diff --git a/.betterer.results b/.betterer.results index f05cafeefa00a..b6572d2326e0c 100644 --- a/.betterer.results +++ b/.betterer.results @@ -1296,11 +1296,7 @@ exports[`better eslint`] = { ], "public/app/core/services/backend_srv.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], - [0, 0, 0, "Unexpected any. Specify a different type.", "1"], - [0, 0, 0, "Unexpected any. Specify a different type.", "2"], - [0, 0, 0, "Unexpected any. Specify a different type.", "3"], - [0, 0, 0, "Unexpected any. Specify a different type.", "4"], - [0, 0, 0, "Unexpected any. Specify a different type.", "5"] + [0, 0, 0, "Do not use any type assertions.", "1"] ], "public/app/core/services/context_srv.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -3103,9 +3099,6 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "7"], [0, 0, 0, "Unexpected any. Specify a different type.", "8"] ], - "public/app/features/dashboard/components/DashboardRow/DashboardRow.test.tsx:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], "public/app/features/dashboard/components/DashboardRow/DashboardRow.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000000000..5bbdf0600c72d --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,276 @@ +version: 2.1 + +# this allows to use CircleCI's dynamic configuration feature +setup: true + +orbs: + gcp-gcr: circleci/gcp-gcr@0.13.0 + +executors: + base-cimg-executor: + docker: + - image: cimg/base:2022.07 + python-cimg-executor: + docker: + - image: cimg/python:3.10.4 + +commands: + asdf_install: + description: "Install tools using ASDF" + parameters: + tools: + type: string + description: + "Newline separated list of tools to install. If empty, will install + everything." + default: "" + cache_name: + type: string + description: "Name of asdf cache" + default: "default" + steps: + - run: + name: Install ASDF + command: | + git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.2 + printf '\nsource "${HOME}/.asdf/asdf.sh"\n' >> "${BASH_ENV}" + date +%m > ~/month + date +%d > ~/day + # We need to restore ASDF cache after installing, otherwise we will try to clone it to non-empty dir + - restore_cache: + name: Restore ASDF cache + keys: + - grafana-asdf-cache-v7-{{ checksum "~/month" }}-<< + parameters.cache_name >>-{{ checksum ".tool-versions" }} + - grafana-asdf-cache-v7-{{ checksum "~/month" }}-<< + parameters.cache_name >>- + - run: + name: Install ASDF tools + environment: + TOOLS: << parameters.tools >> + command: .circleci/scripts/asdf_install.sh + asdf_save_cache: + parameters: + cache_name: + type: string + description: "Name of asdf cache" + default: "default" + steps: + - save_cache: + name: Save ASDF cache + key: + grafana-asdf-cache-v7-{{ checksum "~/month" }}-<< + parameters.cache_name >>-{{ checksum ".tool-versions" }} + paths: + - ~/.asdf + opsninja_install: + parameters: + branch: + type: string + default: main + description: opsninja branch to install from + fingerprint: + type: string + default: 10:d1:92:4e:2a:55:81:c9:82:c2:74:ce:6d:0e:e8:a8 # fluxninja/cloud R/O + description: What SSH identity to use for accessing opsninja repository + steps: + - add_ssh_keys: + fingerprints: + - << parameters.fingerprint >> + - run: + name: Install opsninja and its dependencies + command: | + # We need R/O access to cloud repository to be able to fetch opsninja library + # FIXME: make "releases" of opsninja library somehow, even as a separate repository + # to limit exposure. + export CLOUD_RO_KEY_FINGERPRINT="<< parameters.fingerprint >>" + export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_$(echo "${CLOUD_RO_KEY_FINGERPRINT}" | tr -d ':')" + export SSH_AUTH_SOCK="" + # Bust asdf cache as our opsninja version is always 0.0.0 + pip uninstall -y opsninja + pip install 'git+ssh://git@github.com/fluxninja/cloud@<< parameters.branch >>#egg=opsninja&subdirectory=ops/apps/opsninja/' + which asdf > /dev/null 2>&1 && asdf reshim + +jobs: + release-components: + executor: base-cimg-executor + steps: + - checkout + - asdf_install: + cache_name: release + tools: |- + python + gcloud + - opsninja_install + - run: + name: Schedule release jobs + working_directory: ops/apps/opsninja + command: fn circleci trigger-release --tag << pipeline.git.tag >> + - asdf_save_cache: + cache_name: release + build-push-add-tag: + parameters: + attach-workspace: + type: boolean + description: Boolean for whether or not to attach to an existing workspace + default: false + docker-context: + type: string + description: Path to the directory containing your build context, defaults to . + default: . + dockerfile: + type: string + description: Name of dockerfile to use, defaults to Dockerfile + default: Dockerfile + executor: + type: executor + description: executor to use for this job + default: base-cimg-executor + extra_build_args: + type: string + description: Extra flags to pass to docker build + default: "" + image: + type: string + description: A name for your Docker image + path: + type: string + description: Path to the directory containing your Dockerfile, defaults to . + default: . + remote-docker-version: + type: string + description: Specify the remote docker version + default: 20.10.14 + setup-remote-docker: + type: boolean + description: Setup and use CircleCI's remote Docker environment + default: true + tag: + type: string + description: A Docker image tag + default: ${CIRCLE_SHA1:0:8} + target-tag: + type: string + description: Additional image tag applied when job runs on fluxninja_micro_frontends branch + default: latest + use-docker-layer-caching: + type: boolean + description: Setup docker layer caching for optimized build + default: false + workspace-root: + type: string + description: > + Workspace root path that is either an absolute path or a path relative + to the working directory. Defaults to '.' (the working directory) + default: . + executor: <> + environment: + DOCKER_BUILDKIT: 1 + steps: + - checkout + - when: + condition: <> + steps: + - setup_remote_docker: + docker_layer_caching: <> + version: <> + - gcp-gcr/gcr-auth + - gcp-gcr/build-image: + attach-workspace: <> + docker-context: <> + dockerfile: <> + extra_build_args: <> + image: <> + path: <> + tag: <> + workspace-root: <> + - gcp-gcr/push-image: + image: <> + tag: <> + - when: + condition: + equal: [coderabbit_micro_frontend, << pipeline.git.branch >>] + steps: + - gcp-gcr/tag-image: + image: <> + source-tag: <> + target-tag: <> + update-environment: + parameters: + job-root: + type: string + default: "/home/circleci" + description: The root folder of the job where all repositories will be cloned to + manifests-repo: + type: string + default: git@github.com:fluxninja/argo-manifests.git + description: ArgoCD manifests repository to update + manifests-branch: + type: string + default: environments/latest + description: Branch to use when pushing deployment changes + environment-path: + type: string + description: Path to the environment to update + component: + type: string + default: "" + description: Application component to update image and deployment code for + update: + type: string + default: everything + description: Whether to update 'images', 'deployment-code' or 'everything' + executor: python-cimg-executor + steps: + - add_ssh_keys: + fingerprints: + - "f9:49:04:10:b1:77:16:b0:0e:c0:ba:21:0e:9d:fd:40" # argo-manifests R/W + - checkout + - asdf_install: + cache_name: release + tools: |- + python + gcloud + - gcp-gcr/gcr-auth + - opsninja_install + - run: + name: Update application in the deployment + environment: + JOB_ROOT: << parameters.job-root >> + UPDATE: << parameters.update >> + MANIFESTS_BRANCH: << parameters.manifests-branch >> + MANIFESTS_REPO: << parameters.manifests-repo >> + COMPONENT: << parameters.component >> + ENVIRONMENT_PATH: << parameters.environment-path >> + command: .circleci/scripts/update_environment.sh + +workflows: + version: 2 + build-alpine: + jobs: + - build-push-add-tag: + name: image-build-grafana-alpine + image: cf-fn/grafana + - update-environment: + name: update-demo-environment + filters: + branches: + only: + - coderabbit_micro_frontend + requires: + - image-build-grafana-alpine + environment-path: environments/latest/ + component: grafana + update: images + + release-components: + when: + matches: { value: << pipeline.git.tag >>, pattern: "^releases/.+$" } + jobs: + - release-components: + # both this and workflow's when is needed + filters: + branches: + ignore: /.+/ + tags: + only: /releases\/.+/ diff --git a/.circleci/scripts/asdf_install.sh b/.circleci/scripts/asdf_install.sh new file mode 100755 index 0000000000000..98a3b4445640b --- /dev/null +++ b/.circleci/scripts/asdf_install.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash +set -euo pipefail +set -x + +# shellcheck disable=SC2153 +readarray -t tools <<<"${TOOLS?}" +if [ "${#tools[@]}" -eq 1 ] && [ -z "${tools[0]:-}" ]; then + # Parameter was set to empty string + tools=() +fi + +sudo apt-get update +sudo apt-get install graphviz + +# If we need to setup python +if grep <<<"${TOOLS}" '^python$'; then + # See https://github.com/pyenv/pyenv/wiki#suggested-build-environment + sudo apt-get install make build-essential libssl-dev zlib1g-dev \ + libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm \ + libncursesw5-dev xz-utils tk-dev libxml2-dev libxmlsec1-dev libffi-dev liblzma-dev +fi + +(yes || true) | ./.circleci/scripts/manage_tools.sh setup "${tools[@]}" diff --git a/.circleci/scripts/manage_tools.sh b/.circleci/scripts/manage_tools.sh new file mode 100755 index 0000000000000..0190808493385 --- /dev/null +++ b/.circleci/scripts/manage_tools.sh @@ -0,0 +1,122 @@ +#!/usr/bin/env bash + +set -euo pipefail + +git_root="$(git rev-parse --show-toplevel)" +readonly git_root="${git_root}" +readonly version_file="${git_root}"/.tool-versions + +set -x + +add_plugins() { + check_asdf + + [ -f "$version_file" ] || { + printf 'ASDF .tool-versions does not exist. Exiting\n' + return 1 + } + + readarray -t intended_plugins < <(cut -d" " -f1 "${version_file}") + readarray -t added_plugins < <(asdf plugin-list) + if [ "${#@}" -eq 0 ]; then + local -r wanted_plugins=("${intended_plugins[@]}") + else + local -r wanted_plugins=("${@}") + fi + + local plugin + for plugin in "${wanted_plugins[@]}"; do + if ! array_contains "${plugin}" "${intended_plugins[@]}"; then + printf 'The specified tool %s is not specified in ASDF config!\n' "${plugin}" + printf 'Declared plugins: %s\n' "${intended_plugins[*]}" + return 1 + fi + done + + for plugin in "${wanted_plugins[@]}"; do + if ! array_contains "${plugin}" "${added_plugins[@]}"; then + printf 'Adding asdf plugin: "%s"\n' "${plugin}" + asdf plugin add "${plugin}" + fi + done +} + +install_plugins() { + check_asdf + if [ "${#@}" = 0 ]; then + asdf install + else + local plug + for plug in "${@}"; do + asdf install "${plug}" + done + fi + + if python --version &>/dev/null; then + printf 'Installing Python tools\n' + # install python tools + pushd "${git_root}" >/dev/null + pip install -r "${git_root}"/requirements.txt + popd >/dev/null + fi + if asdf where python &>/dev/null; then + asdf reshim python + fi +} + +setup() { + add_plugins "${@}" + install_plugins "${@}" +} + +main() { + local -r command="${1:-}" + shift + local -r tools=("${@}") + case "${command:-}" in + add) add_plugins "${tools[@]}" ;; + install) install_plugins "${tools[@]}" ;; + setup | '') setup "${tools[@]}" ;; + help) print_help ;; + *) + printf 'Invalid argument: "%s"\n' "${command}" >&2 + print_help + return 1 + ;; + esac +} + +check_asdf() { + command -v asdf >/dev/null || { + printf 'Please install asdf: https://asdf-vm.com/guide/getting-started.html#_3-install-asdf\n' >&2 + return 1 + } +} + +array_contains() { + # Checks if first passed item, exists somewhere in the array passed as second and further arguments + local -r item="${1?Item required}" + shift + local -r arr=("${@}") + local other + for other in "${arr[@]}"; do + if [ "${item}" = "${other}" ]; then + return 0 # Found the item + fi + done + return 1 # didn't find the item +} + +print_help() { + local -r script_called_name="${BASH_SOURCE[0]}" + printf 'Usage: %s [tool_names]\n' "${script_called_name}" >&2 + printf 'Commands:\n' >&2 + printf ' add - add to asdf plugins from .tool-versions file\n' >&2 + printf ' install - install plugins which have been added into asdf and are versioned in .tool-versions file\n' >&2 + printf ' setup - (default, if no command specified) and & install\n' >&2 + printf 'Can additionally pass names of the tools to limit the install to\n' >&2 +} + +if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then + main "$@" +fi diff --git a/.circleci/scripts/update_environment.sh b/.circleci/scripts/update_environment.sh new file mode 100755 index 0000000000000..db4bf66c968cf --- /dev/null +++ b/.circleci/scripts/update_environment.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +set -euo pipefail +export LOGURU_LEVEL=TRACE +export GIT_SSH_COMMAND="fn circleci ssh -o IdentitiesOnly=yes -o IdentityAgent=none" + +commit_author=$(git show --format="%aN <%aE>" --quiet) + +args=( + --author "${commit_author}" + --update "${UPDATE}" + --release-train "latest" + --manifests-repo-url "${MANIFESTS_REPO}" + --manifests-base-branch "${MANIFESTS_BRANCH}" + --manifests-repo-ref "${MANIFESTS_BRANCH}" + --skip-pull-request + --push +) + +if [ -n "${COMPONENT}" ]; then + args+=(--component "${COMPONENT}") +fi + +retry_counter=10 +errcode=1 +while true; do + (( retry_counter-- )) || break + + set +e + if fn --config-path "${JOB_ROOT}"/project/.opsninja.yaml \ + manifests update "${args[@]}" "${ENVIRONMENT_PATH}"; then + errcode=0 + break + else + errcode="${?}" + fi + set -e + sleep 1 +done + +exit $errcode diff --git a/.eslintignore b/.eslintignore index 1b83fc33e021e..c0e76b172ce95 100644 --- a/.eslintignore +++ b/.eslintignore @@ -25,3 +25,6 @@ playwright-report # Auto-generated icon file /packages/grafana-ui/src/components/Icon/iconBundle.ts + +# Sankey chart module.js +public/app/plugins/panel/sankey-panel-0.5.0/module.js diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 8c656594ef850..0000000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,753 +0,0 @@ -# Lines starting with '#' are comments. -# Each line is a file pattern followed by one or more owners. - -# More details are here: https://help.github.com/articles/about-codeowners/ - -# The '*' pattern is global owners. - -# Order is important. The last matching pattern has the most precedence. -# The folders are ordered as follows: - -# In each subsection folders are ordered first by depth, then alphabetically. -# This should make it easy to add new rules without breaking existing ones. - -# Documentation -/.changelog-archive @grafana/grafana-release-guild -/CHANGELOG.md @grafana/grafana-release-guild -/CODE_OF_CONDUCT.md @grafana/grafana-community-support -/CONTRIBUTING.md @grafana/grafana-community-support -/GOVERNANCE.md @RichiH -/HALL_OF_FAME.md @grafana/grafana-community-support -/LICENSE @torkelo -/LICENSING.md @torkelo -/MAINTAINERS.md @RichiH -/NOTICE.md @torkelo -/README.md @grafana/docs-grafana -/ROADMAP.md @torkelo -/SECURITY.md @grafana/security-team -/SUPPORT.md @torkelo -/WORKFLOW.md @torkelo -/contribute/ @grafana/grafana-community-support -/contribute/UPGRADING_DEPENDENCIES.md @grafana/docs-grafana -/devenv/README.md @grafana/docs-grafana - -# START Technical documentation -# `make docs` procedure and related workflows are owned @grafana/docs-tooling. Slack #docs. -/docs/ @grafana/docs-tooling - -/docs/.codespellignore @grafana/docs-tooling -/docs/sources/ @Eve832 - -/docs/sources/administration/ @jdbaldry -/docs/sources/alerting/ @brendamuir -/docs/sources/dashboards/ @imatwawana -/docs/sources/datasources/ @jdbaldry -/docs/sources/explore/ @grafana/explore-squad @lwandz13 -/docs/sources/fundamentals @chri2547 -/docs/sources/getting-started/ @chri2547 -/docs/sources/introduction/ @chri2547 -/docs/sources/panels-visualizations/ @imatwawana -/docs/sources/release-notes/ @Eve832 @GrafanaWriter -/docs/sources/setup-grafana/ @chri2547 -/docs/sources/upgrade-guide/ @imatwawana -/docs/sources/whatsnew/ @imatwawana - -/docs/sources/developers/plugins/ @grafana/plugins-platform-frontend @grafana/plugins-platform-backend - -/docs/sources/panels-visualizations/query-transform-data/transform-data/index.md @imatwawana @baldm0mma -# END Technical documentation - -# Backend code -/go.mod @grafana/grafana-backend-group -/go.sum @grafana/grafana-backend-group -/go.work @grafana/grafana-app-platform-squad -/go.work.sum @grafana/grafana-app-platform-squad -/.bingo/ @grafana/grafana-backend-group -/pkg/README.md @grafana/grafana-backend-group -/pkg/ruleguard.rules.go @grafana/grafana-backend-group -/.bra.toml @grafana/grafana-backend-group -/.golangci.toml @grafana/grafana-backend-group -/build.go @grafana/grafana-backend-services-squad -/scripts/modowners/ @grafana/grafana-backend-services-squad -/scripts/go-workspace @grafana/grafana-app-platform-squad -/hack/ @grafana/grafana-app-platform-squad - -/apps/alerting/ @grafana/alerting-backend -/pkg/api/ @grafana/grafana-backend-group -/pkg/apis/ @grafana/grafana-app-platform-squad -/pkg/apis/alerting_notifications @grafana/grafana-app-platform-squad @grafana/alerting-backend @grafana/alerting-frontend -/pkg/bus/ @grafana/grafana-search-and-storage -/pkg/cmd/ @grafana/grafana-backend-group -/pkg/cmd/grafana/apiserver @grafana/grafana-app-platform-squad -/pkg/components/apikeygen/ @grafana/identity-squad -/pkg/components/satokengen/ @grafana/identity-squad -/pkg/components/dashdiffs/ @grafana/grafana-app-platform-squad -/pkg/components/imguploader/ @grafana/alerting-backend -/pkg/components/loki/ @grafana/grafana-backend-group -/pkg/components/null/ @grafana/grafana-backend-group -/pkg/components/simplejson/ @grafana/grafana-backend-group -/pkg/events/ @grafana/grafana-backend-group -/pkg/extensions/ @grafana/grafana-backend-group -/pkg/ifaces/ @grafana/grafana-backend-group -/pkg/infra/db/ @grafana/grafana-backend-group -/pkg/infra/localcache/ @grafana/grafana-backend-group -/pkg/infra/log/ @grafana/grafana-backend-group -/pkg/infra/metrics/ @grafana/grafana-backend-group -/pkg/infra/network/ @grafana/grafana-backend-group -/pkg/infra/process/ @grafana/grafana-backend-group -/pkg/infra/remotecache/ @grafana/grafana-backend-group -/pkg/infra/serverlock/ @grafana/grafana-backend-group -/pkg/infra/slugify/ @grafana/grafana-backend-group -/pkg/infra/tracing/ @grafana/grafana-backend-group -/pkg/infra/usagestats/ @grafana/grafana-backend-group -/pkg/middleware/ @grafana/grafana-backend-group -/pkg/mocks/ @grafana/grafana-backend-group -/pkg/models/ @grafana/grafana-backend-group -/pkg/semconv/ @grafana/grafana-backend-group -/pkg/server/ @grafana/grafana-backend-group -/pkg/apiserver @grafana/grafana-app-platform-squad -/pkg/aggregator @grafana/grafana-app-platform-squad -/pkg/apimachinery @grafana/grafana-app-platform-squad -/pkg/apimachinery/identity/ @grafana/identity-squad -/pkg/apimachinery/errutil/ @grafana/grafana-backend-group -/pkg/promlib @grafana/observability-metrics -/pkg/storage/ @grafana/grafana-search-and-storage -/pkg/services/annotations/ @grafana/grafana-search-and-storage -/pkg/services/apikey/ @grafana/identity-squad -/pkg/services/cleanup/ @grafana/grafana-backend-group -/pkg/services/contexthandler/ @grafana/grafana-backend-group -/pkg/services/correlations/ @grafana/explore-squad -/pkg/services/dashboardimport/ @grafana/grafana-backend-group -/pkg/services/dashboards/ @grafana/grafana-app-platform-squad -/pkg/services/dashboardversion/ @grafana/grafana-backend-group -/pkg/services/encryption/ @grafana/grafana-operator-experience-squad -/pkg/services/folder/ @grafana/grafana-search-and-storage -/pkg/services/apiserver @grafana/grafana-app-platform-squad -/pkg/services/hooks/ @grafana/grafana-backend-group -/pkg/services/kmsproviders/ @grafana/grafana-operator-experience-squad -/pkg/services/licensing/ @grafana/grafana-operator-experience-squad -/pkg/services/navtree/ @grafana/grafana-backend-group -/pkg/services/notifications/ @grafana/grafana-backend-group -/pkg/services/org/ @grafana/grafana-backend-group -/pkg/services/playlist/ @grafana/grafana-app-platform-squad -/pkg/services/preference/ @grafana/grafana-backend-group -/pkg/services/provisioning/ @grafana/grafana-search-and-storage -/pkg/services/query/ @grafana/grafana-app-platform-squad -/pkg/services/queryhistory/ @grafana/explore-squad -/pkg/services/quota/ @grafana/grafana-search-and-storage -/pkg/services/screenshot/ @grafana/grafana-backend-group -/pkg/services/search/ @grafana/grafana-search-and-storage -/pkg/services/searchusers/ @grafana/grafana-search-and-storage -/pkg/services/secrets/ @grafana/grafana-operator-experience-squad -/pkg/services/shorturls/ @grafana/grafana-backend-group -/pkg/services/sqlstore/ @grafana/grafana-search-and-storage -/pkg/services/ssosettings/ @grafana/identity-squad -/pkg/services/star/ @grafana/grafana-search-and-storage -/pkg/services/stats/ @grafana/grafana-backend-group -/pkg/services/tag/ @grafana/grafana-search-and-storage -/pkg/services/team/ @grafana/access-squad -/pkg/services/temp_user/ @grafana/grafana-backend-group -/pkg/services/updatechecker/ @grafana/grafana-backend-group -/pkg/services/user/ @grafana/access-squad -/pkg/services/validations/ @grafana/grafana-backend-group -/pkg/setting/ @grafana/grafana-backend-services-squad -/pkg/tests/ @grafana/grafana-backend-services-squad -/pkg/tests/apis/ @grafana/grafana-app-platform-squad -/pkg/tests/apis/alerting @grafana/grafana-app-platform-squad @grafana/alerting-backend -/pkg/tests/api/correlations/ @grafana/explore-squad -/pkg/tsdb/grafanads/ @grafana/grafana-backend-group -/pkg/tsdb/opentsdb/ @grafana/partner-datasources -/pkg/util/ @grafana/grafana-backend-group -/pkg/web/ @grafana/grafana-backend-group - -/pkg/infra/kvstore/ @grafana/grafana-backend-group -/pkg/infra/fs/ @grafana/grafana-backend-group - -# devenv -# Backend code, developers environment -/devenv/docker/blocks/auth/ @grafana/identity-access-team - -# Logs code, developers environment -/devenv/docker/blocks/loki* @grafana/observability-logs -/devenv/docker/blocks/elastic* @grafana/aws-datasources -/devenv/docker/blocks/self-instrumentation* @grafana/observability-metrics - -/devenv/bulk-dashboards/ @grafana/dashboards-squad -/devenv/bulk-folders/ @grafana/grafana-frontend-platform -/devenv/create_docker_compose.sh @grafana/grafana-backend-services-squad -/devenv/alert_rules.yaml @grafana/alerting-backend -/devenv/dashboards.yaml @grafana/dashboards-squad -/devenv/datasources.yaml @grafana/grafana-backend-group -/devenv/datasources_docker.yaml @grafana/grafana-backend-group -/devenv/dev-dashboards-without-uid/ @grafana/dashboards-squad -/devenv/dev-dashboards/ @grafana/dashboards-squad -/devenv/docker/blocks/alert_webhook_listener/ @grafana/alerting-backend -/devenv/docker/blocks/clickhouse/ @grafana/partner-datasources -/devenv/docker/blocks/collectd/ @grafana/observability-metrics -/devenv/docker/blocks/etcd @grafana/grafana-app-platform-squad -/devenv/docker/blocks/grafana/ @grafana/grafana-as-code -/devenv/docker/blocks/graphite/ @grafana/partner-datasources -/devenv/docker/blocks/graphite09/ @grafana/partner-datasources -/devenv/docker/blocks/graphite1/ @grafana/partner-datasources -/devenv/docker/blocks/influxdb/ @grafana/partner-datasources -/devenv/docker/blocks/influxdb1/ @grafana/partner-datasources -/devenv/docker/blocks/jaeger/ @grafana/oss-big-tent -/devenv/docker/blocks/maildev/ @grafana/alerting-frontend -/devenv/docker/blocks/mariadb/ @grafana/oss-big-tent -/devenv/docker/blocks/memcached/ @grafana/grafana-backend-group -/devenv/docker/blocks/mimir_backend/ @grafana/alerting-backend -/devenv/docker/blocks/mssql/ @grafana/partner-datasources -/devenv/docker/blocks/mssql_arm64/ @grafana/partner-datasources -/devenv/docker/blocks/mssql_tests/ @grafana/partner-datasources -/devenv/docker/blocks/mssql_tls/ @grafana/partner-datasources -/devenv/docker/blocks/mysql/ @grafana/oss-big-tent -/devenv/docker/blocks/mysql_exporter/ @grafana/oss-big-tent -/devenv/docker/blocks/mysql_opendata/ @grafana/oss-big-tent -/devenv/docker/blocks/mysql_tests/ @grafana/oss-big-tent -/devenv/docker/blocks/opentsdb/ @grafana/partner-datasources -/devenv/docker/blocks/postgres/ @grafana/oss-big-tent -/devenv/docker/blocks/postgres_tests/ @grafana/oss-big-tent -/devenv/docker/blocks/prometheus/ @grafana/observability-metrics -/devenv/docker/blocks/prometheus_random_data/ @grafana/observability-metrics -/devenv/docker/blocks/prometheus_high_card/ @grafana/observability-metrics -/devenv/docker/blocks/pyroscope/ @grafana/observability-traces-and-profiling -/devenv/docker/blocks/redis/ @bergquist -/devenv/docker/blocks/sensugo/ @grafana/grafana-backend-group -/devenv/docker/blocks/slow_proxy/ @bergquist -/devenv/docker/blocks/smtp/ @bergquist -/devenv/docker/blocks/tempo/ @grafana/observability-traces-and-profiling -/devenv/docker/blocks/traefik/ @mckn -/devenv/docker/blocks/zipkin/ @grafana/oss-big-tent -/devenv/docker/blocks/webdav/ @grafana/alerting-backend -/devenv/docker/buildcontainer/ @bergquist -/devenv/docker/compose_header.yml @grafana/grafana-backend-services-squad -/devenv/docker/debtest/ @bergquist -/devenv/docker/ha-test-unified-alerting/ @grafana/alerting-backend -/devenv/docker/ha_test/ @grafana/grafana-backend-services-squad -/devenv/docker/loadtest/ @grafana/grafana-backend-services-squad -/devenv/docker/rpmtest/ @grafana/grafana-backend-services-squad -/devenv/jsonnet/ @grafana/dataviz-squad -/devenv/local-npm/ @grafana/frontend-ops -/devenv/vscode/ @grafana/frontend-ops -/devenv/setup.sh @grafana/grafana-backend-services-squad -/devenv/plugins.yaml @grafana/plugins-platform-frontend - -# Emails -/emails/ @grafana/alerting-frontend - -#Packaging -/packaging/ @DanCech - - -# Continuous Integration -.drone.yml @grafana/grafana-release-guild -.drone.star @grafana/grafana-release-guild -/scripts/drone/ @grafana/grafana-release-guild -/pkg/build/ @grafana/grafana-release-guild -/.dockerignore @grafana/grafana-release-guild -/Dockerfile @grafana/grafana-release-guild -/Makefile @grafana/grafana-release-guild -/scripts/build/ @grafana/grafana-release-guild -/scripts/list-release-artifacts.sh @grafana/grafana-release-guild -/.trivyignore @grafana/grafana-backend-services-squad - -# OSS Plugin Partnerships backend code -/pkg/tsdb/cloudwatch/ @grafana/aws-datasources -/pkg/tsdb/azuremonitor/ @grafana/partner-datasources -/pkg/tsdb/cloud-monitoring/ @grafana/partner-datasources - -# Observability backend code -/pkg/tsdb/prometheus/ @grafana/observability-metrics -/pkg/tsdb/elasticsearch/ @grafana/aws-datasources -/pkg/tsdb/loki/ @grafana/observability-logs -/pkg/tsdb/tempo/ @grafana/observability-traces-and-profiling -/pkg/tsdb/grafana-pyroscope-datasource/ @grafana/observability-traces-and-profiling -/pkg/tsdb/parca/ @grafana/oss-big-tent - -# OSS Big Tent backend code -/pkg/tsdb/mysql/ @grafana/oss-big-tent -/pkg/tsdb/grafana-postgresql-datasource/ @grafana/oss-big-tent - -# Partner Datasources backend code -/pkg/tsdb/mssql/ @grafana/partner-datasources -/pkg/tsdb/influxdb/ @grafana/partner-datasources -/pkg/tsdb/graphite/ @grafana/partner-datasources - -# Database migrations -/pkg/services/sqlstore/migrations/ @grafana/grafana-search-and-storage -*_mig.go @grafana/grafana-search-and-storage - -# Grafana app platform -/pkg/services/live/ @grafana/grafana-app-platform-squad -/pkg/services/searchV2/ @grafana/grafana-app-platform-squad -/pkg/services/store/ @grafana/grafana-app-platform-squad -/pkg/infra/filestorage/ @grafana/grafana-app-platform-squad -/pkg/modules/ @grafana/grafana-app-platform-squad -/pkg/services/grpcserver/ @grafana/grafana-search-and-storage -/pkg/generated @grafana/grafana-app-platform-squad - -# Alerting -/pkg/services/ngalert/ @grafana/alerting-backend -/pkg/services/sqlstore/migrations/ualert/ @grafana/alerting-backend -/pkg/tests/api/alerting/ @grafana/alerting-backend -/public/app/features/alerting/ @grafana/alerting-frontend -/public/app/features/gops/ @grafana/alerting-frontend - -# Library Services -/pkg/services/libraryelements/ @grafana/dashboards-squad -/pkg/services/librarypanels/ @grafana/dashboards-squad - -# Plugins -/pkg/api/pluginproxy/ @grafana/plugins-platform-backend -/pkg/infra/httpclient/ @grafana/plugins-platform-backend -/pkg/plugins/ @grafana/plugins-platform-backend -/pkg/services/datasourceproxy/ @grafana/plugins-platform-backend -/pkg/services/datasources/ @grafana/plugins-platform-backend -/pkg/services/pluginsintegration/ @grafana/plugins-platform-backend -/pkg/plugins/pfs/ @grafana/plugins-platform-backend @grafana/grafana-as-code -/pkg/tsdb/grafana-testdata-datasource/ @grafana/plugins-platform-backend -/pkg/tsdb/Magefile.go @grafana/plugins-platform-backend -/pkg/services/pluginsintegration/pluginsettings/ @grafana/plugins-platform-backend -/pkg/services/plugindashboards/ @grafana/plugins-platform-backend - -# Backend code docs -/contribute/backend/ @grafana/grafana-backend-group - - -/crowdin.yml @grafana/grafana-frontend-platform -/public/locales/ @grafana/grafana-frontend-platform -/public/app/core/internationalization/ @grafana/grafana-frontend-platform -/e2e/ @grafana/grafana-frontend-platform -/e2e/cloud-plugins-suite/ @grafana/partner-datasources -/e2e/plugin-e2e/plugin-e2e-api-tests/ @grafana/plugins-platform-frontend -/e2e/test-plugins/grafana-extensionstest-app/ @grafana/plugins-platform-frontend - -# Packages -/packages/ @grafana/grafana-frontend-platform @grafana/plugins-platform-frontend -/packages/grafana-data/src/**/*logs* @grafana/observability-logs -/packages/grafana-data/src/transformations/ @grafana/dataviz-squad -/packages/grafana-e2e-selectors/ @grafana/grafana-frontend-platform -/packages/grafana-flamegraph/ @grafana/observability-traces-and-profiling -/packages/grafana-o11y-ds-frontend/ @grafana/observability-logs -/packages/grafana-o11y-ds-frontend/src/IntervalInput/ @grafana/observability-traces-and-profiling -/packages/grafana-o11y-ds-frontend/src/NodeGraph/ @grafana/observability-traces-and-profiling -/packages/grafana-o11y-ds-frontend/src/pyroscope/ @grafana/observability-traces-and-profiling -/packages/grafana-o11y-ds-frontend/src/SpanBar/ @grafana/observability-traces-and-profiling -/packages/grafana-o11y-ds-frontend/src/TraceToLogs/ @grafana/observability-traces-and-profiling -/packages/grafana-o11y-ds-frontend/src/TraceToMetrics/ @grafana/observability-traces-and-profiling -/packages/grafana-o11y-ds-frontend/src/TraceToProfiles/ @grafana/observability-traces-and-profiling -/packages/grafana-plugin-configs/ @grafana/plugins-platform-frontend -/packages/grafana-prometheus/ @grafana/observability-metrics -/packages/grafana-schema/src/**/*canvas* @grafana/dataviz-squad -/packages/grafana-schema/src/**/*tempo* @grafana/observability-traces-and-profiling -/packages/grafana-sql/ @grafana/partner-datasources @grafana/oss-big-tent -/packages/grafana-ui/.storybook/ @grafana/plugins-platform-frontend -/packages/grafana-ui/src/components/ @grafana/grafana-frontend-platform -/packages/grafana-ui/src/components/BarGauge/ @grafana/dataviz-squad -/packages/grafana-ui/src/components/DataLinks/ @grafana/dataviz-squad -/packages/grafana-ui/src/components/DateTimePickers/ @grafana/grafana-frontend-platform -/packages/grafana-ui/src/components/Gauge/ @grafana/dataviz-squad -/packages/grafana-ui/src/components/PluginSignatureBadge/ @grafana/plugins-platform-frontend -/packages/grafana-ui/src/components/Sparkline/ @grafana/grafana-frontend-platform @grafana/app-o11y-visualizations -/packages/grafana-ui/src/components/Table/ @grafana/dataviz-squad -/packages/grafana-ui/src/components/Table/SparklineCell.tsx @grafana/dataviz-squad @grafana/app-o11y-visualizations -/packages/grafana-ui/src/components/uPlot/ @grafana/dataviz-squad -/packages/grafana-ui/src/components/ValuePicker/ @grafana/dataviz-squad -/packages/grafana-ui/src/components/VizLayout/ @grafana/dataviz-squad -/packages/grafana-ui/src/components/VizLegend/ @grafana/dataviz-squad -/packages/grafana-ui/src/components/VizRepeater/ @grafana/dataviz-squad -/packages/grafana-ui/src/components/VizTooltip/ @grafana/dataviz-squad -/packages/grafana-ui/src/graveyard/Graph/ @grafana/dataviz-squad -/packages/grafana-ui/src/graveyard/GraphNG/ @grafana/dataviz-squad -/packages/grafana-ui/src/graveyard/TimeSeries/ @grafana/dataviz-squad -/packages/grafana-ui/src/utils/storybook/ @grafana/plugins-platform-frontend - -/plugins-bundled/ @grafana/plugins-platform-frontend - -# root files, mostly frontend -/.browserslistrc @grafana/frontend-ops -/package.json @grafana/frontend-ops -/nx.json @grafana/frontend-ops -/project.json @grafana/frontend-ops -/tsconfig.json @grafana/frontend-ops -/.editorconfig @grafana/frontend-ops -/.eslintignore @grafana/frontend-ops -/.gitattributes @grafana/frontend-ops -/.gitignore @grafana/frontend-ops -/.nvmrc @grafana/frontend-ops -/.prettierignore @grafana/frontend-ops -/.yarn @grafana/frontend-ops -/.yarnrc.yml @grafana/frontend-ops -/yarn.lock @grafana/frontend-ops -/lerna.json @grafana/frontend-ops -/.prettierrc.js @grafana/frontend-ops -/.eslintrc @grafana/frontend-ops -/.vim @zoltanbedi -/jest.config.js @grafana/frontend-ops -/latest.json @grafana/frontend-ops -/stylelint.config.js @grafana/frontend-ops -/tools/ @grafana/frontend-ops -/lefthook.yml @grafana/frontend-ops -/lefthook.rc @grafana/frontend-ops -/.husky/pre-commit @grafana/frontend-ops -/cypress.config.js @grafana/grafana-frontend-platform -/.levignore.js @grafana/plugins-platform-frontend -playwright.config.ts @grafana/plugins-platform-frontend - -# public folder -/public/app/core/ @grafana/grafana-frontend-platform -/public/app/core/components/TimePicker/ @grafana/grafana-frontend-platform -/public/app/core/components/Layers/ @grafana/dataviz-squad -/public/app/core/components/GraphNG/ @grafana/dataviz-squad -/public/app/core/components/TimeSeries/ @grafana/dataviz-squad -/public/app/core/components/TimelineChart/ @grafana/dataviz-squad -/public/app/core/components/Form/ @grafana/grafana-frontend-platform -/public/app/core/history/ @grafana/explore-squad -/public/app/features/all.ts @grafana/grafana-frontend-platform -/public/app/features/admin/ @grafana/identity-access-team - -# Temp owners until Enterprise team takes over -/public/app/features/migrate-to-cloud @grafana/grafana-frontend-platform - -/public/app/features/auth-config/ @grafana/identity-squad -/public/app/features/annotations/ @grafana/dashboards-squad -/public/app/features/api-keys/ @grafana/identity-squad -/public/app/features/canvas/ @grafana/dataviz-squad -/public/app/features/geo/ @grafana/dataviz-squad -/public/app/features/visualization/data-hover/ @grafana/dataviz-squad -/public/app/features/commandPalette/ @grafana/grafana-frontend-platform -/public/app/features/connections/ @grafana/plugins-platform-frontend -/public/app/features/correlations/ @grafana/explore-squad -/public/app/features/dashboard/ @grafana/dashboards-squad -/public/app/features/dashboard/components/TransformationsEditor/ @grafana/dataviz-squad -/public/app/features/dashboard-scene/ @grafana/dashboards-squad -/public/app/features/scopes/ @grafana/dashboards-squad -/public/app/features/datasources/ @grafana/plugins-platform-frontend -/public/app/features/dimensions/ @grafana/dataviz-squad -/public/app/features/dataframe-import/ @grafana/dataviz-squad -/public/app/features/explore/ @grafana/explore-squad -/public/app/features/expressions/ @grafana/observability-metrics -/public/app/features/folders/ @grafana/grafana-frontend-platform -/public/app/features/inspector/ @grafana/dashboards-squad -/public/app/features/invites/ @grafana/grafana-frontend-platform -/public/app/features/library-panels/ @grafana/dashboards-squad -/public/app/features/logs/ @grafana/observability-logs -/public/app/features/live/ @grafana/grafana-app-platform-squad -/public/app/features/apiserver/ @grafana/grafana-app-platform-squad -/public/app/features/manage-dashboards/ @grafana/dashboards-squad -/public/app/features/notifications/ @grafana/grafana-frontend-platform -/public/app/features/org/ @grafana/grafana-frontend-platform -/public/app/features/panel/ @grafana/dashboards-squad -/public/app/features/playlist/ @grafana/dashboards-squad -/public/app/features/plugins/ @grafana/plugins-platform-frontend -/public/app/features/profile/ @grafana/grafana-frontend-platform -/public/app/features/query-library/ @grafana/explore-squad -/public/app/features/runtime/ @ryantxu -/public/app/features/query/ @grafana/dashboards-squad -/public/app/features/sandbox/ @grafana/grafana-frontend-platform -/public/app/features/browse-dashboards/ @grafana/grafana-frontend-platform -/public/app/features/search/ @grafana/grafana-frontend-platform -/public/app/features/serviceaccounts/ @grafana/identity-squad -/public/app/features/storage/ @grafana/grafana-app-platform-squad -/public/app/features/teams/ @grafana/access-squad -/public/app/features/templating/ @grafana/dashboards-squad -/public/app/features/trails/ @grafana/observability-metrics -/public/app/features/transformers/ @grafana/dataviz-squad -/public/app/features/transformers/timeSeriesTable/ @grafana/dataviz-squad @grafana/app-o11y-visualizations -/public/app/features/users/ @grafana/access-squad -/public/app/features/variables/ @grafana/dashboards-squad -/public/app/features/preferences/ @grafana/grafana-frontend-platform -/public/app/plugins/panel/alertlist/ @grafana/alerting-frontend -/public/app/plugins/panel/annolist/ @grafana/grafana-frontend-platform -/public/app/plugins/panel/barchart/ @grafana/dataviz-squad -/public/app/plugins/panel/bargauge/ @grafana/dataviz-squad -/public/app/plugins/panel/dashlist/ @grafana/grafana-frontend-platform -/public/app/plugins/panel/debug/ @ryantxu -/public/app/plugins/panel/datagrid/ @grafana/dataviz-squad -/public/app/plugins/panel/gauge/ @grafana/dataviz-squad -/public/app/plugins/panel/gettingstarted/ @grafana/grafana-frontend-platform -/public/app/plugins/panel/graph/ @grafana/dataviz-squad -/public/app/plugins/panel/heatmap/ @grafana/dataviz-squad -/public/app/plugins/panel/histogram/ @grafana/dataviz-squad -/public/app/plugins/panel/logs/ @grafana/observability-logs -/public/app/plugins/panel/nodeGraph/ @grafana/observability-traces-and-profiling @grafana/app-o11y-visualizations -/public/app/plugins/panel/traces/ @grafana/observability-traces-and-profiling -/public/app/plugins/panel/flamegraph/ @grafana/observability-traces-and-profiling -/public/app/plugins/panel/piechart/ @grafana/dataviz-squad -/public/app/plugins/panel/state-timeline/ @grafana/dataviz-squad -/public/app/plugins/panel/status-history/ @grafana/dataviz-squad -/public/app/plugins/panel/table/ @grafana/dataviz-squad -/public/app/plugins/panel/table/cells/SparklineCellOptionsEditor.tsx @grafana/dataviz-squad @grafana/app-o11y-visualizations -/public/app/plugins/panel/table-old/ @grafana/dataviz-squad -/public/app/plugins/panel/timeseries/ @grafana/dataviz-squad -/public/app/plugins/panel/trend/ @grafana/dataviz-squad -/public/app/plugins/panel/geomap/ @grafana/dataviz-squad -/public/app/plugins/panel/canvas/ @grafana/dataviz-squad -/public/app/plugins/panel/candlestick/ @grafana/dataviz-squad -/public/app/plugins/panel/live/ @grafana/grafana-app-platform-squad -/public/app/plugins/panel/news/ @grafana/grafana-frontend-platform -/public/app/plugins/panel/stat/ @grafana/dataviz-squad -/public/app/plugins/panel/text/ @grafana/grafana-frontend-platform -/public/app/plugins/panel/welcome/ @grafana/grafana-frontend-platform -/public/app/plugins/panel/xychart/ @grafana/dataviz-squad -/public/app/plugins/sdk.ts @grafana/plugins-platform-frontend -/public/app/routes/ @grafana/grafana-frontend-platform -/public/app/store/ @grafana/grafana-frontend-platform -/public/app/types/ @grafana/grafana-frontend-platform -/public/app/types/alerting.ts @grafana/alerting-frontend -/public/app/types/unified-alerting-dto.ts @grafana/alerting-frontend -/public/dashboards/ @grafana/dashboards-squad -/public/gazetteer/ @ryantxu -/public/img/ @grafana/grafana-frontend-platform -/public/lib/ @grafana/grafana-frontend-platform -/public/lib/monaco-languages/kusto.ts @grafana/partner-datasources -/public/maps/ @ryantxu -/public/robots.txt @grafana/frontend-ops -/public/fonts/ @grafana/grafana-frontend-platform -/public/sass/ @grafana/grafana-frontend-platform -/public/test/ @grafana/grafana-frontend-platform -/public/test/helpers/alertingRuleEditor.tsx @grafana/alerting-frontend -/public/views/ @grafana/grafana-frontend-platform -/public/views/swagger.html @grafana/grafana-app-platform-squad -/public/swagger/ @grafana/grafana-app-platform-squad - -/public/app/features/explore/Logs/ @grafana/observability-logs - -/public/app/features/explore/RawPrometheus/ @grafana/observability-metrics - -/public/app/features/explore/NodeGraph/ @grafana/observability-traces-and-profiling -/public/app/features/explore/FlameGraph/ @grafana/observability-traces-and-profiling -/public/app/features/explore/TraceView/ @grafana/observability-traces-and-profiling - -/public/api-merged.json @grafana/grafana-backend-group -/public/api-enterprise-spec.json @grafana/grafana-backend-group -/public/openapi3.json @grafana/grafana-backend-group -/public/app/angular/ @torkelo -/public/app/app.ts @grafana/frontend-ops -/public/app/dev.ts @grafana/frontend-ops -/public/app/core/utils/metrics.ts @grafana/plugins-platform-frontend -/public/app/index.ts @grafana/frontend-ops -/public/app/AppWrapper.tsx @grafana/frontend-ops -/public/app/partials/ @grafana/grafana-frontend-platform - - - - -/scripts/benchmark-access-control.sh @grafana/access-squad -/scripts/check-breaking-changes.sh @grafana/plugins-platform-frontend -/scripts/ci-* @grafana/grafana-release-guild -/scripts/circle-* @grafana/grafana-release-guild -/scripts/publish-npm-packages.sh @grafana/grafana-release-guild @grafana/plugins-platform-frontend -/scripts/validate-npm-packages.sh @grafana/grafana-release-guild @grafana/plugins-platform-frontend -/scripts/ci-frontend-metrics.sh @grafana/grafana-frontend-platform @grafana/plugins-platform-frontend @grafana/dataviz-squad -/scripts/cli/ @grafana/grafana-frontend-platform -/scripts/clean-git-or-error.sh @grafana/grafana-as-code -/scripts/grafana-server/ @grafana/grafana-frontend-platform -/scripts/helpers/ @grafana/grafana-release-guild -/scripts/import_many_dashboards.sh @torkelo -/scripts/mixin-check.sh @bergquist -/scripts/openapi3/ @grafana/grafana-operator-experience-squad -/scripts/prepare-packagejson.js @grafana/frontend-ops -/scripts/protobuf-check.sh @grafana/plugins-platform-backend -/scripts/stripnulls.sh @grafana/grafana-as-code -/scripts/tag_release.sh @grafana/grafana-release-guild -/scripts/trigger_docker_build.sh @grafana/grafana-release-guild -/scripts/trigger_grafana_packer.sh @grafana/grafana-release-guild -/scripts/trigger_windows_build.sh @grafana/grafana-release-guild -/scripts/cleanup-husky.sh @grafana/frontend-ops -/scripts/verify-repo-update/ @grafana/grafana-release-guild -/scripts/generate-icon-bundle.js @grafana/plugins-platform-frontend @grafana/grafana-frontend-platform -/scripts/generate-rtk-apis.ts @grafana/grafana-frontend-platform -/scripts/generate-alerting-rtk-apis.ts @grafana/alerting-frontend -/scripts/levitate-parse-json-report.js @grafana/plugins-platform-frontend -/scripts/levitate-show-affected-plugins.js @grafana/plugins-platform-frontend -/scripts/codemods/explicit-barrel-imports.cjs @grafana/frontend-ops - -/scripts/**/generate-transformations* @grafana/dataviz-squad -/scripts/webpack/ @grafana/frontend-ops -/scripts/generate-a11y-report.sh @grafana/grafana-frontend-platform -.pa11yci.conf.js @grafana/grafana-frontend-platform -.pa11yci-pr.conf.js @grafana/grafana-frontend-platform -.betterer.results @grafanabot -.betterer.results.json @grafanabot -.betterer.ts @grafana/grafana-frontend-platform - -# @grafana/ui component documentation -*.mdx @grafana/plugins-platform-frontend - -# Design system -/public/img/icons/unicons/ @grafana/design-system - -# Core datasources -/public/app/plugins/datasource/dashboard/ @grafana/dashboards-squad -/public/app/plugins/datasource/cloudwatch/ @grafana/aws-datasources -/public/app/plugins/datasource/elasticsearch/ @grafana/aws-datasources -/public/app/plugins/datasource/grafana/ @grafana/grafana-frontend-platform -/public/app/plugins/datasource/grafana-testdata-datasource/ @grafana/plugins-platform-frontend -/public/app/plugins/datasource/azuremonitor/ @grafana/partner-datasources -/public/app/plugins/datasource/graphite/ @grafana/partner-datasources -/public/app/plugins/datasource/influxdb/ @grafana/partner-datasources -/public/app/plugins/datasource/jaeger/ @grafana/oss-big-tent -/public/app/plugins/datasource/loki/ @grafana/observability-logs -/public/app/plugins/datasource/mixed/ @grafana/dashboards-squad -/public/app/plugins/datasource/mssql/ @grafana/partner-datasources -/public/app/plugins/datasource/mysql/ @grafana/oss-big-tent -/public/app/plugins/datasource/opentsdb/ @grafana/partner-datasources -/public/app/plugins/datasource/grafana-postgresql-datasource/ @grafana/oss-big-tent -/public/app/plugins/datasource/prometheus/ @grafana/observability-metrics -/public/app/plugins/datasource/cloud-monitoring/ @grafana/partner-datasources -/public/app/plugins/datasource/zipkin/ @grafana/oss-big-tent -/public/app/plugins/datasource/tempo/ @grafana/observability-traces-and-profiling -/public/app/plugins/datasource/grafana-pyroscope-datasource/ @grafana/observability-traces-and-profiling -/public/app/plugins/datasource/parca/ @grafana/oss-big-tent -/public/app/plugins/datasource/alertmanager/ @grafana/alerting-squad - -# Grafana Sharing Squad -/public/app/features/dashboard-scene/sharing/ @grafana/sharing-squad -/public/app/features/dashboard/components/ShareModal/ @grafana/sharing-squad -/public/app/features/manage-dashboards/components/PublicDashboardListTable/ @grafana/sharing-squad -/public/app/features/dashboard/containers/PublicDashboardPage.tsx @grafana/sharing-squad -/public/app/features/manage-dashboards/components/SnapshotListTable.tsx @grafana/sharing-squad -/pkg/api/render.go @grafana/sharing-squad -/pkg/services/dashboardsnapshots/ @grafana/sharing-squad -/pkg/services/publicdashboards/ @grafana/sharing-squad -/pkg/services/rendering/ @grafana/sharing-squad - -# SSE - Server Side Expressions -/pkg/expr/ @grafana/observability-metrics - -# Cloud middleware -/grafana-mixin/ @grafana/grafana-backend-services-squad - -# Grafana authentication and authorization -/pkg/login/ @grafana/identity-squad -/pkg/services/accesscontrol/ @grafana/access-squad -/pkg/services/anonymous/ @grafana/identity-access-team -/pkg/services/auth/ @grafana/identity-squad -/pkg/services/authn/ @grafana/identity-squad -/pkg/services/authz/ @grafana/access-squad -/pkg/services/signingkeys/ @grafana/identity-squad -/pkg/services/dashboards/accesscontrol.go @grafana/access-squad -/pkg/services/datasources/guardian/ @grafana/access-squad -/pkg/services/guardian/ @grafana/access-squad -/pkg/services/ldap/ @grafana/identity-squad -/pkg/services/login/ @grafana/identity-squad -/pkg/services/loginattempt/ @grafana/identity-squad -/pkg/services/extsvcauth/ @grafana/identity-access-team -/pkg/services/oauthtoken/ @grafana/identity-squad -/pkg/services/serviceaccounts/ @grafana/identity-squad -/public/app/core/components/RolePicker/ @grafana/access-squad - -# Support bundles -/public/app/features/support-bundles/ @grafana/identity-access-team -/pkg/services/supportbundles/ @grafana/identity-access-team - -# Grafana Operator Experience Team -/pkg/services/caching/ @grafana/grafana-operator-experience-squad -/pkg/services/cloudmigration/ @grafana/grafana-operator-experience-squad -/pkg/services/gcom/ @grafana/grafana-operator-experience-squad - -# Feature toggles -/pkg/services/featuremgmt/ @grafana/grafana-backend-services-squad - - -# Kind definitions -/kinds/dashboard @grafana/dashboards-squad -/kinds/ @grafana/grafana-as-code - -# Kind system and code generation -embed.go @grafana/grafana-as-code -/pkg/kinds/ @grafana/grafana-as-code -/pkg/registry/ @grafana/grafana-as-code -/pkg/registry/apis/ @grafana/grafana-app-platform-squad -/pkg/registry/apis/alerting @grafana/grafana-app-platform-squad @grafana/alerting-backend -/pkg/codegen/ @grafana/grafana-as-code -/pkg/codegen/generators @grafana/grafana-as-code -/pkg/kinds/*/*_gen.go @grafana/grafana-as-code -/pkg/registry/schemas/ @grafana/grafana-as-code -/public/app/plugins/*gen.go @grafana/grafana-as-code -/cue.mod/ @grafana/grafana-as-code - -# GitHub Workflows and Templates -/.github/CODEOWNERS @tolzhabayev -/.github/ISSUE_TEMPLATE/ @torkelo @sympatheticmoose -/.github/PULL_REQUEST_TEMPLATE.md @torkelo -/.github/bot.md @torkelo -/.github/commands.json @torkelo -/.github/dependabot.yml @grafana/frontend-ops -/.github/issue-opened.json @grafana/grafana-community-support -/.github/metrics-collector.json @torkelo -/.github/pr-checks.json @marefr -/.github/pr-commands.json @marefr -/.github/renovate.json5 @grafana/frontend-ops -/.github/teams.yml @armandgrillet -/.github/workflows/alerting-swagger-gen.yml @grafana/alerting-backend -/.github/workflows/auto-milestone.yml @grafana/grafana-release-guild -/.github/workflows/backport.yml @grafana/grafana-release-guild -/.github/workflows/bump-version.yml @grafana/grafana-release-guild -/.github/workflows/close-milestone.yml @grafana/grafana-release-guild -/.github/workflows/release-pr.yml @grafana/grafana-release-guild -/.github/workflows/release-comms.yml @grafana/grafana-release-guild -/.github/workflows/codeowners-validator.yml @tolzhabayev -/.github/workflows/codeql-analysis.yml @DanCech -/.github/workflows/commands.yml @torkelo -/.github/workflows/community-release.yml @grafana/grafana-release-guild -/.github/workflows/detect-breaking-changes-* @grafana/plugins-platform-frontend -/.github/workflows/doc-validator.yml @grafana/docs-tooling -/.github/workflows/epic-add-to-platform-ux-parent-project.yml @meanmina -/.github/workflows/github-release.yml @grafana/grafana-release-guild -/.github/workflows/issue-labeled.yml @armandgrillet -/.github/workflows/issue-opened.yml @grafana/grafana-community-support -/.github/workflows/metrics-collector.yml @torkelo -/.github/workflows/milestone.yml @marefr -/.github/workflows/pr-checks.yml @marefr -/.github/workflows/pr-codeql-analysis-go.yml @DanCech -/.github/workflows/pr-codeql-analysis-javascript.yml @DanCech -/.github/workflows/pr-codeql-analysis-python.yml @DanCech -/.github/workflows/pr-commands.yml @marefr -/.github/workflows/pr-patch-check.yml @grafana/grafana-release-guild -/.github/workflows/sync-mirror.yml @grafana/grafana-release-guild -/.github/workflows/publish-technical-documentation-next.yml @grafana/docs-tooling -/.github/workflows/publish-technical-documentation-release.yml @grafana/docs-tooling -/.github/workflows/remove-milestone.yml @grafana/grafana-release-guild -/.github/workflows/sbom-report.yml @grafana/security-team -/.github/workflows/scripts/json-file-to-job-output.js @grafana/plugins-platform-frontend -/.github/workflows/scripts/pr-get-job-link.js @grafana/plugins-platform-frontend -/.github/workflows/stale.yml @grafana/grafana-release-guild -/.github/workflows/update-changelog.yml @grafana/grafana-release-guild -/.github/workflows/update-make-docs.yml @grafana/docs-tooling -/.github/workflows/scripts/kinds/verify-kinds.go @grafana/platform-cat -/.github/workflows/publish-kinds-next.yml @grafana/platform-cat -/.github/workflows/publish-kinds-release.yml @grafana/platform-cat -/.github/workflows/verify-kinds.yml @grafana/platform-cat -/.github/workflows/dashboards-issue-add-label.yml @grafana/dashboards-squad -/.github/workflows/ephemeral-instances-pr-comment.yml @grafana/grafana-backend-services-squad -/.github/workflows/create-security-patch-from-security-mirror.yml @grafana/grafana-release-guild -/.github/workflows/core-plugins-build-and-release.yml @grafana/plugins-platform-frontend @grafana/plugins-platform-backend -/.github/workflows/i18n-crowdin-upload.yml @grafana/grafana-frontend-platform -/.github/workflows/i18n-crowdin-download.yml @grafana/grafana-frontend-platform -/.github/workflows/pr-go-workspace-check.yml @grafana/grafana-app-platform-squad -/.github/workflows/pr-k8s-codegen-check.yml @grafana/grafana-app-platform-squad -/.github/workflows/run-scenes-e2e.yml @grafana/dashboards-squad -/.github/workflows/go_lint.yml @grafana/grafana-backend-services-squad -/.github/workflows/trivy-scan.yml @grafana/grafana-backend-services-squad -/.github/workflows/changelog.yml @zserge -/.github/workflows/actions/changelog @zserge - -# Generated files not requiring owner approval -/packages/grafana-data/src/types/featureToggles.gen.ts @grafanabot -/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md @grafanabot -/pkg/services/featuremgmt/toggles_gen.csv @grafanabot -/pkg/services/featuremgmt/toggles_gen.go @grafanabot -/public/emails/ @grafanabot - -# Conf -/conf/defaults.ini @torkelo -/conf/sample.ini @torkelo -/conf/ldap.toml @grafana/identity-squad -/conf/ldap_multiple.toml @grafana/identity-squad -/conf/provisioning/access-control/ @grafana/access-squad -/conf/provisioning/alerting/ @grafana/alerting-backend -/conf/provisioning/dashboards/ @grafana/dashboards-squad -/conf/provisioning/datasources/ @grafana/plugins-platform-backend -/conf/provisioning/plugins/ @grafana/plugins-platform-backend diff --git a/.github/ISSUE_TEMPLATE/2-accessibility.md b/.github/ISSUE_TEMPLATE/2-accessibility.md deleted file mode 100644 index 51b3ecc255b6b..0000000000000 --- a/.github/ISSUE_TEMPLATE/2-accessibility.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -name: Accessibility issue -about: Help make Grafana be better at keyboard navigation, screen-readable and accessible to all. -labels: 'type: accessibility' ---- - - - -**Steps to reproduce**: - -**Actual Result**: - -**Expected Result** - -**Relevant WCAG Criteria:** [#.#.# WCAG Criterion](link to https://www.w3.org/WAI/WCAG21/quickref/?versions=2.0) - -**Environment**: -- Grafana version: -- Data source type & version: -- User OS & Browser: -- Others: diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 8211d8ee69ce0..0000000000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,5 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: Questions & Help - url: https://community.grafana.com - about: Please ask and answer questions here. diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 116beb08dafb0..0000000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,50 +0,0 @@ - - -**What is this feature?** - -[Add a brief description of what the feature or update does.] - -**Why do we need this feature?** - -[Add a description of the problem the feature is trying to solve.] - -**Who is this feature for?** - -[Add information on what kind of user the feature is for.] - -**Which issue(s) does this PR fix?**: - - - -Fixes # - -**Special notes for your reviewer:** - -Please check that: -- [ ] It works as expected from a user's perspective. -- [ ] If this is a pre-GA feature, it is behind a feature toggle. -- [ ] The docs are updated, and if this is a [notable improvement](https://grafana.com/docs/writers-toolkit/contribute/release-notes/#how-to-determine-if-content-belongs-in-whats-new), it's added to our [What's New](https://grafana.com/docs/writers-toolkit/contribute/release-notes/) doc. diff --git a/.github/bot.md b/.github/bot.md deleted file mode 100644 index 6eae334f4fa8c..0000000000000 --- a/.github/bot.md +++ /dev/null @@ -1,30 +0,0 @@ -# GitHub & grafanabot automation - -The bot is configured via [commands.json](https://github.com/grafana/grafana/blob/main/.github/commands.json) and some other GitHub workflows [workflows](https://github.com/grafana/grafana/tree/main/.github/workflows). - -Comment commands: - -* Write the word `/duplicate #` anywhere in a comment and the bot will add the correct label and standard message. -* Write the word `/needsMoreInfo` anywhere in a comment and the bot will add the correct label and standard message. - -Label commands: - -* Add label `bot/question` the bot will close with standard question message and add label `type/question` -* Add label `bot/duplicate` the bot will close with standard duplicate message and add label `type/duplicate` -* Add label `bot/needs more info` for bot to request more info (or use comment command mentioned above) -* Add label `bot/close feature request` for bot to close a feature request with standard message and adds label `not implemented` -* Add label `bot/no new info` for bot to close an issue where we asked for more info but has not received any updates in at least 14 days. - -## Metrics - -Metrics are configured in [metrics-collector.json](https://github.com/grafana/grafana/blob/main/.github/metrics-collector.json) and are also defined in the -[metrics-collector](https://github.com/grafana/grafana-github-actions/blob/main/metrics-collector/index.ts) GitHub action. - -## Backport PR - -To automatically backport a PR to a release branch like v7.3.x add a label named `backport v7.3.x`. The label name should follow the pattern `backport `. Once merged grafanabot will automatically -try to cherry-pick the PR merge commit into that branch and open a PR. You must then add the milestone to your backport PR. - -If there are merge conflicts the bot will write a comment on the source PR saying the cherry-pick failed. In this case you have to do the cherry pick and backport PR manually. - -The backport logic is written [here](https://github.com/grafana/grafana-github-actions/blob/main/backport/backport.ts) diff --git a/.github/commands.json b/.github/commands.json deleted file mode 100644 index 5f02fc4967e8e..0000000000000 --- a/.github/commands.json +++ /dev/null @@ -1,462 +0,0 @@ -[ - { - "type": "label", - "name": "bot/question", - "addLabel": "type/question", - "removeLabel": "bot/question", - "action": "close", - "comment": "Please ask your question on [community.grafana.com/](https://community.grafana.com/). To avoid having your issue closed in the future, please read our [CONTRIBUTING](https://github.com/grafana/grafana/blob/main/CONTRIBUTING.md) guidelines.\n\nHappy graphing!" - }, - { - "type": "comment", - "name": "duplicate", - "allowUsers": [], - "action": "close", - "addLabel": "type/duplicate" - }, - { - "type": "label", - "name": "bot/duplicate", - "addLabel": "type/duplicate", - "removeLabel": "bot/duplicate", - "action": "close", - "comment": "Thanks for creating this issue! It looks like this has already been reported by another user. We’ve closed this in favor of the existing one. Please consider adding any details you think is missing to that issue.\n\nTo avoid having your issue closed in the future, please read our [CONTRIBUTING](https://github.com/grafana/grafana/blob/main/CONTRIBUTING.md) guidelines.\n\nHappy graphing!" - }, - { - "type": "comment", - "name": "needsMoreInfo", - "allowUsers": [], - "action": "updateLabels", - "addLabel": "bot/needs more info" - }, - { - "type": "label", - "name": "bot/needs more info", - "action": "updateLabels", - "addLabel": "needs more info", - "removeLabel": "bot/needs more info", - "comment": "Thanks for creating this issue! We think it's missing some basic information. \r\n\r\nFollow the issue template and add additional information that will help us replicate the problem. \r\nFor data visualization issues: \r\n- Query results from the inspect drawer (data tab & query inspector)\r\n- Panel settings can be extracted in the panel inspect drawer JSON tab\r\n\r\nFor dashboard related issues: \r\n- Dashboard JSON can be found in the dashboard settings JSON model view\r\n\r\nFor authentication, provisioning and alerting issues, Grafana server logs are useful. \r\n\r\nHappy graphing!" - }, - { - "type": "label", - "name": "bot/no new info", - "action": "close", - "removeLabel": "needs more info", - "comment": "We've closed this issue since it needs more information and hasn't had any activity recently. We can re-open it after you you add more information. To avoid having your issue closed in the future, please read our [CONTRIBUTING](https://github.com/grafana/grafana/blob/main/CONTRIBUTING.md) guidelines.\n\nHappy graphing!" - }, - { - "type": "label", - "name": "bot/close feature request", - "action": "close", - "addLabel": "not implemented", - "comment": "This feature request has been open for a long time with few received upvotes or comments, so we are closing it. We're trying to limit open GitHub issues in order to better track planned work and features. \r\n\r\nThis doesn't mean that we'll never ever implement it or that we will never accept a PR for it. A closed issue can still attract upvotes and act as a ticket to track feature demand\/interest. \r\n\r\nThank You to you for taking the time to create this issue!" - }, - { - "type": "label", - "name": "area/plugins-catalog", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/76" - } - }, - { - "type": "label", - "name": "type/docs", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/69" - } - }, - { - "type": "label", - "name": "datasource/Azure", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/190" - } - }, - { - "type": "label", - "name": "datasource/CloudWatch", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/97" - } - }, - { - "type": "label", - "name": "datasource/CloudWatch Logs", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/97" - } - }, - { - "type": "label", - "name": "datasource/GoogleCloudMonitoring", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/190" - } - }, - { - "type": "label", - "name": "datasource/Prometheus", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/112" - } - }, - { - "type": "label", - "name": "datasource/InfluxDB", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/190" - } - }, - { - "type": "label", - "name": "datasource/Graphite", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/190" - } - }, - { - "type": "label", - "name": "datasource/OpenTSDB", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/190" - } - }, - { - "type": "label", - "name": "datasource/Loki", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/203" - } - }, - { - "type": "label", - "name": "datasource/Tempo", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/221" - } - }, - { - "type": "label", - "name": "datasource/grafana-pyroscope", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/221" - } - }, - { - "type": "label", - "name": "datasource/Parca", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/221" - } - }, - { - "type": "label", - "name": "datasource/Elasticsearch", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/97" - } - }, - { - "type": "label", - "name": "datasource/Jaeger", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/221" - } - }, - { - "type": "label", - "name": "datasource/Zipkin", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/221" - } - }, - { - "type": "label", - "name": "area/explore", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/111" - } - }, - { - "type": "label", - "name": "team/operator-experience", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/336" - } - }, - { - "type": "label", - "name": "team/grafana-authnz", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/86" - } - }, - { - "type": "label", - "name": "area/auth", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/86" - } - }, - { - "type": "label", - "name": "area/auth/rbac", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/86" - } - }, - { - "type": "label", - "name": "area/auth/serviceaccount", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/86" - } - }, - { - "type": "label", - "name": "area/auth/authproxy", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/86" - } - }, - { - "type": "label", - "name": "area/auth/oauth", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/86" - } - }, - { - "type": "label", - "name": "area/auth/ldap", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/86" - } - }, - { - "type": "label", - "name": "area/auth/saml", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/86" - } - }, - { - "type": "label", - "name": "area/auth/apikeys", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/86" - } - }, - { - "type": "label", - "name": "area/auth/dspermissions", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/86" - } - }, - { - "type": "label", - "name": "area/auth/teamsync", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/86" - } - }, - { - "type": "label", - "name": "area/internationalization", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/78" - } - }, - { - "type": "label", - "name": "area/panel/candlestick", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/canvas", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/barchart", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/bargauge", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/gauge", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/geomap", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/graph", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/heatmap", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/histogram", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/piechart", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/stat", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/state-timeline", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/status-history", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/timeseries", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/xychart", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/trend", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/panel/table", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/tooltip", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "area/legend", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/56" - } - }, - { - "type": "label", - "name": "grafana program", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/471" - } - } -] \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml deleted file mode 100644 index 5db8a10262655..0000000000000 --- a/.github/dependabot.yml +++ /dev/null @@ -1,10 +0,0 @@ -version: 2 -updates: - - package-ecosystem: "github-actions" - directory: "/" - schedule: - interval: "daily" - - package-ecosystem: "gomod" - directory: "/" - schedule: - interval: "weekly" diff --git a/.github/metrics-collector.json b/.github/metrics-collector.json deleted file mode 100644 index fc717a749084c..0000000000000 --- a/.github/metrics-collector.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "queries": [ - { - "name": "type_bug", - "query": "label:\"type/bug\" is:issue is:open" - }, - { - "name": "type_docs", - "query": "label:\"type/docs\" is:issue is:open" - }, - { - "name": "needs_investigation", - "query": "label:\"needs investigation\" is:issue is:open" - }, - { - "name": "needs_more_info", - "query": "label:\"needs more info\" is:issue is:open" - }, - { - "name": "triage_needs_confirmation", - "query": "label:\"triage/needs-confirmation\" is:issue is:open" - }, - { - "name": "unlabeled", - "query": "is:open is:issue no:label" - }, - { - "name": "open_prs", - "query": "is:open is:pull-request" - } - ] -} \ No newline at end of file diff --git a/.github/pr-checks.json b/.github/pr-checks.json deleted file mode 100644 index fb0aa6040025e..0000000000000 --- a/.github/pr-checks.json +++ /dev/null @@ -1,23 +0,0 @@ -[ - { - "type": "check-changelog", - "title": "Changelog Check", - "labels": { - "exists": "Changelog enabled", - "notExists": "Changelog decision needed", - "matches": [ - "add to changelog" - ] - }, - "breakingChangeLabels": [ - "breaking change" - ], - "skip": { - "message": "Changelog skipped", - "matches": [ - "no-changelog" - ] - }, - "targetUrl": "https://github.com/grafana/grafana/blob/main/contribute/merge-pull-request.md#include-in-changelog-and-release-notes" - } -] \ No newline at end of file diff --git a/.github/pr-commands.json b/.github/pr-commands.json deleted file mode 100644 index fa5dd96fd953a..0000000000000 --- a/.github/pr-commands.json +++ /dev/null @@ -1,440 +0,0 @@ -[ - { - "type": "changedfiles", - "matches": [ - "docs/**/*", - "contribute/**/*" - ], - "action": "updateLabel", - "addLabel": "type/docs" - }, - { - "type": "changedfiles", - "matches": [ - "public/**/*", - "packages/**/*", - "e2e/**/*", - "plugins-bundled/**/*", - "scripts/build/release-packages.sh", - "scripts/circle-release-next-packages.sh", - "scripts/ci-frontend-metrics.sh", - "scripts/grunt/**/*", - "scripts/webpack/**/*", - "package.json", - "tsconfig.json", - "lerna.json", - ".prettierrc.js", - ".eslintrc", - "**/*.mdx" - ], - "action": "updateLabel", - "addLabel": "area/frontend" - }, - { - "type": "changedfiles", - "matches": [ - "**/*.go", - "go.mod", - "go.sum", - "contribute/style-guides/backend.md", - "contribute/architecture/backend/**/*" - ], - "action": "updateLabel", - "addLabel": "area/backend" - }, - { - "type": "changedfiles", - "matches": [ - "pkg/services/sqlstore/migrations/**/*", - "**/*_mig.go" - ], - "action": "updateLabel", - "addLabel": "area/backend/db/migration" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/features/explore/**/*" - ], - "action": "updateLabel", - "addLabel": "area/explore" - }, - { - "type": "changedfiles", - "matches": [ - ".circleci/**/*", - "packaging/**/*", - "scripts/build/**/*", - "scripts/*.sh", - "Makefile", - "Dockerfile" - ], - "action": "updateLabel", - "addLabel": "type/build-packaging" - }, - { - "type": "changedfiles", - "matches": [ - "scripts/*.star", - ".drone.star", - ".drone.yml" - ], - "action": "updateLabel", - "addLabel": "type/ci" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/azuremonitor/**/*", - "pkg/tsdb/azuremonitor/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/Azure" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/cloud-monitoring/**/*", - "pkg/tsdb/cloud-monitoring/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/GoogleCloudMonitoring" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/cloudwatch/**/*", - "pkg/tsdb/cloudwatch/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/CloudWatch" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/elasticsearch/**/*", - "pkg/tsdb/elasticsearch/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/Elasticsearch" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/graphite/**/*", - "pkg/tsdb/graphite/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/Graphite" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/influxdb/**/*", - "pkg/tsdb/influx/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/InfluxDB" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/jaeger/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/Jaeger" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/loki/**/*", - "pkg/tsdb/loki/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/Loki" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/mssql/**/*", - "pkg/tsdb/mssql/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/MSSQL" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/mysql/**/*", - "pkg/tsdb/mysql/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/MySQL" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/opentsdb/**/*", - "pkg/tsdb/opentsdb/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/OpenTSDB" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/parca/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/Parca" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/grafana-pyroscope-datasource/**/*", - "pkg/tsdb/grafana-pyroscope-datasource/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/grafana-pyroscope" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/grafana-postgresql-datasource/**/*", - "pkg/tsdb/grafana-postgresql-datasource/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/Postgres" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/prometheus/**/*", - "pkg/tsdb/prometheus/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/Prometheus" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/tempo/**/*", - "pkg/tsdb/tempo/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/Tempo" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/datasource/zipkin/**/*" - ], - "action": "updateLabel", - "addLabel": "datasource/Zipkin" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/features/variables/**/*", - "public/app/features/templating/**/*" - ], - "action": "updateLabel", - "addLabel": "area/dashboard/templating" - }, - { - "type": "changedfiles", - "matches": [ - "/pkg/services/ngalert/**/*", - "/pkg/services/sqlstore/migrations/ualert/**/*", - "/pkg/services/alerting/**/*", - "/public/app/features/alerting/**/*", - "/pkg/tests/api/alerting/**/*" - ], - "action": "updateLabel", - "addLabel": "area/alerting" - }, - { - "type": "author", - "name": "pr/external", - "notMemberOf": { - "org": "grafana" - }, - "ignoreList": [ - "renovate[bot]", - "dependabot[bot]", - "grafana-delivery-bot[bot]", - "grafanabot" - ], - "action": "updateLabel", - "addLabel": "pr/external" - }, - { - "type": "label", - "name": "type/docs", - "action": "addToProject", - "addToProject": { - "url": "https://github.com/orgs/grafana/projects/69" - } - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/candlestick/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/candlestick" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/canvas/**/*", - "/public/app/features/canvas/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/canvas" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/barchart/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/barchart" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/geomap/**/*", - "/public/app/features/geo/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/geomap" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/graph/**/*", - "/packages/grafana-ui/src/components/Graph/**/*", - "/packages/grafana-ui/src/components/GraphNG/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/graph" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/heatmap/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/heatmap" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/histogram/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/histogram" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/state-timeline/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/state-timeline" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/status-history/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/status-history" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/timeseries/**/*", - "/packages/grafana-ui/src/components/TimeSeries/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/timeseries" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/xychart/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/xychart" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/trend/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/trend" - }, - { - "type": "changedfiles", - "matches": [ - "/packages/grafana-ui/src/components/VizLegend/**/*" - ], - "action": "updateLabel", - "addLabel": "area/legend" - }, - { - "type": "changedfiles", - "matches": [ - "/packages/grafana-ui/src/components/VizTooltip/**/*", - "public/app/feature/visualization/data-hover/**/*" - ], - "action": "updateLabel", - "addLabel": "area/tooltip" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/gauge/**/*", - "/packages/grafana-ui/src/components/Gauge/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/gauge" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/bargauge/**/*", - "/packages/grafana-ui/src/components/BarGauge/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/bargauge" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/stat/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/stat" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/piechart/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/piechart" - }, - { - "type": "changedfiles", - "matches": [ - "public/app/plugins/panel/table/**/*", - "/packages/grafana-ui/src/components/Table/**/*" - ], - "action": "updateLabel", - "addLabel": "area/panel/table" - } -] \ No newline at end of file diff --git a/.github/renovate.json5 b/.github/renovate.json5 deleted file mode 100644 index 047d57f0a4a18..0000000000000 --- a/.github/renovate.json5 +++ /dev/null @@ -1,97 +0,0 @@ -{ - "extends": [ - "config:base" - ], - "enabledManagers": ["npm"], - "ignoreDeps": [ - "@types/history", // this can be removed entirely when we upgrade history since v5 exposes types directly - "history", // we should bump this together with react-router-dom (see https://github.com/grafana/grafana/issues/76744) - "react-router-dom", // we should bump this together with history (see https://github.com/grafana/grafana/issues/76744) - "loader-utils", // v3 requires upstream changes in ngtemplate-loader. ignore, and remove when we remove angular. - "monaco-editor", // due to us exposing this via @grafana/ui/CodeEditor's props bumping can break plugins - "@fingerprintjs/fingerprintjs", // we don't want to bump to v4 due to licensing changes - "@swc/core", // versions ~1.4.5 contain multiple bugs related to baseUrl resolution breaking builds. - "slate", // we don't want to continue using this on the long run, use Monaco editor instead of Slate - "slate-react", // we don't want to continue using this on the long run, use Monaco editor instead of Slate - "@types/slate-react", // we don't want to continue using this on the long run, use Monaco editor instead of Slate - "@types/slate" // we don't want to continue using this on the long run, use Monaco editor instead of Slate - ], - "includePaths": ["package.json", "packages/**", "public/app/plugins/**"], - "ignorePaths": ["emails/**", "plugins-bundled/**", "**/mocks/**"], - "labels": ["area/frontend", "dependencies", "no-changelog"], - "postUpdateOptions": ["yarnDedupeHighest"], - "packageRules": [ - { - "automerge": true, - "matchCurrentVersion": "!/^0/", - "matchUpdateTypes": ["patch"], - "excludePackagePatterns": ["^@?storybook", "^@locker"] - }, - { - "matchPackagePatterns": ["^@?storybook"], - "extends": ["schedule:monthly"], - "groupName": "Storybook updates" - }, - { - "groupName": "React Aria", - "matchPackagePrefixes": [ - "@react-aria/", - "@react-stately/" - ] - }, - { - "groupName": "Moveable", - "matchPackageNames": [ - "moveable", - "react-moveable" - ] - }, - { - "groupName": "Slate", - "matchPackageNames": [ - "@types/slate", - "@types/slate-react", - "slate", - "slate-react" - ] - }, - { - "groupName": "d3", - "matchPackagePrefixes": [ - "d3", - "@types/d3" - ] - }, - { - "groupName": "visx", - "matchPackagePrefixes": [ - "@visx/" - ] - }, - { - "groupName": "uLibraries", - "matchPackageNames": [ - "@leeoniya/ufuzzy", - "uplot" - ], - "reviewers": ["leeoniya"], - }, - { - "groupName": "locker", - "matchPackagePrefixes": [ - "@locker/" - ], - "reviewers": ["team:grafana/plugins-platform-frontend"], - }, - ], - "pin": { - "enabled": false - }, - "prConcurrentLimit": 10, - "rebaseWhen": "conflicted", - "reviewers": ["team:grafana/frontend-ops"], - "separateMajorMinor": false, - "vulnerabilityAlerts": { - "addLabels": ["area/security"] - } -} diff --git a/.github/teams.yml b/.github/teams.yml deleted file mode 100644 index 94b55fc28dfce..0000000000000 --- a/.github/teams.yml +++ /dev/null @@ -1,104 +0,0 @@ -# The first keys are labels used on issues. All fields are optional. -# Example -test: - # channel-label is used to send a message to a specific channel - # when the label "test" is added to an issue. - channel-label: CXXXXXXXXXX - -# Alerting team -area/alerting: - channel-label: C028MCV4R7C - exclude-github-team: alerting-squad - -# DataViz squad -area/dataviz: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/legend: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/barchart: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/bargauge: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/candlestick: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/canvas: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/common: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/gauge: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/geomap: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/graph: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/heatmap: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/histogram: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/piechart: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/stat: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/state-timeline: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/status-history: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/timeseries: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/trend: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/panel/xychart: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/tooltip: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/transformations: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/value-mapping: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad - -area/units: - channel-label: C04J73AAQ87 # grafana-dataviz - exclude-github-team: dataviz-squad diff --git a/.github/workflows/alerting-swagger-gen.yml b/.github/workflows/alerting-swagger-gen.yml deleted file mode 100644 index 7c3af87837fb0..0000000000000 --- a/.github/workflows/alerting-swagger-gen.yml +++ /dev/null @@ -1,37 +0,0 @@ -on: - workflow_dispatch: - schedule: - - cron: '0 0 * * 1' - -jobs: - gen-swagger: - name: Alerting Swagger spec generation cron job - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - fetch-depth: 2 - - name: Set go version - uses: actions/setup-go@v4 - with: - go-version-file: go.mod - - name: Build swagger - run: | - make -C pkg/services/ngalert/api/tooling post.json api.json - - name: Open Pull Request - uses: peter-evans/create-pull-request@v5 - with: - token: ${{ secrets.GITHUB_TOKEN }} - commit-message: "chore: update alerting swagger spec" - title: "Alerting: Update Swagger spec" - body: | - This is an automated pull request to update the alerting swagger spec. - Please review and merge. - branch: update-alerting-swagger-spec - delete-branch: true - labels: 'area/alerting,type/docs,no-changelog' - team-reviewers: 'grafana/alerting-backend' - draft: false - diff --git a/.github/workflows/auto-milestone.yml b/.github/workflows/auto-milestone.yml deleted file mode 100644 index 0697888fba011..0000000000000 --- a/.github/workflows/auto-milestone.yml +++ /dev/null @@ -1,27 +0,0 @@ -name: Auto-milestone -on: - pull_request_target: - types: - - opened - - reopened - - closed - - ready_for_review - -permissions: - pull-requests: write - contents: write - -# Note: this action runs with write permissions on GITHUB_TOKEN even from forks -# so it must not run untrusted code (such as checking out the pull request) -jobs: - main: - runs-on: ubuntu-latest - if: github.event.pull_request.draft == false - steps: - # Note: Github will not trigger other actions from this because it uses - # the GITHUB_TOKEN token - - name: Run auto-milestone - uses: grafana/grafana-github-actions-go/auto-milestone@main - with: - pr: ${{ github.event.pull_request.number }} - token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml deleted file mode 100644 index 18407b67f761b..0000000000000 --- a/.github/workflows/backport.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Backport PR Creator -on: - pull_request_target: - types: - - closed - - labeled - -jobs: - main: - if: github.repository == 'grafana/grafana' - runs-on: ubuntu-latest - steps: - - name: Checkout Actions - uses: actions/checkout@v4 - with: - repository: "grafana/grafana-github-actions" - path: ./actions - ref: main - - name: Install Actions - run: npm install --production --prefix ./actions - - name: "Generate token" - id: generate_token - uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 - with: - app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }} - private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }} - - name: Run backport - uses: ./actions/backport - with: - metricsWriteAPIKey: ${{secrets.GRAFANA_MISC_STATS_API_KEY}} - token: ${{ steps.generate_token.outputs.token }} - labelsToAdd: "backport" - title: "[{{base}}] {{originalTitle}}" diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml deleted file mode 100644 index 5f0b7cf302067..0000000000000 --- a/.github/workflows/bump-version.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: Bump version -on: - workflow_dispatch: - inputs: - version: - description: 'Needs to match, exactly, the name of a milestone. The version to be released please respect: major.minor.patch, major.minor.patch-preview or major.minor.patch-preview format. example: 7.4.3, 7.4.3-preview or 7.4.3-preview1' - required: true - push: - default: true - required: false - dry_run: - default: false - required: false -jobs: - main: - runs-on: ubuntu-latest - steps: - - name: Checkout Grafana - uses: actions/checkout@v4 - - name: Update package.json versions - uses: ./pkg/build/actions/bump-version - with: - version: ${{ inputs.version }} - - if: ${{ inputs.push }} - name: Generate token - id: generate_token - uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 - with: - app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }} - private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }} - - if: ${{ inputs.push }} - name: Push & Create PR - run: | - git config --local user.name "github-actions[bot]" - git config --local user.email "github-actions[bot]@users.noreply.github.com" - git config --local --add --bool push.autoSetupRemote true - git checkout -b "bump-version/${{ github.run_id }}/${{ inputs.version }}" - git add . - git commit -m "bump version ${{ inputs.version }}" - git push - gh pr create --dry-run=${{ inputs.dry_run }} -l "type/ci" -l "no-changelog" -B "${{ github.ref_name }}" --title "Release: Bump version to ${{ inputs.version }}" --body "Updated version to ${{ inputs.version }}" - env: - GH_TOKEN: ${{ steps.generate_token.outputs.token }} diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index 48246cc7f425a..33c5cdaed492c 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -38,10 +38,12 @@ on: required: false default: false type: boolean + description: 'Dry run mode' latest: required: false default: false type: boolean + description: 'Generate changelog for the latest release' permissions: contents: write diff --git a/.github/workflows/close-milestone.yml b/.github/workflows/close-milestone.yml deleted file mode 100644 index 11613b5fab97d..0000000000000 --- a/.github/workflows/close-milestone.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Close milestone -on: - workflow_dispatch: - inputs: - version: - required: true - description: Needs to match, exactly, the name of a milestone - workflow_call: - inputs: - version_call: - description: Needs to match, exactly, the name of a milestone - required: true - type: string - -jobs: - main: - if: github.repository == 'grafana/grafana' - runs-on: ubuntu-latest - steps: - - name: Checkout Actions - uses: actions/checkout@v4 - with: - repository: "grafana/grafana-github-actions" - path: ./actions - ref: main - - name: Install Actions - run: npm install --production --prefix ./actions - - name: "Generate token" - id: generate_token - uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 - with: - app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }} - private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }} - - name: Close milestone (manually invoked) - if: ${{ github.event.inputs.version != '' }} - uses: ./actions/close-milestone - with: - token: ${{ steps.generate_token.outputs.token }} - - name: Close milestone (workflow invoked) - if: ${{ inputs.version_call != '' }} - uses: ./actions/close-milestone - with: - version_call: ${{ inputs.version_call }} - token: ${{ steps.generate_token.outputs.token }} diff --git a/.github/workflows/codeowners-validator.yml b/.github/workflows/codeowners-validator.yml deleted file mode 100644 index 12184b2f6803d..0000000000000 --- a/.github/workflows/codeowners-validator.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: "Codeowners Validator" - -on: - pull_request: - branches: [ main ] - -jobs: - codeowners-validator: - runs-on: ubuntu-latest - steps: - # Checks-out your repository, which is validated in the next step - - uses: actions/checkout@v4 - - name: GitHub CODEOWNERS Validator - uses: mszostok/codeowners-validator@v0.7.4 - # input parameters - with: - # ==== GitHub Auth ==== - - # "The list of checks that will be executed. By default, all checks are executed. Possible values: files,owners,duppatterns,syntax" - checks: "files,duppatterns,syntax" - - # "The comma-separated list of experimental checks that should be executed. By default, all experimental checks are turned off. Possible values: notowned,avoid-shadowing" - experimental_checks: "notowned,avoid-shadowing" - - # The repository path in which CODEOWNERS file should be validated." - repository_path: "." - - # Defines the level on which the application should treat check issues as failures. Defaults to warning, which treats both errors and warnings as failures, and exits with error code 3. Possible values are error and warning. Default: warning" - check_failure_level: "error" - - # The comma-separated list of patterns that should be ignored by not-owned-checker. For example, you can specify * and as a result, the * pattern from the CODEOWNERS file will be ignored and files owned by this pattern will be reported as unowned unless a later specific pattern will match that path. It's useful because often we have default owners entry at the begging of the CODOEWNERS file, e.g. * @global-owner1 @global-owner2" - not_owned_checker_skip_patterns: "" - - # Specifies whether CODEOWNERS may have unowned files. For example, `/infra/oncall-rotator/oncall-config.yml` doesn't have owner and this is not reported. - owner_checker_allow_unowned_patterns: "false" - - # Specifies whether only teams are allowed as owners of files. - owner_checker_owners_must_be_teams: "false" diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 14981389debf8..0000000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,70 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -name: "CodeQL" - -on: - workflow_dispatch: - push: - branches: [main, v1.8.x, v2.0.x, v2.1.x, v2.6.x, v3.0.x, v3.1.x, v4.0.x, v4.1.x, v4.2.x, v4.3.x, v4.4.x, v4.5.x, v4.6.x, v4.7.x, v5.0.x, v5.1.x, v5.2.x, v5.3.x, v5.4.x, v6.0.x, v6.1.x, v6.2.x, v6.3.x, v6.4.x, v6.5.x, v6.6.x, v6.7.x, v7.0.x, v7.1.x, v7.2.x] - paths-ignore: - - '**/*.cue' - - '**/*.json' - - '**/*.md' - - '**/*.txt' - - '**/*.yml' - schedule: - - cron: '0 4 * * 6' - -permissions: - security-events: write - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - if: github.repository == 'grafana/grafana' - - strategy: - fail-fast: false - matrix: - # Override automatic language detection by changing the below list - # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] - language: ['javascript', 'go', 'python'] - # Learn more... - # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 - - - if: matrix.language == 'go' - name: Set go version - uses: actions/setup-go@v4 - with: - go-version-file: go.mod - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - - if: matrix.language == 'go' - name: Build go files - run: | - go mod verify - make build-go - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/commands.yml b/.github/workflows/commands.yml deleted file mode 100644 index c0244a0274abf..0000000000000 --- a/.github/workflows/commands.yml +++ /dev/null @@ -1,41 +0,0 @@ -name: Run commands when issues are labeled or comments added -on: - issues: - types: [labeled, unlabeled] - issue_comment: - types: [created] -concurrency: - group: issue-commands-${{ github.event.issue.number }} -jobs: - config: - runs-on: "ubuntu-latest" - outputs: - has-secrets: ${{ steps.check.outputs.has-secrets }} - steps: - - name: "Check for secrets" - id: check - shell: bash - run: | - if [ -n "${{ (secrets.GRAFANA_MISC_STATS_API_KEY != '' && secrets.ISSUE_COMMANDS_TOKEN != '') || '' }}" ]; then - echo "has-secrets=1" >> "$GITHUB_OUTPUT" - fi - - main: - needs: config - if: needs.config.outputs.has-secrets - runs-on: ubuntu-latest - steps: - - name: Checkout Actions - uses: actions/checkout@v4 - with: - repository: "grafana/grafana-github-actions" - path: ./actions - ref: main - - name: Install Actions - run: npm install --production --prefix ./actions - - name: Run Commands - uses: ./actions/commands - with: - metricsWriteAPIKey: ${{secrets.GRAFANA_MISC_STATS_API_KEY}} - token: ${{secrets.ISSUE_COMMANDS_TOKEN}} - configPath: commands diff --git a/.github/workflows/community-release.yml b/.github/workflows/community-release.yml deleted file mode 100644 index 86e7703e5c421..0000000000000 --- a/.github/workflows/community-release.yml +++ /dev/null @@ -1,46 +0,0 @@ -name: Create community release post -on: - workflow_call: - inputs: - version: - type: string - required: true - description: 'Needs to match, exactly, the name of a milestone. The version to be released please respect: major.minor.patch, major.minor.patch-preview or major.minor.patch-preview format. example: 7.4.3, 7.4.3-preview or 7.4.3-preview1' - dry_run: - type: boolean - required: false - default: false - description: When enabled, this workflow will print a preview instead of creating an actual post. - secrets: - GRAFANA_MISC_STATS_API_KEY: - required: true - GRAFANABOT_FORUM_KEY: - required: true - workflow_dispatch: - inputs: - version: - type: string - required: true - description: 'Needs to match, exactly, the name of a milestone. The version to be released please respect: major.minor.patch, major.minor.patch-preview or major.minor.patch-preview format. example: 7.4.3, 7.4.3-preview or 7.4.3-preview1' - dry_run: - type: boolean - required: false - default: false - description: When enabled, this workflow will print a preview instead of creating an actual post. - -permissions: - contents: read - -jobs: - main: - runs-on: ubuntu-latest - steps: - - name: Run community-release (manually invoked) - uses: grafana/grafana-github-actions-go/community-release@main - with: - token: ${{ secrets.GITHUB_TOKEN }} - version: ${{ inputs.version }} - metrics_api_key: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }} - community_api_key: ${{ secrets.GRAFANABOT_FORUM_KEY }} - community_api_username: grafanabot - dry_run: ${{ inputs.dry_run }} diff --git a/.github/workflows/core-plugins-build-and-release.yml b/.github/workflows/core-plugins-build-and-release.yml deleted file mode 100644 index e4803a2208f67..0000000000000 --- a/.github/workflows/core-plugins-build-and-release.yml +++ /dev/null @@ -1,269 +0,0 @@ -name: Build and release core plugins - -on: - workflow_dispatch: - inputs: - plugin_id: - description: "ID of the plugin you want to publish" - required: true - type: choice - options: - - grafana-azure-monitor-datasource - - grafana-pyroscope-datasource - - grafana-testdata-datasource - - jaeger - - parca - - stackdriver - - tempo - - zipkin - -concurrency: - group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }}-${{ inputs.plugin_id }} - cancel-in-progress: true - -env: - GRABPL_VERSION: 3.0.44 - GCP_BUCKET: integration-artifacts # Dev: plugins-community-staging - GCOM_API: https://grafana.com # Dev: https://grafana-dev.com - -# These permissions are needed to assume roles from Github's OIDC. -permissions: - contents: read - id-token: write - -jobs: - build-and-publish: - name: Build and publish ${{ inputs.plugin_id }} - runs-on: ubuntu-latest - outputs: - type: ${{ steps.get_dir.outputs.dir }} - has_backend: ${{ steps.check_backend.outputs.has_backend }} - version: ${{ steps.build_frontend.outputs.version }} - steps: - - name: checkout - uses: actions/checkout@v4 - - name: Verify inputs - run: | - if [ -z ${{ inputs.plugin_id }} ]; then echo "Missing plugin ID"; exit 1; fi - - id: get-secrets - uses: grafana/shared-workflows/actions/get-vault-secrets@main - with: - # Secrets placed in the ci/repo/grafana// path in Vault - repo_secrets: | - PLUGINS_GOOGLE_CREDENTIALS=core-plugins-build-and-release:PLUGINS_GOOGLE_CREDENTIALS - PLUGINS_GRAFANA_API_KEY=core-plugins-build-and-release:PLUGINS_GRAFANA_API_KEY - PLUGINS_GCOM_TOKEN=core-plugins-build-and-release:PLUGINS_GCOM_TOKEN - - name: 'Authenticate to Google Cloud' - uses: 'google-github-actions/auth@v2' - with: - credentials_json: '${{ env.PLUGINS_GOOGLE_CREDENTIALS }}' - - name: 'Set up Cloud SDK' - uses: 'google-github-actions/setup-gcloud@v2' - - name: Setup nodejs environment - uses: actions/setup-node@v4 - with: - node-version-file: .nvmrc - cache: yarn - - name: Find plugin directory - shell: bash - id: get_dir - run: | - dir=$(dirname \ - $(egrep -lir --include=plugin.json --exclude-dir=dist \ - '"id": "${{ inputs.plugin_id }}"' \ - public/app/plugins \ - ) \ - ) - echo "dir=${dir}" >> $GITHUB_OUTPUT - - name: Install frontend dependencies - shell: bash - working-directory: ${{ steps.get_dir.outputs.dir }} - run: | - yarn install --immutable - - name: Download grabpl executable - shell: sh - working-directory: ${{ steps.get_dir.outputs.dir }} - run: | - [ ! -d ./bin ] && mkdir -pv ./bin || true - curl -fL -o ./bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v${{ env.GRABPL_VERSION }}/grabpl - chmod 0755 ./bin/grabpl - - name: Check backend - id: check_backend - shell: bash - run: | - if egrep -qr --include=main.go 'datasource.Manage\("${{ inputs.plugin_id }}"' pkg/tsdb; then - echo "has_backend=true" >> $GITHUB_OUTPUT - else - echo "has_backend=false" >> $GITHUB_OUTPUT - fi - - name: Setup golang environment - uses: actions/setup-go@v4 - if: steps.check_backend.outputs.has_backend == 'true' - with: - go-version-file: go.mod - - name: Install Mage - shell: bash - if: steps.check_backend.outputs.has_backend == 'true' - run: | - go install github.com/magefile/mage - - name: Check tools - shell: bash - working-directory: ${{ steps.get_dir.outputs.dir }} - run: | - echo "=======================================" - echo " Frontend tools" - echo "=======================================" - echo "-------- node version -----" - node --version - echo "-------- npm version -----" - npm --version - echo "-------- yarn version -----" - yarn --version - echo "=======================================" - echo " Misc tools" - echo "=======================================" - echo "-------- docker version -----" - docker --version - echo "-------- jq version -----" - jq --version - echo "-------- grabpl version -----" - ./bin/grabpl --version - echo "=======================================" - - name: Check backend tools - shell: bash - if: steps.check_backend.outputs.has_backend == 'true' - working-directory: ${{ steps.get_dir.outputs.dir }} - run: | - echo "=======================================" - echo " Backend tools" - echo "=======================================" - echo "-------- go version -----" - go version - echo "-------- mage version -----" - mage --version - echo "=======================================" - - name: build:frontend - shell: bash - id: build_frontend - run: | - command="plugin:build:commit" - if [ "$GITHUB_REF" != "refs/heads/main" ]; then - # Release branch, do not add commit hash to version - command="plugin:build" - fi - yarn $command --scope="@grafana-plugins/${{ inputs.plugin_id }}" - version=$(cat ${{ steps.get_dir.outputs.dir }}/dist/plugin.json | jq -r .info.version) - echo "version=${version}" >> $GITHUB_OUTPUT - - name: build:backend - if: steps.check_backend.outputs.has_backend == 'true' - shell: bash - env: - VERSION: ${{ steps.build_frontend.outputs.version }} - run: | - make build-plugin-go PLUGIN_ID=${{ inputs.plugin_id }} - - name: package - working-directory: ${{ steps.get_dir.outputs.dir }} - run: | - mkdir -p ci/jobs/package - bin/grabpl plugin package - env: - GRAFANA_API_KEY: ${{ env.PLUGINS_GRAFANA_API_KEY }} - PLUGIN_SIGNATURE_TYPE: grafana - - name: Check existing release - env: - GCOM_TOKEN: ${{ env.PLUGINS_GCOM_TOKEN }} - VERSION: ${{ steps.build_frontend.outputs.version }} - run: | - api_res=$(curl -X 'GET' -H "Authorization: Bearer $GCOM_TOKEN" \ - '${{ env.GCOM_API}}/api/plugins/${{ inputs.plugin_id }}?version=$VERSION' \ - -H 'accept: application/json') - api_res_code=$(echo $api_res | jq -r .code) - if [ "$api_res_code" = "NotFound" ]; then - echo "No existing release found" - else - echo "Expecting a missing release, got:" - echo $api_res - exit 1 - fi - - name: store build artifacts - uses: actions/upload-artifact@v4 - with: - name: build-artifacts - path: ${{ steps.get_dir.outputs.dir }}/ci/packages/*.zip - - name: Publish release to Google Cloud Storage - working-directory: ${{ steps.get_dir.outputs.dir }} - env: - VERSION: ${{ steps.build_frontend.outputs.version }} - run: | - echo "Publish release to Google Cloud Storage:" - touch ci/packages/windows ci/packages/darwin ci/packages/linux ci/packages/any - gsutil -m cp -r ci/packages/*windows* gs://${{ env.GCP_BUCKET }}/${{ inputs.plugin_id }}/release/${VERSION}/windows - gsutil -m cp -r ci/packages/*linux* gs://${{ env.GCP_BUCKET }}/${{ inputs.plugin_id }}/release/${VERSION}/linux - gsutil -m cp -r ci/packages/*darwin* gs://${{ env.GCP_BUCKET }}/${{ inputs.plugin_id }}/release/${VERSION}/darwin - gsutil -m cp -r ci/packages/*any* gs://${{ env.GCP_BUCKET }}/${{ inputs.plugin_id }}/release/${VERSION}/any - - name: Publish new plugin version on grafana.com - if: steps.check_backend.outputs.has_backend == 'true' - working-directory: ${{ steps.get_dir.outputs.dir }} - env: - GCOM_TOKEN: ${{ env.PLUGINS_GCOM_TOKEN }} - VERSION: ${{ steps.build_frontend.outputs.version }} - run: | - echo "Publish new plugin version on grafana.com:" - echo "Plugin version: ${VERSION}" - result=`curl -H "Authorization: Bearer $GCOM_TOKEN" -H "Content-Type: application/json" ${{ env.GCOM_API}}/api/plugins -d "{ - \"url\": \"https://github.com/grafana/grafana/tree/main/${{ steps.get_dir.outputs.dir }}\", - \"download\": { - \"linux-amd64\": { - \"url\": \"https://storage.googleapis.com/${{ env.GCP_BUCKET }}/${{ inputs.plugin_id }}/release/${VERSION}/linux/${{ inputs.plugin_id }}-${VERSION}.linux_amd64.zip\", - \"md5\": \"$(cat ci/packages/info-linux_amd64.json | jq -r .plugin.md5)\" - }, - \"linux-arm64\": { - \"url\": \"https://storage.googleapis.com/${{ env.GCP_BUCKET }}/${{ inputs.plugin_id }}/release/${VERSION}/linux/${{ inputs.plugin_id }}-${VERSION}.linux_arm64.zip\", - \"md5\": \"$(cat ci/packages/info-linux_arm64.json | jq -r .plugin.md5)\" - }, - \"linux-arm\": { - \"url\": \"https://storage.googleapis.com/${{ env.GCP_BUCKET }}/${{ inputs.plugin_id }}/release/${VERSION}/linux/${{ inputs.plugin_id }}-${VERSION}.linux_arm.zip\", - \"md5\": \"$(cat ci/packages/info-linux_arm.json | jq -r .plugin.md5)\" - }, - \"windows-amd64\": { - \"url\": \"https://storage.googleapis.com/${{ env.GCP_BUCKET }}/${{ inputs.plugin_id }}/release/${VERSION}/windows/${{ inputs.plugin_id }}-${VERSION}.windows_amd64.zip\", - \"md5\": \"$(cat ci/packages/info-windows_amd64.json | jq -r .plugin.md5)\" - }, - \"darwin-amd64\": { - \"url\": \"https://storage.googleapis.com/${{ env.GCP_BUCKET }}/${{ inputs.plugin_id }}/release/${VERSION}/darwin/${{ inputs.plugin_id }}-${VERSION}.darwin_amd64.zip\", - \"md5\": \"$(cat ci/packages/info-darwin_amd64.json | jq -r .plugin.md5)\" - }, - \"darwin-arm64\": { - \"url\": \"https://storage.googleapis.com/${{ env.GCP_BUCKET }}/${{ inputs.plugin_id }}/release/${VERSION}/darwin/${{ inputs.plugin_id }}-${VERSION}.darwin_arm64.zip\", - \"md5\": \"$(cat ci/packages/info-darwin_arm64.json | jq -r .plugin.md5)\" - } - } - }"` - if [[ "$(echo $result | jq -r .version)" == "null" ]]; then - echo "Failed to publish plugin version. Got:" - echo $result - exit 1 - fi - - name: Publish new plugin version on grafana.com (frontend only) - if: steps.check_backend.outputs.has_backend == 'false' - working-directory: ${{ steps.get_dir.outputs.dir }} - env: - GCOM_TOKEN: ${{ env.PLUGINS_GCOM_TOKEN }} - VERSION: ${{ steps.build_frontend.outputs.version }} - run: | - echo "Publish new plugin version on grafana.com:" - echo "Plugin version: ${VERSION}" - result=`curl -H "Authorization: Bearer $GCOM_TOKEN" -H "Content-Type: application/json" ${{ env.GCOM_API}}/api/plugins -d "{ - \"url\": \"https://github.com/grafana/grafana/tree/main/${{ steps.get_dir.outputs.dir }}\", - \"download\": { - \"any\": { - \"url\": \"https://storage.googleapis.com/${{ env.GCP_BUCKET }}/${{ inputs.plugin_id }}/release/${VERSION}/any/${{ inputs.plugin_id }}-${VERSION}.any.zip\", - \"md5\": \"$(cat ci/packages/info-any.json | jq -r .plugin.md5)\" - } - } - }"` - if [[ "$(echo $result | jq -r .version)" == "null" ]]; then - echo "Failed to publish plugin version. Got:" - echo $result - exit 1 - fi diff --git a/.github/workflows/create-security-patch-from-security-mirror.yml b/.github/workflows/create-security-patch-from-security-mirror.yml deleted file mode 100644 index e187149b8b47c..0000000000000 --- a/.github/workflows/create-security-patch-from-security-mirror.yml +++ /dev/null @@ -1,28 +0,0 @@ -# Owned by grafana-release-guild -# Intended to be dropped into the base repo (Ex: grafana/grafana) for use in the security mirror. -name: Create security patch -run-name: create-security-patch -on: - pull_request: - types: - - opened - - reopened - - synchronize - branches: - - "main" - - "v*.*.*" - -# This is run before the pull request has been merged, so we'll run against the src branch -jobs: - trigger_downstream_create_security_patch: - concurrency: create-patch-${{ github.ref_name }} - uses: grafana/security-patch-actions/.github/workflows/create-patch.yml@main - if: github.repository == 'grafana/grafana-security-mirror' - with: - repo: "${{ github.repository }}" - src_ref: "${{ github.head_ref }}" # this is the source branch name, Ex: "feature/newthing" - patch_ref: "${{ github.base_ref }}" # this is the target branch name, Ex: "main" - patch_repo: "grafana/grafana-security-patches" - patch_prefix: "${{ github.event.pull_request.number }}" - secrets: inherit - diff --git a/.github/workflows/dashboards-issue-add-label.yml b/.github/workflows/dashboards-issue-add-label.yml deleted file mode 100644 index 766c89c724265..0000000000000 --- a/.github/workflows/dashboards-issue-add-label.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: When an issue changes and it's part of the dashboards project, add the dashboards squad label -on: - issues: - types: [opened, closed, edited, reopened, assigned, unassigned, labeled, unlabeled] - -env: - GITHUB_TOKEN: ${{ secrets.ISSUE_COMMANDS_TOKEN }} - ORGANIZATION: ${{ github.repository_owner }} - REPO: ${{ github.event.repository.name }} - TARGET_PROJECT: 202 - LABEL_IDs: "LA_kwDOAOaWjc8AAAABT38U-A" - -concurrency: - group: issue-label-when-in-project-${{ github.event.number }} -jobs: - config: - runs-on: "ubuntu-latest" - outputs: - has-secrets: ${{ steps.check.outputs.has-secrets }} - steps: - - name: "Check for secrets" - id: check - shell: bash - run: | - if [ -n "${{ (secrets.ISSUE_COMMANDS_TOKEN != '') || '' }}" ]; then - echo "has-secrets=1" >> "$GITHUB_OUTPUT" - fi - - main: - needs: config - if: needs.config.outputs.has-secrets - runs-on: ubuntu-latest - steps: - - name: log in - run: gh api user -q .login - - name: Check if issue is in target project - run: | - gh api graphql -f query=' - query($org: String!, $repo: String!) { - repository(name: $repo, owner: $org) { - issue (number: ${{ github.event.issue.number }}) { - id - projectItems(first:20) { - nodes { - project { - number, - }, - } - } - } - } - }' -f org=$ORGANIZATION -f repo=$REPO > projects_data.json - - echo 'IN_TARGET_PROJ='$(jq '.data.repository.issue.projectItems.nodes[] | select(.project.number==${{ env.TARGET_PROJECT }}) | .project != null' projects_data.json) >> $GITHUB_ENV - echo 'ITEM_ID='$(jq '.data.repository.issue.id' projects_data.json) >> $GITHUB_ENV - - name: Set up label array - if: env.IN_TARGET_PROJ - run: | - IFS=',' read -ra LABEL_IDs <<< "${{ env.LABEL_IDs }}" - for item in "${LABEL_IDs[@]}"; do - echo "Item: $item" - done - - name: Add label to issue - if: env.IN_TARGET_PROJ - run: | - gh api graphql -f query=' - mutation ($labelableId: ID!, $labelIds: [ID!]!) { - addLabelsToLabelable( - input: {labelableId: $labelableId, labelIds: $labelIds} - ) { - clientMutationId - } - }' -f labelableId=$ITEM_ID -f labelIds=${{ env.LABEL_IDs }} diff --git a/.github/workflows/deploy-cloud-run-grafana-prod.yaml b/.github/workflows/deploy-cloud-run-grafana-prod.yaml new file mode 100644 index 0000000000000..1e08ef3ee7b51 --- /dev/null +++ b/.github/workflows/deploy-cloud-run-grafana-prod.yaml @@ -0,0 +1,46 @@ +name: Deploy Grafana Server Cloud Run on prod + +on: + push: + branches: + - coderabbit_micro_frontend + paths: + - "/**" + workflow_dispatch: + +jobs: + build_and_deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: google-github-actions/auth@v2 + with: + credentials_json: ${{ secrets.GOOGLECLOUDSA_PROD }} + + - uses: docker/setup-buildx-action@v3 + + - name: Cache Docker layers + uses: actions/cache@v4 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-${{ github.workflow }}-${{ github.sha }} + restore-keys: ${{ runner.os }}-${{ github.workflow }}- + + - run: gcloud auth configure-docker + + - uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: gcr.io/coderabbitprod/grafana:latest + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new + + - name: Move Docker cache + run: | + rm -rf /tmp/.buildx-cache + mv /tmp/.buildx-cache-new /tmp/.buildx-cache + + - name: Deploy to Cloud Run + run: gcloud run deploy grafana-internal --image gcr.io/coderabbitprod/grafana:latest --region us-central1 --allow-unauthenticated --vpc-connector=coderabbitaiprod-prod-cr diff --git a/.github/workflows/deploy-cloud-run-grafana.yaml b/.github/workflows/deploy-cloud-run-grafana.yaml new file mode 100644 index 0000000000000..56f45b5aa8248 --- /dev/null +++ b/.github/workflows/deploy-cloud-run-grafana.yaml @@ -0,0 +1,46 @@ +name: Deploy Grafana Server Cloud Run + +on: + push: + branches: + - coderabbit_micro_frontend + paths: + - "/**" + workflow_dispatch: + +jobs: + build_and_deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - uses: google-github-actions/auth@v2 + with: + credentials_json: ${{ secrets.GOOGLECLOUDSA }} + + - uses: docker/setup-buildx-action@v3 + + - name: Cache Docker layers + uses: actions/cache@v4 + with: + path: /tmp/.buildx-cache + key: ${{ runner.os }}-${{ github.workflow }}-${{ github.sha }} + restore-keys: ${{ runner.os }}-${{ github.workflow }}- + + - run: gcloud auth configure-docker + + - uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: gcr.io/coderabbit/grafana:latest + cache-from: type=local,src=/tmp/.buildx-cache + cache-to: type=local,dest=/tmp/.buildx-cache-new + + - name: Move Docker cache + run: | + rm -rf /tmp/.buildx-cache + mv /tmp/.buildx-cache-new /tmp/.buildx-cache + + - name: Deploy to Cloud Run + run: gcloud run deploy grafana --image gcr.io/coderabbit/grafana:latest --region us-central1 --allow-unauthenticated --vpc-connector=coderabbitai-dev-cr diff --git a/.github/workflows/doc-validator.yml b/.github/workflows/doc-validator.yml deleted file mode 100644 index 75b721904cc10..0000000000000 --- a/.github/workflows/doc-validator.yml +++ /dev/null @@ -1,29 +0,0 @@ -name: "doc-validator" -on: - pull_request: - paths: ["docs/sources/**"] - workflow_dispatch: -jobs: - doc-validator: - runs-on: "ubuntu-latest" - container: - image: "grafana/doc-validator:v5.0.0" - steps: - - name: "Checkout code" - uses: "actions/checkout@v4" - - name: "Run doc-validator tool" - # Only run doc-validator on specific directories. - run: > - doc-validator - '--include=^docs/sources/(?:alerting|fundamentals|getting-started|introduction|setup-grafana|upgrade-guide|whatsnew/whats-new-in-v(?:9|10))/.+\.md$' - '--skip-checks=^(?:image.+|canonical-does-not-match-pretty-URL)$' - ./docs/sources - /docs/grafana/latest - | reviewdog - -f=rdjsonl - --fail-on-error - --filter-mode=nofilter - --name=doc-validator - --reporter=github-pr-review - env: - REVIEWDOG_GITHUB_API_TOKEN: "${{ secrets.GITHUB_TOKEN }}" diff --git a/.github/workflows/ephemeral-instances-pr-comment.yml b/.github/workflows/ephemeral-instances-pr-comment.yml deleted file mode 100644 index be07b7ef6acab..0000000000000 --- a/.github/workflows/ephemeral-instances-pr-comment.yml +++ /dev/null @@ -1,61 +0,0 @@ -name: 'Ephemeral instances' -on: - issue_comment: - types: [created] - pull_request: - types: [closed] -jobs: - config: - runs-on: "ubuntu-latest" - outputs: - has-secrets: ${{ steps.check.outputs.has-secrets }} - steps: - - name: "Check for secrets" - id: check - shell: bash - run: | - if [ -n "${{ (secrets.EI_APP_ID != '' && - secrets.EI_APP_PRIVATE_KEY != '' && - secrets.EI_GCOM_HOST != '' && - secrets.EI_GCOM_TOKEN != '' && - secrets.EI_EPHEMERAL_INSTANCES_REGISTRY != '' && - secrets.EI_GCP_SERVICE_ACCOUNT_KEY_BASE64 != '' && - secrets.EI_EPHEMERAL_ORG_ID != '' - ) || '' }}" ]; then - echo "has-secrets=1" >> "$GITHUB_OUTPUT" - fi - - handle-pull-request-event: - needs: config - if: needs.config.outputs.has-secrets && - ${{ github.event.issue.pull_request && (startsWith(github.event.comment.body, '/deploy-to-hg') || github.event.action == 'closed') }} - runs-on: - labels: ubuntu-latest-8-cores - continue-on-error: true - steps: - - name: Generate a GitHub app installation token - id: generate_token - uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 - with: - app_id: ${{ secrets.EI_APP_ID }} - private_key: ${{ secrets.EI_APP_PRIVATE_KEY }} - - - name: Checkout ephemeral instances repository - uses: actions/checkout@v4 - with: - repository: grafana/ephemeral-grafana-instances-github-action - token: ${{ steps.generate_token.outputs.token }} - ref: main - path: ephemeral - - - name: build and deploy ephemeral instance - uses: ./ephemeral - with: - github-token: ${{ steps.generate_token.outputs.token }} - gcom-host: ${{ secrets.EI_GCOM_HOST }} - gcom-token: ${{ secrets.EI_GCOM_TOKEN }} - registry: "${{ secrets.EI_EPHEMERAL_INSTANCES_REGISTRY }}" - gcp-service-account-key: "${{ secrets.EI_GCP_SERVICE_ACCOUNT_KEY_BASE64 }}" - ephemeral-org-id: "${{ secrets.EI_EPHEMERAL_ORG_ID }}" - oss-or-enterprise: oss - verbose: true diff --git a/.github/workflows/github-release.yml b/.github/workflows/github-release.yml deleted file mode 100644 index a46a12134bfe4..0000000000000 --- a/.github/workflows/github-release.yml +++ /dev/null @@ -1,48 +0,0 @@ -name: Create or update GitHub release -on: - workflow_call: - inputs: - version: - required: true - description: Needs to match, exactly, the name of a milestone (NO v prefix) - type: string - latest: - required: false - default: false - description: Mark this release as latest (`1`) or not (`0`, default) - type: string - dry_run: - required: false - default: false - type: boolean - workflow_dispatch: - inputs: - version: - required: true - description: Needs to match, exactly, the name of a milestone (NO v prefix) - type: string - latest: - required: false - description: Mark this release as latest (`1`) or not (`0`, default) - type: string - dry_run: - required: false - default: false - type: boolean - -permissions: - # contents: write allows the action(s) to create github releases - contents: write - -jobs: - main: - runs-on: ubuntu-latest - steps: - - name: Create GitHub release (manually invoked) - uses: grafana/grafana-github-actions-go/github-release@main - with: - token: ${{ secrets.GITHUB_TOKEN }} - version: ${{ inputs.version }} - metrics_api_key: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }} - latest: ${{ inputs.latest }} - dry_run: ${{ inputs.dry_run }} diff --git a/.github/workflows/go_lint.yml b/.github/workflows/go_lint.yml deleted file mode 100644 index d4ac5e4934653..0000000000000 --- a/.github/workflows/go_lint.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: golangci-lint -on: - push: - paths: - - pkg/** - - .github/workflows/go_lint.yml - - go.* - branches: - - main - pull_request: - -permissions: - contents: read - -jobs: - lint-go: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-go@v5 - with: - go-version-file: ./go.mod - - run: CODEGEN_VERIFY=1 make gen-cue - - run: make gen-go - - name: golangci-lint - uses: golangci/golangci-lint-action@v6 - with: - version: v1.60.1 - args: | - --config .golangci.toml --max-same-issues=0 --max-issues-per-linter=0 --verbose $(./scripts/go-workspace/golangci-lint-includes.sh) - skip-cache: true - install-mode: binary diff --git a/.github/workflows/i18n-crowdin-download.yml b/.github/workflows/i18n-crowdin-download.yml deleted file mode 100644 index 440ee9068bae5..0000000000000 --- a/.github/workflows/i18n-crowdin-download.yml +++ /dev/null @@ -1,120 +0,0 @@ -name: Crowdin Download Action - -on: - workflow_dispatch: - schedule: - - cron: "0 * * * *" - -jobs: - download-sources-from-crowdin: - runs-on: ubuntu-latest - - permissions: - contents: write # needed to commit changes into the PR - pull-requests: write # needed to update PR description, labels, etc - - steps: - - uses: actions/checkout@v4 - with: - ref: ${{ github.head_ref }} - - - name: Generate token - id: generate_token - uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 - with: - app_id: ${{ secrets.GRAFANA_PR_AUTOMATION_APP_ID }} - private_key: ${{ secrets.GRAFANA_PR_AUTOMATION_APP_PEM }} - - - name: Download sources - id: crowdin-download - uses: crowdin/github-action@v1 - with: - upload_sources: false - upload_translations: false - download_sources: false - download_translations: true - export_only_approved: true - localization_branch_name: i18n_crowdin_translations - create_pull_request: true - pull_request_title: 'I18n: Download translations from Crowdin' - pull_request_body: | - :robot: Automatic download of translations from Crowdin. - - Steps for merging: - 1. A quick sanity check of the changes and approve. Things to look out for: - - No changes in the English file. The source of truth is in the main branch, NOT in Crowdin. - - Translations maybe be removed if the English phrase was removed, but there should not be many of these - - Anything else that looks 'funky'. Ask if you're not sure. - 2. Approve & (Auto-)merge. :tada: - - If there's a conflict, close the pull request and **delete the branch**. A GH action will recreate the pull request. - Remember, the longer this pull request is open, the more likely it is that it'll get conflicts. - pull_request_labels: 'area/frontend, area/internationalization, no-changelog, no-backport' - pull_request_reviewers: 'grafana-frontend-platform' - pull_request_base_branch_name: 'main' - base_url: 'https://grafana.api.crowdin.com' - config: 'crowdin.yml' - source: 'public/locales/en-US/grafana.json' - translation: 'public/locales/%locale%/%original_file_name%' - # Magic details of the github-actions bot user, to pass CLA checks - github_user_name: "github-actions[bot]" - github_user_email: "41898282+github-actions[bot]@users.noreply.github.com" - env: - GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} - CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} - CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} - - - name: Get pull request ID - if: steps.crowdin-download.outputs.pull_request_url - shell: bash - # Crowdin action returns us the URL of the pull request, but we need an ID for the GraphQL API - # that looks like 'PR_kwDOAOaWjc5mP_GU' - run: | - pr_id=$(gh pr view ${{ steps.crowdin-download.outputs.pull_request_url }} --json id -q .id) - echo "PULL_REQUEST_ID=$pr_id" >> "$GITHUB_ENV" - env: - GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} - - - name: Get project board ID - uses: octokit/graphql-action@v2.x - id: get-project-id - if: steps.crowdin-download.outputs.pull_request_url - with: - # Frontend Platform project - https://github.com/orgs/grafana/projects/78 - org: grafana - project_number: 78 - query: | - query getProjectId($org: String!, $project_number: Int!){ - organization(login: $org) { - projectV2(number: $project_number) { - title - id - } - } - } - env: - GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} - - - name: Add to project board - uses: octokit/graphql-action@v2.x - if: steps.crowdin-download.outputs.pull_request_url - with: - projectid: ${{ fromJson(steps.get-project-id.outputs.data).organization.projectV2.id }} - prid: ${{ env.PULL_REQUEST_ID }} - query: | - mutation addPullRequestToProject($projectid: ID!, $prid: ID!){ - addProjectV2ItemById(input: {projectId: $projectid, contentId: $prid}) { - item { - id - } - } - } - env: - GITHUB_TOKEN: ${{ steps.generate_token.outputs.token }} - - - name: Run auto-milestone - uses: grafana/grafana-github-actions-go/auto-milestone@main - if: steps.crowdin-download.outputs.pull_request_url - with: - pr: ${{ steps.crowdin-download.outputs.pull_request_number }} - token: ${{ steps.generate_token.outputs.token }} diff --git a/.github/workflows/i18n-crowdin-upload.yml b/.github/workflows/i18n-crowdin-upload.yml deleted file mode 100644 index 9e028b5386fe2..0000000000000 --- a/.github/workflows/i18n-crowdin-upload.yml +++ /dev/null @@ -1,33 +0,0 @@ -name: Crowdin Upload Action - -on: - workflow_dispatch: - push: - paths: - - 'public/locales/en-US/grafana.json' - branches: - - main - -jobs: - upload-sources-to-crowdin: - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Upload sources - uses: crowdin/github-action@v1 - with: - upload_sources: true - upload_sources_args: '--dest=public/locales/en-US/grafana.json' - upload_translations: false - download_translations: false - create_pull_request: false - base_url: 'https://grafana.api.crowdin.com' - config: 'crowdin.yml' - source: 'public/locales/en-US/grafana.json' - translation: 'public/locales/%locale%/%original_file_name%' - env: - CROWDIN_PROJECT_ID: ${{ secrets.CROWDIN_PROJECT_ID }} - CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} diff --git a/.github/workflows/issue-labeled.yml b/.github/workflows/issue-labeled.yml deleted file mode 100644 index 8cc4f303c8be8..0000000000000 --- a/.github/workflows/issue-labeled.yml +++ /dev/null @@ -1,99 +0,0 @@ -name: Notify Slack channel based on new issue label - -on: - issues: - types: [labeled] - -jobs: - config: - runs-on: "ubuntu-latest" - outputs: - has-secrets: ${{ steps.check.outputs.has-secrets }} - steps: - - name: "Check for secrets" - id: check - shell: bash - run: | - if [ -n "${{ (secrets.SLACK_WEBHOOK_URL != '') || '' }}" ]; then - echo "has-secrets=1" >> "$GITHUB_OUTPUT" - fi - - notify: - needs: config - if: needs.config.outputs.has-secrets - runs-on: ubuntu-latest - steps: - - name: "Download teams.yml to know which label is for which team" - run: wget https://raw.githubusercontent.com/grafana/grafana/main/.github/teams.yml - - - name: "Determine which team to notify" - run: | - # Default to null values. - CHANNEL="null" - TEAM="null" - - echo "${{ github.event.label.name }} label added" - export CURRENT_LABEL="${{ github.event.label.name }}" # Enable the use of the label in yq evaluations - # yq is installed by default in ubuntu-latest - if [[ $(yq e 'keys | .[] | select(. == env(CURRENT_LABEL))' teams.yml ) ]]; then - # Check if we have a channel set to notify on comments. - if [[ $(yq '.[env(CURRENT_LABEL)] | has("channel-label")' teams.yml ) == true ]]; then - CHANNEL=$(yq '.[env(CURRENT_LABEL)].channel-label' teams.yml) - echo "Ready to send issue to channel ID ${CHANNEL}" - fi - - if [[ $(yq '.[env(CURRENT_LABEL)] | has("exclude-github-team")' teams.yml ) == true ]]; then - TEAM=$(yq '.[env(CURRENT_LABEL)].exclude-github-team' teams.yml) - echo "Will not send issue to channel if issue author is part of the team ${TEAM}" - fi - fi - - # set environment for next steps - echo "CHANNEL=${CHANNEL}" >> $GITHUB_ENV - echo "TEAM=${TEAM}" >> $GITHUB_ENV - - - name: "Prepare payload" - uses: frabert/replace-string-action@v2.5 - id: preparePayload - with: - # replace double quotes with single quotes to avoid breaking the JSON payload sent to Slack - string: ${{ github.event.issue.title }} - pattern: '"' - replace-with: "'" - flags: 'g' - - - name: Get Token - id: get_workflow_token - uses: peter-murray/workflow-application-token-action@v3 - with: - application_id: ${{ secrets.APP_GRAFANA_TEAM_CHECKER_ID }} - application_private_key: ${{ secrets.APP_GRAFANA_TEAM_CHECKER_KEY }} - - - name: "Check that issue author is not part of the team" - if: ${{ env.TEAM != 'null' }} - run: | - response=$(gh api /orgs/grafana/teams/${{ env.TEAM }}/memberships/${{ github.event.issue.user.login }} -i -H "Accept: application/vnd.github.v3+json") - STATUS_CODE=$(echo "$response" | head -n 1 | cut -d' ' -f2) - if [ "$status_code" -eq 404 ]; then - echo "The user was not found in the team." - echo "USER_FOUND=false" >> $GITHUB_ENV - else - echo "The user was potentially found in the team" - echo "USER_FOUND=maybe" >> $GITHUB_ENV - fi - env: - GITHUB_TOKEN: ${{ steps.get_workflow_token.outputs.token }} - - - name: "Send Slack notification" - if: ${{ (env.CHANNEL != 'null') && ((env.USER_FOUND == 'false') || (env.TEAM != 'null')) }} - uses: slackapi/slack-github-action@v1.26.0 - with: - payload: > - { - "icon_emoji": ":grafana:", - "username": "Grafana issue labeled", - "text": "Issue \"${{ steps.preparePayload.outputs.replaced }}\" labeled \"${{ github.event.label.name }}\": ${{ github.event.issue.html_url }}, please triage.", - "channel": "${{ env.CHANNEL }}" - } - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} diff --git a/.github/workflows/issue-opened.yml b/.github/workflows/issue-opened.yml deleted file mode 100644 index 5df1de30a2c93..0000000000000 --- a/.github/workflows/issue-opened.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Run commands when issues are opened -on: - issues: - types: [opened] -concurrency: - group: issue-opened-${{ github.event.issue.number }} -jobs: - main: - runs-on: ubuntu-latest - steps: - - name: Checkout Actions - uses: actions/checkout@v4 - with: - repository: "grafana/grafana-github-actions" - path: ./actions - ref: main - - name: Install Actions - run: npm install --production --prefix ./actions - # give issue-openers a chance to add labels after submit - - name: Sleep for 2 minutes - run: sleep 2m - shell: bash - - name: Run Commands - uses: ./actions/commands - with: - metricsWriteAPIKey: ${{secrets.GRAFANA_MISC_STATS_API_KEY}} - token: ${{secrets.ISSUE_COMMANDS_TOKEN}} - configPath: "issue-opened" diff --git a/.github/workflows/metrics-collector.yml b/.github/workflows/metrics-collector.yml deleted file mode 100644 index 2e22a830a8845..0000000000000 --- a/.github/workflows/metrics-collector.yml +++ /dev/null @@ -1,50 +0,0 @@ -# -# When triggered by the cron job it will also collect metrics for: -# * number of issues without label -# * number of issues with "needs more info" -# * number of issues with "needs investigation" -# * number of issues with label type/bug -# * number of open issues in current milestone -# -# https://github.com/grafana/grafana-github-actions/blob/main/metrics-collector/index.ts -# -name: Github issue metrics collection -on: - schedule: - - cron: "*/10 * * * *" - issues: - types: [opened, closed] - -jobs: - config: - runs-on: "ubuntu-latest" - outputs: - has-secrets: ${{ steps.check.outputs.has-secrets }} - steps: - - name: "Check for secrets" - id: check - shell: bash - run: | - if [ -n "${{ (secrets.GRAFANA_MISC_STATS_API_KEY != '') || '' }}" ]; then - echo "has-secrets=1" >> "$GITHUB_OUTPUT" - fi - - main: - needs: config - if: needs.config.outputs.has-secrets - runs-on: ubuntu-latest - steps: - - name: Checkout Actions - uses: actions/checkout@v4 - with: - repository: "grafana/grafana-github-actions" - path: ./actions - ref: main - - name: Install Actions - run: npm install --production --prefix ./actions - - name: Run metrics collector - uses: ./actions/metrics-collector - with: - metricsWriteAPIKey: ${{secrets.GRAFANA_MISC_STATS_API_KEY}} - token: ${{secrets.GITHUB_TOKEN}} - configPath: "metrics-collector" diff --git a/.github/workflows/milestone.yml b/.github/workflows/milestone.yml deleted file mode 100644 index f686dee7d5540..0000000000000 --- a/.github/workflows/milestone.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Close Milestone -on: - workflow_dispatch: - inputs: - version_input: - description: 'The version to be released please respect: major.minor.patch, major.minor.patch-preview or major.minor.patch-preview format. example: 7.4.3, 7.4.3-preview or 7.4.3-preview1' - required: true -jobs: - call-remove-milestone: - uses: grafana/grafana/.github/workflows/remove-milestone.yml@main - with: - version_call: ${{ github.event.inputs.version_input }} - secrets: inherit - call-close-milestone: - uses: grafana/grafana/.github/workflows/close-milestone.yml@main - with: - version_call: ${{ github.event.inputs.version_input }} - secrets: inherit - needs: call-remove-milestone diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml deleted file mode 100644 index ae2b0898f73ea..0000000000000 --- a/.github/workflows/pr-checks.yml +++ /dev/null @@ -1,45 +0,0 @@ -name: PR Checks -on: - pull_request_target: - types: - - opened - - reopened - - synchronize - - ready_for_review - - labeled - - unlabeled - - edited - - auto_merge_enabled - issues: - types: - - milestoned - - demilestoned - -concurrency: - group: pr-checks-${{ github.event.number }} - -permissions: - statuses: write - checks: write - actions: write - contents: read - pull-requests: read - -jobs: - main: - runs-on: ubuntu-latest - if: github.event.pull_request.draft == false - steps: - - name: Checkout Actions - uses: actions/checkout@v4 - with: - repository: "grafana/grafana-github-actions" - path: ./actions - ref: main - - name: Install Actions - run: npm install --production --prefix ./actions - - name: Run PR Checks - uses: ./actions/pr-checks - with: - token: ${{secrets.GITHUB_TOKEN}} - configPath: pr-checks diff --git a/.github/workflows/pr-codeql-analysis-go.yml b/.github/workflows/pr-codeql-analysis-go.yml deleted file mode 100644 index ce9082f44003f..0000000000000 --- a/.github/workflows/pr-codeql-analysis-go.yml +++ /dev/null @@ -1,53 +0,0 @@ -name: "CodeQL for PR / go" - -on: - workflow_dispatch: - pull_request: - branches: [main] - paths: - - '**/*.go' - -permissions: - security-events: write - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - if: github.repository == 'grafana/grafana' - - steps: - - name: "Generate token" - id: generate_token - continue-on-error: true - uses: tibdex/github-app-token@3beb63f4bd073e61482598c45c71c1019b59b73a - with: - app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }} - private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }} - - - name: Checkout repository - uses: actions/checkout@v4 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 - token: ${{ steps.generate_token.outputs.token }} - - - name: Set go version - uses: actions/setup-go@v4 - with: - go-version-file: go.mod - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: "go" - - - name: Build go files - run: | - go mod verify - make build-go - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/pr-codeql-analysis-javascript.yml b/.github/workflows/pr-codeql-analysis-javascript.yml deleted file mode 100644 index 6c5264c926a43..0000000000000 --- a/.github/workflows/pr-codeql-analysis-javascript.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: "CodeQL for PR / javascript" - -on: - workflow_dispatch: - pull_request: - branches: [main] - paths: - - '**/*.js' - - '**/*.ts' - - '**/*.tsx' - -permissions: - security-events: write - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - if: github.repository == 'grafana/grafana' - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: "javascript" - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/pr-codeql-analysis-python.yml b/.github/workflows/pr-codeql-analysis-python.yml deleted file mode 100644 index aea55365afc9f..0000000000000 --- a/.github/workflows/pr-codeql-analysis-python.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: "CodeQL for PR / python" - -on: - workflow_dispatch: - pull_request: - branches: [main] - paths: - - '**/*.py' - -permissions: - security-events: write - -jobs: - analyze: - name: Analyze - runs-on: ubuntu-latest - if: github.repository == 'grafana/grafana' - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - with: - # We must fetch at least the immediate parents so that if this is - # a pull request then we can checkout the head. - fetch-depth: 2 - - # Initializes the CodeQL tools for scanning. - - name: Initialize CodeQL - uses: github/codeql-action/init@v2 - with: - languages: "python" - - - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/pr-commands.yml b/.github/workflows/pr-commands.yml deleted file mode 100644 index 51838dc7ae7b6..0000000000000 --- a/.github/workflows/pr-commands.yml +++ /dev/null @@ -1,51 +0,0 @@ -name: PR automation -on: - pull_request_target: - types: - - labeled - - opened - - synchronize -concurrency: - group: pr-commands-${{ github.event.number }} -jobs: - config: - runs-on: "ubuntu-latest" - outputs: - has-secrets: ${{ steps.check.outputs.has-secrets }} - steps: - - name: "Check for secrets" - id: check - shell: bash - run: | - if [ -n "${{ (secrets.GRAFANA_PR_AUTOMATION_APP_ID != '' && - secrets.GRAFANA_PR_AUTOMATION_APP_PEM != '' && - secrets.GRAFANA_MISC_STATS_API_KEY != '' - ) || '' }}" ]; then - echo "has-secrets=1" >> "$GITHUB_OUTPUT" - fi - - main: - needs: config - if: needs.config.outputs.has-secrets - runs-on: ubuntu-latest - steps: - - name: Checkout Actions - uses: actions/checkout@v4 - with: - repository: "grafana/grafana-github-actions" - path: ./actions - ref: main - - name: Install Actions - run: npm install --production --prefix ./actions - - name: "Generate token" - id: generate_token - uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 - with: - app_id: ${{ secrets.GRAFANA_PR_AUTOMATION_APP_ID }} - private_key: ${{ secrets.GRAFANA_PR_AUTOMATION_APP_PEM }} - - name: Run Commands - uses: ./actions/commands - with: - metricsWriteAPIKey: ${{secrets.GRAFANA_MISC_STATS_API_KEY}} - token: ${{ steps.generate_token.outputs.token }} - configPath: pr-commands diff --git a/.github/workflows/pr-go-workspace-check.yml b/.github/workflows/pr-go-workspace-check.yml deleted file mode 100644 index bc5385ef0e0ea..0000000000000 --- a/.github/workflows/pr-go-workspace-check.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: "Go Workspace Check" - -on: - workflow_dispatch: - pull_request: - branches: [main] - -jobs: - check: - name: Go Workspace Check - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Set go version - uses: actions/setup-go@v4 - with: - go-version-file: go.mod - - - name: Update workspace - run: make update-workspace - - - name: Check for go mod & workspace changes - run: | - if ! git diff --exit-code --quiet; then - echo "Changes detected:" - git diff - echo "Please run 'make update-workspace' and commit the changes." - echo "If there is a change in enterprise dependencies, please update pkg/extensions/main.go." - exit 1 - fi - - name: Ensure Dockerfile contains submodule COPY commands - run: ./scripts/go-workspace/validate-dockerfile.sh \ No newline at end of file diff --git a/.github/workflows/pr-k8s-codegen-check.yml b/.github/workflows/pr-k8s-codegen-check.yml deleted file mode 100644 index 71dd29b63545c..0000000000000 --- a/.github/workflows/pr-k8s-codegen-check.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: "K8s Codegen Check" - -on: - workflow_dispatch: - pull_request: - branches: [main] - paths: - - "pkg/apis/**" - - "pkg/aggregator/apis/**" - - "pkg/apimachinery/apis/**" - - "hack/**" - - "*.sum" - -jobs: - check: - name: K8s Codegen Check - runs-on: ubuntu-latest - - steps: - - name: Checkout repository - uses: actions/checkout@v4 - - - name: Set go version - uses: actions/setup-go@v4 - with: - go-version-file: go.mod - - - name: Update k8s codegen - run: ./hack/update-codegen.sh - - - name: Check for k8s codegen changes - run: | - if ! git diff --exit-code --quiet; then - echo "Changes detected:" - git diff - echo "Please run './hack/update-codegen.sh' and commit the changes." - exit 1 - fi \ No newline at end of file diff --git a/.github/workflows/pr-patch-check.yml b/.github/workflows/pr-patch-check.yml deleted file mode 100644 index ef1009b7545a4..0000000000000 --- a/.github/workflows/pr-patch-check.yml +++ /dev/null @@ -1,27 +0,0 @@ -# Owned by grafana-release-guild -# Intended to be dropped into the base repo Ex: grafana/grafana -name: Check for patch conflicts -run-name: check-patch-conflicts-${{ github.base_ref }}-${{ github.head_ref }} -on: - pull_request: - types: - - opened - - reopened - - synchronize - branches: - - "main" - - "v*.*.*" - - "release-*" - -# Since this is run on a pull request, we want to apply the patches intended for the -# target branch onto the source branch, to verify compatibility before merging. -jobs: - trigger_downstream_patch_check: - uses: grafana/security-patch-actions/.github/workflows/test-patches.yml@main - if: github.repository == 'grafana/grafana' - with: - src_repo: "${{ github.repository }}" - src_ref: "${{ github.head_ref }}" # this is the source branch name, Ex: "feature/newthing" - patch_repo: "${{ github.repository }}-security-patches" - patch_ref: "${{ github.base_ref }}" # this is the target branch name, Ex: "main" - secrets: inherit diff --git a/.github/workflows/publish-kinds-next.yml b/.github/workflows/publish-kinds-next.yml deleted file mode 100644 index 4aed6cf36c3ee..0000000000000 --- a/.github/workflows/publish-kinds-next.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: "publish-kinds-next" - -on: - push: - branches: - - "main" - paths: - - '**/*.cue' - workflow_dispatch: - -jobs: - config: - runs-on: "ubuntu-latest" - if: github.repository == 'grafana/grafana' - outputs: - has-secrets: ${{ steps.check.outputs.has-secrets }} - steps: - - name: "Check for secrets" - id: check - shell: bash - run: | - if [ -n "${{ (secrets.GRAFANA_DELIVERY_BOT_APP_ID != '' &&secrets.GRAFANA_DELIVERY_BOT_APP_PEM != '') || '' }}" ]; then - echo "has-secrets=1" >> "$GITHUB_OUTPUT" - fi - - main: - needs: config - if: github.repository == 'grafana/grafana' && needs.config.outputs.has-secrets - runs-on: "ubuntu-latest" - steps: - - name: "Checkout Grafana repo" - uses: "actions/checkout@v4" - with: - fetch-depth: 0 - - - name: "Setup Go" - uses: "actions/setup-go@v4" - with: - go-version-file: go.mod - - - name: "Verify kinds" - run: go run .github/workflows/scripts/kinds/verify-kinds.go - - - name: "Generate token" - id: generate_token - uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 - with: - app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }} - private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }} - - - name: "Clone website-sync Action" - run: "git clone --single-branch --no-tags --depth 1 -b master https://grafana-delivery-bot:${{ steps.generate_token.outputs.token }}@github.com/grafana/website-sync ./.github/actions/website-sync" - - - name: "Publish to kind registry (next)" - uses: "./.github/actions/website-sync" - id: "publish-next" - with: - repository: "grafana/kind-registry" - branch: "main" - host: "github.com" - github_pat: "grafana-delivery-bot:${{ steps.generate_token.outputs.token }}" - source_folder: ".github/workflows/scripts/kinds/next" - target_folder: "grafana/next" diff --git a/.github/workflows/publish-kinds-release.yml b/.github/workflows/publish-kinds-release.yml deleted file mode 100644 index 691cdff386747..0000000000000 --- a/.github/workflows/publish-kinds-release.yml +++ /dev/null @@ -1,85 +0,0 @@ -name: "publish-kinds-release" - -on: - push: - branches: - - v[0-9]+.[0-9]+.x - tags: - - v[0-9]+.[0-9]+.[0-9]+ - paths: - - '**/*.cue' - workflow_dispatch: - -jobs: - config: - runs-on: "ubuntu-latest" - if: github.repository == 'grafana/grafana' - outputs: - has-secrets: ${{ steps.check.outputs.has-secrets }} - steps: - - name: "Check for secrets" - id: check - shell: bash - run: | - if [ -n "${{ (secrets.GRAFANA_DELIVERY_BOT_APP_ID != '' && secrets.GRAFANA_DELIVERY_BOT_APP_PEM != '') || '' }}" ]; then - echo "has-secrets=1" >> "$GITHUB_OUTPUT" - fi - - main: - needs: config - if: github.repository == 'grafana/grafana' && needs.config.outputs.has-secrets - runs-on: "ubuntu-latest" - steps: - - name: "Checkout Grafana repo" - uses: "actions/checkout@v4" - with: - # required for the `grafana/grafana-github-actions/has-matching-release-tag` action to work - fetch-depth: 0 - - - name: "Setup Go" - uses: "actions/setup-go@v4" - with: - go-version-file: go.mod - - - name: "Verify kinds" - run: go run .github/workflows/scripts/kinds/verify-kinds.go - - - name: "Checkout Actions library" - uses: "actions/checkout@v4" - with: - repository: "grafana/grafana-github-actions" - path: "./actions" - - - name: "Install Actions from library" - run: "npm install --production --prefix ./actions" - - - name: "Determine if there is a matching release tag" - id: "has-matching-release-tag" - uses: "./actions/has-matching-release-tag" - with: - ref_name: "${{ github.ref_name }}" - release_tag_regexp: "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$" - release_branch_regexp: "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.x$" - - - name: "Generate token" - id: generate_token - uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 - with: - app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }} - private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }} - - - name: "Clone website-sync Action" - if: "steps.has-matching-release-tag.outputs.bool == 'true'" - run: "git clone --single-branch --no-tags --depth 1 -b master https://grafana-delivery-bot:${{ steps.generate_token.outputs.token }}@github.com/grafana/website-sync ./.github/actions/website-sync" - - - name: "Publish to kind registry (release)" - if: "steps.has-matching-release-tag.outputs.bool == 'true'" - uses: "./.github/actions/website-sync" - id: "publish-release" - with: - repository: "grafana/kind-registry" - branch: "main" - host: "github.com" - github_pat: "grafana-delivery-bot:${{ steps.generate_token.outputs.token }}" - source_folder: ".github/workflows/scripts/kinds/next" - target_folder: "grafana/${{ github.ref_name }}" diff --git a/.github/workflows/publish-technical-documentation-next.yml b/.github/workflows/publish-technical-documentation-next.yml deleted file mode 100644 index 56fc984700e91..0000000000000 --- a/.github/workflows/publish-technical-documentation-next.yml +++ /dev/null @@ -1,38 +0,0 @@ -name: "publish-technical-documentation-next" - -on: - push: - branches: - - "main" - paths: - - "docs/sources/**" - workflow_dispatch: -jobs: - sync: - if: github.repository == 'grafana/grafana' - runs-on: "ubuntu-latest" - steps: - - name: "Checkout Grafana repo" - uses: "actions/checkout@v4" - - - name: "Clone website-sync Action" - # WEBSITE_SYNC_TOKEN is a fine-grained GitHub Personal Access Token that expires. - # It must be regenerated in the grafanabot GitHub account and requires a Grafana organization - # GitHub administrator to update the organization secret. - # The IT helpdesk can update the organization secret. - run: "git clone --single-branch --no-tags --depth 1 -b master https://grafanabot:${{ secrets.WEBSITE_SYNC_TOKEN }}@github.com/grafana/website-sync ./.github/actions/website-sync" - - - name: "Publish to website repository (next)" - uses: "./.github/actions/website-sync" - id: "publish-next" - with: - repository: "grafana/website" - branch: "master" - host: "github.com" - # PUBLISH_TO_WEBSITE_TOKEN is a fine-grained GitHub Personal Access Token that expires. - # It must be regenerated in the grafanabot GitHub account and requires a Grafana organization - # GitHub administrator to update the organization secret. - # The IT helpdesk can update the organization secret. - github_pat: "grafanabot:${{ secrets.PUBLISH_TO_WEBSITE_TOKEN }}" - source_folder: "docs/sources" - target_folder: "content/docs/grafana/next" diff --git a/.github/workflows/publish-technical-documentation-release.yml b/.github/workflows/publish-technical-documentation-release.yml deleted file mode 100644 index c22bb41cb4897..0000000000000 --- a/.github/workflows/publish-technical-documentation-release.yml +++ /dev/null @@ -1,74 +0,0 @@ -name: "publish-technical-documentation-release" - -on: - push: - branches: - - v[0-9]+.[0-9]+.x - tags: - - v[0-9]+.[0-9]+.[0-9]+ - paths: - - "docs/sources/**" - workflow_dispatch: -jobs: - sync: - if: github.repository == 'grafana/grafana' - runs-on: "ubuntu-latest" - steps: - - name: "Checkout Grafana repo" - uses: "actions/checkout@v4" - with: - fetch-depth: 0 - - - name: "Checkout Actions library" - uses: "actions/checkout@v4" - with: - repository: "grafana/grafana-github-actions" - path: "./actions" - - - name: "Install Actions from library" - run: "npm install --production --prefix ./actions" - - - name: "Determine if there is a matching release tag" - id: "has-matching-release-tag" - uses: "./actions/has-matching-release-tag" - with: - ref_name: "${{ github.ref_name }}" - release_tag_regexp: "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)$" - release_branch_regexp: "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.x$" - - - name: "Determine technical documentation version" - if: "steps.has-matching-release-tag.outputs.bool == 'true'" - uses: "./actions/docs-target" - id: "target" - with: - ref_name: "${{ github.ref_name }}" - - - name: "Clone website-sync Action" - if: "steps.has-matching-release-tag.outputs.bool == 'true'" - # WEBSITE_SYNC_TOKEN is a fine-grained GitHub Personal Access Token that expires. - # It must be regenerated in the grafanabot GitHub account and requires a Grafana organization - # GitHub administrator to update the organization secret. - # The IT helpdesk can update the organization secret. - run: "git clone --single-branch --no-tags --depth 1 -b master https://grafanabot:${{ secrets.WEBSITE_SYNC_TOKEN }}@github.com/grafana/website-sync ./.github/actions/website-sync" - - - name: "Switch to HEAD of version branch for tags" - # Tags aren't necessarily made to the HEAD of the version branch. - # The documentation to be published is always on the HEAD of the version branch. - if: "steps.has-matching-release-tag.outputs.bool == 'true' && github.ref_type == 'tag'" - run: "git switch --detach origin/${{ steps.target.outputs.target }}.x" - - - name: "Publish to website repository (release)" - if: "steps.has-matching-release-tag.outputs.bool == 'true'" - uses: "./.github/actions/website-sync" - id: "publish-release" - with: - repository: "grafana/website" - branch: "master" - host: "github.com" - # PUBLISH_TO_WEBSITE_TOKEN is a fine-grained GitHub Personal Access Token that expires. - # It must be regenerated in the grafanabot GitHub account and requires a Grafana organization - # GitHub administrator to update the organization secret. - # The IT helpdesk can update the organization secret. - github_pat: "grafanabot:${{ secrets.PUBLISH_TO_WEBSITE_TOKEN }}" - source_folder: "docs/sources" - target_folder: "content/docs/grafana/${{ steps.target.outputs.target }}" diff --git a/.github/workflows/release-comms.yml b/.github/workflows/release-comms.yml deleted file mode 100644 index dc7355ef0b8ce..0000000000000 --- a/.github/workflows/release-comms.yml +++ /dev/null @@ -1,78 +0,0 @@ -# This workflow runs whenever the release PR is merged. It includes post-release communication processes like -# posting to slack, the website, community forums, etc. -# Only things that happen after a release is completed and all of the necessary code changes (like the changelog) are made. -name: Post-release -on: - workflow_dispatch: - inputs: - dry_run: - required: false - default: true - version: - required: true - latest: - type: bool - default: false - pull_request: - types: - - closed - branches: - - 'main' - - 'v*.*.*' - -jobs: - setup: - if: ${{ github.event_name == 'workflow_dispatch' || (github.event.pull_request.merged == true && startsWith(github.head_ref, 'release/')) }} - name: Setup and establish latest - outputs: - version: ${{ steps.output.outputs.version }} - dry_run: ${{ steps.output.outputs.dry_run }} - latest: ${{ steps.output.outputs.latest }} - runs-on: ubuntu-latest - steps: - - if: ${{ github.event_name == 'workflow_dispatch' }} - run: | - echo setting up GITHUB_ENV for ${{ github.event_name }} - echo "VERSION=${{ inputs.version }}" >> $GITHUB_ENV - echo "DRY_RUN=${{ inputs.dry_run }}" >> $GITHUB_ENV - echo "LATEST=${{ inputs.latest }}" >> $GITHUB_ENV - - if: ${{ github.event.pull_request.merged == true && startsWith(github.head_ref, 'release/') }} - run: | - echo "VERSION=$(echo ${{ github.head_ref }} | sed -e 's/release\/.*\///g')" >> $GITHUB_ENV - echo "DRY_RUN=${{ contains(github.event.pull_request.labels.*.name, 'release/dry-run') }}" >> $GITHUB_ENV - echo "LATEST=${{ contains(github.event.pull_request.labels.*.name, 'release/latest') }}" >> $GITHUB_ENV - - id: output - run: | - echo "dry_run: $DRY_RUN" - echo "latest: $LATEST" - echo "version: $VERSION" - - echo "dry_run=$DRY_RUN" >> "$GITHUB_OUTPUT" - echo "latest=$LATEST" >> "$GITHUB_OUTPUT" - echo "version=$VERSION" >> "$GITHUB_OUTPUT" - post_changelog_on_forum: - needs: setup - uses: ./.github/workflows/community-release.yml - secrets: - GRAFANA_MISC_STATS_API_KEY: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }} - GRAFANABOT_FORUM_KEY: ${{ secrets.GRAFANABOT_FORUM_KEY }} - with: - version: ${{ needs.setup.outputs.version }} - dry_run: ${{ needs.setup.outputs.dry_run == 'true' }} - create_github_release: - # a github release requires a git tag - # The github-release action retrieves the changelog using the /repos/grafana/grafana/contents/CHANGELOG.md API - # endpoint. - needs: setup - uses: ./.github/workflows/github-release.yml - with: - version: ${{ needs.setup.outputs.version }} - dry_run: ${{ needs.setup.outputs.dry_run == 'true' }} - latest: ${{ needs.setup.outputs.latest }} - post_on_slack: - needs: setup - runs-on: ubuntu-latest - steps: - - run: | - echo announce on slack that ${{ needs.setup.outputs.version }} has been released - echo dry run: ${{ needs.setup.outputs.dry_run }} diff --git a/.github/workflows/release-pr.yml b/.github/workflows/release-pr.yml deleted file mode 100644 index f960bb5ca745e..0000000000000 --- a/.github/workflows/release-pr.yml +++ /dev/null @@ -1,161 +0,0 @@ -# This workflow creates a new PR in Grafana which is triggered after a release is completed. -# It should include all code changes that are needed after a release is done. This includes the changelog update and -# version bumps, but could include more in the future. -# Please refrain from including any processes that do not result in code changes in this workflow. Instead, they should -# either be triggered in the release promotion process or in the release comms process (that is triggered by merging -# this PR). -name: Complete a Grafana release -on: - workflow_dispatch: - inputs: - version: - required: true - type: string - description: The version of Grafana that is being released - target: - required: true - type: string - description: The base branch that these changes are being merged into - backport: - required: false - type: string - description: Branch to backport these changes to - dry_run: - required: false - default: false - type: boolean - latest: - required: false - default: false - type: boolean - -permissions: - contents: write - pull-requests: write - -jobs: - push-changelog-to-main: - name: Create PR to main to update the changelog - uses: ./.github/workflows/changelog.yml - with: - version: ${{ inputs.version }} - latest: ${{ inputs.latest }} - dry_run: ${{ inputs.dry_run }} - target: main - secrets: - GRAFANA_DELIVERY_BOT_APP_ID: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }} - GRAFANA_DELIVERY_BOT_APP_PEM: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }} - create-prs: - name: Create Release PR - runs-on: ubuntu-latest - if: github.repository == 'grafana/grafana' - steps: - - name: Generate bot token - id: generate_token - uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 - with: - app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }} - private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }} - - name: Checkout Grafana - uses: actions/checkout@v4 - with: - ref: ${{ inputs.target }} - fetch-depth: 0 - fetch-tags: true - - name: Checkout Grafana (main) - uses: actions/checkout@v4 - with: - ref: main - fetch-depth: '0' - fetch-tags: 'false' - path: .grafana-main - - name: Configure git user - run: | - git config --local user.name "github-actions[bot]" - git config --local user.email "github-actions[bot]@users.noreply.github.com" - git config --local --add --bool push.autoSetupRemote true - - - name: Create branch - run: git checkout -b "release/${{ github.run_id }}/${{ inputs.version }}" - - name: Generate changelog - id: changelog - uses: ./.grafana-main/.github/workflows/actions/changelog - with: - github_token: ${{ steps.generate_token.outputs.token }} - target: v${{ inputs.version }} - output_file: changelog_items.md - - name: Patch CHANGELOG.md - run: | - # Prepare CHANGELOG.md content with version delimiters - ( - echo - echo "# ${{ inputs.version}} ($(date '+%F'))" - echo - cat changelog_items.md - ) > CHANGELOG.part - - # Check if a version exists in the changelog - if grep -q "" - cat CHANGELOG.part - echo "" - cat CHANGELOG.md - ) > CHANGELOG.tmp - mv CHANGELOG.tmp CHANGELOG.md - fi - - rm -f CHANGELOG.part changelog_items.md - - git diff CHANGELOG.md - - - name: Commit CHANGELOG.md changes - run: git add CHANGELOG.md && git commit --allow-empty -m "Update changelog" CHANGELOG.md - - - name: Update package.json versions - uses: ./.grafana-main/pkg/build/actions/bump-version - with: - version: 'patch' - - - name: Add package.json changes - run: | - git add package.json lerna.json yarn.lock packages public - git commit -m "Update version to ${{ inputs.version }}" - - - name: Git push - if: ${{ inputs.dry_run }} != true - run: git push --set-upstream origin release/${{ github.run_id }}/${{ inputs.version }} - - - name: Create PR without backports - if: "${{ inputs.backport == '' }}" - run: > - gh pr create \ - $( [ "x${{ inputs.latest }}" == "xtrue" ] && printf %s '-l "release/latest"') \ - -l "no-changelog" \ - --dry-run=${{ inputs.dry_run }} \ - -B "${{ inputs.target }}" \ - --title "Release: ${{ inputs.version }}" \ - --body "These code changes must be merged after a release is complete" - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - - - name: Create PR with backports - if: "${{ inputs.backport != '' }}" - run: > - gh pr create \ - $( [ "x${{ inputs.latest }}" == "xtrue" ] && printf %s '-l "release/latest"') \ - -l "product-approved" \ - -l "no-changelog" \ - --dry-run=${{ inputs.dry_run }} \ - -B "${{ inputs.target }}" \ - --title "Release: ${{ inputs.version }}" \ - --body "These code changes must be merged after a release is complete" - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/remove-milestone.yml b/.github/workflows/remove-milestone.yml deleted file mode 100644 index d41b63f1f51ca..0000000000000 --- a/.github/workflows/remove-milestone.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: Remove milestone -on: - workflow_dispatch: - inputs: - version: - required: true - description: Needs to match, exactly, the name of a milestone - workflow_call: - inputs: - version_call: - description: Needs to match, exactly, the name of a milestone - required: true - type: string - -jobs: - config: - runs-on: "ubuntu-latest" - outputs: - has-secrets: ${{ steps.check.outputs.has-secrets }} - steps: - - name: "Check for secrets" - id: check - shell: bash - run: | - if [ -n "${{ (secrets.GRAFANA_DELIVERY_BOT_APP_ID != '' && secrets.GRAFANA_DELIVERY_BOT_APP_PEM != '') || '' }}" ]; then - echo "has-secrets=1" >> "$GITHUB_OUTPUT" - fi - - main: - needs: config - if: needs.config.outputs.has-secrets - permissions: - issues: write - runs-on: ubuntu-latest - steps: - - name: Checkout Actions - uses: actions/checkout@v4 - with: - repository: "grafana/grafana-github-actions" - path: ./actions - ref: main - - name: Install Actions - run: npm install --production --prefix ./actions - - name: "Generate token" - id: generate_token - uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 - with: - app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }} - private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }} - - name: Remove milestone from open issues (manually invoked) - if: ${{ github.event.inputs.version != '' }} - uses: ./actions/remove-milestone - with: - token: ${{ steps.generate_token.outputs.token }} - - name: Remove milestone from open issues (workflow invoked) - if: ${{ inputs.version_call != '' }} - uses: ./actions/remove-milestone - with: - version_call: ${{ inputs.version_call }} - token: ${{ steps.generate_token.outputs.token }} diff --git a/.github/workflows/run-scenes-e2e.yml b/.github/workflows/run-scenes-e2e.yml deleted file mode 100644 index 5342568049297..0000000000000 --- a/.github/workflows/run-scenes-e2e.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Run dashboard scenes e2e - -on: - schedule: - - cron: "0 8 * * 1-5" # every day at 08:00UTC on weekdays - # push # uncomment for test run during PR - -env: - ARCH: linux-amd64 - -jobs: - dashboard-scenes-e2e: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v4 - - name: Pin Go version to mod file - uses: actions/setup-go@v5 - with: - go-version-file: 'go.mod' - - run: go version - - uses: actions/setup-node@v4 - with: - node-version: 20 - - name: Install dependencies - run: yarn install --immutable - - name: Build grafana - run: make build - - name: Install Cypress dependencies - uses: cypress-io/github-action@v6 - with: - runTests: false - - name: Run dashboard scenes e2e - run: yarn e2e:scenes - - name: "Send Slack notification" - if: ${{ failure() }} - uses: slackapi/slack-github-action@v1.26.0 - with: - payload: > - { - "icon_emoji": ":this-is-fine-fire:", - "username": "Dashboard scenes e2e tests failed", - "text": "Link to run: https://github.com/${{github.repository}}/actions/runs/${{github.run_id}}", - "channel": "#grafana-dashboards-squad" - } - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} diff --git a/.github/workflows/sbom-report.yml b/.github/workflows/sbom-report.yml deleted file mode 100644 index c913b76331ad3..0000000000000 --- a/.github/workflows/sbom-report.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: syft-sbom-ci - -on: - release: - types: [created] - -jobs: - syft-sbom: - - runs-on: ubuntu-latest - - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Anchore SBOM Action - uses: anchore/sbom-action@v0.14.2 - with: - artifact-name: ${{ github.event.repository.name }}-spdx.json - diff --git a/.github/workflows/scripts/json-file-to-job-output.js b/.github/workflows/scripts/json-file-to-job-output.js deleted file mode 100644 index c71c1b8600162..0000000000000 --- a/.github/workflows/scripts/json-file-to-job-output.js +++ /dev/null @@ -1,18 +0,0 @@ -module.exports = async ({ core, filePath }) => { - try { - const fs = require('fs').promises; - const content = await fs.readFile(filePath) - const result = JSON.parse(content); - - core.startGroup('Parsing json file...'); - - for (const property in result) { - core.info(`${property} <- ${result[property]}`); - core.setOutput(property, result[property]); - } - - core.endGroup(); - } catch (error) { - core.setFailed(error.message); - } -} \ No newline at end of file diff --git a/.github/workflows/scripts/pr-get-job-link.js b/.github/workflows/scripts/pr-get-job-link.js deleted file mode 100644 index b1b49c89941ad..0000000000000 --- a/.github/workflows/scripts/pr-get-job-link.js +++ /dev/null @@ -1,9 +0,0 @@ - -module.exports = async ({ name, github, context, core }) => { - const { owner, repo } = context.repo; - const url = `https://api.github.com/repos/${owner}/${repo}/actions/runs/${context.runId}/jobs` - const result = await github.request(url); - const job = result.data.jobs.find(j => j.name === name); - - core.setOutput('link', `${job.html_url}?check_suite_focus=true`); -} diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml deleted file mode 100644 index 778a49b16d00f..0000000000000 --- a/.github/workflows/stale.yml +++ /dev/null @@ -1,42 +0,0 @@ -name: 'Close stale issues and PRs' -on: - schedule: - - cron: '30 1 * * *' - -permissions: - issues: write - pull-requests: write - -jobs: - stale: - runs-on: ubuntu-latest - steps: - - uses: actions/stale@v9 - with: - repo-token: ${{ secrets.GITHUB_TOKEN }} - operations-per-run: 750 - # start from the oldest issues/PRs when performing stale operations - ascending: true - days-before-issue-stale: 365 - days-before-issue-close: 30 - stale-issue-label: stale - exempt-issue-labels: no stalebot,type/epic - stale-issue-message: > - This issue has been automatically marked as stale because it has not had - activity in the last year. It will be closed in 30 days if no further activity occurs. Please - feel free to leave a comment if you believe the issue is still relevant. - Thank you for your contributions! - close-issue-message: > - This issue has been automatically closed because it has not had any further - activity in the last 30 days. Thank you for your contributions! - days-before-pr-stale: 30 - days-before-pr-close: 14 - stale-pr-label: stale - exempt-pr-labels: no stalebot - stale-pr-message: > - This pull request has been automatically marked as stale because it has not had - activity in the last 30 days. It will be closed in 2 weeks if no further activity occurs. Please - feel free to give a status update or ping for review. Thank you for your contributions! - close-pr-message: > - This pull request has been automatically closed because it has not had any further - activity in the last 2 weeks. Thank you for your contributions! diff --git a/.github/workflows/sync-mirror.yml b/.github/workflows/sync-mirror.yml deleted file mode 100644 index 09c8f87d50902..0000000000000 --- a/.github/workflows/sync-mirror.yml +++ /dev/null @@ -1,25 +0,0 @@ -# Owned by grafana-release-guild -# Intended to be dropped into the base repo, Ex: grafana/grafana -name: Sync to mirror -run-name: sync-to-mirror-${{ github.ref_name }} -on: - workflow_dispatch: - push: - branches: - - "main" - - "v*.*.*" - - "release-*" - -# This is run after the pull request has been merged, so we'll run against the target branch -jobs: - trigger_downstream_patch_mirror: - concurrency: patch-mirror-${{ github.ref_name }} - uses: grafana/security-patch-actions/.github/workflows/mirror-branch-and-apply-patches.yml@main - if: github.repository == 'grafana/grafana' - with: - ref: "${{ github.ref_name }}" # this is the target branch name, Ex: "main" - src_repo: "${{ github.repository }}" - dest_repo: "${{ github.repository }}-security-mirror" - patch_repo: "${{ github.repository }}-security-patches" - secrets: inherit - diff --git a/.github/workflows/trivy-scan.yml b/.github/workflows/trivy-scan.yml deleted file mode 100644 index f3a2c32f53e91..0000000000000 --- a/.github/workflows/trivy-scan.yml +++ /dev/null @@ -1,54 +0,0 @@ -name: Trivy Scan -on: - pull_request: - # only run on PRs where go.mod/go.sum/etc have been updated - paths: - - go.* - push: - branches: - - main - paths: - - go.* - -jobs: - trivy-scan: - runs-on: ubuntu-22.04 - steps: - - uses: actions/checkout@v4 - - name: Run Trivy vulnerability scanner (table output) - uses: aquasecurity/trivy-action@0.24.0 - with: - # scan the filesystem, rather than building a Docker image prior - the - # downside is we won't catch dependencies that are only installed in the - # image, but the upside is we'll only catch vulnerabilities that are - # explicitly in the our dependencies - scan-type: 'fs' - scanners: 'vuln' - format: 'table' - exit-code: 1 - ignore-unfixed: true - vuln-type: 'os,library' - severity: 'CRITICAL,HIGH' - trivyignores: .trivyignore - # for the PR check, ignore JS-related issues - skip-files: 'yarn.lock,package.json' - - name: Run Trivy vulnerability scanner (SARIF) - uses: aquasecurity/trivy-action@0.24.0 - with: - scan-type: 'fs' - scanners: 'vuln' - # Note: The SARIF format ignores severity and uploads all vulns for - # later triage. The table-format step above is used to fail the build - # if there are any critical or high vulnerabilities. - # See https://github.com/aquasecurity/trivy-action/issues/95 - format: 'sarif' - output: 'trivy-results.sarif' - ignore-unfixed: true - vuln-type: 'os,library' - trivyignores: .trivyignore - if: always() && github.repository == 'grafana/grafana' - - name: Upload Trivy scan results to GitHub Security tab - uses: github/codeql-action/upload-sarif@v3 - with: - sarif_file: 'trivy-results.sarif' - if: always() && github.repository == 'grafana/grafana' diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml deleted file mode 100644 index db22ab1fb96b6..0000000000000 --- a/.github/workflows/update-changelog.yml +++ /dev/null @@ -1,52 +0,0 @@ -name: Update changelog -on: - workflow_dispatch: - inputs: - version: - required: true - description: 'Needs to match, exactly, the name of a milestone. The version to be released please respect: major.minor.patch, major.minor.patch-preview or major.minor.patch-preview format. example: 7.4.3, 7.4.3-preview or 7.4.3-preview1' - skip_pr: - required: false - default: "0" - skip_community_post: - required: false - default: "0" -jobs: - config: - runs-on: "ubuntu-latest" - outputs: - has-secrets: ${{ steps.check.outputs.has-secrets }} - steps: - - name: "Check for secrets" - id: check - shell: bash - run: | - if [ -n "${{ (secrets.GRAFANA_DELIVERY_BOT_APP_ID != '' && - secrets.GRAFANA_DELIVERY_BOT_APP_PEM != '' && - secrets.GRAFANA_MISC_STATS_API_KEY != '' && - secrets.GRAFANABOT_FORUM_KEY != '' - ) || '' }}" ]; then - echo "has-secrets=1" >> "$GITHUB_OUTPUT" - fi - - main: - needs: config - if: needs.config.outputs.has-secrets - runs-on: ubuntu-latest - steps: - - name: "Generate token" - id: generate_token - uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 - with: - app_id: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_ID }} - private_key: ${{ secrets.GRAFANA_DELIVERY_BOT_APP_PEM }} - - name: Run update changelog (manually invoked) - uses: grafana/grafana-github-actions-go/update-changelog@main - with: - token: ${{ steps.generate_token.outputs.token }} - version: ${{ inputs.version }} - metrics_api_key: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }} - community_api_key: ${{ secrets.GRAFANABOT_FORUM_KEY }} - community_api_username: grafanabot - skip_pr: ${{ inputs.skip_pr }} - skip_community_post: ${{ inputs.skip_community_post }} diff --git a/.github/workflows/update-make-docs.yml b/.github/workflows/update-make-docs.yml deleted file mode 100644 index 49b64504bd0db..0000000000000 --- a/.github/workflows/update-make-docs.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Update `make docs` procedure -on: - schedule: - - cron: '0 7 * * 1-5' - workflow_dispatch: -jobs: - main: - if: github.repository == 'grafana/grafana' - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: grafana/writers-toolkit/update-make-docs@update-make-docs/v1 - with: - pr_options: > - --label 'backport v10.1.x' - --label 'backport v10.2.x' - --label 'backport v10.3.x' - --label no-changelog - --label type/docs diff --git a/.github/workflows/verify-kinds.yml b/.github/workflows/verify-kinds.yml deleted file mode 100644 index 88b45660d454d..0000000000000 --- a/.github/workflows/verify-kinds.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: "verify-kinds" - -on: - pull_request: - branches: [ main ] - paths: - - '**/*.cue' - -jobs: - main: - runs-on: "ubuntu-latest" - steps: - - name: "Checkout Grafana repo" - uses: "actions/checkout@v4" - with: - fetch-depth: 0 - - - name: "Setup Go" - uses: "actions/setup-go@v4" - with: - go-version-file: go.mod - - - name: "Verify kinds" - run: go run .github/workflows/scripts/kinds/verify-kinds.go - env: - GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.opsninja.yaml b/.opsninja.yaml new file mode 100644 index 0000000000000..0b7222c2e753e --- /dev/null +++ b/.opsninja.yaml @@ -0,0 +1,11 @@ +metadata: + repository: https://github.com/fluxninja/grafana + +applications: + grafana: + image: + name: grafana + dockerfile: Dockerfile + argo_manifests: + - app_path: apps/app-of-apps/cloud/cloud-prometheus.yaml + image_prefix: NINJA_GRAFANA_ diff --git a/.tool-versions b/.tool-versions new file mode 100644 index 0000000000000..e77e0a05ef04d --- /dev/null +++ b/.tool-versions @@ -0,0 +1,2 @@ +gcloud 395.0.0 +python 3.10.6 diff --git a/.yarn/sdks/eslint/lib/unsupported-api.js b/.yarn/sdks/eslint/lib/unsupported-api.js new file mode 100644 index 0000000000000..f5f8e24d0e3cc --- /dev/null +++ b/.yarn/sdks/eslint/lib/unsupported-api.js @@ -0,0 +1,27 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, register} = require(`module`); +const {resolve} = require(`path`); +const {pathToFileURL} = require(`url`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = createRequire(absPnpApiPath); + +const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`); +const isPnpLoaderEnabled = existsSync(absPnpLoaderPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require eslint/use-at-your-own-risk + require(absPnpApiPath).setup(); + if (isPnpLoaderEnabled && register) { + register(pathToFileURL(absPnpLoaderPath)); + } + } +} + +// Defer to the real eslint/use-at-your-own-risk your application uses +module.exports = absRequire(`eslint/use-at-your-own-risk`); diff --git a/.yarn/sdks/prettier/bin/prettier.cjs b/.yarn/sdks/prettier/bin/prettier.cjs new file mode 100755 index 0000000000000..00f1f7f745b47 --- /dev/null +++ b/.yarn/sdks/prettier/bin/prettier.cjs @@ -0,0 +1,27 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, register} = require(`module`); +const {resolve} = require(`path`); +const {pathToFileURL} = require(`url`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = createRequire(absPnpApiPath); + +const absPnpLoaderPath = resolve(absPnpApiPath, `../.pnp.loader.mjs`); +const isPnpLoaderEnabled = existsSync(absPnpLoaderPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require prettier/bin/prettier.cjs + require(absPnpApiPath).setup(); + if (isPnpLoaderEnabled && register) { + register(pathToFileURL(absPnpLoaderPath)); + } + } +} + +// Defer to the real prettier/bin/prettier.cjs your application uses +module.exports = absRequire(`prettier/bin/prettier.cjs`); diff --git a/FN_README.md b/FN_README.md new file mode 100644 index 0000000000000..a5664f6638f6b --- /dev/null +++ b/FN_README.md @@ -0,0 +1,60 @@ +## Sankey Plugin + +We created our fork of [snakey-panel](https://github.com/IsmaelMasharo/sankey-panel) ---> [our fork](https://github.com/fluxninja/sankey-panel) and if we want to add some changes to it we need to: + +- git clone our fork +- add changes we want +- build plugin using `yarn build` (if you want to test something use `yarn dev` because the normal build removes all console.logs) +- copy-paste builded version of plugin into grafana `public/app/plugins/panel/sankey-panel-0.5.0` +- refresh grafana + +## [Grafadruid-druid datasource plugin](./public/app/plugins/datasource//grafadruid-druid-datasource/) + +https://github.com/grafadruid/druid-grafana/tree/master/src + +## Local Testing + +Run Grafana locally using: + +```shell +make run + +yarn start +``` + +Port forward local prometheus and druid from [cloud](https://github.com/fluxninja/cloud) repo using fn: + +```shell +cd cloud + +LOGURU_LEVEL=TRACE fn dev service-proxy --cluster prometheus-cloud druid-router + +``` + +Connect to druid and prometheus on locally running Grafana UI. For this go to connection tab and select Data Source. Add new data source and make a connection. To test micro frontend make a connection with UI follow this [MFE Grafana](https://github.com/fluxninja/cloud/tree/main/services/cloud/ui#running-grafana-locally-for-development). + +## Troubleshooting + +### "Cannot find module" typescript errors (ts2307) + +Smart IDEs (such as VSCode or IntelliJ) require special configuration for TypeScript to work when using Plug'n'Play installs. +A collection of settings for each editor can be found under the (link)[https://yarnpkg.com/getting-started/editor-sdks#vscode] + +Generally speaking: the editor SDKs and settings can be generated using `yarn dlx @yarnpkg/sdks` (or yarn sdks if you added @yarnpkg/sdks to your dependencies): + +- Use yarn sdks vscode vim to generate both the base SDKs and the settings for the specified supported editors. +- Use yarn sdks base to generate the base SDKs and then manually tweak the configuration of unsupported editors. +- Use yarn sdks to update all installed SDKs and editor settings. + +### VSCode + +To support features like go-to-definition a plugin like ZipFS is needed. + +Run the following command, which will generate a new directory called .yarn/sdks: +`yarn dlx @yarnpkg/sdks vscode` + +For safety reason VSCode requires you to explicitly activate the custom TS settings: + +- Press ctrl+shift+p in a TypeScript file +- Choose "Select TypeScript Version" +- Pick "Use Workspace Version" diff --git a/conf/defaults.ini b/conf/defaults.ini index e164bf0fbd22a..87e32001a0199 100644 --- a/conf/defaults.ini +++ b/conf/defaults.ini @@ -38,7 +38,7 @@ min_tls_version = "" http_addr = # The http port to use -http_port = 3000 +http_port = 3003 # The public facing domain name used to access grafana from a browser domain = localhost @@ -1707,7 +1707,7 @@ disable_sanitize_html = false enable_alpha = false app_tls_skip_verify_insecure = false # Enter a comma-separated list of plugin identifiers to identify plugins to load even if they are unsigned. Plugins with modified signatures are never loaded. -allow_loading_unsigned_plugins = +allow_loading_unsigned_plugins = fifemon-graphql-datasource # Enable or disable installing / uninstalling / updating plugins directly from within Grafana. plugin_admin_enabled = true plugin_admin_external_manage_enabled = false @@ -1837,7 +1837,7 @@ license_path = # will take precedence over toggles in the `enable` list. # enable = feature1,feature2 -enable = +enable = publicDashboards # Some features are enabled by default, see: # https://grafana.com/docs/grafana/next/setup-grafana/configure-grafana/feature-toggles/ diff --git a/go.mod b/go.mod index c9e74c8f93322..cb285d8317112 100644 --- a/go.mod +++ b/go.mod @@ -50,7 +50,7 @@ require ( github.com/fatih/color v1.16.0 // @grafana/grafana-backend-group github.com/fullstorydev/grpchan v1.1.1 // @grafana/grafana-backend-group github.com/gchaincl/sqlhooks v1.3.0 // @grafana/grafana-search-and-storage - github.com/getkin/kin-openapi v0.125.0 // @grafana/grafana-as-code + github.com/getkin/kin-openapi v0.127.0 // @grafana/grafana-as-code github.com/go-jose/go-jose/v3 v3.0.3 // @grafana/identity-access-team github.com/go-kit/log v0.2.1 // @grafana/grafana-backend-group github.com/go-ldap/ldap/v3 v3.4.4 // @grafana/identity-access-team @@ -75,8 +75,6 @@ require ( github.com/gorilla/mux v1.8.1 // @grafana/grafana-backend-group github.com/gorilla/websocket v1.5.0 // @grafana/grafana-app-platform-squad github.com/grafana/alerting v0.0.0-20240822131459-9daa6239cc41 // @grafana/alerting-backend - github.com/grafana/authlib v0.0.0-20240814074258-eae7d47f01db // @grafana/identity-access-team - github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db // @grafana/identity-access-team github.com/grafana/codejen v0.0.3 // @grafana/dataviz-squad github.com/grafana/cuetsy v0.1.11 // @grafana/grafana-as-code github.com/grafana/dataplane/examples v0.0.1 // @grafana/observability-metrics @@ -130,7 +128,7 @@ require ( github.com/modern-go/reflect2 v1.0.2 // @grafana/alerting-backend github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // @grafana/alerting-backend github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f // @grafana/grafana-operator-experience-squad - github.com/oapi-codegen/oapi-codegen/v2 v2.3.0 // @grafana/grafana-as-code + github.com/oapi-codegen/oapi-codegen/v2 v2.3.1-0.20240823215434-d232e9efa9f5 // @grafana/grafana-as-code github.com/oklog/ulid/v2 v2.1.0 // @grafana/identity-access-team github.com/olekukonko/tablewriter v0.0.5 // @grafana/grafana-backend-group github.com/openfga/api/proto v0.0.0-20240529184453-5b0b4941f3e0 // @grafana/identity-access-team @@ -425,7 +423,6 @@ require ( github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect - github.com/yudai/pp v2.0.1+incompatible // indirect github.com/yuin/gopher-lua v1.1.1 // indirect github.com/zclconf/go-cty v1.13.0 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect @@ -477,12 +474,24 @@ require ( gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect ) +require ( + github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible + github.com/bitly/go-simplejson v0.5.1 + github.com/grafadruid/go-druid v0.0.7-0.20230607082331-983aa577d90a + github.com/grafana/authlib v0.0.0-20240828122726-9edfcbea43e2 + github.com/grafana/authlib/claims v0.0.0-20240827210201-19d5347dd8dd +) + require ( cloud.google.com/go/longrunning v0.5.12 // indirect github.com/at-wat/mqtt-go v0.19.4 // indirect + github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 // indirect github.com/grafana/grafana/pkg/semconv v0.0.0-20240808213237-f4d2e064f435 // indirect github.com/hairyhenderson/go-which v0.2.0 // indirect github.com/iancoleman/orderedmap v0.3.0 // indirect + github.com/speakeasy-api/openapi-overlay v0.9.0 // indirect + github.com/vmware-labs/yaml-jsonpath v0.3.2 // indirect + github.com/yudai/pp v2.0.1+incompatible // indirect ) // Use fork of crewjam/saml with fixes for some issues until changes get merged into upstream @@ -499,3 +508,7 @@ replace xorm.io/xorm => github.com/grafana/grafana/pkg/util/xorm v0.0.1 // lock for mysql tsdb compat replace github.com/go-sql-driver/mysql => github.com/go-sql-driver/mysql v1.7.1 + +// This is for sending custom HTTP headers in druid client. +// Change in upstream: https://github.com/grafadruid/go-druid/pull/71 +// replace github.com/grafadruid/go-druid => github.com/fluxninja/go-druid v0.0.0-20220825112309-14a37dd3317d diff --git a/go.sum b/go.sum index 86a4f1227081c..1aceb2cbc6d5e 100644 --- a/go.sum +++ b/go.sum @@ -1436,6 +1436,7 @@ github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXY github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= github.com/KimMachineGun/automemlimit v0.6.0/go.mod h1:T7xYht7B8r6AG/AqFcUdc7fzd2bIdBKmepfP2S1svPY= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI= github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU= @@ -1613,6 +1614,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= +github.com/bitly/go-simplejson v0.5.1 h1:xgwPbetQScXt1gh9BmoJ6j9JMr3TElvuIyjR8pgdoow= +github.com/bitly/go-simplejson v0.5.1/go.mod h1:YOPVLzCfwK14b4Sff3oP1AmGhI9T9Vsg84etUnlyp+Q= github.com/bits-and-blooms/bitset v1.2.0 h1:Kn4yilvwNtMACtf1eYDlG8H77R07mZSPbMjLyS07ChA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= @@ -1813,6 +1816,9 @@ github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDD github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/dprotaso/go-yit v0.0.0-20191028211022-135eb7262960/go.mod h1:9HQzr9D/0PGwMEbC3d5AB7oi67+h4TsQqItC1GVYG58= +github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936 h1:PRxIJD8XjimM5aTknUK9w6DHLDox2r2M3DI4i2pnd3w= +github.com/dprotaso/go-yit v0.0.0-20220510233725-9ba8df137936/go.mod h1:ttYvX5qlB+mlV1okblJqcSMtR4c52UKxDiX9GRBS8+Q= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= @@ -1900,8 +1906,8 @@ github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/gchaincl/sqlhooks v1.3.0 h1:yKPXxW9a5CjXaVf2HkQn6wn7TZARvbAOAelr3H8vK2Y= github.com/gchaincl/sqlhooks v1.3.0/go.mod h1:9BypXnereMT0+Ys8WGWHqzgkkOfHIhyeUCqXC24ra34= -github.com/getkin/kin-openapi v0.125.0 h1:jyQCyf2qXS1qvs2U00xQzkGCqYPhEhZDmSmVt65fXno= -github.com/getkin/kin-openapi v0.125.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= +github.com/getkin/kin-openapi v0.127.0 h1:Mghqi3Dhryf3F8vR370nN67pAERW+3a95vomb3MAREY= +github.com/getkin/kin-openapi v0.127.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A= github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0= @@ -2246,12 +2252,14 @@ github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grafadruid/go-druid v0.0.7-0.20230607082331-983aa577d90a h1:+2Q5MlRJc7nxT5H4aPzWK9YyC6uO3bhiw2yElOz4Nfo= +github.com/grafadruid/go-druid v0.0.7-0.20230607082331-983aa577d90a/go.mod h1:KY3a6MrVMKkXgMTwBS9Nrhm1E8OWyR4gd0WzUi8d/zM= github.com/grafana/alerting v0.0.0-20240822131459-9daa6239cc41 h1:p+UsX43BoDH5YlG6xUd9xDS3M4sWouy8VJ+ODv5S6uE= github.com/grafana/alerting v0.0.0-20240822131459-9daa6239cc41/go.mod h1:GMLi6d09Xqo96fCVUjNk//rcjP5NKEdjOzfWIffD5r4= -github.com/grafana/authlib v0.0.0-20240814074258-eae7d47f01db h1:z++X4DdoX+aNlZNT1ZY4cykiFay4+f077pa0AG48SGg= -github.com/grafana/authlib v0.0.0-20240814074258-eae7d47f01db/go.mod h1:ptt910z9KFfpVSIbSbXvTRR7tS19mxD7EtmVbbJi/WE= -github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db h1:mDk0bwRV6rDrLSmKXftcPf9kLA9uH6EvxJvzpPW9bso= -github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A= +github.com/grafana/authlib v0.0.0-20240828122726-9edfcbea43e2 h1:SU+p1ck8037cz6F8W38PIL9MzRb6YMeNqc7+GHDuqiU= +github.com/grafana/authlib v0.0.0-20240828122726-9edfcbea43e2/go.mod h1:PFzXbCrn0GIpN4KwT6NP1l5Z1CPLfmKHnYx8rZzQcyY= +github.com/grafana/authlib/claims v0.0.0-20240827210201-19d5347dd8dd h1:sIlR7n38/MnZvX2qxDEszywXdI5soCwQ78aTDSARvus= +github.com/grafana/authlib/claims v0.0.0-20240827210201-19d5347dd8dd/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A= github.com/grafana/codejen v0.0.3 h1:tAWxoTUuhgmEqxJPOLtJoxlPBbMULFwKFOcRsPRPXDw= github.com/grafana/codejen v0.0.3/go.mod h1:zmwwM/DRyQB7pfuBjTWII3CWtxcXh8LTwAYGfDfpR6s= github.com/grafana/cue v0.0.0-20230926092038-971951014e3f h1:TmYAMnqg3d5KYEAaT6PtTguL2GjLfvr6wnAX8Azw6tQ= @@ -2379,6 +2387,7 @@ github.com/hashicorp/go-plugin v1.2.2/go.mod h1:F9eH4LrE/ZsRdbwhfjs9k9HoDUwAHnYt github.com/hashicorp/go-plugin v1.6.1 h1:P7MR2UP6gNKGPp+y7EZw2kOiq4IR9WiqLvp0XOsVdwI= github.com/hashicorp/go-plugin v1.6.1/go.mod h1:XPHFku2tFo3o3QKFgSYo+cghcUhw1NA1hZyMK0PWAw0= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= +github.com/hashicorp/go-retryablehttp v0.6.7/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-retryablehttp v0.7.1/go.mod h1:vAew36LZh98gCBJNLH42IQ1ER/9wtLZZ8meHqQvEYWY= github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= @@ -2798,8 +2807,8 @@ github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1/go.mod h1:mpRZBD8SJ55 github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= -github.com/oapi-codegen/oapi-codegen/v2 v2.3.0 h1:rICjNsHbPP1LttefanBPnwsSwl09SqhCO7Ee623qR84= -github.com/oapi-codegen/oapi-codegen/v2 v2.3.0/go.mod h1:4k+cJeSq5ntkwlcpQSxLxICCxQzCL772o30PxdibRt4= +github.com/oapi-codegen/oapi-codegen/v2 v2.3.1-0.20240823215434-d232e9efa9f5 h1:v1Go6tsT4lfcVzlSXjg6CfSGGgG8kWXPHOthLkx8eV8= +github.com/oapi-codegen/oapi-codegen/v2 v2.3.1-0.20240823215434-d232e9efa9f5/go.mod h1:ZBPUgGu64Z0KswMMFH+qiCjpZmnyXB0khpUR/z79tmg= github.com/oapi-codegen/runtime v1.1.1 h1:EXLHh0DXIJnWhdRPN2w4MXAzFyE4CskzhNLUmtpMYro= github.com/oapi-codegen/runtime v1.1.1/go.mod h1:SK9X900oXmPWilYR5/WKPzt3Kqxn/uS/+lbpREv+eCg= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -2815,6 +2824,7 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.2/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= @@ -2838,6 +2848,7 @@ github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xl github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA= github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= @@ -3073,6 +3084,7 @@ github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/segmentio/encoding v0.3.6 h1:E6lVLyDPseWEulBmCmAKPanDd3jiyGDo5gMcugCRwZQ= github.com/segmentio/encoding v0.3.6/go.mod h1:n0JeuIqEQrQoPDGsjo8UNd1iA0U8d8+oHAA4E3G3OxM= +github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 h1:n661drycOFuPLCN3Uc8sB6B/s6Z4t2xvBgU1htSHuq8= github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/sethvargo/go-retry v0.2.4 h1:T+jHEQy/zKJf5s95UkguisicE0zuF9y7+/vgz08Ocec= @@ -3113,6 +3125,8 @@ github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJ github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/speakeasy-api/openapi-overlay v0.9.0 h1:Wrz6NO02cNlLzx1fB093lBlYxSI54VRhy1aSutx0PQg= +github.com/speakeasy-api/openapi-overlay v0.9.0/go.mod h1:f5FloQrHA7MsxYg9djzMD5h6dxrHjVVByWKh7an8TRc= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= github.com/spf13/afero v1.3.3/go.mod h1:5KUK8ByomD5Ti5Artl0RtHeI5pTF7MIDuXL3yY520V4= @@ -3222,6 +3236,8 @@ github.com/urfave/cli/v2 v2.27.1/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6S github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/vburenin/ifacemaker v1.2.1/go.mod h1:5WqrzX2aD7/hi+okBjcaEQJMg4lDGrpuEX3B8L4Wgrs= +github.com/vmware-labs/yaml-jsonpath v0.3.2 h1:/5QKeCBGdsInyDCyVNLbXyilb61MXGi9NP674f9Hobk= +github.com/vmware-labs/yaml-jsonpath v0.3.2/go.mod h1:U6whw1z03QyqgWdgXxvVnQ90zN1BWz5V+51Ewf8k+rQ= github.com/vultr/govultr/v2 v2.17.2 h1:gej/rwr91Puc/tgh+j33p/BLR16UrIPnSr+AIwYWZQs= github.com/vultr/govultr/v2 v2.17.2/go.mod h1:ZFOKGWmgjytfyjeyAdhQlSWwTjh2ig+X49cAp50dzXI= github.com/wk8/go-ordered-map v1.0.0 h1:BV7z+2PaK8LTSd/mWgY12HyMAo5CEgkHqbkVq2thqr8= @@ -4509,6 +4525,7 @@ gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20191026110619-0b21df46bc1d/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/go.work.sum b/go.work.sum index 448f00a3af11c..7b76575e97b9e 100644 --- a/go.work.sum +++ b/go.work.sum @@ -6,40 +6,62 @@ cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbD cloud.google.com/go/accessapproval v1.7.5 h1:uzmAMSgYcnlHa9X9YSQZ4Q1wlfl4NNkZyQgho1Z6p04= cloud.google.com/go/accessapproval v1.7.11 h1:MgtE8CI+YJWPGGHnxQ9z1VQqV87h+vSGy2MeM/m0ggQ= cloud.google.com/go/accessapproval v1.7.11/go.mod h1:KGK3+CLDWm4BvjN0wFtZqdFUGhxlTvTF6PhAwQJGL4M= +cloud.google.com/go/accessapproval v1.7.12 h1:uxJBvDCor5iuCYOVby/0WTsHSMyBh8bpJ6hzqKdcL64= +cloud.google.com/go/accessapproval v1.7.12/go.mod h1:wvyt8Okohbq1i8/aPbCMBNwGQFZaNli5d+1qa/5zgGo= cloud.google.com/go/accesscontextmanager v1.8.5 h1:2GLNaNu9KRJhJBFTIVRoPwk6xE5mUDgD47abBq4Zp/I= cloud.google.com/go/accesscontextmanager v1.8.11 h1:IQ3KLJmNKPgstN0ZcRw0niU4KfsiOZmzvcGCF+NT618= cloud.google.com/go/accesscontextmanager v1.8.11/go.mod h1:nwPysISS3KR5qXipAU6cW/UbDavDdTBBgPohbkhGSok= +cloud.google.com/go/accesscontextmanager v1.8.12 h1:u3gLVJFZ8couGeVBZmhK0ON5YU3w9YIXOVr+THOik/M= +cloud.google.com/go/accesscontextmanager v1.8.12/go.mod h1:EmaVYmffq+2jA2waP0/XHECDkaOKVztxVsdzl65t8hw= cloud.google.com/go/aiplatform v1.60.0 h1:0cSrii1ZeLr16MbBoocyy5KVnrSdiQ3KN/vtrTe7RqE= cloud.google.com/go/aiplatform v1.68.0 h1:EPPqgHDJpBZKRvv+OsB3cr0jYz3EL2pZ+802rBPcG8U= cloud.google.com/go/aiplatform v1.68.0/go.mod h1:105MFA3svHjC3Oazl7yjXAmIR89LKhRAeNdnDKJczME= cloud.google.com/go/analytics v0.23.0 h1:Q+y94XH84jM8SK8O7qiY/PJRexb6n7dRbQ6PiUa4YGM= cloud.google.com/go/analytics v0.23.6 h1:BY8ZY7hQwKBi+lNp1IkiMTOK4xe4lxZCeYv3S9ARXtE= cloud.google.com/go/analytics v0.23.6/go.mod h1:cFz5GwWHrWQi8OHKP9ep3Z4pvHgGcG9lPnFQ+8kXsNo= +cloud.google.com/go/analytics v0.24.0 h1:wIMRXRQAanMWaUGSOglVwEmpZqCC4WAs9YacMuGcD88= +cloud.google.com/go/analytics v0.24.0/go.mod h1:NpavJSb6TSO56hGpX1+4JL7js6AkKl27TEqzW9Sn7E4= cloud.google.com/go/apigateway v1.6.5 h1:sPXnpk+6TneKIrjCjcpX5YGsAKy3PTdpIchoj8/74OE= cloud.google.com/go/apigateway v1.6.11 h1:VtEvpnqqY2T5gZBzo+p7C87yGH3omHUkPIbRQkmGS9I= cloud.google.com/go/apigateway v1.6.11/go.mod h1:4KsrYHn/kSWx8SNUgizvaz+lBZ4uZfU7mUDsGhmkWfM= +cloud.google.com/go/apigateway v1.6.12 h1:yynQNoSDVxbc8iPA2kLC4RWj1Ir64/FhGcXbyhJKC4c= +cloud.google.com/go/apigateway v1.6.12/go.mod h1:2RX6Op78cxqMtENfJW8kKpwtBCFVJGyvBtSR9l6v7aM= cloud.google.com/go/apigeeconnect v1.6.5 h1:CrfIKv9Go3fh/QfQgisU3MeP90Ww7l/sVGmr3TpECo8= cloud.google.com/go/apigeeconnect v1.6.11 h1:CftZgGXFRLJeD2/5ZIdWuAMxW/88UG9tHhRPI/NY75M= cloud.google.com/go/apigeeconnect v1.6.11/go.mod h1:iMQLTeKxtKL+sb0D+pFlS/TO6za2IUOh/cwMEtn/4g0= +cloud.google.com/go/apigeeconnect v1.6.12 h1:Pq2wTmm41l2w5sLuxEGRZmXhYULKg5qIWcvGEOsFhZQ= +cloud.google.com/go/apigeeconnect v1.6.12/go.mod h1:/DSr1IlfzrXeKjS6c3+8P04avr+4U5S7J3F69SNGFkY= cloud.google.com/go/apigeeregistry v0.8.3 h1:C+QU2K+DzDjk4g074ouwHQGkoff1h5OMQp6sblCVreQ= cloud.google.com/go/apigeeregistry v0.8.9 h1:3vLwk0tS9L++6ZyV4RDH4UCydfVoqxJbpWvqG6MTtUw= cloud.google.com/go/apigeeregistry v0.8.9/go.mod h1:4XivwtSdfSO16XZdMEQDBCMCWDp3jkCBRhVgamQfLSA= +cloud.google.com/go/apigeeregistry v0.8.10 h1:DYqJWmGXIfPWnvSER1eIrMvCpzpPaWyfwUbZ9n51tR0= +cloud.google.com/go/apigeeregistry v0.8.10/go.mod h1:3uJa4XfNqvhIvKksKEE7UahxZY1/2Uj07cCfT/RJZZM= cloud.google.com/go/apikeys v0.6.0 h1:B9CdHFZTFjVti89tmyXXrO+7vSNo2jvZuHG8zD5trdQ= cloud.google.com/go/appengine v1.8.5 h1:l2SviT44zWQiOv8bPoMBzW0vOcMO22iO0s+nVtVhdts= cloud.google.com/go/appengine v1.8.11 h1:ZLoWWwakgRzRnXX2bsgk2g1sdzti3wq+ebunTJsZNog= cloud.google.com/go/appengine v1.8.11/go.mod h1:xET3coaDUj+OP4TgnZlgQ+rG2R9fG2nblya13czP56Q= +cloud.google.com/go/appengine v1.8.12 h1:R4n+yN8pyOZQmufa5NlvPKLnG4C0YIAgYUmKLHN7Xgg= +cloud.google.com/go/appengine v1.8.12/go.mod h1:31Ib+S1sYnRQmCtfGqEf6EfzsiYy98EuDtLlvmpmx6U= cloud.google.com/go/area120 v0.8.5 h1:vTs08KPLN/iMzTbxpu5ciL06KcsrVPMjz4IwcQyZ4uY= cloud.google.com/go/area120 v0.8.11 h1:UID1dl7lW2zs8OpYVtVZ5WsXU9kUcxC1nd3nnToHW70= cloud.google.com/go/area120 v0.8.11/go.mod h1:VBxJejRAJqeuzXQBbh5iHBYUkIjZk5UzFZLCXmzap2o= +cloud.google.com/go/area120 v0.8.12 h1:MIAp/4z3v6RVmdhBy20xL3q2eFCpMRSk9gQqxwppu44= +cloud.google.com/go/area120 v0.8.12/go.mod h1:W94qTbrwhzGimOeoClrGdm5DAkMGlg/V6Maldra5QM8= cloud.google.com/go/artifactregistry v1.14.7 h1:W9sVlyb1VRcUf83w7aM3yMsnp4HS4PoyGqYQNG0O5lI= cloud.google.com/go/artifactregistry v1.14.13 h1:NNK4vYVA5NGQmbmYidfJhnfmYU6SSSRUM2oopNouJNs= cloud.google.com/go/artifactregistry v1.14.13/go.mod h1:zQ/T4xoAFPtcxshl+Q4TJBgsy7APYR/BLd2z3xEAqRA= +cloud.google.com/go/artifactregistry v1.14.14 h1:RADsnxebM3WPtZrvWx2PYGWWxyqEsbe3rTTDRad6cZM= +cloud.google.com/go/artifactregistry v1.14.14/go.mod h1:lPHksFcKpcZRrhGNx87a6SSygv0hfWi6Cd0gnWIUU4U= cloud.google.com/go/asset v1.17.2 h1:xgFnBP3luSbUcC9RWJvb3Zkt+y/wW6PKwPHr3ssnIP8= cloud.google.com/go/asset v1.19.5 h1:/R2XZS6lR8oj/Y3L+epD2yy7mf44Zp62H4xZ4vzaR/Y= cloud.google.com/go/asset v1.19.5/go.mod h1:sqyLOYaLLfc4ACcn3YxqHno+J7lRt9NJTdO50zCUcY0= +cloud.google.com/go/asset v1.19.6 h1:p8Huo2TW4GyTfqQZuvUsmvYc3bXC1uS51VvpKfPfqqU= +cloud.google.com/go/asset v1.19.6/go.mod h1:UsijVGuWC6uml/+ODlL+mv6e3dZ52fbdOfOkiv4f0cE= cloud.google.com/go/assuredworkloads v1.11.5 h1:gCrN3IyvqY3cP0wh2h43d99CgH3G+WYs9CeuFVKChR8= cloud.google.com/go/assuredworkloads v1.11.11 h1:pwZp9o8aF5QmX4Z0YNlRe1ZOUzDw0UALmkem3aPobZc= cloud.google.com/go/assuredworkloads v1.11.11/go.mod h1:vaYs6+MHqJvLKYgZBOsuuOhBgNNIguhRU0Kt7JTGcnI= +cloud.google.com/go/assuredworkloads v1.11.12 h1:Oh8gYugn66aqjxlCEJq7WMEo7W8RR12mPK0B2FFfhL4= +cloud.google.com/go/assuredworkloads v1.11.12/go.mod h1:yYnk9icCH5XEkqjJinBNBDv5mSvi1FYhpA9Q+BpTwew= cloud.google.com/go/auth v0.3.0/go.mod h1:lBv6NKTWp8E3LPzmO1TbiiRKc4drLOfHsgmlH9ogv5w= cloud.google.com/go/auth v0.5.1/go.mod h1:vbZT8GjzDf3AVqCcQmqeeM32U9HBFc32vVVAbwDsa6s= cloud.google.com/go/auth v0.6.1/go.mod h1:eFHG7zDzbXHKmjJddFG/rBlcGp6t25SwRUiEQSlO4x4= @@ -51,158 +73,252 @@ cloud.google.com/go/auth/oauth2adapt v0.2.3/go.mod h1:tMQXOfZzFuNuUxOypHlQEXgdfX cloud.google.com/go/automl v1.13.5 h1:ijiJy9sYWh75WrqImXsfWc1e3HR3iO+ef9fvW03Ig/4= cloud.google.com/go/automl v1.13.11 h1:FBCLjGS+Did/wtRHqyS055bRs/EJXx3meTvHPcdZgk8= cloud.google.com/go/automl v1.13.11/go.mod h1:oMJdXRDOVC+Eq3PnGhhxSut5Hm9TSyVx1aLEOgerOw8= +cloud.google.com/go/automl v1.13.12 h1:sjA6i5RbSqtgVzlLStZN3++AHKbZaCCvBmt68NeAAS0= +cloud.google.com/go/automl v1.13.12/go.mod h1:Rw8hmEIlKyvdhbFXjLrLvM2qNKZNwf5oraS5DervadE= cloud.google.com/go/baremetalsolution v1.2.4 h1:LFydisRmS7hQk9P/YhekwuZGqb45TW4QavcrMToWo5A= cloud.google.com/go/baremetalsolution v1.2.10 h1:VvBiXT9QJ4VpNVyfzHhLScY1aymZxpQgOa20yUvgphw= cloud.google.com/go/baremetalsolution v1.2.10/go.mod h1:eO2c2NMRy5ytcNPhG78KPsWGNsX5W/tUsCOWmYihx6I= +cloud.google.com/go/baremetalsolution v1.2.11 h1:rhMIixzQvm9cy8Ks3etB/JQOMw5vU8z71Jqf7VwI1Ts= +cloud.google.com/go/baremetalsolution v1.2.11/go.mod h1:bqthxNtU+n3gwWxoyXVR9VdSqIfVcgmpYtBlXQkeWq8= cloud.google.com/go/batch v1.8.0 h1:2HK4JerwVaIcCh/lJiHwh6+uswPthiMMWhiSWLELayk= cloud.google.com/go/batch v1.9.2 h1:o1RAjc0ExGAAm41YB9LbJZyJDgZR4M6SKyITsd/Smr4= cloud.google.com/go/batch v1.9.2/go.mod h1:smqwS4sleDJVAEzBt/TzFfXLktmWjFNugGDWl8coKX4= +cloud.google.com/go/batch v1.9.4 h1:JQWzsdmjnONvqNWeAubtDI6OIFv/v2lCYGzx8lpxTKg= +cloud.google.com/go/batch v1.9.4/go.mod h1:qqfXThFPI9dyDK1PfidiEOM/MrS+jUQualcQJytJCLA= cloud.google.com/go/beyondcorp v1.0.4 h1:qs0J0O9Ol2h1yA0AU+r7l3hOCPzs2MjE1d6d/kaHIKo= cloud.google.com/go/beyondcorp v1.0.10 h1:K4blSIQZn3YO4F4LmvWrH52pb8Y0L3NOrwkf22+x67M= cloud.google.com/go/beyondcorp v1.0.10/go.mod h1:G09WxvxJASbxbrzaJUMVvNsB1ZiaKxpbtkjiFtpDtbo= +cloud.google.com/go/beyondcorp v1.0.11 h1:oBXJtKP2J7VLqYQf6l5i2Cqm/qjFJPngnGKbzehkxYU= +cloud.google.com/go/beyondcorp v1.0.11/go.mod h1:V0EIXuYoyqKkHfnNCYZrNv6M+WYWJGIr5h019LurF3I= cloud.google.com/go/bigquery v1.59.1 h1:CpT+/njKuKT3CEmswm6IbhNu9u35zt5dO4yPDLW+nG4= cloud.google.com/go/bigquery v1.62.0 h1:SYEA2f7fKqbSRRBHb7g0iHTtZvtPSPYdXfmqsjpsBwo= cloud.google.com/go/bigquery v1.62.0/go.mod h1:5ee+ZkF1x/ntgCsFQJAQTM3QkAZOecfCmvxhkJsWRSA= cloud.google.com/go/bigtable v1.27.2-0.20240802230159-f371928b558f h1:UR2/6M/bSN8PPQlhaq+57w21VZLcEvq4ujsHd1p/G2s= cloud.google.com/go/bigtable v1.27.2-0.20240802230159-f371928b558f/go.mod h1:avmXcmxVbLJAo9moICRYMgDyTTPoV0MA0lHKnyqV4fQ= +cloud.google.com/go/bigtable v1.29.0 h1:2CnFjKPwjpZMZdTi2RpppvxzD80zKzDYrLYEQw/NnAs= +cloud.google.com/go/bigtable v1.29.0/go.mod h1:5p909nNdWaNUcWs6KGZO8mI5HUovstlmrIi7+eA5PTQ= cloud.google.com/go/billing v1.18.2 h1:oWUEQvuC4JvtnqLZ35zgzdbuHt4Itbftvzbe6aEyFdE= cloud.google.com/go/billing v1.18.9 h1:sGRWx7PvsfHuZyx151Xr6CrORIgjvCMO4GRabihSdQQ= cloud.google.com/go/billing v1.18.9/go.mod h1:bKTnh8MBfCMUT1fzZ936CPN9rZG7ZEiHB2J3SjIjByc= +cloud.google.com/go/billing v1.18.10 h1:Hguzxohg+0U/qMFmB0hyK/rM1yH1VSARMgZ8fM1K5as= +cloud.google.com/go/billing v1.18.10/go.mod h1:Lt+Qrjqsde38l/h1+9fzu44Pv9t+Suyf/p973mrg+xU= cloud.google.com/go/binaryauthorization v1.8.1 h1:1jcyh2uIUwSZkJ/JmL8kd5SUkL/Krbv8zmYLEbAz6kY= cloud.google.com/go/binaryauthorization v1.8.7 h1:ItT9uR/0/ok2Ru3LCcbSIBUPsKqTA49ZmxCupqQaeFo= cloud.google.com/go/binaryauthorization v1.8.7/go.mod h1:cRj4teQhOme5SbWQa96vTDATQdMftdT5324BznxANtg= +cloud.google.com/go/binaryauthorization v1.8.8 h1:Gxcy5/ydfTg2CviIxnZPVCNcFoDmQRbjzfAKg8bDJAU= +cloud.google.com/go/binaryauthorization v1.8.8/go.mod h1:D7B3gkNPdZ1Zj2IEyfypDTgbwFgTWE2SE6Csz0f46jg= cloud.google.com/go/certificatemanager v1.7.5 h1:UMBr/twXvH3jcT5J5/YjRxf2tvwTYIfrpemTebe0txc= cloud.google.com/go/certificatemanager v1.8.5 h1:ASC9N81NU8JnGzi9kiY2QTqtTgOziwGv48sjt3YG420= cloud.google.com/go/certificatemanager v1.8.5/go.mod h1:r2xINtJ/4xSz85VsqvjY53qdlrdCjyniib9Jp98ZKKM= +cloud.google.com/go/certificatemanager v1.8.6 h1:ekHCSJWJ8NFWvCRLRRWrJh1iPeJAKx0oIq0i9gFyVRM= +cloud.google.com/go/certificatemanager v1.8.6/go.mod h1:ZsK7vU+XFDfSRwOqB4GjAGzawIIA3dWPXaFC9I5Jsts= cloud.google.com/go/channel v1.17.5 h1:/omiBnyFjm4S1ETHoOmJbL7LH7Ljcei4rYG6Sj3hc80= cloud.google.com/go/channel v1.17.11 h1:AkKyMl2pSoJxBQtjAd6LYOtMgOaCl/kuiKoSg/Gf/H4= cloud.google.com/go/channel v1.17.11/go.mod h1:gjWCDBcTGQce/BSMoe2lAqhlq0dIRiZuktvBKXUawp0= +cloud.google.com/go/channel v1.17.12 h1:JNtAUfwGEOgeBp1bOxSzY/Hi3H1ARySNrj5cNBmOG+M= +cloud.google.com/go/channel v1.17.12/go.mod h1:DoVQacEH1YuNqIZVN8v67cXGxaUyOgjrst+/+pkVqWU= cloud.google.com/go/cloudbuild v1.15.1 h1:ZB6oOmJo+MTov9n629fiCrO9YZPOg25FZvQ7gIHu5ng= cloud.google.com/go/cloudbuild v1.16.5 h1:RvK5r8JBCLNg9XmfGPy05t3bmhLJV3Xh3sDHGHAATgM= cloud.google.com/go/cloudbuild v1.16.5/go.mod h1:HXLpZ8QeYZgmDIWpbl9Gs22p6o6uScgQ/cV9HF9cIZU= +cloud.google.com/go/cloudbuild v1.16.6 h1:6kV/JpCSKq64KWuZMYWZ8/utSkifWfEtQ+EcPjWPPLs= +cloud.google.com/go/cloudbuild v1.16.6/go.mod h1:Y7+6WFO8pT53rG0Lve6OZoO4+RkVTHGnHG7EB3uNiQw= cloud.google.com/go/clouddms v1.7.4 h1:Sr0Zo5EAcPQiCBgHWICg3VGkcdS/LLP1d9SR7qQBM/s= cloud.google.com/go/clouddms v1.7.10 h1:EA3y9v5TZiAlwgHJh2vPOEelqYiCxXBYZRCNnGK5q+g= cloud.google.com/go/clouddms v1.7.10/go.mod h1:PzHELq0QDyA7VaD9z6mzh2mxeBz4kM6oDe8YxMxd4RA= +cloud.google.com/go/clouddms v1.7.11 h1:pc78L2+BP6ex67gHqr1YjJ3uGo9gKLRCYk2hzzs9P2g= +cloud.google.com/go/clouddms v1.7.11/go.mod h1:rPNK0gJEkF2//rdxhCKhx+IFBlzkObOZhlhvDY1JKCE= cloud.google.com/go/cloudtasks v1.12.6 h1:EUt1hIZ9bLv8Iz9yWaCrqgMnIU+Tdh0yXM1MMVGhjfE= cloud.google.com/go/cloudtasks v1.12.12 h1:p91Brp4nJkyRRI/maYdO+FT+e9tU+2xoGr20s2rvalU= cloud.google.com/go/cloudtasks v1.12.12/go.mod h1:8UmM+duMrQpzzRREo0i3x3TrFjsgI/3FQw3664/JblA= +cloud.google.com/go/cloudtasks v1.12.13 h1:SN2NqXSOdmQzQJjoMV0qLIn6GXG5SzRrRVNrNq2Q6zA= +cloud.google.com/go/cloudtasks v1.12.13/go.mod h1:53OmmKqQTocrbeCL13cuaryBQOflyO8s4NxuRHJlXgc= cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= cloud.google.com/go/compute v1.27.4 h1:XM8ulx6crjdl09XBfji7viFgZOEQuIxBwKmjRH9Rtmc= cloud.google.com/go/compute v1.27.4/go.mod h1:7JZS+h21ERAGHOy5qb7+EPyXlQwzshzrx1x6L9JhTqU= +cloud.google.com/go/compute v1.27.5 h1:iii9Z+FhEeZ5cUkGOEqU+GM7MJSyxMgbE7H7j+JndYY= +cloud.google.com/go/compute v1.27.5/go.mod h1:DfwDGujFTdSeiE8b8ZqadF/uxHFBz+ekGsk8Zfi9dTA= cloud.google.com/go/contactcenterinsights v1.13.0 h1:6Vs/YnDG5STGjlWMEjN/xtmft7MrOTOnOZYUZtGTx0w= cloud.google.com/go/contactcenterinsights v1.13.6 h1:LRcI5RAlLIbjwT312sGt+gyXcaXTr+v7uEQlNyArO9g= cloud.google.com/go/contactcenterinsights v1.13.6/go.mod h1:mL+DbN3pMQGaAbDC4wZhryLciwSwHf5Tfk4Itr72Zyk= +cloud.google.com/go/contactcenterinsights v1.13.7 h1:KAqbmVHi77C5DwQ5ahpI41czo7LO2AWe0QJLDPfaVmY= +cloud.google.com/go/contactcenterinsights v1.13.7/go.mod h1:N5D7yxGknC0pDUC1OKOLShGQwpidKizKu3smt08153U= cloud.google.com/go/container v1.31.0 h1:MAaNH7VRNPWEhvqOypq2j+7ONJKrKzon4v9nS3nLZe0= cloud.google.com/go/container v1.38.0 h1:GP5zLamfvPZeOTifnGBSER/br76D5eJ97xhcXXrh5tM= cloud.google.com/go/container v1.38.0/go.mod h1:U0uPBvkVWOJGY/0qTVuPS7NeafFEUsHSPqT5pB8+fCY= +cloud.google.com/go/container v1.38.1 h1:Pb0GbZIg/KS4A9gbF3J4JHmrgPpBA2y+4v9N04aJkOs= +cloud.google.com/go/container v1.38.1/go.mod h1:2r4Qiz6IG2LhRFfWhPNmrYD7yzdE2B2kghigVWoSw/g= cloud.google.com/go/containeranalysis v0.11.4 h1:doJ0M1ljS4hS0D2UbHywlHGwB7sQLNrt9vFk9Zyi7vY= cloud.google.com/go/containeranalysis v0.12.1 h1:Xb8Eu7vVmWR5nAl5WPTGTx/dCr+R+oF7VbuYV47EHHs= cloud.google.com/go/containeranalysis v0.12.1/go.mod h1:+/lcJIQSFt45TC0N9Nq7/dPbl0isk6hnC4EvBBqyXsM= +cloud.google.com/go/containeranalysis v0.12.2 h1:BE8mBsV41BgUFQO3QW9wdpF3s5owx8idOcJ3I2aAoQA= +cloud.google.com/go/containeranalysis v0.12.2/go.mod h1:XF/U1ZJ9kXfl8HWRzuWMtEtzBb8SvJ0zvySrxrQA3N0= cloud.google.com/go/datacatalog v1.19.3 h1:A0vKYCQdxQuV4Pi0LL9p39Vwvg4jH5yYveMv50gU5Tw= cloud.google.com/go/datacatalog v1.21.0 h1:vl0pQT9TZ5rKi9e69FgtXNCR7I8MVRj4+CnbeXhz6UQ= cloud.google.com/go/datacatalog v1.21.0/go.mod h1:DB0QWF9nelpsbB0eR/tA0xbHZZMvpoFD1XFy3Qv/McI= +cloud.google.com/go/datacatalog v1.21.1 h1:l8yPkaMTlIX/437kBKGURvk4dtZIbotHBuSX2nLbJY8= +cloud.google.com/go/datacatalog v1.21.1/go.mod h1:23qsWWm592aQHwZ4or7VDjNhx7DeNklHAPE3GM47d1U= cloud.google.com/go/dataflow v0.9.5 h1:RYHtcPhmE664+F0Je46p+NvFbG8z//KCXp+uEqB4jZU= cloud.google.com/go/dataflow v0.9.11 h1:YIhStasKFDESaUdpnsHsp/5bACYL/yvW0OuZ6zPQ6nY= cloud.google.com/go/dataflow v0.9.11/go.mod h1:CCLufd7I4pPfyp54qMgil/volrL2ZKYjXeYLfQmBGJs= +cloud.google.com/go/dataflow v0.9.12 h1:p80cphmUBav+Htfr9DSQf++P0s8FrQT4BKsGmvYXBxM= +cloud.google.com/go/dataflow v0.9.12/go.mod h1:+2+80N2FOdDFWYhZdC2uTlX7GHP5kOH4vPNtfadggqQ= cloud.google.com/go/dataform v0.9.2 h1:5e4eqGrd0iDTCg4Q+VlAao5j2naKAA7xRurNtwmUknU= cloud.google.com/go/dataform v0.9.8 h1:oNtTx9PdH7aPnvrKIsPrh+Y6Mw+8Bw5/ZgLWVHAev/c= cloud.google.com/go/dataform v0.9.8/go.mod h1:cGJdyVdunN7tkeXHPNosuMzmryx55mp6cInYBgxN3oA= +cloud.google.com/go/dataform v0.9.9 h1:4aZ5O9aBHXUgQFZfu4sKjgIJIpzunbxZ1y8GHgtQZG8= +cloud.google.com/go/dataform v0.9.9/go.mod h1:QkiXNcrbFGjYtPtTkn700sfBiGIOG4mmpt26Ds8Ixeg= cloud.google.com/go/datafusion v1.7.5 h1:HQ/BUOP8OIGJxuztpYvNvlb+/U+/Bfs9SO8tQbh61fk= cloud.google.com/go/datafusion v1.7.11 h1:GVcVisjVKmoj1eNnIp3G3qjjo+7koHr0Kf8tF6Cjqe0= cloud.google.com/go/datafusion v1.7.11/go.mod h1:aU9zoBHgYmoPp4dzccgm/Gi4xWDMXodSZlNZ4WNeptw= +cloud.google.com/go/datafusion v1.7.12 h1:O5p8qgJg+7sn55JnaEnRr2yMX37bOZTMp3GBOa6dG0o= +cloud.google.com/go/datafusion v1.7.12/go.mod h1:ZUaEMjNVppM5ZasVt87QE0jN57O0LKY3uFe67EQ0GGI= cloud.google.com/go/datalabeling v0.8.5 h1:GpIFRdm0qIZNsxqURFJwHt0ZBJZ0nF/mUVEigR7PH/8= cloud.google.com/go/datalabeling v0.8.11 h1:7jSuJEAc7upeMmyICzqfU0OyxUV38JSWW+8r5GmoHX0= cloud.google.com/go/datalabeling v0.8.11/go.mod h1:6IGUV3z7hlkAU5ndKVshv/8z+7pxE+k0qXsEjyzO1Xg= +cloud.google.com/go/datalabeling v0.8.12 h1:iC7Lpzya3QKVLUy8M2J4y+JZrjAFtHg8bvAuLhMpkGw= +cloud.google.com/go/datalabeling v0.8.12/go.mod h1:IBbWnl80akCFj7jZ89/dRB/juuXig+QrQoLg24+vidg= cloud.google.com/go/dataplex v1.14.2 h1:fxIfdU8fxzR3clhOoNI7XFppvAmndxDu1AMH+qX9WKQ= cloud.google.com/go/dataplex v1.18.2 h1:bIU1r1YnsX6P1qTnaRnah/STHoLJ3EHUZVCjJl2+1Eo= cloud.google.com/go/dataplex v1.18.2/go.mod h1:NuBpJJMGGQn2xctX+foHEDKRbizwuiHJamKvvSteY3Q= +cloud.google.com/go/dataplex v1.18.3 h1:jYcAzyFS1DcnpwBVfnUD8wrRlltgU5L1EQdPshCEO+o= +cloud.google.com/go/dataplex v1.18.3/go.mod h1:wcfVhUr529uu9aZSy9WIUUdOCrkB8M5Gikfh3YUuGtE= cloud.google.com/go/dataproc v1.12.0 h1:W47qHL3W4BPkAIbk4SWmIERwsWBaNnWm0P2sdx3YgGU= cloud.google.com/go/dataproc/v2 v2.4.0 h1:/u81Fd+BvCLp+xjctI1DiWVJn6cn9/s3Akc8xPH02yk= cloud.google.com/go/dataproc/v2 v2.5.3 h1:OgTfUARkF8AfkNmoyT0wyLLXNh4LbT3l55s5gUlvFOk= cloud.google.com/go/dataproc/v2 v2.5.3/go.mod h1:RgA5QR7v++3xfP7DlgY3DUmoDSTaaemPe0ayKrQfyeg= +cloud.google.com/go/dataproc/v2 v2.5.4 h1:otFEJPOxzbAniKw4Aa1GVJlxjejR4/qHBlmU+xhY6MI= +cloud.google.com/go/dataproc/v2 v2.5.4/go.mod h1:rpxihxKtWjPl8MDwjGiYgMva8nEWQSyzvl3e0p4ATt4= cloud.google.com/go/dataqna v0.8.5 h1:9ybXs3nr9BzxSGC04SsvtuXaHY0qmJSLIpIAbZo9GqQ= cloud.google.com/go/dataqna v0.8.11 h1:bEUidOYRS0EQ7qHbZtcnospuks72iTapboszXU9poz8= cloud.google.com/go/dataqna v0.8.11/go.mod h1:74Icl1oFKKZXPd+W7YDtqJLa+VwLV6wZ+UF+sHo2QZQ= +cloud.google.com/go/dataqna v0.8.12 h1:bTiS9ppeA86EnJnXqZZLiQWXglFpyaF2TK/iPkZ/ga0= +cloud.google.com/go/dataqna v0.8.12/go.mod h1:86JdVMqh3521atZY1P7waaa50vzIbErTLY7gsio+umg= cloud.google.com/go/datastore v1.15.0 h1:0P9WcsQeTWjuD1H14JIY7XQscIPQ4Laje8ti96IC5vg= cloud.google.com/go/datastore v1.17.1 h1:6Me8ugrAOAxssGhSo8im0YSuy4YvYk4mbGvCadAH5aE= cloud.google.com/go/datastore v1.17.1/go.mod h1:mtzZ2HcVtz90OVrEXXGDc2pO4NM1kiBQy8YV4qGe0ZM= +cloud.google.com/go/datastore v1.19.0 h1:p5H3bUQltOa26GcMRAxPoNwoqGkq5v8ftx9/ZBB35MI= +cloud.google.com/go/datastore v1.19.0/go.mod h1:KGzkszuj87VT8tJe67GuB+qLolfsOt6bZq/KFuWaahc= cloud.google.com/go/datastream v1.10.4 h1:o1QDKMo/hk0FN7vhoUQURREuA0rgKmnYapB+1M+7Qz4= cloud.google.com/go/datastream v1.10.10 h1:klGhjQCLoLIRHMzMFIqM73cPNKliGveqC+Vrms+ce6A= cloud.google.com/go/datastream v1.10.10/go.mod h1:NqchuNjhPlISvWbk426/AU/S+Kgv7srlID9P5XOAbtg= +cloud.google.com/go/datastream v1.10.11 h1:LpJhP4g8+JGO5dKwhVSblnpB1hk/qA2/+rq68ppkVF8= +cloud.google.com/go/datastream v1.10.11/go.mod h1:0d9em/ERaof15lY5JU3pWKF7ZJOHiPKcNJsTCBz6TX8= cloud.google.com/go/deploy v1.17.1 h1:m27Ojwj03gvpJqCbodLYiVmE9x4/LrHGGMjzc0LBfM4= cloud.google.com/go/deploy v1.21.0 h1:/qnNETfztKemA9JmUBOrnH/rG/XFkHOBHygN1Vy5lkg= cloud.google.com/go/deploy v1.21.0/go.mod h1:PaOfS47VrvmYnxG5vhHg0KU60cKeWcqyLbMBjxS8DW8= +cloud.google.com/go/deploy v1.21.2 h1:sperWx8Nk3AFnonH8XXxCdarZfeXZYR7dgmDFoBkuCc= +cloud.google.com/go/deploy v1.21.2/go.mod h1:BDBWUXXCBGrvYxVmSYXIRdNffioym0ChQWDQS0c/wA8= cloud.google.com/go/dialogflow v1.49.0 h1:KqG0oxGE71qo0lRVyAoeBozefCvsMfcDzDjoLYSY0F4= cloud.google.com/go/dialogflow v1.55.0 h1:H28O0WAm2waHpNAz2n9jbv8FApfXxeKAkfHObdP2MMk= cloud.google.com/go/dialogflow v1.55.0/go.mod h1:0u0hSlJiFpMkMpMNoFrQETwDjaRm8Q8hYKv+jz5JeRA= +cloud.google.com/go/dialogflow v1.56.0 h1:s4lhL0DZExduaN534Rl3K488sKkes7LHnDQtbpwFHNk= +cloud.google.com/go/dialogflow v1.56.0/go.mod h1:P1hIske3kr9pSl11nEP4tFfAu2E4US+7PpboeBhM4ag= cloud.google.com/go/dlp v1.11.2 h1:lTipOuJaSjlYnnotPMbEhKURLC6GzCMDDzVbJAEbmYM= cloud.google.com/go/dlp v1.16.0 h1:mYjBqgVjseYXlx1TOOFsxSeZLboqxxKR7TqRGOG9vIU= cloud.google.com/go/dlp v1.16.0/go.mod h1:LtPZxZAenBXKzvWIOB2hdHIXuEcK0wW0En8//u+/nNA= +cloud.google.com/go/dlp v1.17.0 h1:BrKrhNjAi5u8EgIadv1mcjEX4bB7FPPcRvr0Cf9bdN4= +cloud.google.com/go/dlp v1.17.0/go.mod h1:9LuCkaCRZxWZ6HyqkmV3/PW0gKIVKoUVNjf0yMKVqMs= cloud.google.com/go/documentai v1.25.0 h1:lI62GMEEPO6vXJI9hj+G9WjOvnR0hEjvjokrnex4cxA= cloud.google.com/go/documentai v1.31.0 h1:YRkFK+0ZgEciz1svDkuL9fjbQLq8xvVa1d3NUlhO6B4= cloud.google.com/go/documentai v1.31.0/go.mod h1:5ajlDvaPyl9tc+K/jZE8WtYIqSXqAD33Z1YAYIjfad4= +cloud.google.com/go/documentai v1.32.0 h1:bXTTAjRmu7oVlvLqV4lLc7VKqR/IUtgexBPyLDWUs/o= +cloud.google.com/go/documentai v1.32.0/go.mod h1:X8skObtXBvR31QF+jERAu4mOCpRiJBaqbMvB3FLnMsA= cloud.google.com/go/domains v0.9.5 h1:Mml/R6s3vQQvFPpi/9oX3O5dRirgjyJ8cksK8N19Y7g= cloud.google.com/go/domains v0.9.11 h1:8peNiXtaMNIF9Wybci859M/yprFcEve1R2z08pErUBs= cloud.google.com/go/domains v0.9.11/go.mod h1:efo5552kUyxsXEz30+RaoIS2lR7tp3M/rhiYtKXkhkk= +cloud.google.com/go/domains v0.9.12 h1:Ot7K4Vl4Ap/y90VYjyz9qL57e+pAhMYVP0bIM7YnPvI= +cloud.google.com/go/domains v0.9.12/go.mod h1:2YamnZleyO3y5zYV+oASWAUoiHBJ0ZmkEcO6MXs5x3c= cloud.google.com/go/edgecontainer v1.1.5 h1:tBY32km78ScpK2aOP84JoW/+wtpx5WluyPUSEE3270U= cloud.google.com/go/edgecontainer v1.2.5 h1:wTo0ulZDSsDzeoVjICJZjZMzZ1Nn9y//AwAQlXbaTbs= cloud.google.com/go/edgecontainer v1.2.5/go.mod h1:OAb6tElD3F3oBujFAup14PKOs9B/lYobTb6LARmoACY= +cloud.google.com/go/edgecontainer v1.2.6 h1:r/4Yqg3Kji26XbCegwta1c7C92uwO0TUSaTwbzG5s/w= +cloud.google.com/go/edgecontainer v1.2.6/go.mod h1:4jyHt4ytGLL8P0S3m6umOL8bJhTw4tVnDUcPQCGlNMM= cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= cloud.google.com/go/errorreporting v0.3.1 h1:E/gLk+rL7u5JZB9oq72iL1bnhVlLrnfslrgcptjJEUE= cloud.google.com/go/errorreporting v0.3.1/go.mod h1:6xVQXU1UuntfAf+bVkFk6nld41+CPyF2NSPCyXE3Ztk= cloud.google.com/go/essentialcontacts v1.6.6 h1:13eHn5qBnsawxI7mIrv4jRIEmQ1xg0Ztqw5ZGqtUNfA= cloud.google.com/go/essentialcontacts v1.6.12 h1:JaQXS+qCFYs8yectfZHpzw4+NjTvFqTuDMCtfPzMvbw= cloud.google.com/go/essentialcontacts v1.6.12/go.mod h1:UGhWTIYewH8Ma4wDRJp8cMAHUCeAOCKsuwd6GLmmQLc= +cloud.google.com/go/essentialcontacts v1.6.13 h1:zKttHKhAV6LxT/SlahypK+2hBjmIVg9elMn3r0WQ5cY= +cloud.google.com/go/essentialcontacts v1.6.13/go.mod h1:52AB7Qmi6TBzA/lsSZER7oi4jR/pY0TXC0lNaaAyfA4= cloud.google.com/go/eventarc v1.13.4 h1:ORkd6/UV5FIdA8KZQDLNZYKS7BBOrj0p01DXPmT4tE4= cloud.google.com/go/eventarc v1.13.10 h1:HVJmOVc+7eVFAqMpJRrq0nY0KlYBEBVZW7Gz7TxTio8= cloud.google.com/go/eventarc v1.13.10/go.mod h1:KlCcOMApmUaqOEZUpZRVH+p0nnnsY1HaJB26U4X5KXE= +cloud.google.com/go/eventarc v1.13.11 h1:bFkxnUwdOKKgXjCoxpwd9FYV/yBs8iUhIuiJV4R1jlE= +cloud.google.com/go/eventarc v1.13.11/go.mod h1:1PJ+icw2mJYgqUsICg7Cr8gzMw38f3THiSzVSNPFrNQ= cloud.google.com/go/filestore v1.8.1 h1:X5G4y/vrUo1B8Nsz93qSWTMAcM8LXbGUldq33OdcdCw= cloud.google.com/go/filestore v1.8.7 h1:LF9t5MClPyFJMuXdez/AjF1uyO9xHKUFF3GUqA+xFPI= cloud.google.com/go/filestore v1.8.7/go.mod h1:dKfyH0YdPAKdYHqAR/bxZeil85Y5QmrEVQwIYuRjcXI= +cloud.google.com/go/filestore v1.8.8 h1:ZPE2+k1eyesicuehhHRXEG7WDo3mW/0li8oNnmuyxYE= +cloud.google.com/go/filestore v1.8.8/go.mod h1:gNT7bpDZSOFWCnRirQw1IehZtA7blbzkO3Q8VQfkeZ0= cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= cloud.google.com/go/firestore v1.16.0 h1:YwmDHcyrxVRErWcgxunzEaZxtNbc8QoFYA/JOEwDPgc= cloud.google.com/go/firestore v1.16.0/go.mod h1:+22v/7p+WNBSQwdSwP57vz47aZiY+HrDkrOsJNhk7rg= cloud.google.com/go/functions v1.16.0 h1:IWVylmK5F6hJ3R5zaRW7jI5PrWhCvtBVU4axQLmXSo4= cloud.google.com/go/functions v1.16.6 h1:tPe3/48RpjcFk96VeB6jOKQpK8nliGJLsgjh6pUOyFQ= cloud.google.com/go/functions v1.16.6/go.mod h1:wOzZakhMueNQaBUJdf0yjsJIe0GBRu+ZTvdSTzqHLs0= +cloud.google.com/go/functions v1.18.0 h1:50K2iLtj7xj6xqrhdNOL+aVaHwKi4h7qgNWP9ieTDag= +cloud.google.com/go/functions v1.18.0/go.mod h1:r8uxxI35hdP2slfTjGJvx04NRy8sP/EXUMZ0NYfBd+w= cloud.google.com/go/gaming v1.10.1 h1:5qZmZEWzMf8GEFgm9NeC3bjFRpt7x4S6U7oLbxaf7N8= cloud.google.com/go/gkebackup v1.3.5 h1:iuE8KNtTsPOc79qeWoNS8zOWoXPD9SAdOmwgxtlCmh8= cloud.google.com/go/gkebackup v1.5.4 h1:mufh0PNpvqbfLV+TcxzSGESX8jGBcjKgctldv7kwQns= cloud.google.com/go/gkebackup v1.5.4/go.mod h1:V+llvHlRD0bCyrkYaAMJX+CHralceQcaOWjNQs8/Ymw= +cloud.google.com/go/gkebackup v1.5.5 h1:ITiOPDl0Q1vgDHdbMvRk0Yk6uEcP8Kq875m6IMJJu6Y= +cloud.google.com/go/gkebackup v1.5.5/go.mod h1:C/XZ2LoG+V97xGc18oCPniO754E0iHt0OXqKatawBMM= cloud.google.com/go/gkeconnect v0.8.5 h1:17d+ZSSXKqG/RwZCq3oFMIWLPI8Zw3b8+a9/BEVlwH0= cloud.google.com/go/gkeconnect v0.8.11 h1:4bZAzvqhuv1uP+i4yG9cEMQ6ggdP26nBVjUgroPU6IM= cloud.google.com/go/gkeconnect v0.8.11/go.mod h1:ejHv5ehbceIglu1GsMwlH0nZpTftjxEY6DX7tvaM8gA= +cloud.google.com/go/gkeconnect v0.8.12 h1:0n3xfOvU+SN2LJRWex81U3xCNfQtPpxjSkrI3XBdudM= +cloud.google.com/go/gkeconnect v0.8.12/go.mod h1:+SpnnnUx4Xs/mWBJbqC7Mlu9Vv7riQlHSDS1T1ek2+U= cloud.google.com/go/gkehub v0.14.5 h1:RboLNFzf9wEMSo7DrKVBlf+YhK/A/jrLN454L5Tz99Q= cloud.google.com/go/gkehub v0.14.11 h1:hQkVCcOiW/vPVYsthvKl1nje430/TpdFfgeIuqcYVOA= cloud.google.com/go/gkehub v0.14.11/go.mod h1:CsmDJ4qbBnSPkoBltEubK6qGOjG0xNfeeT5jI5gCnRQ= +cloud.google.com/go/gkehub v0.14.12 h1:twVZpPzRnwJQ9UwU3M/Mwn356qboSRo+UxsTmlMtKiM= +cloud.google.com/go/gkehub v0.14.12/go.mod h1:CNYNBCqjIkE9L70gzbRxZOsc++Wcp2oCLkfuytOFqRM= cloud.google.com/go/gkemulticloud v1.1.1 h1:rsSZAGLhyjyE/bE2ToT5fqo1qSW7S+Ubsc9jFOcbhSI= cloud.google.com/go/gkemulticloud v1.2.4 h1:6zV05tyl37HoEjCGGY+zHFNxnKQCjvVpiqWAUVgGaEs= cloud.google.com/go/gkemulticloud v1.2.4/go.mod h1:PjTtoKLQpIRztrL+eKQw8030/S4c7rx/WvHydDJlpGE= +cloud.google.com/go/gkemulticloud v1.2.5 h1:OREoK+FO+5j6eVXdvGsiXHvoFkUZxxoS8WBWk6zWThA= +cloud.google.com/go/gkemulticloud v1.2.5/go.mod h1:zVRNlO7/jFXmvrkBd+UfhI2T7ZBb+N3b3lt/3K60uS0= cloud.google.com/go/grafeas v0.3.4 h1:D4x32R/cHX3MTofKwirz015uEdVk4uAxvZkZCZkOrF4= cloud.google.com/go/grafeas v0.3.6 h1:7bcA10EBgTsxeAVypJhz2Dv3fhrdlO7Ml8l7ZZA2IkE= cloud.google.com/go/grafeas v0.3.6/go.mod h1:to6ECAPgRO2xeqD8ISXHc70nObJuaKZThreQOjeOH3o= +cloud.google.com/go/grafeas v0.3.9 h1:4rfIkfgxFkhgzGc19aBGob+R6OXJVC7nZ+XrpOFTxYg= +cloud.google.com/go/grafeas v0.3.9/go.mod h1:j8hBcywIqtJ3/3QP9yYB/LqjLWBM9dXumBa+xplvyG0= cloud.google.com/go/gsuiteaddons v1.6.5 h1:CZEbaBwmbYdhFw21Fwbo+C35HMe36fTE0FBSR4KSfWg= cloud.google.com/go/gsuiteaddons v1.6.11 h1:zydWX0nVT0Ut/P1X25Sy+4Rqe2PH04IzhwlF1BJd8To= cloud.google.com/go/gsuiteaddons v1.6.11/go.mod h1:U7mk5PLBzDpHhgHv5aJkuvLp9RQzZFpa8hgWAB+xVIk= +cloud.google.com/go/gsuiteaddons v1.6.12 h1:lp9f1VVl7Z4S8uqWTvGvazsMhBFpEbUiqCG2uYJ3LRs= +cloud.google.com/go/gsuiteaddons v1.6.12/go.mod h1:hqTWzMXCgS/BPuyiWHzDBZC4K3+a9lcJWBUR+i+6D7A= cloud.google.com/go/iam v1.1.8/go.mod h1:GvE6lyMmfxXauzNq8NbgJbeVQNspG+tcdL/W8QO1+zE= cloud.google.com/go/iam v1.1.12/go.mod h1:9LDX8J7dN5YRyzVHxwQzrQs9opFFqn0Mxs9nAeB+Hhg= cloud.google.com/go/iap v1.9.4 h1:94zirc2r4t6KzhAMW0R6Dme005eTP6yf7g6vN4IhRrA= cloud.google.com/go/iap v1.9.10 h1:j7jQqqSkZ2nWAOCiyaZfnJ+REycTJ2NP2dUEjLoW4aA= cloud.google.com/go/iap v1.9.10/go.mod h1:pO0FEirrhMOT1H0WVwpD5dD9r3oBhvsunyBQtNXzzc0= +cloud.google.com/go/iap v1.9.11 h1:rqm2jCKE/uA2iRYxcFY7O88sUBhru5+/OTK4dphIOyM= +cloud.google.com/go/iap v1.9.11/go.mod h1:UcvTLqySIc8C3Dw3JPZ7QihzzxVQJ7/KUOL9MjxiPZk= cloud.google.com/go/ids v1.4.5 h1:xd4U7pgl3GHV+MABnv1BF4/Vy/zBF7CYC8XngkOLzag= cloud.google.com/go/ids v1.4.11 h1:JhlR1d0XhMsj6YmSmbLbbXV5CGkffnUkPj0HNxJYNtc= cloud.google.com/go/ids v1.4.11/go.mod h1:+ZKqWELpJm8WcRRsSvKZWUdkriu4A3XsLLzToTv3418= +cloud.google.com/go/ids v1.4.12 h1:9X6gbqXgOztpxR9pl9xkBgG4jMex0oZDrpwaspCLL1k= +cloud.google.com/go/ids v1.4.12/go.mod h1:SH2yjlk9fKWrRgob/E0Gd1wM+VFztfTdR+LaJRDMiPw= cloud.google.com/go/iot v1.7.5 h1:munTeBlbqI33iuTYgXy7S8lW2TCgi5l1hA4roSIY+EE= cloud.google.com/go/iot v1.7.11 h1:UBqSUZA6+7bM+mv6uvhl8tVsyT2Fi50njtBFRbrKSlI= cloud.google.com/go/iot v1.7.11/go.mod h1:0vZJOqFy9kVLbUXwTP95e0dWHakfR4u5IWqsKMGIfHk= +cloud.google.com/go/iot v1.7.12 h1:udkAi3LvaD7KdwJUegnUyOBVnruL0It1nmV5TktYF7o= +cloud.google.com/go/iot v1.7.12/go.mod h1:8ntlg5OWnVodAsbs0KDLY58tKEroy+CYciDX/ONxpl4= cloud.google.com/go/kms v1.18.4/go.mod h1:SG1bgQ3UWW6/KdPo9uuJnzELXY5YTTMJtDYvajiQ22g= cloud.google.com/go/language v1.12.3 h1:iaJZg6K4j/2PvZZVcjeO/btcWWIllVRBhuTFjGO4LXs= cloud.google.com/go/language v1.13.0 h1:6Pl97Ei85A3wBJwjXW2S/1IWeUvhQf/lIPQBItnp0FA= cloud.google.com/go/language v1.13.0/go.mod h1:B9FbD17g1EkilctNGUDAdSrBHiFOlKNErLljO7jplDU= +cloud.google.com/go/language v1.13.1 h1:sgAhzmJ/wZBS/4djQJLpjke52sdDhfKuskoCHSTaCHk= +cloud.google.com/go/language v1.13.1/go.mod h1:PY/DAdVW0p2MWl2Lut31AJddEmQBBXMnPUM8nkl/WfA= cloud.google.com/go/lifesciences v0.9.5 h1:gXvN70m2p+4zgJFzaz6gMKaxTuF9WJ0USYoMLWAOm8g= cloud.google.com/go/lifesciences v0.9.11 h1:xyPSYICJWZElcELYgWCKs5PltyNX3TzOKaQAZA7d/I0= cloud.google.com/go/lifesciences v0.9.11/go.mod h1:NMxu++FYdv55TxOBEvLIhiAvah8acQwXsz79i9l9/RY= +cloud.google.com/go/lifesciences v0.9.12 h1:DGKhxamDcn1v7ieat3sqCjm6HwJqWnrF9Xbq/IDyz80= +cloud.google.com/go/lifesciences v0.9.12/go.mod h1:si0In2nxVPtZnSoDNlEgSV4BJWxxlkdgKh+LXPYMf4w= cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw= cloud.google.com/go/logging v1.11.0 h1:v3ktVzXMV7CwHq1MBF65wcqLMA7i+z3YxbUsoK7mOKs= cloud.google.com/go/logging v1.11.0/go.mod h1:5LDiJC/RxTt+fHc1LAt20R9TKiUTReDg6RuuFOZ67+A= @@ -214,18 +330,28 @@ cloud.google.com/go/longrunning v0.5.11/go.mod h1:rDn7//lmlfWV1Dx6IB4RatCPenTwwm cloud.google.com/go/managedidentities v1.6.5 h1:+bpih1piZVLxla/XBqeSUzJBp8gv9plGHIMAI7DLpDM= cloud.google.com/go/managedidentities v1.6.11 h1:YU6NtRRBX5R1f3a8ryqhh1dUb1/pt3rnhSO50b63yZY= cloud.google.com/go/managedidentities v1.6.11/go.mod h1:df+8oZ1D4Eri+NrcpuiR5Hd6MGgiMqn0ZCzNmBYPS0A= +cloud.google.com/go/managedidentities v1.6.12 h1:p+n5vvhcpWgwpHoeeUoe+D9/wzIqW5vsWoi2n7YTafA= +cloud.google.com/go/managedidentities v1.6.12/go.mod h1:7KrCfXlxPw85nhlEYF3o5oLC8RtQakMAIGKNiNN3OAg= cloud.google.com/go/maps v1.6.4 h1:EVCZAiDvog9So46460BGbCasPhi613exoaQbpilMVlk= cloud.google.com/go/maps v1.11.6 h1:HMI0drvgnT+BtsjBofb1Z80P53n63ybmm7l+1w1og9I= cloud.google.com/go/maps v1.11.6/go.mod h1:MOS/NN0L6b7Kumr8bLux9XTpd8+D54DYxBMUjq+XfXs= +cloud.google.com/go/maps v1.11.7 h1:ifdbRNVte+Oq0aHVR4lvXMBSvJhtIcK+G9GsWRQDQ9o= +cloud.google.com/go/maps v1.11.7/go.mod h1:CEGHM/Q0epp0oWFO7kiEk8oDGUUhjd1sj4Rcd/4iwGU= cloud.google.com/go/mediatranslation v0.8.5 h1:c76KdIXljQHSCb/Cy47S8H4s05A4zbK3pAFGzwcczZo= cloud.google.com/go/mediatranslation v0.8.11 h1:QvO405ocKTmcJqjfqL1zps08yrKk8rE+0E1ZNSWfjbw= cloud.google.com/go/mediatranslation v0.8.11/go.mod h1:3sNEm0fx61eHk7rfzBzrljVV9XKr931xI3OFacQBVFg= +cloud.google.com/go/mediatranslation v0.8.12 h1:26qFQZxj9Rii22kl84HHcJ0zWlaHsVdBJZxAil89ejs= +cloud.google.com/go/mediatranslation v0.8.12/go.mod h1:owrIOMto4hzsoqkZe95ePEiMJv4JF7/tgEgWuHC+t40= cloud.google.com/go/memcache v1.10.5 h1:yeDv5qxRedFosvpMSEswrqUsJM5OdWvssPHFliNFTc4= cloud.google.com/go/memcache v1.10.11 h1:DGPEJOVL4Qix2GLKQKcgzGpNLD7gAnCFLr9ch9YSIhU= cloud.google.com/go/memcache v1.10.11/go.mod h1:ubJ7Gfz/xQawQY5WO5pht4Q0dhzXBFeEszAeEJnwBHU= +cloud.google.com/go/memcache v1.10.12 h1:rQxkJUKO9YlENBUHb9WuSb6vBlOrU5xh9Riz81haxW0= +cloud.google.com/go/memcache v1.10.12/go.mod h1:OfG2zgIXVTNJy2UKDF4o4irKxBqTx9RMZhGKJ/hLJUI= cloud.google.com/go/metastore v1.13.4 h1:dR7vqWXlK6IYR8Wbu9mdFfwlVjodIBhd1JRrpZftTEg= cloud.google.com/go/metastore v1.13.10 h1:E5eAxzIRoVP0DrV+ZtTLMYkkjSs4fcfsbL7wv1mXV2U= cloud.google.com/go/metastore v1.13.10/go.mod h1:RPhMnBxUmTLT1fN7fNbPqtH5EoGHueDxubmJ1R1yT84= +cloud.google.com/go/metastore v1.13.11 h1:yZR2paCUcLscxQLp35FoApsMOFB7pOGcIJTiX6psnlc= +cloud.google.com/go/metastore v1.13.11/go.mod h1:aeP+V0Xs3SLqu4mrQWRyuSg5+fdyPq+kdu1xclnR8y8= cloud.google.com/go/monitoring v1.18.0 h1:NfkDLQDG2UR3WYZVQE8kwSbUIEyIqJUPl+aOQdFH1T4= cloud.google.com/go/monitoring v1.20.3/go.mod h1:GPIVIdNznIdGqEjtRKQWTLcUeRnPjZW85szouimiczU= cloud.google.com/go/monitoring v1.20.4 h1:zwcViK7mT9SV0kzKqLOI3spRadvsmvw/R9z1MHNeC0E= @@ -233,42 +359,68 @@ cloud.google.com/go/monitoring v1.20.4/go.mod h1:v7F/UcLRw15EX7xq565N7Ae5tnYEE28 cloud.google.com/go/networkconnectivity v1.14.4 h1:GBfXFhLyPspnaBE3nI/BRjdhW8vcbpT9QjE/4kDCDdc= cloud.google.com/go/networkconnectivity v1.14.10 h1:2EE8pKiv1AI8fBdZCdiUjNgQ+TaBgwE4GxIze4fDdY0= cloud.google.com/go/networkconnectivity v1.14.10/go.mod h1:f7ZbGl4CV08DDb7lw+NmMXQTKKjMhgCEEwFbEukWuOY= +cloud.google.com/go/networkconnectivity v1.14.11 h1:zkOTU4GJQQVOD2bKTlUPFIdEG1MQCgNrnwagL43uK8s= +cloud.google.com/go/networkconnectivity v1.14.11/go.mod h1:XRA6nT7ygTN09gAtCRsFhbqn3u7/9LIUn6S+5G4fs50= cloud.google.com/go/networkmanagement v1.9.4 h1:aLV5GcosBNmd6M8+a0ekB0XlLRexv4fvnJJrYnqeBcg= cloud.google.com/go/networkmanagement v1.13.6 h1:6TGn7ZZXyj5rloN0vv5Aw0awYbfbheNRg8BKroT7/2g= cloud.google.com/go/networkmanagement v1.13.6/go.mod h1:WXBijOnX90IFb6sberjnGrVtZbgDNcPDUYOlGXmG8+4= +cloud.google.com/go/networkmanagement v1.13.7 h1:dXfIaWKr5vVBBHagmbILBkb7yV+FEsyZmMuTZmG3frk= +cloud.google.com/go/networkmanagement v1.13.7/go.mod h1:foi1eLe3Ayydrr63O3ViMwG1AGS3/BxRSmXpAqMFhkY= cloud.google.com/go/networksecurity v0.9.5 h1:+caSxBTj0E8OYVh/5wElFdjEMO1S/rZtE1152Cepchc= cloud.google.com/go/networksecurity v0.9.11 h1:6wUzyHCwDEOkDbAJjT6jxsAi+vMfe3aj2JWwqSFVXOQ= cloud.google.com/go/networksecurity v0.9.11/go.mod h1:4xbpOqCwplmFgymAjPFM6ZIplVC6+eQ4m7sIiEq9oJA= +cloud.google.com/go/networksecurity v0.9.12 h1:BqYfZZHx2koUMiRqEz3BV9AVOsreleSOELi+FZqrEUw= +cloud.google.com/go/networksecurity v0.9.12/go.mod h1:Id0HGMKFJemLolvsoECda71vU2T9JByGPYct6LgMxrw= cloud.google.com/go/notebooks v1.11.3 h1:FH48boYmrWVQ6k0Mx/WrnNafXncT5iSYxA8CNyWTgy0= cloud.google.com/go/notebooks v1.11.9 h1:c8I0EaLGqStRmvX29L7jb4mOrpigxn1mGyBt65OdS0s= cloud.google.com/go/notebooks v1.11.9/go.mod h1:JmnRX0eLgHRJiyxw8HOgumW9iRajImZxr7r75U16uXw= +cloud.google.com/go/notebooks v1.11.10 h1:7FOp+bFhy1WYKbRpfb190Jhj5Qu4paXv5EErwOD1bFY= +cloud.google.com/go/notebooks v1.11.10/go.mod h1:2d3Lwdm5VTxZzxY94V8TffNBk0FBnORieiVBeN+n9QQ= cloud.google.com/go/optimization v1.6.3 h1:63NZaWyN+5rZEKHPX4ACpw3BjgyeuY8+rCehiCMaGPY= cloud.google.com/go/optimization v1.6.9 h1:++U21U9LWFdgnnVFaq4kDeOafft6gI/CHzsiJ173c6U= cloud.google.com/go/optimization v1.6.9/go.mod h1:mcvkDy0p4s5k7iSaiKrwwpN0IkteHhGmuW5rP9nXA5M= +cloud.google.com/go/optimization v1.6.10 h1:jsPO26IqwEs/x3KJQCmHvL9/gQK35JppdxNbuyXPh5Q= +cloud.google.com/go/optimization v1.6.10/go.mod h1:qWX4Kv90NeBgPfoRwyMbISe8M7Ql1LAOFPNFuOqIvUI= cloud.google.com/go/orchestration v1.8.5 h1:YHgWMlrPttIVGItgGfuvO2KM7x+y9ivN/Yk92pMm1a4= cloud.google.com/go/orchestration v1.9.6 h1:xfczjtNDabsXTnDySAwD/TMfDSkcxEgH1rxfS6BVQtM= cloud.google.com/go/orchestration v1.9.6/go.mod h1:gQvdIsHESZJigimnbUA8XLbYeFlSg/z+A7ppds5JULg= +cloud.google.com/go/orchestration v1.9.7 h1:6KCe2V5E9gCtN09BEzLVTCv8g16LPYzImDqgwXKbnvY= +cloud.google.com/go/orchestration v1.9.7/go.mod h1:Mgtuci4LszRSzKkQucdWvdhTyG+QB4+3ZpsZ4sqalrQ= cloud.google.com/go/orgpolicy v1.12.1 h1:2JbXigqBJVp8Dx5dONUttFqewu4fP0p3pgOdIZAhpYU= cloud.google.com/go/orgpolicy v1.12.7 h1:StymaN9vS7949m15Nwgf5aKd9yaRtzWJ4VqHdbXcOEM= cloud.google.com/go/orgpolicy v1.12.7/go.mod h1:Os3GlUFRPf1UxOHTup5b70BARnhHeQNNVNZzJXPbWYI= +cloud.google.com/go/orgpolicy v1.12.8 h1:lBKGvA07J42nQpU6X61hQDIv/jcnuJtz/BhnTjGIDYg= +cloud.google.com/go/orgpolicy v1.12.8/go.mod h1:WHkLGqHILPnMgJ4UTdag6YgztVIgWS+T5T6tywH3cSM= cloud.google.com/go/osconfig v1.12.5 h1:Mo5jGAxOMKH/PmDY7fgY19yFcVbvwREb5D5zMPQjFfo= cloud.google.com/go/osconfig v1.13.2 h1:IbbTg7jtTEn4+iEJwgbCYck5NLMOc2eKrqVpQb7Xx6c= cloud.google.com/go/osconfig v1.13.2/go.mod h1:eupylkWQJCwSIEMkpVR4LqpgKkQi0mD4m1DzNCgpQso= +cloud.google.com/go/osconfig v1.13.3 h1:GoiK/q0OAhaGxZMMapulq+lxZU4BEZn8ado2g3yqfqc= +cloud.google.com/go/osconfig v1.13.3/go.mod h1:gIFyyriC1ANob8SnpwrQ6jjNroRwItoBOYfqiG3LkUU= cloud.google.com/go/oslogin v1.13.1 h1:1K4nOT5VEZNt7XkhaTXupBYos5HjzvJMfhvyD2wWdFs= cloud.google.com/go/oslogin v1.13.7 h1:q9x7tjKtfBpXMpiJKwb5UyhMA3GrwmJHvx56uCEuS8M= cloud.google.com/go/oslogin v1.13.7/go.mod h1:xq027cL0fojpcEcpEQdWayiDn8tIx3WEFYMM6+q7U+E= +cloud.google.com/go/oslogin v1.13.8 h1:ukF32m5YIOUgMQXrJW6RkOLxV/VYPa3f1mDr9OjN8bA= +cloud.google.com/go/oslogin v1.13.8/go.mod h1:rc52yAdMXB5mERVeOXRcDnaswQNFTPRJ93VVHmGwJSk= cloud.google.com/go/phishingprotection v0.8.5 h1:DH3WFLzEoJdW/6xgsmoDqOwT1xddFi7gKu0QGZQhpGU= cloud.google.com/go/phishingprotection v0.8.11 h1:3Kr7TINZ+8pbdWe3JnJf9c84ibz60NRTvwLdVtI3SK8= cloud.google.com/go/phishingprotection v0.8.11/go.mod h1:Mge0cylqVFs+D0EyxlsTOJ1Guf3qDgrztHzxZqkhRQM= +cloud.google.com/go/phishingprotection v0.8.12 h1:64kH4KgKV4vYJeAqN9dHbxPLFE5yEKcfvV3Rrh0TZTg= +cloud.google.com/go/phishingprotection v0.8.12/go.mod h1:tkR+cZBpRdu4i04BP1CqaZr2yL7U1o8t+v/SZ2kOSDU= cloud.google.com/go/policytroubleshooter v1.10.3 h1:c0WOzC6hz964QWNBkyKfna8A2jOIx1zzZa43Gx/P09o= cloud.google.com/go/policytroubleshooter v1.10.9 h1:EHXkBYgHQtVH8P41G2xxmQbMwQh+o5ggno8l3/9CXaA= cloud.google.com/go/policytroubleshooter v1.10.9/go.mod h1:X8HEPVBWz8E+qwI/QXnhBLahEHdcuPO3M9YvSj0LDek= +cloud.google.com/go/policytroubleshooter v1.10.10 h1:oIc5msMHCZgiYbMJPMuqhj478Eo0oT6HkUnLmYBz/rc= +cloud.google.com/go/policytroubleshooter v1.10.10/go.mod h1:9S7SKOsLydGB2u91WKNjHpLScxxkKATIu3Co0fw8LPQ= cloud.google.com/go/privatecatalog v0.9.5 h1:UZ0assTnATXSggoxUIh61RjTQ4P9zCMk/kEMbn0nMYA= cloud.google.com/go/privatecatalog v0.9.11 h1:t8dJpQf22H6COeDvp7TDl7+KuwLT6yVmqAVRIUIUj6U= cloud.google.com/go/privatecatalog v0.9.11/go.mod h1:awEF2a8M6UgoqVJcF/MthkF8SSo6OoWQ7TtPNxUlljY= +cloud.google.com/go/privatecatalog v0.9.12 h1:ZmATFJMFK6gbWoDQpLX9y6nmBMeYUCY8Wa5ijc2yKss= +cloud.google.com/go/privatecatalog v0.9.12/go.mod h1:Sl292f/1xY0igI+CFNGfiXJWiN9BvaLpc8mjnCHNRnA= cloud.google.com/go/pubsub v1.36.1 h1:dfEPuGCHGbWUhaMCTHUFjfroILEkx55iUmKBZTP5f+Y= cloud.google.com/go/pubsub v1.41.0 h1:ZPaM/CvTO6T+1tQOs/jJ4OEMpjtel0PTLV7j1JK+ZrI= cloud.google.com/go/pubsub v1.41.0/go.mod h1:g+YzC6w/3N91tzG66e2BZtp7WrpBBMXVa3Y9zVoOGpk= +cloud.google.com/go/pubsub v1.42.0 h1:PVTbzorLryFL5ue8esTS2BfehUs0ahyNOY9qcd+HMOs= +cloud.google.com/go/pubsub v1.42.0/go.mod h1:KADJ6s4MbTwhXmse/50SebEhE4SmUwHi48z3/dHar1Y= cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= cloud.google.com/go/pubsublite v1.8.2 h1:jLQozsEVr+c6tOU13vDugtnaBSUy/PD5zK6mhm+uF1Y= cloud.google.com/go/pubsublite v1.8.2/go.mod h1:4r8GSa9NznExjuLPEJlF1VjOPOpgf3IT6k8x/YgaOPI= @@ -276,30 +428,48 @@ cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQly cloud.google.com/go/recaptchaenterprise/v2 v2.9.2 h1:U3Wfq12X9cVMuTpsWDSURnXF0Z9hSPTHj+xsnXDRLsw= cloud.google.com/go/recaptchaenterprise/v2 v2.14.2 h1:80Mx0i3uyv5dPNUYsNPFk9GJ+19AmTlnWnXFCTC9NkI= cloud.google.com/go/recaptchaenterprise/v2 v2.14.2/go.mod h1:MwPgdgvBkE46aWuuXeBTCB8hQJ88p+CpXInROZYCTkc= +cloud.google.com/go/recaptchaenterprise/v2 v2.14.3 h1:qnU+urA6SZlRErosscaJ2DLG4264D6V8S4OgC3RU6QY= +cloud.google.com/go/recaptchaenterprise/v2 v2.14.3/go.mod h1:MiSHAXwja4btHPJFNJrDke//V+x83/ckXcdwbzn4+e8= cloud.google.com/go/recommendationengine v0.8.5 h1:ineqLswaCSBY0csYv5/wuXJMBlxATK6Xc5jJkpiTEdM= cloud.google.com/go/recommendationengine v0.8.11 h1:STJYdA/e/MAh2ZSdjss5YE/d0t0nt0WotBF9V0pgpPQ= cloud.google.com/go/recommendationengine v0.8.11/go.mod h1:cEkU4tCXAF88a4boMFZym7U7uyxvVwcQtKzS85IbQio= +cloud.google.com/go/recommendationengine v0.8.12 h1:X587hwzHqvmKyTR4EzH/QVYtvaCNqeIKhX9QC2iAw4g= +cloud.google.com/go/recommendationengine v0.8.12/go.mod h1:A3c39mOVC4utWlwk+MpchvkZTM6MSJXm3KUwTQ47VzA= cloud.google.com/go/recommender v1.12.1 h1:LVLYS3r3u0MSCxQSDUtLSkporEGi9OAE6hGvayrZNPs= cloud.google.com/go/recommender v1.12.7 h1:asEAoj4a3inPCdH8nbPaZDJWhR/xwfKi4tuSmIlaS2I= cloud.google.com/go/recommender v1.12.7/go.mod h1:lG8DVtczLltWuaCv4IVpNphONZTzaCC9KdxLYeZM5G4= +cloud.google.com/go/recommender v1.12.8 h1:3d+XXbeVU9Mt0TW6La+BhVFyCT5M2F1nazhAYrtahfM= +cloud.google.com/go/recommender v1.12.8/go.mod h1:zoJL8kPJJotOoNU3D2fCXW33vhbyIPe0Sq7ObhYLnGM= cloud.google.com/go/redis v1.14.2 h1:QF0maEdVv0Fj/2roU8sX3NpiDBzP9ICYTO+5F32gQNo= cloud.google.com/go/redis v1.16.4 h1:9CO6EcuM9/CpgtcjG6JZV+GFw3oDrRfwLwmvwo/uM1o= cloud.google.com/go/redis v1.16.4/go.mod h1:unCVfLP5eFrVhGLDnb7IaSaWxuZ+7cBgwwBwbdG9m9w= +cloud.google.com/go/redis v1.16.5 h1:yqidSLL+AE6IPNnEkAK6ZlxXp5c3zrsTTCB1TrpO054= +cloud.google.com/go/redis v1.16.5/go.mod h1:cWn6WHSEnmVZh9lJ9AN/UwDTtvlcT+TTRGvNIckUbG0= cloud.google.com/go/resourcemanager v1.9.5 h1:AZWr1vWVDKGwfLsVhcN+vcwOz3xqqYxtmMa0aABCMms= cloud.google.com/go/resourcemanager v1.9.11 h1:N8CmqszjKNOgJnrQVsg+g8VWIEGgcwsD5rPiay9cMC4= cloud.google.com/go/resourcemanager v1.9.11/go.mod h1:SbNAbjVLoi2rt9G74bEYb3aw1iwvyWPOJMnij4SsmHA= +cloud.google.com/go/resourcemanager v1.9.12 h1:p++iHmmeq9iWTia8WhNmPvBhL7MZsglQpZAYlHCguBs= +cloud.google.com/go/resourcemanager v1.9.12/go.mod h1:unouv9x3+I+6kVeE10LGM3oJ8aQrUZganWnRchitbAM= cloud.google.com/go/resourcesettings v1.6.5 h1:BTr5MVykJwClASci/7Og4Qfx70aQ4n3epsNLj94ZYgw= cloud.google.com/go/resourcesettings v1.7.4 h1:1VwLfvJi8QtGrKPwuisGqr6gcgaCSR6A57wIvN+fqkM= cloud.google.com/go/resourcesettings v1.7.4/go.mod h1:seBdLuyeq+ol2u9G2+74GkSjQaxaBWF+vVb6mVzQFG0= +cloud.google.com/go/resourcesettings v1.7.5 h1:zRvaQBE1O7wuB/UtX7Lw119r/xGcPzaY1POGpoMEhEs= +cloud.google.com/go/resourcesettings v1.7.5/go.mod h1:voqqKzYIrnoAqFKV6xk2qhgTnxzfGCJNOuBnHJEzcNU= cloud.google.com/go/retail v1.16.0 h1:Fn1GuAua1c6crCGqfJ1qMxG1Xh10Tg/x5EUODEHMqkw= cloud.google.com/go/retail v1.17.4 h1:YJgpBwCarAPqzaJS8ycIhyn2sAQT1RhTJRiTVBjtJAI= cloud.google.com/go/retail v1.17.4/go.mod h1:oPkL1FzW7D+v/hX5alYIx52ro2FY/WPAviwR1kZZTMs= +cloud.google.com/go/retail v1.17.5 h1:seOuQ16gMSxxre//JZy7lEdAKWwHQJMLYBmSfifJ/VI= +cloud.google.com/go/retail v1.17.5/go.mod h1:DSWPessLdnuvRH+N2FY+j1twyKtpRDKp4Y88dm7VqBw= cloud.google.com/go/run v1.3.4 h1:m9WDA7DzTpczhZggwYlZcBWgCRb+kgSIisWn1sbw2rQ= cloud.google.com/go/run v1.4.0 h1:ai1rnbX92iPqWg9MrbDbebsxlUSAiOK6N9dEDDQeVA0= cloud.google.com/go/run v1.4.0/go.mod h1:4G9iHLjdOC+CQ0CzA0+6nLeR6NezVPmlj+GULmb0zE4= +cloud.google.com/go/run v1.4.1 h1:grsUhL/Dlp7z5z2A4Nxi1oxEyktBkyB8VuobO6fuILs= +cloud.google.com/go/run v1.4.1/go.mod h1:gaXIpytRDfrJjb3pz9PRG2q2KUaDDDV+Uvmq6QRZH20= cloud.google.com/go/scheduler v1.10.6 h1:5U8iXLoQ03qOB+ZXlAecU7fiE33+u3QiM9nh4cd0eTE= cloud.google.com/go/scheduler v1.10.12 h1:8BxDXoHCcsAe2fXsvFrkBbTxgl+5JBrIy1+/HRS0nxY= cloud.google.com/go/scheduler v1.10.12/go.mod h1:6DRtOddMWJ001HJ6MS148rtLSh/S2oqd2hQC3n5n9fQ= +cloud.google.com/go/scheduler v1.10.13 h1:KEM2/3r4NIn6eOIL1tAEN1Qrot8xqKYuW1QKEQ+GyFU= +cloud.google.com/go/scheduler v1.10.13/go.mod h1:lDJItkp2hNrCsHOBtVExCzjXBzK9WI3yKNg713/OU4s= cloud.google.com/go/secretmanager v1.11.5 h1:82fpF5vBBvu9XW4qj0FU2C6qVMtj1RM/XHwKXUEAfYY= cloud.google.com/go/secretmanager v1.13.5/go.mod h1:/OeZ88l5Z6nBVilV0SXgv6XJ243KP2aIhSWRMrbvDCQ= cloud.google.com/go/secretmanager v1.13.6 h1:0ZEl/LuoB4xQsjVfQt3Gi/dZfOv36n4JmdPrMargzYs= @@ -307,37 +477,57 @@ cloud.google.com/go/secretmanager v1.13.6/go.mod h1:x2ySyOrqv3WGFRFn2Xk10iHmNmvm cloud.google.com/go/security v1.15.5 h1:wTKJQ10j8EYgvE8Y+KhovxDRVDk2iv/OsxZ6GrLP3kE= cloud.google.com/go/security v1.17.4 h1:ERhxAa02mnMEIIAXvzje+qJ+yWniP6l5uOX+k9ELCaA= cloud.google.com/go/security v1.17.4/go.mod h1:KMuDJH+sEB3KTODd/tLJ7kZK+u2PQt+Cfu0oAxzIhgo= +cloud.google.com/go/security v1.17.5 h1:FzjVVdJKgfHmDt1gsecHehVewA0wLuruHvA1g4o5k4c= +cloud.google.com/go/security v1.17.5/go.mod h1:MA8w7SbQAQO9CQ9r0R7HR0F7g1AJoqx87SFLpapq3OU= cloud.google.com/go/securitycenter v1.24.4 h1:/5jjkZ+uGe8hZ7pvd7pO30VW/a+pT2MrrdgOqjyucKQ= cloud.google.com/go/securitycenter v1.33.1 h1:K+jfFUTum2jl//uWCN+QKkKXRgidxTyGfGTqXPyDvUY= cloud.google.com/go/securitycenter v1.33.1/go.mod h1:jeFisdYUWHr+ig72T4g0dnNCFhRwgwGoQV6GFuEwafw= +cloud.google.com/go/securitycenter v1.34.0 h1:rf1n9DviaHlkjqG/Acy61nsQxSGL4w8hIQoSraNNQBM= +cloud.google.com/go/securitycenter v1.34.0/go.mod h1:7esjYVxn7k0nm02CnLNueFWD40FH0eunhookSEUalSs= cloud.google.com/go/servicecontrol v1.11.1 h1:d0uV7Qegtfaa7Z2ClDzr9HJmnbJW7jn0WhZ7wOX6hLE= cloud.google.com/go/servicedirectory v1.11.4 h1:da7HFI1229kyzIyuVEzHXip0cw0d+E0s8mjQby0WN+k= cloud.google.com/go/servicedirectory v1.11.11 h1:8Ky2lY0CWJJIIlsc+rKTn6C3SqOuVEwT3brDC6TJCjk= cloud.google.com/go/servicedirectory v1.11.11/go.mod h1:pnynaftaj9LmRLIc6t3r7r7rdCZZKKxui/HaF/RqYfs= +cloud.google.com/go/servicedirectory v1.11.12 h1:KPlLc16HUiUp5/dGHF7KlBUEub13Ps76J91xCMBG+5U= +cloud.google.com/go/servicedirectory v1.11.12/go.mod h1:A0mXC1awKEK5alkG7p3hxaHtb5SSPqAdeWx09RTIOGY= cloud.google.com/go/servicemanagement v1.8.0 h1:fopAQI/IAzlxnVeiKn/8WiV6zKndjFkvi+gzu+NjywY= cloud.google.com/go/serviceusage v1.6.0 h1:rXyq+0+RSIm3HFypctp7WoXxIA563rn206CfMWdqXX4= cloud.google.com/go/shell v1.7.5 h1:3Fq2hzO0ZSyaqBboJrFkwwf/qMufDtqwwA6ep8EZxEI= cloud.google.com/go/shell v1.7.11 h1:RobTXyL33DQITYQh//KJ9GjS4bsdj4fGmm2rkb/ywzM= cloud.google.com/go/shell v1.7.11/go.mod h1:SywZHWac7onifaT9m9MmegYp3GgCLm+tgk+w2lXK8vg= +cloud.google.com/go/shell v1.7.12 h1:UCDVhq9IkB1RWhUIJxj9Xr/c+BVVxMSAnnJUGjPfk4U= +cloud.google.com/go/shell v1.7.12/go.mod h1:QxxwQMvXqDUTYgMwbO7Y2Z6rojGzA7q64aQTCEj7xfM= cloud.google.com/go/spanner v1.57.0 h1:fJq+ZfQUDHE+cy1li0bJA8+sy2oiSGhuGqN5nqVaZdU= cloud.google.com/go/spanner v1.65.0 h1:XK15cs9lFFQo5n4Wh9nfrcPXAxWln6NdodDiQKmoD08= cloud.google.com/go/spanner v1.65.0/go.mod h1:dQGB+w5a67gtyE3qSKPPxzniedrnAmV6tewQeBY7Hxs= +cloud.google.com/go/spanner v1.67.0 h1:h8xfobxh5lQu4qJVMPH+wSiyU+ZM6ZTxRNqGeu9iIVA= +cloud.google.com/go/spanner v1.67.0/go.mod h1:Um+TNmxfcCHqNCKid4rmAMvoe/Iu1vdz6UfxJ9GPxRQ= cloud.google.com/go/speech v1.21.1 h1:nuFc+Kj5B8de75nN4FdPyUbI2SiBoHZG6BLurXL56Q0= cloud.google.com/go/speech v1.24.0 h1:3j+WpeBY57C0FDJxg317vpKgOLjL/kNxlcNPGSqXkqE= cloud.google.com/go/speech v1.24.0/go.mod h1:HcVyIh5jRXM5zDMcbFCW+DF2uK/MSGN6Rastt6bj1ic= +cloud.google.com/go/speech v1.24.1 h1:sgJ+sBzamry/ZBhbIZX6Dmv/BnrTAvWLXeJT1bmugnU= +cloud.google.com/go/speech v1.24.1/go.mod h1:th/IKNidPLzrbaEiKLIhTv/oTGADe4r4bzxZvYG62EE= cloud.google.com/go/storage v1.41.0/go.mod h1:J1WCa/Z2FcgdEDuPUY8DxT5I+d9mFKsCepp5vR6Sq80= cloud.google.com/go/storagetransfer v1.10.4 h1:dy4fL3wO0VABvzM05ycMUPFHxTPbJz9Em8ikAJVqSbI= cloud.google.com/go/storagetransfer v1.10.10 h1:GfxaYqX+kwlrSrJAENNmRTCGmSTgvouvS3XhgwKpOT8= cloud.google.com/go/storagetransfer v1.10.10/go.mod h1:8+nX+WgQ2ZJJnK8e+RbK/zCXk8T7HdwyQAJeY7cEcm0= +cloud.google.com/go/storagetransfer v1.10.11 h1:AF5iHhnbiVC4BEKf1b8ujWeUuXCfpRzO9aclF2j2A1w= +cloud.google.com/go/storagetransfer v1.10.11/go.mod h1:AMAR/PTS5yKPp1FHP6rk3eJYGmHF14vQYiHddcIgoOA= cloud.google.com/go/talent v1.6.6 h1:JssV0CE3FNujuSWn7SkosOzg7qrMxVnt6txOfGcMSa4= cloud.google.com/go/talent v1.6.12 h1:JN721EjG+UTfHVVaMhyxwKCCJPjUc8PiS0RnW/7kWfE= cloud.google.com/go/talent v1.6.12/go.mod h1:nT9kNVuJhZX2QgqKZS6t6eCWZs5XEBYRBv6bIMnPmo4= +cloud.google.com/go/talent v1.6.13 h1:DLrLO6LVl6T7v07Jc3+4IaI+sDFRbgd7MTEbTow5qVE= +cloud.google.com/go/talent v1.6.13/go.mod h1:jqjQzIF7ZPCxFSdsfhgUF0wGB+mbytYzyUqaHLiQcQg= cloud.google.com/go/texttospeech v1.7.5 h1:dxY2Q5mHCbrGa3oPR2O3PCicdnvKa1JmwGQK36EFLOw= cloud.google.com/go/texttospeech v1.7.11 h1:jzko1ahItjLYEWr6n3lTIoBSinD1JzavEuDzYLWZNko= cloud.google.com/go/texttospeech v1.7.11/go.mod h1:Ua125HU+WT2IkIo5MzQtuNpNEk72soShJQVdorZ1SAE= +cloud.google.com/go/texttospeech v1.7.12 h1:W33C7hjh61V1HVAh4E1RqAx2hSPIebmilYqMuqvP/HQ= +cloud.google.com/go/texttospeech v1.7.12/go.mod h1:B1Xck47Mhy/PJMnvrLkv0gfKGinGP78c0XFZjWB7TdY= cloud.google.com/go/tpu v1.6.5 h1:C8YyYda8WtNdBoCgFwwBzZd+S6+EScHOxM/z1h0NNp8= cloud.google.com/go/tpu v1.6.11 h1:uMrwnK05cocNt3OOp+mZ16xlvIKaXUt3QUXkUbG4LdM= cloud.google.com/go/tpu v1.6.11/go.mod h1:W0C4xaSj1Ay3VX/H96FRvLt2HDs0CgdRPVI4e7PoCDk= +cloud.google.com/go/tpu v1.6.12 h1:n54G/s4O6t2sbTiTkhj795JW6iCBSzI1ccrXp+GAP6c= +cloud.google.com/go/tpu v1.6.12/go.mod h1:IFJa2vI7gxF6fypOQXYmbuFwKLsde4zVwcv1p9zhOqY= cloud.google.com/go/trace v1.10.5 h1:0pr4lIKJ5XZFYD9GtxXEWr0KkVeigc3wlGpZco0X1oA= cloud.google.com/go/trace v1.10.11/go.mod h1:fUr5L3wSXerNfT0f1bBg08W4axS2VbHGgYcfH4KuTXU= cloud.google.com/go/trace v1.10.12 h1:GoGZv1iAXEa73HgSGNjRl2vKqp5/f2AeKqErRFXA2kg= @@ -346,34 +536,54 @@ cloud.google.com/go/translate v1.10.1 h1:upovZ0wRMdzZvXnu+RPam41B0mRJ+coRXFP2cYF cloud.google.com/go/translate v1.10.3/go.mod h1:GW0vC1qvPtd3pgtypCv4k4U8B7EdgK9/QEF2aJEUovs= cloud.google.com/go/translate v1.10.7 h1:W16MpZ2Z3TWoHbNHmyHz9As276lGVTSwxRcquv454R0= cloud.google.com/go/translate v1.10.7/go.mod h1:mH/+8tvcItuy1cOWqU+/Y3iFHgkVUObNIQYI/kiFFiY= +cloud.google.com/go/translate v1.11.0 h1:ncOb+dtBr65+5Ay9VotOA8j5RlrUJXB+qdq+xqpV4Ls= +cloud.google.com/go/translate v1.11.0/go.mod h1:UFNHzrfcEo/ZCmA5SveVqxh0l57BP27HCvroN5o59FI= cloud.google.com/go/video v1.20.4 h1:TXwotxkShP1OqgKsbd+b8N5hrIHavSyLGvYnLGCZ7xc= cloud.google.com/go/video v1.22.0 h1:+FTZi7NtT4FV2Y1j3zC3zYjaRrlGqKsZpbLweredEWM= cloud.google.com/go/video v1.22.0/go.mod h1:CxPshUNAb1ucnzbtruEHlAal9XY+SPG2cFqC/woJzII= +cloud.google.com/go/video v1.22.1 h1:G2gFE34k6TIC0CHW1OTbF6tKfzA3X+MbjkoLblu0vWU= +cloud.google.com/go/video v1.22.1/go.mod h1:+AYF4e9kqQhra0AfKPoOOIUK0Ho7BquOWQK+Te+Qnns= cloud.google.com/go/videointelligence v1.11.5 h1:mYaWH8uhUCXLJCN3gdXswKzRa2+lK0zN6/KsIubm6pE= cloud.google.com/go/videointelligence v1.11.11 h1:zl8xijOEavernn/t6mZZ4fg0pIVc2yquHH73oj0Leo4= cloud.google.com/go/videointelligence v1.11.11/go.mod h1:dab2Ca3AXT6vNJmt3/6ieuquYRckpsActDekLcsd6dU= +cloud.google.com/go/videointelligence v1.11.12 h1:dFCXde/zOkP1yhM8aCuFVC+smix46sP2U56OywCOkAQ= +cloud.google.com/go/videointelligence v1.11.12/go.mod h1:dQlDAFtTwsZi3UI+03NVF4XQoarx0VU5/IKMLyVyC2E= cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= cloud.google.com/go/vision/v2 v2.8.0 h1:W52z1b6LdGI66MVhE70g/NFty9zCYYcjdKuycqmlhtg= cloud.google.com/go/vision/v2 v2.8.6 h1:HyFEUXQa0SvlF0LASCn/x+juNCH4kIXQrUqi6SIcYvE= cloud.google.com/go/vision/v2 v2.8.6/go.mod h1:G3v0uovxCye3u369JfrHGY43H6u/IQ08x9dw5aVH8yY= +cloud.google.com/go/vision/v2 v2.8.7 h1:4hWiRo2j4zzmCzXG+SkJVYq0dvR6TklFHkxdsmdfMsU= +cloud.google.com/go/vision/v2 v2.8.7/go.mod h1:4ADQGbgAAvEDn/2I6XLeBN6mCUq6D44bfjWaqQc6iYU= cloud.google.com/go/vmmigration v1.7.5 h1:5v9RT2vWyuw3pK2ox0HQpkoftO7Q7/8591dTxxQc79g= cloud.google.com/go/vmmigration v1.7.11 h1:yqwkTPpvSw9dUfnl9/APAVrwO9UW1jJZtgbZpNQ+WdU= cloud.google.com/go/vmmigration v1.7.11/go.mod h1:PmD1fDB0TEHGQR1tDZt9GEXFB9mnKKalLcTVRJKzcQA= +cloud.google.com/go/vmmigration v1.7.12 h1:+X5l9sfrevUi5EeOM7LhzFFzGVT/N7u0TJY7jdIiIQA= +cloud.google.com/go/vmmigration v1.7.12/go.mod h1:Fb6yZsMdgFUo3wdDc7vK75KmBzXkY1Tio/053vuvCXU= cloud.google.com/go/vmwareengine v1.1.1 h1:EGdDi9QbqThfZq3ILcDK5g+m9jTevc34AY5tACx5v7k= cloud.google.com/go/vmwareengine v1.2.0 h1:9Fjn/RoeOMo8UQt1TbXmmw7rJApC26BqnISAI1AERcc= cloud.google.com/go/vmwareengine v1.2.0/go.mod h1:rPjCHu6hG9N8d6PhkoDWFkqL9xpbFY+ueVW+0pNFbZg= +cloud.google.com/go/vmwareengine v1.2.1 h1:UChEIPaM3wxBXKLy7Ooqeey3YNesta7PR5D2h7lI61I= +cloud.google.com/go/vmwareengine v1.2.1/go.mod h1:OE5z8qJdTiPpSeWunFenN/RMF7ymRgI0HvJ/c7Zl5U0= cloud.google.com/go/vpcaccess v1.7.5 h1:XyL6hTLtEM/eE4F1GEge8xUN9ZCkiVWn44K/YA7z1rQ= cloud.google.com/go/vpcaccess v1.7.11 h1:1XgRP+Q2X6MvE/xnexpQ7ydgav+IO5UcKUIJEbL65J8= cloud.google.com/go/vpcaccess v1.7.11/go.mod h1:a2cuAiSCI4TVK0Dt6/dRjf22qQvfY+podxst2VvAkcI= +cloud.google.com/go/vpcaccess v1.7.12 h1:n077TcPH7S8RjZGBwHWykVfoVaa41O5VK9xn8KR18+0= +cloud.google.com/go/vpcaccess v1.7.12/go.mod h1:Bt9j9aqlNDj1xW5uMNrHyhpc61JZgttbQRecG9xm1cE= cloud.google.com/go/webrisk v1.9.5 h1:251MvGuC8wisNN7+jqu9DDDZAi38KiMXxOpA/EWy4dE= cloud.google.com/go/webrisk v1.9.11 h1:2qwEqnXrToIv2Y4xvsUSxCk7R2Ki+3W2+GNyrytoKTQ= cloud.google.com/go/webrisk v1.9.11/go.mod h1:mK6M8KEO0ZI7VkrjCq3Tjzw4vYq+3c4DzlMUDVaiswE= +cloud.google.com/go/webrisk v1.9.12 h1:2WWCTU5744V0AsZomJxzH18LG7jlL13z1iDzgMWAJOQ= +cloud.google.com/go/webrisk v1.9.12/go.mod h1:YaAgE2xKzIN8yQNUspTTeZbvdcifSJh+wcMyXmp8fgg= cloud.google.com/go/websecurityscanner v1.6.5 h1:YqWZrZYabG88TZt7364XWRJGhxmxhony2ZUyZEYMF2k= cloud.google.com/go/websecurityscanner v1.6.11 h1:r3ePI3YN7ujwX8c9gIkgbVjYVwP4yQA4X2z6P7+HNxI= cloud.google.com/go/websecurityscanner v1.6.11/go.mod h1:vhAZjksELSg58EZfUQ1BMExD+hxqpn0G0DuyCZQjiTg= +cloud.google.com/go/websecurityscanner v1.6.12 h1:0RJvr/1Eybjt6klGMrW4U5DVitv1P+BoLmrRU6Xmzc0= +cloud.google.com/go/websecurityscanner v1.6.12/go.mod h1:9WFCBNpS0EIIhQaqiNC3ezZ48qisGPh3Ekz6T2n9Ioc= cloud.google.com/go/workflows v1.12.4 h1:uHNmUiatTbPQ4H1pabwfzpfEYD4BBnqDHqMm2IesOh4= cloud.google.com/go/workflows v1.12.10 h1:EGJeZmwgE71jxFOI5s9iKST2Bivif3DSzlqVbiXACXQ= cloud.google.com/go/workflows v1.12.10/go.mod h1:RcKqCiOmKs8wFUEf3EwWZPH5eHc7Oq0kamIyOUCk0IE= +cloud.google.com/go/workflows v1.12.11 h1:9pfL+XeaaNDEPTc02VvX70qW36cBrTHmcH1plZwOI7s= +cloud.google.com/go/workflows v1.12.11/go.mod h1:0cYsbMDyqr/1SbEt1DfN+S+mI2AAnVrT7+Hrh7qaxZ0= code.cloudfoundry.org/clock v1.1.0 h1:XLzC6W3Ah/Y7ht1rmZ6+QfPdt1iGWEAAtIZXgiaj57c= code.cloudfoundry.org/clock v1.1.0/go.mod h1:yA3fxddT9RINQL2XHS7PS+OXxKCGhfrZmlNUCIM6AKo= contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9 h1:yxE46rQA0QaqPGqN2UnwXvgCrRqtjR1CsGSWVTRjvv4= @@ -390,9 +600,22 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUu docker.io/go-docker v1.0.0 h1:VdXS/aNYQxyA9wdLD5z8Q8Ro688/hG8HzKxYVEVbE6s= docker.io/go-docker v1.0.0/go.mod h1:7tiAn5a0LFmjbPDbyTPOaTTOuG1ZRNXdPA6RvKY+fpY= gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= +gioui.org v0.2.0 h1:RbzDn1h/pCVf/q44ImQSa/J3MIFpY3OWphzT/Tyei+w= +gioui.org v0.2.0/go.mod h1:1H72sKEk/fNFV+l0JNeM2Dt3co3Y4uaQcD+I+/GQ0e4= +gioui.org/cpu v0.0.0-20220412190645-f1e9e8c3b1f7 h1:tNJdnP5CgM39PRc+KWmBRRYX/zJ+rd5XaYxY5d5veqA= +gioui.org/cpu v0.0.0-20220412190645-f1e9e8c3b1f7/go.mod h1:A8M0Cn5o+vY5LTMlnRoK3O5kG+rH0kWfJjeKd9QpBmQ= +gioui.org/shader v1.0.6 h1:cvZmU+eODFR2545X+/8XucgZdTtEjR3QWW6W65b0q5Y= +gioui.org/shader v1.0.6/go.mod h1:mWdiME581d/kV7/iEhLmUgUK5iZ09XR5XpduXzbePVM= +gioui.org/x v0.2.0 h1:/MbdjKH19F16auv19UiQxli2n6BYPw7eyh9XBOTgmEw= +gioui.org/x v0.2.0/go.mod h1:rCGN2nZ8ZHqrtseJoQxCMZpt2xrZUrdZ2WuMRLBJmYs= +git.sr.ht/~sbinet/cmpimg v0.1.0 h1:E0zPRk2muWuCqSKSVZIWsgtU9pjsw3eKHi8VmQeScxo= +git.sr.ht/~sbinet/cmpimg v0.1.0/go.mod h1:FU12psLbF4TfNXkKH2ZZQ29crIqoiqTZmeQ7dkp/pxE= git.sr.ht/~sbinet/gg v0.3.1 h1:LNhjNn8DerC8f9DHLz6lS0YYul/b602DUxDgGkd/Aik= +git.sr.ht/~sbinet/gg v0.5.0 h1:6V43j30HM623V329xA9Ntq+WJrMjDxRjuAB1LFWF5m8= +git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= github.com/99designs/basicauth-go v0.0.0-20160802081356-2a93ba0f464d h1:j6oB/WPCigdOkxtuPl1VSIiLpy7Mdsu6phQffbF19Ng= github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e h1:rl2Aq4ZODqTDkeSqQBy+fzpZPamacO1Srp8zq7jf2Sc= +github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkByhMAwYaFAX9w2l7vxvBQ5NMoxDrkhqhtn4= github.com/Azure/azure-amqp-common-go/v3 v3.2.2 h1:CJpxNAGxP7UBhDusRUoaOn0uOorQyAYhQYLnNgkRhlY= github.com/Azure/azure-amqp-common-go/v3 v3.2.3 h1:uDF62mbd9bypXWi19V1bN5NZEO84JqgmI5G73ibAmrk= github.com/Azure/azure-amqp-common-go/v3 v3.2.3/go.mod h1:7rPmbSfszeovxGfc5fSAXE4ehlXQZHpMja2OtxC2Tas= @@ -432,6 +655,7 @@ github.com/ClickHouse/clickhouse-go/v2 v2.17.1 h1:ZCmAYWpu75IyEi7+Yrs/uaAjiCGY5w github.com/ClickHouse/clickhouse-go/v2 v2.17.1/go.mod h1:rkGTvFDTLqLIm0ma+13xmcCfr/08Gvs7KmFt1tgiWHQ= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= +github.com/CloudyKit/jet/v3 v3.0.0 h1:1PwO5w5VCtlUUl+KTOBsTGZlhjWkcybsGaAau52tOy8= github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= @@ -443,10 +667,10 @@ github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4p github.com/IBM/sarama v1.40.1/go.mod h1:+5OFwA5Du9I6QrznhaMHsuwWdWZNMjaBSIxEWEgKOYE= github.com/IBM/sarama v1.43.0 h1:YFFDn8mMI2QL0wOrG0J2sFoVIAFl7hS9JQi2YZsXtJc= github.com/IBM/sarama v1.43.0/go.mod h1:zlE6HEbC/SMQ9mhEYaF7nNLYOUyrs0obySKCckWP9BM= +github.com/Joker/hpp v1.0.0 h1:65+iuJYdRXv/XyN62C1uEmmOx3432rNG/rKlX6V7Kkc= github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/KimMachineGun/automemlimit v0.6.0 h1:p/BXkH+K40Hax+PuWWPQ478hPjsp9h1CPDhLlA3Z37E= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o= github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= @@ -468,6 +692,7 @@ github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrd github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= +github.com/ajg/form v1.5.1 h1:t9c7v8JUKu/XxOGBU0yjNpaMloxGEJhUkqFRq0ibGeU= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9 h1:7kQgkwGRoLzC9K0oyXdJo7nve/bynv/KwUsxbiTlzAM= github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19 h1:iXUgAaqDcIUGbRoy2TdeofRG/j1zpGRSEmNK05T+bi8= github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b h1:slYM766cy2nI3BwyRiyQj/Ud48djTMtMebDqepE95rw= @@ -487,6 +712,8 @@ github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk= github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= +github.com/andybalholm/stroke v0.0.0-20221221101821-bd29b49d73f0 h1:uF5Q/hWnDU1XZeT6CsrRSxHLroUSEYYO3kgES+yd+So= +github.com/andybalholm/stroke v0.0.0-20221221101821-bd29b49d73f0/go.mod h1:ccdDYaY5+gO+cbnQdFxEXqfy0RkoV25H3jLXUDNM3wg= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= @@ -524,6 +751,7 @@ github.com/aws/aws-sdk-go-v2/service/ssm v1.52.4 h1:hgSBvRT7JEWx2+vEGI9/Ld5rZtl7 github.com/aws/aws-sdk-go-v2/service/ssm v1.52.4/go.mod h1:v7NIzEFIHBiicOMaMTuEmbnzGnqW0d+6ulNALul6fYE= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible h1:Ppm0npCCsmuR9oQaBtRuZcmILVE74aXE+AmrJj8L2ns= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= @@ -532,11 +760,14 @@ github.com/bradleyjkemp/cupaloy/v2 v2.6.0 h1:knToPYa2xtfg42U3I6punFEjaGFKWQRXJwj github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/brianvoe/gofakeit/v6 v6.25.0 h1:ZpFjktOpLZUeF8q223o0rUuXtA+m5qW5srjvVi+JkXk= github.com/brianvoe/gofakeit/v6 v6.25.0/go.mod h1:Xj58BMSnFqcn/fAQeSK+/PLtC5kSb7FJIq4JyGa8vEs= +github.com/bufbuild/protocompile v0.10.0/go.mod h1:G9qQIQo0xZ6Uyj6CMNz0saGmx2so+KONo8/KrELABiY= github.com/bufbuild/protovalidate-go v0.2.1 h1:pJr07sYhliyfj/STAM7hU4J3FKpVeLVKvOBmOTN8j+s= github.com/bufbuild/protovalidate-go v0.2.1/go.mod h1:e7XXDtlxj5vlEyAgsrxpzayp4cEMKCSSb8ZCkin+MVA= github.com/bwesterb/go-ristretto v1.2.3 h1:1w53tCkGhCQ5djbat3+MH0BAQ5Kfgbt56UZQ/JMzngw= github.com/bytedance/sonic v1.10.0-rc3 h1:uNSnscRapXTwUgTyOF0GVljYD08p9X/Lbr9MweSV3V0= github.com/bytedance/sonic v1.10.0-rc3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/campoy/embedmd v1.0.0 h1:V4kI2qTJJLf4J29RzI/MAt2c3Bl4dQSYPuflzwFH2hY= +github.com/campoy/embedmd v1.0.0/go.mod h1:oxyr9RCiSXg0M3VJ3ks0UGfp98BpSSGr0kpiX3MzVl8= github.com/casbin/casbin/v2 v2.37.0 h1:/poEwPSovi4bTOcP752/CsTQiRz2xycyVKFG7GUhbDw= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= @@ -545,6 +776,7 @@ github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/chromedp/cdproto v0.0.0-20220208224320-6efb837e6bc2/go.mod h1:At5TxYYdxkbQL0TSefRjhLE3Q0lgvqKKMSFUglJ7i1U= github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= @@ -560,7 +792,9 @@ github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nC github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c h1:2zRrJWIt/f9c9HhNHAgrRgq0San5gRRUJTBXLkchal0= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= +github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= +github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= @@ -595,10 +829,14 @@ github.com/dave/patsy v0.0.0-20210517141501-957256f50cba h1:1o36L4EKbZzazMk8iGC4 github.com/dave/rebecca v0.9.1 h1:jxVfdOxRirbXL28vXMvUvJ1in3djwkVKXCq339qhBL0= github.com/dchest/uniuri v1.2.0 h1:koIcOUdrTIivZgSLhHQvKgqdWZq5d7KdMEWF1Ud6+5g= github.com/dchest/uniuri v1.2.0/go.mod h1:fSzm4SLHzNZvWLvWJew423PhAzkpNQYq+uNLq4kxhkY= +github.com/deepmap/oapi-codegen v1.12.4 h1:pPmn6qI9MuOtCz82WY2Xaw46EQjgvxednXXrP7g5Q2s= +github.com/deepmap/oapi-codegen v1.12.4/go.mod h1:3lgHGMu6myQ2vqbbTXH2H1o4eXFTGnFiDaOaKKl5yas= github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3 h1:tkum0XDgfR0jcVVXuTsYv/erY2NnEDqwRojbxR1rBYA= github.com/denisenkom/go-mssqldb v0.12.0 h1:VtrkII767ttSPNRfFekePK3sctr+joXgO58stqQbtUA= github.com/devigned/tab v0.1.1 h1:3mD6Kb1mUOYeLpJvTVSDwSg5ZsfSxfvxGRTxRsJsITA= +github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Evo= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dhui/dktest v0.3.0 h1:kwX5a7EkLcjo7VpsPQSYJcKGbXBXdjI9FGjuUj1jn6I= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/j0mACtrfE= @@ -618,15 +856,23 @@ github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6/go.mod h1 github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= +github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= github.com/elastic/go-sysinfo v1.11.2 h1:mcm4OSYVMyws6+n2HIVMGkln5HOpo5Ie1ZmbbNn0jg4= github.com/elastic/go-sysinfo v1.11.2/go.mod h1:GKqR8bbMK/1ITnez9NIsIfXQr25aLhRJa7AfT8HpBFQ= github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= +github.com/elazarl/goproxy v0.0.0-20230731152917-f99041a5c027/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= +github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155 h1:IgJPqnrlY2Mr4pYB6oaMKvFvwJ9H+X6CCY5x1vCTcpc= +github.com/envoyproxy/go-control-plane v0.12.1-0.20240621013728-1eb8caab5155/go.mod h1:5Wkq+JduFtdAXihLmeTJf+tRYIT4KBc2vPXDhwVo1pA= +github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM= github.com/evanphx/json-patch v0.5.2/go.mod h1:ZWS5hhDbVDyob71nXKNL0+PWn6ToqBHMikGIFbs31qQ= github.com/expr-lang/expr v1.16.2 h1:JvMnzUs3LeVHBvGFcXYmXo+Q6DPDmzrlcSBO6Wy3w4s= github.com/expr-lang/expr v1.16.2/go.mod h1:uCkhfG+x7fcZ5A5sXHKuQ07jGZRl6J0FCAaf2k4PtVQ= +github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 h1:DddqAaWDpywytcG8w/qoQ5sAN8X12d3Z3koB0C3Rxsc= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= +github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= @@ -638,19 +884,30 @@ github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbS github.com/fsouza/fake-gcs-server v1.7.0 h1:Un0BXUXrRWYSmYyC1Rqm2e2WJfTPyDy/HGMz31emTi8= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gavv/httpexpect v2.0.0+incompatible h1:1X9kcRshkSKEjNJJxX9Y9mQ5BRfbxU5kORdjhlA1yX8= +github.com/getkin/kin-openapi v0.124.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= github.com/go-faster/errors v0.6.1 h1:nNIPOBkprlKzkThvS/0YaX8Zs9KewLCOSFQS5BU06FI= github.com/go-faster/errors v0.6.1/go.mod h1:5MGV2/2T9yvlrbhe9pD9LO5Z/2zCSq2T8j+Jpi2LAyY= github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= +github.com/go-fonts/dejavu v0.3.2 h1:3XlHi0JBYX+Cp8n98c6qSoHrxPa4AUKDMKdrh/0sUdk= +github.com/go-fonts/dejavu v0.3.2/go.mod h1:m+TzKY7ZEl09/a17t1593E4VYW8L1VaBXHzFZOIjGEY= github.com/go-fonts/latin-modern v0.2.0 h1:5/Tv1Ek/QCr20C6ZOz15vw3g7GELYL98KWr8Hgo+3vk= +github.com/go-fonts/latin-modern v0.3.2 h1:M+Sq24Dp0ZRPf3TctPnG1MZxRblqyWC/cRUL9WmdaFc= +github.com/go-fonts/latin-modern v0.3.2/go.mod h1:9odJt4NbRrbdj4UAMuLVd4zEukf6aAEKnDaQga0whqQ= github.com/go-fonts/liberation v0.3.0 h1:3BI2iaE7R/s6uUUtzNCjo3QijJu3aS4wmrMgfSpYQ+8= github.com/go-fonts/liberation v0.3.0/go.mod h1:jdJ+cqF+F4SUL2V+qxBth8fvBpBDS7yloUL5Fi8GTGY= +github.com/go-fonts/liberation v0.3.2 h1:XuwG0vGHFBPRRI8Qwbi5tIvR3cku9LUfZGq/Ar16wlQ= +github.com/go-fonts/liberation v0.3.2/go.mod h1:N0QsDLVUQPy3UYg9XAc3Uh3UDMp2Z7M1o4+X98dXkmI= github.com/go-fonts/stix v0.1.0 h1:UlZlgrvvmT/58o573ot7NFw0vZasZ5I6bcIft/oMdgg= +github.com/go-fonts/stix v0.2.2 h1:v9krocr13J1llaOHLEol1eaHsv8S43UuFX/1bFgEJJ4= +github.com/go-fonts/stix v0.2.2/go.mod h1:SUxggC9dxd/Q+rb5PkJuvfvTbOPtNc2Qaua00fIp9iU= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= github.com/go-ini/ini v1.25.4 h1:Mujh4R/dH6YL8bxuISne3xX2+qcQ9p0IxKAP6ExWoUo= @@ -658,8 +915,14 @@ github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9 h1:NxXI5pTAtpEaU49bpLpQoDsu1zrteW/vxzTz8Cd2UAs= github.com/go-latex/latex v0.0.0-20230307184459-12ec69307ad9/go.mod h1:gWuR/CrFDDeVRFQwHPvsv9soJVB/iqymhuZQuJ3a9OM= +github.com/go-latex/latex v0.0.0-20231108140139-5c1ce85aa4ea h1:DfZQkvEbdmOe+JK2TMtBM+0I9GSdzE2y/L1/AmD8xKc= +github.com/go-latex/latex v0.0.0-20231108140139-5c1ce85aa4ea/go.mod h1:Y7Vld91/HRbTBm7JwoI7HejdDB0u+e9AUBO9MB7yuZk= +github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.8/go.mod h1:6QT22icPLEqAM/z/TChgb4WAveCHF92+2gF0CNjHpPI= github.com/go-pdf/fpdf v0.6.0 h1:MlgtGIfsdMEEQJr2le6b/HNr1ZlQwxyWr77r2aj2U/8= +github.com/go-pdf/fpdf v0.9.0 h1:PPvSaUuo1iMi9KkaAn90NuKi+P4gwMedWPHhj8YlJQw= +github.com/go-pdf/fpdf v0.9.0/go.mod h1:oO8N111TkmKb9D7VvWGLvLJlaZUQVPM+6V42pp3iV4Y= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= @@ -667,6 +930,8 @@ github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJn github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-text/typesetting v0.0.0-20230803102845-24e03d8b5372 h1:FQivqchis6bE2/9uF70M2gmmLpe82esEm2QadL0TEJo= +github.com/go-text/typesetting v0.0.0-20230803102845-24e03d8b5372/go.mod h1:evDBbvNR/KaVFZ2ZlDSOWWXIUKq0wCOEtzLxRM8SG3k= github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= @@ -679,8 +944,11 @@ github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4 h1:vF83LI8tAakwEwvWZtr github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= +github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt/v5 v5.2.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219 h1:utua3L2IbQJmauC5IXdEA547bcoU5dozgQAfc8Onsg4= +github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386 h1:EcQR3gusLHN46TAD+G+EbaaqJArt5vHhNpXAa12PQf4= github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= @@ -712,6 +980,8 @@ github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= +github.com/grafadruid/go-druid v0.0.6 h1:Nt9jQrhrtHi1BJICN9aDJgYDmBmc10pJYpQiuwAsxa4= +github.com/grafadruid/go-druid v0.0.6/go.mod h1:KY3a6MrVMKkXgMTwBS9Nrhm1E8OWyR4gd0WzUi8d/zM= github.com/grafana/authlib v0.0.0-20240730122259-a0d13672efb1/go.mod h1:YA9We4kTafu7mlMnUh3In6Q2wpg8fYN3ycgCKOK1TB8= github.com/grafana/authlib/claims v0.0.0-20240809101159-74eaccc31a06/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A= github.com/grafana/gomemcache v0.0.0-20240229205252-cd6a66d6fb56/go.mod h1:PGk3RjYHpxMM8HFPhKKo+vve3DdlPUELZLSDEFehPuU= @@ -749,10 +1019,17 @@ github.com/hashicorp/serf v0.10.0/go.mod h1:bXN03oZc5xlH46k/K1qTrpXb9ERKyY1/i/N5 github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hudl/fargo v1.4.0 h1:ZDDILMbB37UlAVLlWcJ2Iz1XuahZZTDZfdCKeclfq2s= +github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91 h1:KyZDvZ/GGn+r+Y3DKZ7UOQ/TP4xV6HNkrwiVMB1GnNY= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465 h1:KwWnWVWCNtNq/ewIX7HIKnELmEx2nDP42yskD/pi7QE= +github.com/imkira/go-interpol v1.1.0 h1:KIiKr0VSG2CUW1hl1jpiyuzuJeKUUpC8iM1AIE7N1Vk= github.com/influxdata/influxdb v1.7.6 h1:8mQ7A/V+3noMGCt/P9pD09ISaiz9XvgCk303UYA3gcs= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= +github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= +github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= +github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= +github.com/iris-contrib/jade v1.1.3 h1:p7J/50I0cjo0wq/VWVCDFd8taPJbuFC+bq23SniRFX0= +github.com/iris-contrib/pongo2 v0.0.1 h1:zGP7pW51oi5eQZMIlGA3I+FHY9/HOQWDB+572yin0to= github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= @@ -801,6 +1078,7 @@ github.com/jsternberg/zap-logfmt v1.2.0/go.mod h1:kz+1CUmCutPWABnNkOu9hOHKdT2q3T github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d h1:c93kUJDtVAXFEhsCh5jSxyOJmFHuzcihnslQiX8Urwo= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= +github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= @@ -808,6 +1086,7 @@ github.com/kataras/golog v0.1.9 h1:vLvSDpP7kihFGKFAvBSofYo7qZNULYSHOH2D7rPTKJk= github.com/kataras/golog v0.1.9/go.mod h1:jlpk/bOaYCyqDqH18pgDHdaJab72yBE6i0O3s30hpWY= github.com/kataras/iris/v12 v12.2.6-0.20230908161203-24ba4e8933b9 h1:Vx8kDVhO2qepK8w44lBtp+RzN3ld743i+LYPzODJSpQ= github.com/kataras/iris/v12 v12.2.6-0.20230908161203-24ba4e8933b9/go.mod h1:ldkoR3iXABBeqlTibQ3MYaviA1oSlPvim6f55biwBh4= +github.com/kataras/neffos v0.0.14 h1:pdJaTvUG3NQfeMbbVCI8JT2T5goPldyyfUB2PJfh1Bs= github.com/kataras/pio v0.0.12 h1:o52SfVYauS3J5X08fNjlGS5arXHjW/ItLkyLcKjoH6w= github.com/kataras/pio v0.0.12/go.mod h1:ODK/8XBhhQ5WqrAhKy+9lTPS7sBf6O3KcLhc9klfRcY= github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= @@ -858,8 +1137,10 @@ github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqA github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= github.com/matryer/moq v0.3.3 h1:pScMH9VyrdT4S93yiLpVyU8rCDqGQr24uOyBxmktG5Q= github.com/matryer/moq v0.3.3/go.mod h1:RJ75ZZZD71hejp39j4crZLsEDszGk6iH4v4YsWFKH4s= +github.com/mattn/goveralls v0.0.2 h1:7eJB6EqsPhRVxvwEXGnqdO2sJI0PTsrWoTMXEk9/OQc= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= +github.com/mediocregopher/radix/v3 v3.4.2 h1:galbPBjIwmyREgwGCfQEN4X8lxbJnKBYurgz+VfcStA= github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg= github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE= github.com/microsoft/ApplicationInsights-Go v0.4.4 h1:G4+H9WNs6ygSCe6sUyxRc2U81TI5Es90b2t/MwX5KqY= @@ -878,6 +1159,7 @@ github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpI github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= github.com/mostynb/go-grpc-compression v1.2.2 h1:XaDbnRvt2+1vgr0b/l0qh4mJAfIxE0bKXtz2Znl3GGI= github.com/mostynb/go-grpc-compression v1.2.2/go.mod h1:GOCr2KBxXcblCuczg3YdLQlcin1/NfyDA348ckuCH6w= +github.com/moul/http2curl v1.0.0 h1:dRMWoAtb+ePxMlLkrCbAqh4TlPHXvoGUSQ323/9Zahs= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8 h1:P48LjvUQpTReR3TQRbxSeSBsMXzfK0uol7eRcr7VBYQ= github.com/natessilva/dag v0.0.0-20180124060714-7194b8dcc5c4 h1:dnMxwus89s86tI8rcGVp2HwZzlz7c5o92VOy7dSckBQ= github.com/nats-io/jwt v1.2.2 h1:w3GMTO969dFg+UOKTmmyuu7IGdusK+7Ytlt//OYH/uU= @@ -965,8 +1247,12 @@ github.com/pires/go-proxyproto v0.7.0 h1:IukmRewDQFWC7kfnb66CSomk2q/seBuilHBYFwy github.com/pires/go-proxyproto v0.7.0/go.mod h1:Vz/1JPY/OACxWGQNIRY2BeyDmpoaWmEP40O9LbuiFR4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= github.com/pkg/profile v1.2.1 h1:F++O52m40owAmADcojzM+9gyjmMOY/T4oYJkgFDH8RE= +github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= +github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= +github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= @@ -1009,6 +1295,7 @@ github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0b github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad h1:fiWzISvDn0Csy5H0iwgAuJGQTUpVfEMJJd4nRFXogbc= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stoewer/parquet-cli v0.0.7 h1:rhdZODIbyMS3twr4OM3am8BPPT5pbfMcHLH93whDM5o= github.com/stoewer/parquet-cli v0.0.7/go.mod h1:bskxHdj8q3H1EmfuCqjViFoeO3NEvs5lzZAQvI8Nfjk= github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= @@ -1035,8 +1322,11 @@ github.com/uber-go/atomic v1.4.0 h1:yOuPqEq4ovnhEjpHmfFwsqBXDYbQeT6Nb0bwD6XnD5o= github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= github.com/uber/jaeger-client-go v2.28.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= +github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= +github.com/valyala/fasthttp v1.6.0 h1:uWF8lgKmeaIewWVPwi4GRq2P6+R46IgYZdxWtM+GtEY= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a h1:0R4NLDRDZX6JcmhJgXi5E4b8Wg84ihbmUKp/GvSPEzc= github.com/vburenin/ifacemaker v1.2.1 h1:3Vq8B/bfBgjWTkv+jDg4dVL1KHt3k1K4lO7XRxYA2sk= github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw= github.com/vertica/vertica-sql-go v1.3.3/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4= @@ -1065,6 +1355,9 @@ github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQ github.com/xhit/go-str2duration v1.2.0 h1:BcV5u025cITWxEQKGWr1URRzrcXtu7uk8+luz3Yuhwc= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= +github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0 h1:6fRhSjgLCkTD3JnJxvaJ4Sj+TYblw757bqYgZaOq5ZY= +github.com/yalue/merged_fs v1.2.2 h1:vXHTpJBluJryju7BBpytr3PDIkzsPMpiEknxVGPhN/I= +github.com/yalue/merged_fs v1.2.2/go.mod h1:WqqchfVYQyclV2tnR7wtRhBddzBvLVR83Cjw9BKQw0M= github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf h1:ckwNHVo4bv2tqNkgx3W3HANh3ta1j6TR5qw08J1A7Tw= github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= github.com/ydb-platform/ydb-go-sdk/v3 v3.55.1 h1:Ebo6J5AMXgJ3A438ECYotA0aK7ETqjQx9WoZvVxzKBE= @@ -1190,8 +1483,15 @@ golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/crypto v0.25.0/go.mod h1:T+wALwcMOSE0kXgUAnPAHqTLW+XHgcELELW8VaDgm/M= golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= +golang.org/x/exp v0.0.0-20231110203233-9a3e6036ecaa/go.mod h1:zk2irFbV9DP96SEBUUAy67IdHUaZuSnrz1n472HUCLE= +golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= +golang.org/x/exp/shiny v0.0.0-20230801115018-d63ba01acd4b h1:sgkbz1SFTsoQIvzTIw45hccUcGocu00QM3qucBYV8b0= +golang.org/x/exp/shiny v0.0.0-20230801115018-d63ba01acd4b/go.mod h1:UH99kUObWAZkDnWqppdQe5ZhPYESUw8I0zVV1uWBR+0= golang.org/x/image v0.6.0 h1:bR8b5okrPI3g/gyZakLZHeWxAR8Dn5CyxXv1hLH5g/4= golang.org/x/image v0.6.0/go.mod h1:MXLdDR43H7cDJq5GEGXEVeeNhPgi+YYEQ2pC1byI1x0= +golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= +golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1216,10 +1516,13 @@ golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= gonum.org/v1/plot v0.10.1 h1:dnifSs43YJuNMDzB7v8wV64O4ABBHReuAVAoBxqBqS4= +gonum.org/v1/plot v0.14.0 h1:+LBDVFYwFe4LHhdP8coW6296MBEY4nQ+Y4vuUpJopcE= +gonum.org/v1/plot v0.14.0/go.mod h1:MLdR9424SJed+5VqC6MsouEpig9pZX2VZ57H9ko2bXU= google.golang.org/api v0.166.0/go.mod h1:4FcBc686KFi7QI/U51/2GKKevfZMpM17sCdibqe/bSA= google.golang.org/api v0.177.0/go.mod h1:srbhue4MLjkjbkux5p3dw/ocYOSZTaIEvf7bCOnFQDw= google.golang.org/api v0.183.0/go.mod h1:q43adC5/pHoSZTx5h2mSmdF7NcyfW9JuDyIOJAgS9ZQ= @@ -1237,13 +1540,18 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8/go. google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= google.golang.org/genproto/googleapis/api v0.0.0-20240604185151-ef581f913117/go.mod h1:OimBR/bc1wPO9iV4NC2bpyjy3VnAwZh5EBPQdtaE5oo= google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4/go.mod h1:px9SlOOZBg1wM1zdnr8jEL4CNGUBZ+ZKYtNPApNQc4c= +google.golang.org/genproto/googleapis/api v0.0.0-20240701130421-f6361c86f094/go.mod h1:fJ/e3If/Q67Mj99hin0hMhiNyCRmt6BQ2aWIJshUSJw= google.golang.org/genproto/googleapis/api v0.0.0-20240711142825-46eb208f015d/go.mod h1:mw8MG/Qz5wfgYr6VqVCiZcHe/GJEfI+oGGDCohaVgB0= google.golang.org/genproto/googleapis/api v0.0.0-20240722135656-d784300faade/go.mod h1:mw8MG/Qz5wfgYr6VqVCiZcHe/GJEfI+oGGDCohaVgB0= google.golang.org/genproto/googleapis/api v0.0.0-20240725223205-93522f1f2a9f/go.mod h1:AHT0dDg3SoMOgZGnZk29b5xTbPHMoEC8qthmBLJCpys= google.golang.org/genproto/googleapis/api v0.0.0-20240730163845-b1a4ccb954bf/go.mod h1:OFMYQFHJ4TM3JRlWDZhJbZfra2uqc3WLBZiaaqP4DtU= +google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= +google.golang.org/genproto/googleapis/api v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:fO8wJzT2zbQbAjbIoos1285VfEIYKDDY+Dt+WpTkh6g= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240325203815-454cdb8f5daa h1:wBkzraZsSqhj1M4L/nMrljUU6XasJkgHvUsq8oRGwF0= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240730163845-b1a4ccb954bf h1:T4tsZBlZYXK3j40sQNP5MBO32I+rn6ypV1PpklsiV8k= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240730163845-b1a4ccb954bf/go.mod h1:5/MT647Cn/GGhwTpXC7QqcaR5Cnee4v4MKCU1/nwnIQ= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240823204242-4ba0660f739c h1:5SFTbgH011A1/MostoGp5314PMnSH9ZLxZX/xynmp64= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20240823204242-4ba0660f739c/go.mod h1:gQizMG9jZ0L2ADJaM+JdZV4yTCON/CQpnHRPoM+54w4= google.golang.org/genproto/googleapis/rpc v0.0.0-20240221002015-b0ce06bbee7c/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= @@ -1255,15 +1563,23 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20240711142825-46eb208f015d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240722135656-d784300faade/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240730163845-b1a4ccb954bf/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240822170219-fc7c04adadcd/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240823204242-4ba0660f739c/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= google.golang.org/grpc v1.64.1/go.mod h1:hiQF4LFZelK2WKaP6W0L92zGHtiQdZxk8CrSdvyjeP0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= +google.golang.org/protobuf v1.33.1-0.20240408130810-98873a205002/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/protobuf v1.34.2-0.20240529085009-ca837e5c658b/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/cheggaaa/pb.v1 v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= +gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= +gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec h1:RlWgLqCMMIYYEVcAR5MDsuHlVkaIPDAF+5Dehzg8L5A= +gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce h1:xcEWjVhvbDy+nHP67nPDDpbYrY+ILlfndk4bRioVHaU= gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= @@ -1271,6 +1587,7 @@ gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/telebot.v3 v3.2.1 h1:3I4LohaAyJBiivGmkfB+CiVu7QFOWkuZ4+KHgO/G3rs= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= @@ -1278,6 +1595,8 @@ k8s.io/code-generator v0.31.0 h1:w607nrMi1KeDKB3/F/J4lIoOgAwc+gV9ZKew4XRfMp8= k8s.io/code-generator v0.31.0/go.mod h1:84y4w3es8rOJOUUP1rLsIiGlO1JuEaPFXQPA9e/K6U0= k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks= k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo= +k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7 h1:cErOOTkQ3JW19o4lo91fFurouhP8NcoBvb7CkvhZZpk= +k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= diff --git a/package.json b/package.json index 257050cda428f..ad7ba34125ba5 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "version": "11.3.0-pre", "repository": "github:grafana/grafana", "scripts": { - "build": "NODE_ENV=production nx exec --verbose -- webpack --config scripts/webpack/webpack.prod.js", + "build": "NODE_ENV=dev nx exec --verbose -- webpack --config scripts/webpack/webpack.dev.js", "build:nominify": "yarn run build -- --env noMinify=1", "dev": "NODE_ENV=dev nx exec -- webpack --config scripts/webpack/webpack.dev.js", "e2e": "./e2e/start-and-run-suite", @@ -79,7 +79,7 @@ "@emotion/eslint-plugin": "11.11.0", "@grafana/eslint-config": "7.0.0", "@grafana/eslint-plugin": "link:./packages/grafana-eslint-rules", - "@grafana/plugin-e2e": "1.6.1", + "@grafana/plugin-e2e": "1.7.1", "@grafana/tsconfig": "^2.0.0", "@manypkg/get-packages": "^2.2.0", "@playwright/test": "1.46.1", @@ -122,7 +122,7 @@ "@types/lodash": "4.17.7", "@types/logfmt": "^1.2.3", "@types/lucene": "^2", - "@types/node": "20.14.14", + "@types/node": "20.16.2", "@types/node-forge": "^1", "@types/ol-ext": "npm:@siedlerchr/types-ol-ext@3.2.4", "@types/pluralize": "^0.0.33", @@ -221,20 +221,20 @@ "react-test-renderer": "18.2.0", "redux-mock-store": "1.5.4", "rimraf": "5.0.7", - "rudder-sdk-js": "2.48.16", + "rudder-sdk-js": "2.48.17", "sass": "1.77.8", "sass-loader": "14.2.1", "smtp-tester": "^2.1.0", "style-loader": "4.0.0", - "stylelint": "16.8.2", + "stylelint": "16.9.0", "stylelint-config-sass-guidelines": "11.1.0", "terser-webpack-plugin": "5.3.10", "testing-library-selector": "0.3.1", "tracelib": "1.0.1", - "ts-jest": "29.2.4", + "ts-jest": "29.2.5", "ts-node": "10.9.2", "typescript": "5.5.4", - "webpack": "5.91.0", + "webpack": "5.94.0", "webpack-assets-manifest": "^5.1.0", "webpack-bundle-analyzer": "4.10.2", "webpack-cli": "5.1.4", @@ -247,9 +247,10 @@ }, "dependencies": { "@emotion/css": "11.11.2", - "@emotion/react": "11.11.4", + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", "@fingerprintjs/fingerprintjs": "^3.4.2", - "@floating-ui/react": "0.26.22", + "@floating-ui/react": "0.26.23", "@formatjs/intl-durationformat": "^0.2.4", "@glideapps/glide-data-grid": "^6.0.0", "@grafana/aws-sdk": "0.4.1", @@ -283,9 +284,10 @@ "@locker/near-membrane-shared-dom": "0.13.6", "@msagl/core": "^1.1.19", "@msagl/parser": "^1.1.19", + "@mui/material": "^6.0.0", "@opentelemetry/api": "1.9.0", "@opentelemetry/exporter-collector": "0.25.0", - "@opentelemetry/semantic-conventions": "1.25.1", + "@opentelemetry/semantic-conventions": "1.27.0", "@popperjs/core": "2.11.8", "@react-aria/dialog": "3.5.17", "@react-aria/focus": "3.18.2", @@ -336,6 +338,7 @@ "leven": "^4.0.0", "lodash": "4.17.21", "logfmt": "^1.3.2", + "loglevel": "^1.9.1", "lru-cache": "10.2.2", "lru-memoize": "^1.1.0", "lucene": "^2.1.1", @@ -359,6 +362,8 @@ "rc-tree": "5.8.8", "re-resizable": "6.9.17", "react": "18.2.0", + "react-ace": "^12.0.0", + "react-datepicker": "^7.3.0", "react-diff-viewer": "^3.1.1", "react-dom": "18.2.0", "react-draggable": "4.4.6", @@ -440,7 +445,7 @@ "engines": { "node": ">= 20" }, - "packageManager": "yarn@4.4.0", + "packageManager": "yarn@4.4.1", "dependenciesMeta": { "prettier@3.3.3": { "unplugged": true diff --git a/packages/grafana-data/package.json b/packages/grafana-data/package.json index db9852ccf9b7f..5c6591bcc11dc 100644 --- a/packages/grafana-data/package.json +++ b/packages/grafana-data/package.json @@ -66,7 +66,7 @@ "@types/dompurify": "^3.0.0", "@types/history": "4.7.11", "@types/lodash": "4.17.7", - "@types/node": "20.14.14", + "@types/node": "20.16.2", "@types/papaparse": "5.3.14", "@types/react": "18.3.3", "@types/react-dom": "18.2.25", diff --git a/packages/grafana-data/src/dataframe/ArrayDataFrame.ts b/packages/grafana-data/src/dataframe/ArrayDataFrame.ts index 8817812b5bd66..8d35ca28d8547 100644 --- a/packages/grafana-data/src/dataframe/ArrayDataFrame.ts +++ b/packages/grafana-data/src/dataframe/ArrayDataFrame.ts @@ -16,18 +16,16 @@ export class ArrayDataFrame implements DataFrame { meta?: QueryResultMeta; constructor(source: T[], names?: string[]) { - return arrayToDataFrame(source, names); // returns a standard DataFrame + return arrayToDataFrame(source, names) as ArrayDataFrame; // returns a standard DataFrame } } /** - * arrayToDataFrame will convert any array into a DataFrame. - * @param source - can be an array of objects or an array of simple values. - * @param names - will be used for ordering of fields. Source needs to be array of objects if names are provided. + * arrayToDataFrame will convert any array into a DataFrame * * @public */ -export function arrayToDataFrame(source: Array> | unknown[], names?: string[]): DataFrame { +export function arrayToDataFrame(source: any[], names?: string[]): DataFrame { const df: DataFrame = { fields: [], length: source.length, @@ -36,46 +34,30 @@ export function arrayToDataFrame(source: Array> | unknow return df; } - // If names are provided then we assume the source is an array of objects with the names as keys (field names). This - // makes ordering of the fields predictable. if (names) { - if (!isObjectArray(source)) { - throw new Error('source is not an array of objects'); - } - for (const name of names) { df.fields.push( makeFieldFromValues( name, - source.map((v) => (v ? v[name] : v)) + source.map((v) => v[name]) ) ); } return df; } - const firstDefined = source.find((v) => v); // first not null|undefined - // This means if the source is lots of null/undefined values we throw that away and return empty dataFrame. This is - // different to how we preserve null/undefined values if there is some defined rows. Not sure this inconsistency - // is by design or not. - if (firstDefined === null) { - return df; - } - - // If is an array of objects we use the keys as field names. - if (isObjectArray(source)) { - // We need to do this to please TS. We know source is array of objects and that there is some object in there but - // TS still thinks it can all be undefined|nulls. - const first = source.find((v) => v); - df.fields = Object.keys(first || {}).map((name) => { - return makeFieldFromValues( - name, - source.map((v) => (v ? v[name] : v)) - ); - }); - } else { - // Otherwise source should be an array of simple values, so we create single field data frame. - df.fields.push(makeFieldFromValues(TIME_SERIES_VALUE_FIELD_NAME, source)); + const first = source.find((v) => v != null); // first not null|undefined + if (first != null) { + if (typeof first === 'object') { + df.fields = Object.keys(first).map((name) => { + return makeFieldFromValues( + name, + source.map((v) => v[name]) + ); + }); + } else { + df.fields.push(makeFieldFromValues(TIME_SERIES_VALUE_FIELD_NAME, source)); + } } return df; } @@ -85,8 +67,3 @@ function makeFieldFromValues(name: string, values: unknown[]): Field { f.type = guessFieldTypeForField(f) ?? FieldType.other; return f; } - -function isObjectArray(arr: unknown[]): arr is Array | null | undefined> { - const first = arr.find((v) => v); // first not null|undefined - return arr.length > 0 && typeof first === 'object'; -} diff --git a/packages/grafana-data/src/themes/breakpoints.ts b/packages/grafana-data/src/themes/breakpoints.ts index 1ad0d7137810e..9edee52f8e12a 100644 --- a/packages/grafana-data/src/themes/breakpoints.ts +++ b/packages/grafana-data/src/themes/breakpoints.ts @@ -28,7 +28,7 @@ export function createBreakpoints(): ThemeBreakpoints { const values: ThemeBreakpointValues = { xs: 0, sm: 544, - md: 769, // 1 more than regular ipad in portrait + md: 768, // 1 more than regular ipad in portrait lg: 992, xl: 1200, xxl: 1440, diff --git a/packages/grafana-data/src/themes/createColors.ts b/packages/grafana-data/src/themes/createColors.ts index 9db987e83a6d7..0e125130d6631 100644 --- a/packages/grafana-data/src/themes/createColors.ts +++ b/packages/grafana-data/src/themes/createColors.ts @@ -91,7 +91,7 @@ class DarkColors implements ThemeColorsBase> { mode: ThemeColorsMode = 'dark'; // Used to get more white opacity colors - whiteBase = '204, 204, 220'; + whiteBase = '219, 217, 215'; border = { weak: `rgba(${this.whiteBase}, 0.12)`, @@ -100,23 +100,22 @@ class DarkColors implements ThemeColorsBase> { }; text = { - primary: `rgb(${this.whiteBase})`, - secondary: `rgba(${this.whiteBase}, 0.65)`, - disabled: `rgba(${this.whiteBase}, 0.6)`, - link: palette.blueDarkText, - maxContrast: palette.white, + primary: '#DBD9D7', + secondary: '#F0E4B6', + disabled: '#9DA7B8', + link: '#F0E4B6', + maxContrast: '#F0E4B6', }; primary = { - main: palette.blueDarkMain, - text: palette.blueDarkText, - border: palette.blueDarkText, + main: '#3F8367', + text: '#F0E4B6', + border: '#ffffff00', }; secondary = { - main: `rgba(${this.whiteBase}, 0.10)`, - shade: `rgba(${this.whiteBase}, 0.14)`, - transparent: `rgba(${this.whiteBase}, 0.08)`, + main: '#F06929', + shade: '#F0692955', text: this.text.primary, contrastText: `rgb(${this.whiteBase})`, border: `rgba(${this.whiteBase}, 0.08)`, @@ -130,19 +129,19 @@ class DarkColors implements ThemeColorsBase> { }; success = { - main: palette.greenDarkMain, - text: palette.greenDarkText, + main: '#4BBF73', + text: '#318B50', }; warning = { - main: palette.orangeDarkMain, - text: palette.orangeDarkText, + main: '#CF8E07', + text: this.text.primary, }; background = { - canvas: palette.gray05, - primary: palette.gray10, - secondary: palette.gray15, + canvas: '#312D2B', //palette.gray05, + primary: '#3B3835', //palette.gray10, + secondary: '#5E5855', //palette.gray15, }; action = { @@ -169,19 +168,19 @@ class DarkColors implements ThemeColorsBase> { class LightColors implements ThemeColorsBase> { mode: ThemeColorsMode = 'light'; - blackBase = '36, 41, 46'; + blackBase = '45, 51, 62'; primary = { - main: palette.blueLightMain, - border: palette.blueLightText, - text: palette.blueLightText, + main: '#FF4702', + border: '#E33E00', + text: '#101828', }; text = { - primary: `rgba(${this.blackBase}, 1)`, - secondary: `rgba(${this.blackBase}, 0.75)`, - disabled: `rgba(${this.blackBase}, 0.64)`, - link: this.primary.text, + primary: '#101828', + secondary: '#344054', + disabled: '#9DA7B8', + link: '#FF4702', maxContrast: palette.black, }; @@ -192,16 +191,15 @@ class LightColors implements ThemeColorsBase> { }; secondary = { - main: `rgba(${this.blackBase}, 0.08)`, - shade: `rgba(${this.blackBase}, 0.15)`, - transparent: `rgba(${this.blackBase}, 0.08)`, + main: '#FF4702', + shade: '#FC9A6990', contrastText: `rgba(${this.blackBase}, 1)`, text: this.text.primary, border: this.border.weak, }; info = { - main: palette.blueLightMain, + main: '#64B6F7', text: palette.blueLightText, }; @@ -212,24 +210,24 @@ class LightColors implements ThemeColorsBase> { }; success = { - main: palette.greenLightMain, + main: '#83D39E', text: palette.greenLightText, }; warning = { - main: palette.orangeLightMain, + main: '#F3D086', text: palette.orangeLightText, }; background = { - canvas: palette.gray90, - primary: palette.white, - secondary: palette.gray100, + primary: '#FFFFFF', + canvas: '#FFFFFF', + secondary: '#FAFAFA', }; action = { hover: `rgba(${this.blackBase}, 0.12)`, - selected: `rgba(${this.blackBase}, 0.08)`, + selected: `#F27A40`, selectedBorder: palette.orangeLightMain, hoverOpacity: 0.08, focus: `rgba(${this.blackBase}, 0.12)`, @@ -251,7 +249,9 @@ class LightColors implements ThemeColorsBase> { export function createColors(colors: ThemeColorsInput): ThemeColors { const dark = new DarkColors(); const light = new LightColors(); + const base = (colors.mode ?? 'dark') === 'dark' ? dark : light; + const { primary = base.primary, secondary = base.secondary, diff --git a/packages/grafana-data/src/themes/createShape.ts b/packages/grafana-data/src/themes/createShape.ts index 881633523f4b5..f87ab3d725e83 100644 --- a/packages/grafana-data/src/themes/createShape.ts +++ b/packages/grafana-data/src/themes/createShape.ts @@ -19,10 +19,10 @@ export interface ThemeShapeInput { } export function createShape(options: ThemeShapeInput): ThemeShape { - const baseBorderRadius = options.borderRadius ?? 2; + const baseBorderRadius = options.borderRadius ?? 6; const radius = { - default: '2px', + default: '6px', pill: '9999px', circle: '100%', }; diff --git a/packages/grafana-data/src/themes/createTypography.ts b/packages/grafana-data/src/themes/createTypography.ts index 3f11990c0e7fa..d0c8fe8189476 100644 --- a/packages/grafana-data/src/themes/createTypography.ts +++ b/packages/grafana-data/src/themes/createTypography.ts @@ -53,8 +53,8 @@ export interface ThemeTypographyInput { htmlFontSize?: number; } -const defaultFontFamily = '"Inter", "Helvetica", "Arial", sans-serif'; -const defaultFontFamilyMonospace = "'Roboto Mono', monospace"; +const defaultFontFamily = '"Poppins", Inter, Satoshi, sans-serif'; //'"Roboto", "Helvetica", "Arial", sans-serif'; +const defaultFontFamilyMonospace = '"SatoshiLight", "FigtreeLight", monospace'; // "'Roboto Mono', monospace"; export function createTypography(colors: ThemeColors, typographyInput: ThemeTypographyInput = {}): ThemeTypography { const { @@ -62,13 +62,13 @@ export function createTypography(colors: ThemeColors, typographyInput: ThemeTypo fontFamilyMonospace = defaultFontFamilyMonospace, // The default font size of the Material Specification. fontSize = 14, // px - fontWeightLight = 300, - fontWeightRegular = 400, - fontWeightMedium = 500, + fontWeightLight = 200, + fontWeightRegular = 300, + fontWeightMedium = 400, fontWeightBold = 500, // Tell Grafana-UI what's the font-size on the html element. // 16px is the default font-size used by browsers. - htmlFontSize = 14, + htmlFontSize = 16, } = typographyInput; if (process.env.NODE_ENV !== 'production') { diff --git a/packages/grafana-data/src/types/config.ts b/packages/grafana-data/src/types/config.ts index 1cf37071e2364..bd055036b0468 100644 --- a/packages/grafana-data/src/types/config.ts +++ b/packages/grafana-data/src/types/config.ts @@ -147,6 +147,10 @@ export interface BootData { light: string; dark: string; }; + themePaths: { + dark: string; + light: string; + }; } /** diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index 2b3667bed7a47..68344c4e3bfa7 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -47,6 +47,11 @@ export interface FeatureToggles { mysqlAnsiQuotes?: boolean; accessControlOnCall?: boolean; nestedFolders?: boolean; + nestedFolderPicker?: boolean; + accessTokenExpirationCheck?: boolean; + emptyDashboardPage?: boolean; + disablePrometheusExemplarSampling?: boolean; + datasourceOnboarding?: boolean; alertingBacktesting?: boolean; editPanelCSVDragAndDrop?: boolean; alertingNoNormalState?: boolean; @@ -60,6 +65,7 @@ export interface FeatureToggles { influxdbRunQueriesInParallel?: boolean; prometheusRunQueriesInParallel?: boolean; lokiMetricDataplane?: boolean; + newTraceView?: boolean; lokiLogsDataplane?: boolean; dataplaneFrontendFallback?: boolean; disableSSEDataplane?: boolean; diff --git a/packages/grafana-e2e-selectors/package.json b/packages/grafana-e2e-selectors/package.json index e54b77ed1d44d..5736415dfd92f 100644 --- a/packages/grafana-e2e-selectors/package.json +++ b/packages/grafana-e2e-selectors/package.json @@ -40,7 +40,7 @@ }, "devDependencies": { "@rollup/plugin-node-resolve": "15.2.3", - "@types/node": "20.14.14", + "@types/node": "20.16.2", "esbuild": "0.20.2", "rimraf": "5.0.7", "rollup": "2.79.1", diff --git a/packages/grafana-e2e-selectors/src/selectors/pages.ts b/packages/grafana-e2e-selectors/src/selectors/pages.ts index 45c453130fa43..738d70f6b0566 100644 --- a/packages/grafana-e2e-selectors/src/selectors/pages.ts +++ b/packages/grafana-e2e-selectors/src/selectors/pages.ts @@ -417,7 +417,4 @@ export const Pages = { }, }, }, - ProfilePage: { - url: '/profile', - }, }; diff --git a/packages/grafana-flamegraph/package.json b/packages/grafana-flamegraph/package.json index aca8388c771a6..a7a746ac1e878 100644 --- a/packages/grafana-flamegraph/package.json +++ b/packages/grafana-flamegraph/package.json @@ -68,7 +68,7 @@ "@types/d3": "^7", "@types/jest": "^29.5.4", "@types/lodash": "4.17.7", - "@types/node": "20.14.14", + "@types/node": "20.16.2", "@types/react": "18.3.3", "@types/react-virtualized-auto-sizer": "1.0.4", "@types/tinycolor2": "1.4.6", @@ -80,7 +80,7 @@ "rollup-plugin-dts": "^5.0.0", "rollup-plugin-esbuild": "5.0.0", "rollup-plugin-node-externals": "^5.0.0", - "ts-jest": "29.2.4", + "ts-jest": "29.2.5", "ts-node": "10.9.2", "typescript": "5.5.4" }, diff --git a/packages/grafana-icons/package.json b/packages/grafana-icons/package.json index 6796b8fa5bc4e..6eab36ca1373a 100644 --- a/packages/grafana-icons/package.json +++ b/packages/grafana-icons/package.json @@ -45,7 +45,7 @@ "@svgr/plugin-prettier": "^8.1.0", "@svgr/plugin-svgo": "^8.1.0", "@types/babel__core": "^7", - "@types/node": "20.14.14", + "@types/node": "20.16.2", "@types/react": "18.3.3", "@types/react-dom": "18.2.25", "esbuild": "0.20.2", diff --git a/packages/grafana-o11y-ds-frontend/package.json b/packages/grafana-o11y-ds-frontend/package.json index 738201a680a30..37146dab8c048 100644 --- a/packages/grafana-o11y-ds-frontend/package.json +++ b/packages/grafana-o11y-ds-frontend/package.json @@ -36,13 +36,13 @@ "@testing-library/react": "15.0.2", "@testing-library/user-event": "14.5.2", "@types/jest": "^29.5.4", - "@types/node": "20.14.14", + "@types/node": "20.16.2", "@types/react": "18.3.3", "@types/systemjs": "6.13.5", "@types/testing-library__jest-dom": "5.14.9", "jest": "^29.6.4", "react": "18.2.0", - "ts-jest": "29.2.4", + "ts-jest": "29.2.5", "ts-node": "10.9.2", "typescript": "5.5.4" }, diff --git a/packages/grafana-o11y-ds-frontend/src/TraceToMetrics/TraceToMetricsSettings.tsx b/packages/grafana-o11y-ds-frontend/src/TraceToMetrics/TraceToMetricsSettings.tsx index 26359c41cba55..d8275a71b5957 100644 --- a/packages/grafana-o11y-ds-frontend/src/TraceToMetrics/TraceToMetricsSettings.tsx +++ b/packages/grafana-o11y-ds-frontend/src/TraceToMetrics/TraceToMetricsSettings.tsx @@ -80,7 +80,7 @@ export function TraceToMetricsSettings({ options, onOptionsChange }: Props) { { updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', { @@ -96,7 +96,7 @@ export function TraceToMetricsSettings({ options, onOptionsChange }: Props) { { updateDatasourcePluginJsonDataOption({ onOptionsChange, options }, 'tracesToMetrics', { diff --git a/packages/grafana-prometheus/package.json b/packages/grafana-prometheus/package.json index 1b5e862153061..7492e11f651f5 100644 --- a/packages/grafana-prometheus/package.json +++ b/packages/grafana-prometheus/package.json @@ -37,10 +37,10 @@ }, "dependencies": { "@emotion/css": "11.11.2", - "@floating-ui/react": "0.26.22", + "@floating-ui/react": "0.26.23", "@grafana/data": "11.3.0-pre", "@grafana/experimental": "1.8.0", - "@grafana/faro-web-sdk": "1.9.0", + "@grafana/faro-web-sdk": "1.9.1", "@grafana/runtime": "11.3.0-pre", "@grafana/schema": "11.3.0-pre", "@grafana/ui": "11.3.0-pre", @@ -49,7 +49,7 @@ "@lezer/common": "1.2.1", "@lezer/highlight": "1.2.1", "@lezer/lr": "1.4.2", - "@prometheus-io/lezer-promql": "0.53.2", + "@prometheus-io/lezer-promql": "0.54.1", "@reduxjs/toolkit": "2.2.7", "d3": "7.9.0", "date-fns": "3.6.0", @@ -92,7 +92,7 @@ "@types/jest": "29.5.12", "@types/jquery": "3.5.30", "@types/lodash": "4.17.7", - "@types/node": "20.14.14", + "@types/node": "20.16.2", "@types/pluralize": "^0.0.33", "@types/prismjs": "1.26.4", "@types/react": "18.3.3", @@ -137,7 +137,7 @@ "testing-library-selector": "0.3.1", "ts-node": "10.9.2", "typescript": "5.5.4", - "webpack": "5.91.0", + "webpack": "5.94.0", "webpack-cli": "5.1.4" }, "peerDependencies": { diff --git a/packages/grafana-runtime/src/services/LocationService.tsx b/packages/grafana-runtime/src/services/LocationService.tsx index 6a148b15482e2..5b0bcd9e0ccf8 100644 --- a/packages/grafana-runtime/src/services/LocationService.tsx +++ b/packages/grafana-runtime/src/services/LocationService.tsx @@ -48,6 +48,11 @@ export class HistoryWrapper implements LocationService { this.getLocation = this.getLocation.bind(this); } + fnPathnameChange(path: string, queryParams: any) { + this.history.location.pathname = path; + this.history.location.search = urlUtil.toUrlParams(queryParams); + } + getHistory() { return this.history; } @@ -87,6 +92,7 @@ export class HistoryWrapper implements LocationService { } reload() { + /* eslint-disable-next-line */ const prevState = (this.history.location.state as any)?.routeReloadCounter; this.history.replace({ ...this.history.location, diff --git a/packages/grafana-sql/package.json b/packages/grafana-sql/package.json index 42054ef4aea4c..018d316c9e356 100644 --- a/packages/grafana-sql/package.json +++ b/packages/grafana-sql/package.json @@ -42,7 +42,7 @@ "@testing-library/user-event": "14.5.2", "@types/jest": "^29.5.4", "@types/lodash": "4.17.7", - "@types/node": "20.14.14", + "@types/node": "20.16.2", "@types/react": "18.3.3", "@types/react-dom": "18.2.25", "@types/react-virtualized-auto-sizer": "1.0.4", @@ -50,7 +50,7 @@ "@types/testing-library__jest-dom": "5.14.9", "@types/uuid": "9.0.8", "jest": "^29.6.4", - "ts-jest": "29.2.4", + "ts-jest": "29.2.5", "ts-node": "10.9.2", "typescript": "5.5.4" }, diff --git a/packages/grafana-ui/package.json b/packages/grafana-ui/package.json index f70c2dfc234b0..35196b97c59c5 100644 --- a/packages/grafana-ui/package.json +++ b/packages/grafana-ui/package.json @@ -49,7 +49,7 @@ "dependencies": { "@emotion/css": "11.11.2", "@emotion/react": "11.11.4", - "@floating-ui/react": "0.26.22", + "@floating-ui/react": "0.26.23", "@grafana/data": "11.3.0-pre", "@grafana/e2e-selectors": "11.3.0-pre", "@grafana/faro-web-sdk": "^1.3.6", @@ -145,7 +145,7 @@ "@types/is-hotkey": "0.1.10", "@types/jest": "29.5.12", "@types/mock-raf": "1.0.6", - "@types/node": "20.14.14", + "@types/node": "20.16.2", "@types/prismjs": "1.26.4", "@types/react": "18.3.3", "@types/react-color": "3.0.12", @@ -186,7 +186,7 @@ "storybook-dark-mode": "^4.0.1", "style-loader": "4.0.0", "typescript": "5.5.4", - "webpack": "5.91.0" + "webpack": "5.94.0" }, "peerDependencies": { "react": "^18.0.0", diff --git a/packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx b/packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx index ac775afbe97b3..f136383d03f49 100644 --- a/packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx +++ b/packages/grafana-ui/src/components/CustomScrollbar/CustomScrollbar.tsx @@ -116,7 +116,14 @@ export const CustomScrollbar = ({ passedProps.style['WebkitOverflowScrolling'] = 'auto'; } - return
; + return ( +
+ ); }, [divId] ); diff --git a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx index 1fdeb14114f11..4eb746fc89be5 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx @@ -381,7 +381,7 @@ const getStyles = (theme: GrafanaTheme2) => ({ container: css({ padding: theme.spacing(1), border: `1px ${theme.colors.border.weak} solid`, - borderRadius: theme.shape.radius.default, + borderRadius: theme.shape.borderRadius(), backgroundColor: theme.colors.background.primary, zIndex: theme.zIndex.modal, }), diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx index e83357196f540..3589bf9420464 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker.tsx @@ -2,7 +2,7 @@ import { css, cx } from '@emotion/css'; import { useDialog } from '@react-aria/dialog'; import { FocusScope } from '@react-aria/focus'; import { useOverlay } from '@react-aria/overlays'; -import { memo, createRef, useState, useEffect } from 'react'; +import { memo, createRef, useState, ReactNode, useEffect } from 'react'; import { rangeUtil, @@ -48,6 +48,7 @@ export interface TimeRangePickerProps { onToolbarTimePickerClick?: () => void; /** Which day of the week the calendar should start on. Possible values: "saturday", "sunday" or "monday" */ weekStart?: WeekStart; + fnText?: ReactNode; } export interface State { @@ -75,6 +76,7 @@ export function TimeRangePicker(props: TimeRangePickerProps) { isOnCanvas, onToolbarTimePickerClick, weekStart, + fnText = '', } = props; const onChange = (timeRange: TimeRange) => { @@ -135,9 +137,8 @@ export function TimeRangePicker(props: TimeRangePickerProps) { )} } - placement="bottom" + placement="bottom-start" interactive > @@ -191,7 +193,7 @@ export function TimeRangePicker(props: TimeRangePickerProps) { /> )} - + ( - <> - - Time range zoom out
CTRL+Z -
- + + Time range zoom out
CTRL+Z +
); export const TimePickerTooltip = ({ timeRange, timeZone }: { timeRange: TimeRange; timeZone?: TimeZone }) => { diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/CalendarBody.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/CalendarBody.tsx index a3f988cb3a43d..aedcc536ba91e 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/CalendarBody.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/CalendarBody.tsx @@ -111,6 +111,7 @@ export const getBodyStyles = (theme: GrafanaTheme2) => { zIndex: theme.zIndex.modal, backgroundColor: theme.colors.background.primary, width: '268px', + borderRadius: theme.shape.borderRadius(), '.react-calendar__navigation': { display: 'flex', @@ -181,6 +182,9 @@ export const getBodyStyles = (theme: GrafanaTheme2) => { borderTopLeftRadius: '20px', borderBottomLeftRadius: '20px', }, + '& button': { + borderRadius: 0, + }, [`${hasActiveSelector}, .react-calendar__tile--rangeEnd`]: { borderTopRightRadius: '20px', diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerContent.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerContent.tsx index 6b8a47d5932bf..f0b5463ec1000 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerContent.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerContent.tsx @@ -4,7 +4,7 @@ import { memo, useMemo, useState } from 'react'; import { GrafanaTheme2, isDateTime, rangeUtil, RawTimeRange, TimeOption, TimeRange, TimeZone } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; -import { useStyles2, useTheme2 } from '../../../themes'; +import { stylesFactory, useStyles2, useTheme2 } from '../../../themes'; import { getFocusStyles } from '../../../themes/mixins'; import { t, Trans } from '../../../utils/i18n'; import { FilterInput } from '../../FilterInput/FilterInput'; @@ -189,7 +189,13 @@ const FullScreenForm = (props: FormProps) => { return ( <> -
+
Absolute time range @@ -212,7 +218,7 @@ const FullScreenForm = (props: FormProps) => { title={t('time-picker.absolute.recent-title', 'Recently used absolute ranges')} options={historyOptions || []} onChange={onChangeTimeOption} - placeholderEmpty={} + placeholderEmpty={<>} />
)} @@ -269,54 +275,50 @@ const useTimeOption = (raw: RawTimeRange, quickOptions: TimeOption[]): TimeOptio }, [raw, quickOptions]); }; -const getStyles = ( - theme: GrafanaTheme2, - isReversed?: boolean, - hideQuickRanges?: boolean, - isContainerTall?: boolean, - isFullscreen?: boolean -) => ({ - container: css({ - background: theme.colors.background.primary, - boxShadow: theme.shadows.z3, - width: `${isFullscreen ? '546px' : '262px'}`, - borderRadius: theme.shape.radius.default, - border: `1px solid ${theme.colors.border.weak}`, - [`${isReversed ? 'left' : 'right'}`]: 0, - display: 'flex', - flexDirection: 'column', - }), - body: css({ - display: 'flex', - flexDirection: 'row-reverse', - height: `${isContainerTall ? '381px' : '217px'}`, - maxHeight: '100vh', - }), - leftSide: css({ - display: 'flex', - flexDirection: 'column', - borderRight: `${isReversed ? 'none' : `1px solid ${theme.colors.border.weak}`}`, - width: `${!hideQuickRanges ? '60%' : '100%'}`, - overflow: 'auto', - scrollbarWidth: 'thin', - order: isReversed ? 1 : 0, - }), - rightSide: css({ - width: `${isFullscreen ? '40%' : '100%'}; !important`, - borderRight: isReversed ? `1px solid ${theme.colors.border.weak}` : 'none', - display: 'flex', - flexDirection: 'column', - }), - timeRangeFilter: css({ - padding: theme.spacing(1), - }), - spacing: css({ - marginTop: '16px', - }), - scrollContent: css({ - overflowY: 'auto', - scrollbarWidth: 'thin', - }), +const getStyles = stylesFactory((theme: GrafanaTheme2, isReversed, hideQuickRanges, isContainerTall, isFullscreen) => { + return { + container: css({ + background: theme.colors.background.primary, + boxShadow: theme.shadows.z3, + width: `${isFullscreen ? '546px' : '262px'}`, + borderRadius: theme.shape.borderRadius(), + border: `1px solid ${theme.colors.border.weak}`, + [`${isReversed ? 'left' : 'right'}`]: 0, + }), + body: css({ + display: 'flex', + flexDirection: 'row-reverse', + height: `${isContainerTall ? '281px' : '217px'}`, + maxHeight: '100vh', + '& button': { + borderRadius: '6px', + }, + }), + leftSide: css({ + display: 'flex', + flexDirection: 'column', + borderRight: `${isReversed ? 'none' : `1px solid ${theme.colors.border.weak}`}`, + width: `${!hideQuickRanges ? '60%' : '100%'}`, + overflow: 'hidden', + order: isReversed ? 1 : 0, + }), + rightSide: css({ + width: `${isFullscreen ? '40%' : '100%'}; !important`, + borderRight: isReversed ? `1px solid ${theme.colors.border.weak}` : 'none', + display: 'flex', + flexDirection: 'column', + }), + timeRangeFilter: css({ + padding: theme.spacing(1), + }), + spacing: css({ + marginTop: '16px', + }), + scrollContent: css({ + overflowY: 'auto', + scrollbarWidth: 'thin', + }), + }; }); const getNarrowScreenStyles = (theme: GrafanaTheme2) => ({ diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerFooter.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerFooter.tsx index 28b328ed5c3a3..686b29122a2a7 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerFooter.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimePickerFooter.tsx @@ -6,7 +6,7 @@ import * as React from 'react'; import { getTimeZoneInfo, GrafanaTheme2, TimeZone } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; -import { useStyles2 } from '../../../themes'; +import { stylesFactory, useStyles2, useTheme2 } from '../../../themes'; import { t, Trans } from '../../../utils/i18n'; import { Button } from '../../Button'; import { Field } from '../../Forms/Field'; @@ -36,6 +36,7 @@ export const TimePickerFooter = (props: Props) => { } = props; const [isEditing, setEditing] = useState(false); const [editMode, setEditMode] = useState('tz'); + const theme = useTheme2(); const timeSettingsId = useId(); const timeZoneSettingsId = useId(); @@ -63,6 +64,8 @@ export const TimePickerFooter = (props: Props) => { return null; } + const fnColor = theme.isDark ? '#8EC4AD' : '#344054'; + return (
{
@@ -162,42 +165,46 @@ export const TimePickerFooter = (props: Props) => { ); }; -const getStyle = (theme: GrafanaTheme2) => ({ - container: css({ - borderTop: `1px solid ${theme.colors.border.weak}`, - padding: theme.spacing(1.5), - display: 'flex', - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - }), - editContainer: css({ - borderTop: `1px solid ${theme.colors.border.weak}`, - padding: theme.spacing(1.5), - paddingTop: 0, - justifyContent: 'space-between', - alignItems: 'center', - }), - spacer: css({ - marginLeft: '7px', - }), - timeSettingContainer: css({ - paddingTop: theme.spacing(1), - }), - fiscalYearField: css({ - marginBottom: 0, - }), - timeZoneContainer: css({ - display: 'flex', - flexDirection: 'row', - justifyContent: 'space-between', - alignItems: 'center', - flexGrow: 1, - }), - timeZone: css({ - display: 'flex', - flexDirection: 'row', - alignItems: 'baseline', - flexGrow: 1, - }), +const getStyle = stylesFactory((theme: GrafanaTheme2) => { + return { + container: css({ + borderTop: `1px solid ${theme.colors.border.weak}`, + padding: '11px', + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + '& button': { + borderRadius: '6px', + }, + }), + editContainer: css({ + borderTop: `1px solid ${theme.colors.border.weak}`, + padding: '11px', + justifyContent: 'space-between', + alignItems: 'center', + }), + spacer: css({ + marginLeft: '7px', + }), + timeSettingContainer: css({ + paddingTop: theme.spacing(1), + }), + fiscalYearField: css({ + marginBottom: 0, + }), + timeZoneContainer: css({ + display: 'flex', + flexDirection: 'row', + justifyContent: 'space-between', + alignItems: 'center', + flexGrow: 1, + }), + timeZone: css({ + display: 'flex', + flexDirection: 'row', + alignItems: 'baseline', + flexGrow: 1, + }), + }; }); diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimeRangeContent.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimeRangeContent.tsx index 87f5572c586c8..1f3f5e1eff7d5 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimeRangeContent.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/TimeRangePicker/TimeRangeContent.tsx @@ -195,6 +195,7 @@ export const TimeRangeContent = (props: Props) => { {fyTooltip}
+
diff --git a/packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneDescription.tsx b/packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneDescription.tsx index 12594c31b650a..fb2ea000e2cbd 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneDescription.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/TimeZonePicker/TimeZoneDescription.tsx @@ -3,7 +3,7 @@ import { useMemo } from 'react'; import { GrafanaTheme2, TimeZoneInfo } from '@grafana/data'; -import { useStyles2 } from '../../../themes'; +import { useTheme2, useStyles2 } from '../../../themes'; interface Props { info?: TimeZoneInfo; @@ -12,12 +12,17 @@ interface Props { export const TimeZoneDescription = ({ info }: Props) => { const styles = useStyles2(getStyles); const description = useDescription(info); + const { isDark } = useTheme2(); if (!info) { return null; } - return
{description}
; + return ( +
+ {description} +
+ ); }; const useDescription = (info?: TimeZoneInfo): string => { diff --git a/packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx b/packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx index 719a32bcb382d..883f7b645ab0d 100644 --- a/packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx +++ b/packages/grafana-ui/src/components/Dropdown/ButtonSelect.tsx @@ -128,6 +128,7 @@ const getStyles = (theme: GrafanaTheme2) => { }), menuWrapper: css({ zIndex: theme.zIndex.dropdown, + marginLeft: -25, }), }; }; diff --git a/packages/grafana-ui/src/components/Icon/Icon.tsx b/packages/grafana-ui/src/components/Icon/Icon.tsx index d760c3a318587..bb810b87732ca 100644 --- a/packages/grafana-ui/src/components/Icon/Icon.tsx +++ b/packages/grafana-ui/src/components/Icon/Icon.tsx @@ -42,6 +42,7 @@ const getIconStyles = (theme: GrafanaTheme2) => { }; }; +const cachedIcon = new Map(); export const Icon = React.forwardRef( ({ size = 'md', type = 'default', name, className, style, title = '', ...rest }, ref) => { const styles = useStyles2(getIconStyles); @@ -58,7 +59,28 @@ export const Icon = React.forwardRef( const svgHgt = svgSize; const svgWid = name.startsWith('gf-bar-align') ? 16 : name.startsWith('gf-interp') ? 30 : svgSize; const subDir = getIconSubDir(iconName, type); - const svgPath = `${iconRoot}${subDir}/${iconName}.svg`; + const [svgPath, setSvgPath] = React.useState(null); + + React.useEffect(() => { + const iconPath = `${iconRoot}${subDir}/${iconName}.svg`; + if (cachedIcon.has(iconPath)) { + setSvgPath(cachedIcon.get(iconPath)); + return; + } + /** + * For microfrontend, all the Grafana routes are behind the proxy, so we need to fetch the icon from the proxy. + * When we use fetch request get intercepted and url is changed to the proxy url. + */ + fetch(iconPath).then(async (response) => { + if (response.ok) { + const icon = await response.text(); + cachedIcon.set(iconPath, icon); + setSvgPath(icon); + } else { + console.error(`Icon ${iconName} not found`); + } + }); + }, [iconName, iconRoot, subDir]); const composedClassName = cx( styles.icon, @@ -70,23 +92,27 @@ export const Icon = React.forwardRef( ); return ( - + <> + {svgPath && ( + + )} + ); } ); diff --git a/packages/grafana-ui/src/components/PageLayout/PageToolbar.tsx b/packages/grafana-ui/src/components/PageLayout/PageToolbar.tsx index b76f75f506303..7edc4f38b5a34 100644 --- a/packages/grafana-ui/src/components/PageLayout/PageToolbar.tsx +++ b/packages/grafana-ui/src/components/PageLayout/PageToolbar.tsx @@ -159,7 +159,7 @@ const getStyles = (theme: GrafanaTheme2) => { const { spacing, typography } = theme; const focusStyle = getFocusStyles(theme); - + // ${theme.colors.background.canvas}; return { pre: css({ whiteSpace: 'pre', diff --git a/packages/grafana-ui/src/components/PanelChrome/PanelChrome.tsx b/packages/grafana-ui/src/components/PanelChrome/PanelChrome.tsx index e50f103339f1a..96a43f88cd78b 100644 --- a/packages/grafana-ui/src/components/PanelChrome/PanelChrome.tsx +++ b/packages/grafana-ui/src/components/PanelChrome/PanelChrome.tsx @@ -23,7 +23,7 @@ import { TitleItem } from './TitleItem'; /** * @internal */ -export type PanelChromeProps = (AutoSize | FixedDimensions) & (Collapsible | HoverHeader); +export type PanelChromeProps = (AutoSize | FixedDimensions) & (Collapsible | HoverHeader) & { isFNPanel?: boolean }; interface BaseProps { padding?: PanelPadding; @@ -134,9 +134,10 @@ export function PanelChrome({ onFocus, onMouseMove, onMouseEnter, + isFNPanel, }: PanelChromeProps) { const theme = useTheme2(); - const styles = useStyles2(getStyles); + const styles = useStyles2(getStyles(isFNPanel)); const panelContentId = useId(); const panelTitleId = useId().replace(/:/g, '_'); @@ -303,7 +304,7 @@ export function PanelChrome({ {headerContent} - {menu && ( + {menu && !isFNPanel && ( { +const getStyles = (isFNPanel?: boolean) => (theme: GrafanaTheme2) => { const { background, borderColor, padding } = theme.components.panel; return { @@ -385,7 +386,7 @@ const getStyles = (theme: GrafanaTheme2) => { backgroundColor: background, border: `1px solid ${borderColor}`, position: 'relative', - borderRadius: theme.shape.radius.default, + borderRadius: theme.shape.borderRadius(), height: '100%', display: 'flex', flexDirection: 'column', @@ -462,6 +463,11 @@ const getStyles = (theme: GrafanaTheme2) => { display: 'flex', padding: theme.spacing(0, padding), minWidth: 0, + ...(isFNPanel && { + width: '100%', + textAlign: 'center', + justifyContent: 'center', + }), '& > h2': { minWidth: 0, }, diff --git a/packages/grafana-ui/src/components/Portal/Portal.tsx b/packages/grafana-ui/src/components/Portal/Portal.tsx index 1dd8e29b374e8..93d5f8d7fa889 100644 --- a/packages/grafana-ui/src/components/Portal/Portal.tsx +++ b/packages/grafana-ui/src/components/Portal/Portal.tsx @@ -40,7 +40,12 @@ export function Portal(props: PropsWithChildren) { }; }, [portalRoot]); - return ReactDOM.createPortal(
{children}
, node.current); + return ReactDOM.createPortal( +
+ {children} +
, + node.current + ); } /** @internal */ diff --git a/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx b/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx index d207288ba891d..d6d15ee929842 100644 --- a/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx +++ b/packages/grafana-ui/src/components/RefreshPicker/RefreshPicker.tsx @@ -5,7 +5,6 @@ import { SelectableValue, parseDuration } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { t } from '../../utils/i18n'; -import { ButtonGroup } from '../Button'; import { ButtonSelect } from '../Dropdown/ButtonSelect'; import { ToolbarButtonVariant, ToolbarButton } from '../ToolbarButton'; @@ -102,7 +101,7 @@ export class RefreshPicker extends PureComponent { const tooltipAutoRefresh = selectedValue.value === '' ? tooltipAutoRefreshOff : tooltipIntervalSelected; return ( - +
{ tooltip={tooltipAutoRefresh} /> )} - +
); } } diff --git a/packages/grafana-ui/src/components/Select/SelectBase.tsx b/packages/grafana-ui/src/components/Select/SelectBase.tsx index a37634653d626..00f4d04bdfc8b 100644 --- a/packages/grafana-ui/src/components/Select/SelectBase.tsx +++ b/packages/grafana-ui/src/components/Select/SelectBase.tsx @@ -115,7 +115,7 @@ export function SelectBase({ menuPlacement = 'auto', menuPosition, menuShouldPortal = true, - noOptionsMessage = t('grafana-ui.select.no-options-label', 'No options found'), + noOptionsMessage = t('grafana-ui.select.no-options-label', 'No options found') as string, onBlur, onChange, onCloseMenu, @@ -128,7 +128,7 @@ export function SelectBase({ onFocus, openMenuOnFocus = false, options = [], - placeholder = t('grafana-ui.select.placeholder', 'Choose'), + placeholder = t('grafana-ui.select.placeholder', 'Choose') as string, prefix, renderControl, showAllSelectedWhenOpen = true, diff --git a/packages/grafana-ui/src/components/Table/Table.tsx b/packages/grafana-ui/src/components/Table/Table.tsx index 3beb04bda7cdb..dea703181eb07 100644 --- a/packages/grafana-ui/src/components/Table/Table.tsx +++ b/packages/grafana-ui/src/components/Table/Table.tsx @@ -67,7 +67,6 @@ export const Table = memo((props: Props) => { const tableStyles = useTableStyles(theme, cellHeight); const headerHeight = noHeader ? 0 : tableStyles.rowHeight; const [footerItems, setFooterItems] = useState(footerValues); - const noValuesDisplayText = fieldConfig?.defaults?.noValue ?? NO_DATA_TEXT; const footerHeight = useMemo(() => { const EXTENDED_ROW_HEIGHT = FOOTER_ROW_HEIGHT; @@ -339,7 +338,7 @@ export const Table = memo((props: Props) => {
) : (
- {noValuesDisplayText} + {NO_DATA_TEXT}
)} {footerItems && ( diff --git a/packages/grafana-ui/src/components/Table/utils.tsx b/packages/grafana-ui/src/components/Table/utils.tsx new file mode 100644 index 0000000000000..7bd0ca96807bd --- /dev/null +++ b/packages/grafana-ui/src/components/Table/utils.tsx @@ -0,0 +1,488 @@ +import { Property } from 'csstype'; +import { clone } from 'lodash'; +import memoizeOne from 'memoize-one'; +import { Row } from 'react-table'; + +import { + DataFrame, + Field, + FieldType, + formattedValueToString, + getFieldDisplayName, + SelectableValue, + fieldReducers, + getDisplayProcessor, + reduceField, + GrafanaTheme2, + isDataFrame, + isTimeSeriesFrame, +} from '@grafana/data'; +import { + BarGaugeDisplayMode, + TableAutoCellOptions, + TableCellBackgroundDisplayMode, + TableCellDisplayMode, +} from '@grafana/schema'; + +import { BarGaugeCell } from './BarGaugeCell'; +import { DefaultCell } from './DefaultCell'; +import { getFooterValue } from './FooterRow'; +import { GeoCell } from './GeoCell'; +import { ImageCell } from './ImageCell'; +import { JSONViewCell } from './JSONViewCell'; +import { RowExpander } from './RowExpander'; +import { SparklineCell } from './SparklineCell'; +import { + CellComponent, + TableCellOptions, + TableFieldOptions, + FooterItem, + GrafanaTableColumn, + TableFooterCalc, +} from './types'; + +export const EXPANDER_WIDTH = 50; + +export function getTextAlign(field?: Field): Property.JustifyContent { + if (!field) { + return 'flex-start'; + } + + if (field.config.custom) { + const custom = field.config.custom as TableFieldOptions; + + switch (custom.align) { + case 'right': + return 'flex-end'; + case 'left': + return 'flex-start'; + case 'center': + return 'center'; + } + } + + if (field.type === FieldType.number) { + return 'flex-end'; + } + + return 'flex-start'; +} + +export function getColumns( + data: DataFrame, + availableWidth: number, + columnMinWidth: number, + expander: boolean, + footerValues?: FooterItem[], + isCountRowsSet?: boolean +): GrafanaTableColumn[] { + const columns: GrafanaTableColumn[] = []; + let fieldCountWithoutWidth = 0; + + if (expander) { + columns.push({ + // Make an expander cell + Header: () => null, // No header + id: 'expander', // It needs an ID + // @ts-expect-error + // TODO fix type error here + Cell: RowExpander, + width: EXPANDER_WIDTH, + minWidth: EXPANDER_WIDTH, + filter: (_rows: Row[], _id: string, _filterValues?: SelectableValue[]) => { + return []; + }, + justifyContent: 'left', + field: data.fields[0], + sortType: 'basic', + }); + + availableWidth -= EXPANDER_WIDTH; + } + + for (const [fieldIndex, field] of data.fields.entries()) { + const fieldTableOptions = (field.config.custom || {}) as TableFieldOptions; + if (fieldTableOptions.hidden) { + continue; + } + + if (fieldTableOptions.width) { + availableWidth -= fieldTableOptions.width; + } else { + fieldCountWithoutWidth++; + } + + const selectSortType = (type: FieldType) => { + switch (type) { + case FieldType.number: + return 'number'; + case FieldType.time: + return 'basic'; + default: + return 'alphanumeric-insensitive'; + } + }; + + const Cell = getCellComponent(fieldTableOptions.cellOptions?.type, field); + columns.push({ + // @ts-expect-error + // TODO fix type error here + Cell, + id: fieldIndex.toString(), + field: field, + Header: fieldTableOptions.hideHeader ? '' : getFieldDisplayName(field, data), + accessor: (_row: any, i: number) => { + return field.values[i]; + }, + sortType: selectSortType(field.type), + width: fieldTableOptions.width, + minWidth: fieldTableOptions.minWidth ?? columnMinWidth, + filter: memoizeOne(filterByValue(field)), + justifyContent: getTextAlign(field), + Footer: getFooterValue(fieldIndex, footerValues, isCountRowsSet), + }); + } + + // set columns that are at minimum width + let sharedWidth = availableWidth / fieldCountWithoutWidth; + for (let i = fieldCountWithoutWidth; i > 0; i--) { + for (const column of columns) { + if (!column.width && column.minWidth > sharedWidth) { + column.width = column.minWidth; + availableWidth -= column.width; + fieldCountWithoutWidth -= 1; + sharedWidth = availableWidth / fieldCountWithoutWidth; + } + } + } + + // divide up the rest of the space + for (const column of columns) { + if (!column.width) { + column.width = sharedWidth; + } + column.minWidth = 50; + } + + return columns; +} + +export function getCellComponent(displayMode: TableCellDisplayMode, field: Field): CellComponent { + switch (displayMode) { + case TableCellDisplayMode.Custom: + case TableCellDisplayMode.ColorText: + case TableCellDisplayMode.ColorBackground: + return DefaultCell; + case TableCellDisplayMode.Image: + return ImageCell; + case TableCellDisplayMode.Gauge: + return BarGaugeCell; + case TableCellDisplayMode.Sparkline: + return SparklineCell; + case TableCellDisplayMode.JSONView: + return JSONViewCell; + } + + if (field.type === FieldType.geo) { + return GeoCell; + } + + if (field.type === FieldType.frame) { + const firstValue = field.values[0]; + if (isDataFrame(firstValue) && isTimeSeriesFrame(firstValue)) { + return SparklineCell; + } + + return JSONViewCell; + } + + // Default or Auto + if (field.type === FieldType.other) { + return JSONViewCell; + } + + return DefaultCell; +} + +export function filterByValue(field?: Field) { + return function (rows: Row[], id: string, filterValues?: SelectableValue[]) { + if (rows.length === 0) { + return rows; + } + + if (!filterValues) { + return rows; + } + + if (!field) { + return rows; + } + + return rows.filter((row) => { + if (!row.values.hasOwnProperty(id)) { + return false; + } + const value = rowToFieldValue(row, field); + return filterValues.find((filter) => filter.value === value) !== undefined; + }); + }; +} + +export function calculateUniqueFieldValues(rows: any[], field?: Field) { + if (!field || rows.length === 0) { + return {}; + } + + const set: Record = {}; + + for (let index = 0; index < rows.length; index++) { + const value = rowToFieldValue(rows[index], field); + set[value || '(Blanks)'] = value; + } + + return set; +} + +export function rowToFieldValue(row: any, field?: Field): string { + if (!field || !row) { + return ''; + } + + const fieldValue = field.values[row.index]; + const displayValue = field.display ? field.display(fieldValue) : fieldValue; + const value = field.display ? formattedValueToString(displayValue) : displayValue; + + return value; +} + +export function valuesToOptions(unique: Record): SelectableValue[] { + return Object.keys(unique) + .reduce((all, key) => all.concat({ value: unique[key], label: key }), [] as SelectableValue[]) + .sort(sortOptions); +} + +export function sortOptions(a: SelectableValue, b: SelectableValue): number { + if (a.label === undefined && b.label === undefined) { + return 0; + } + + if (a.label === undefined && b.label !== undefined) { + return -1; + } + + if (a.label !== undefined && b.label === undefined) { + return 1; + } + + if (a.label! < b.label!) { + return -1; + } + + if (a.label! > b.label!) { + return 1; + } + + return 0; +} + +export function getFilteredOptions(options: SelectableValue[], filterValues?: SelectableValue[]): SelectableValue[] { + if (!filterValues) { + return []; + } + + return options.filter((option) => filterValues.some((filtered) => filtered.value === option.value)); +} + +export function sortCaseInsensitive(a: Row, b: Row, id: string) { + return String(a.values[id]).localeCompare(String(b.values[id]), undefined, { sensitivity: 'base' }); +} + +// sortNumber needs to have great performance as it is called a lot +export function sortNumber(rowA: Row, rowB: Row, id: string) { + const a = toNumber(rowA.values[id]); + const b = toNumber(rowB.values[id]); + return a === b ? 0 : a > b ? 1 : -1; +} + +function toNumber(value: any): number { + if (value === null || value === undefined || value === '' || isNaN(value)) { + return Number.NEGATIVE_INFINITY; + } + + if (typeof value === 'number') { + return value; + } + + return Number(value); +} + +export function getFooterItems( + filterFields: Array<{ id: string; field?: Field } | undefined>, + values: any[number], + options: TableFooterCalc, + theme2: GrafanaTheme2 +): FooterItem[] { + /* + The FooterItems[] are calculated using both the `headerGroups[0].headers` + (filterFields) and `rows` (values) destructured from the useTable() hook. + This cacluation is based on the data from each index in `filterFields` + array as well as the corresponding index in the `values` array. + When the user hides a column through an override, the getColumns() + hook is invoked, removes said hidden column, sends the updated column + data to the useTable() hook, which then builds `headerGroups[0].headers` + without the hidden column. However, it doesn't remove the hidden column + from the `row` data, instead it substututes the hidden column row data + with an `undefined` value. Therefore, the `row` array length never changes, + despite the `headerGroups[0].headers` length changing at every column removal. + This makes all footer reduce calculations AFTER the first hidden column + in the `headerGroups[0].headers` break, since the indexing of both + arrays is no longer in parity. + + So, here we simply recursively test for the "hidden" columns + from `headerGroups[0].headers`. Each column has an ID property that corresponds + to its own index, therefore if (`filterField.id` !== `String(index)`), + we know there is one or more hidden columns; at which point we update + the index with an ersatz placeholder with just an `id` property. + */ + addMissingColumnIndex(filterFields); + + return filterFields.map((data, i) => { + // Then test for numerical data - this will filter out placeholder `filterFields` as well. + if (data?.field?.type !== FieldType.number) { + // Show the reducer in the first column + if (i === 0 && options.reducer && options.reducer.length > 0) { + const reducer = fieldReducers.get(options.reducer[0]); + return reducer.name; + } + // Render an . + return undefined; + } + + let newField = clone(data.field); + newField.values = values[data.id]; + newField.state = undefined; + + data.field = newField; + + if (options.fields && options.fields.length > 0) { + const f = options.fields.find((f) => f === data?.field?.name); + if (f) { + return getFormattedValue(data.field, options.reducer, theme2); + } + return undefined; + } + return getFormattedValue(data.field, options.reducer || [], theme2); + }); +} + +function getFormattedValue(field: Field, reducer: string[], theme: GrafanaTheme2) { + const fmt = field.display ?? getDisplayProcessor({ field, theme }); + const calc = reducer[0]; + const v = reduceField({ field, reducers: reducer })[calc]; + return formattedValueToString(fmt(v)); +} + +// This strips the raw vales from the `rows` object. +export function createFooterCalculationValues(rows: Row[]): any[number] { + const values: any[number] = []; + + for (const key in rows) { + for (const [valKey, val] of Object.entries(rows[key].values)) { + if (values[valKey] === undefined) { + values[valKey] = []; + } + values[valKey].push(val); + } + } + + return values; +} + +const defaultCellOptions: TableAutoCellOptions = { type: TableCellDisplayMode.Auto }; + +export function getCellOptions(field: Field): TableCellOptions { + if (field.config.custom?.displayMode) { + return migrateTableDisplayModeToCellOptions(field.config.custom?.displayMode); + } + + if (!field.config.custom?.cellOptions) { + return defaultCellOptions; + } + + return (field.config.custom as TableFieldOptions).cellOptions; +} + +/** + * Migrates table cell display mode to new object format. + * + * @param displayMode The display mode of the cell + * @returns TableCellOptions object in the correct format + * relative to the old display mode. + */ +export function migrateTableDisplayModeToCellOptions(displayMode: TableCellDisplayMode): TableCellOptions { + switch (displayMode) { + // In the case of the gauge we move to a different option + case 'basic': + case 'gradient-gauge': + case 'lcd-gauge': + let gaugeMode = BarGaugeDisplayMode.Basic; + + if (displayMode === 'gradient-gauge') { + gaugeMode = BarGaugeDisplayMode.Gradient; + } else if (displayMode === 'lcd-gauge') { + gaugeMode = BarGaugeDisplayMode.Lcd; + } + + return { + type: TableCellDisplayMode.Gauge, + mode: gaugeMode, + }; + // Also true in the case of the color background + case 'color-background': + case 'color-background-solid': + let mode = TableCellBackgroundDisplayMode.Basic; + + // Set the new mode field, somewhat confusingly the + // color-background mode is for gradient display + if (displayMode === 'color-background') { + mode = TableCellBackgroundDisplayMode.Gradient; + } + + return { + type: TableCellDisplayMode.ColorBackground, + mode: mode, + }; + default: + return { + // @ts-ignore + type: displayMode, + }; + } +} + +/** + * This recurses through an array of `filterFields` (Array<{ id: string; field?: Field } | undefined>) + * and adds back the missing indecies that are removed due to hiding a column through an panel override. + * This is necessary to create Array.length parity between the `filterFields` array and the `values` array (any[number]), + * since the footer value calculations are based on the corresponding index values of both arrays. + * + * @remarks + * This function uses the splice() method, and therefore mutates the array. + * + * @param columns - An array of `filterFields` (Array<{ id: string; field?: Field } | undefined>). + * @returns void; this function returns nothing; it only mutates values as a side effect. + */ +function addMissingColumnIndex(columns: Array<{ id: string; field?: Field } | undefined>): void { + const missingIndex = columns.findIndex((field, index) => field?.id !== String(index)); + + // Base case + if (missingIndex === -1) { + return; + } + + // Splice in missing column + columns.splice(missingIndex, 0, { id: String(missingIndex) }); + + // Recurse + addMissingColumnIndex(columns); +} diff --git a/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.tsx b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.tsx index b99e176a14293..d26f3a4cc6616 100644 --- a/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.tsx +++ b/packages/grafana-ui/src/components/ToolbarButton/ToolbarButton.tsx @@ -1,11 +1,11 @@ +/* eslint-disable @grafana/no-unreduced-motion */ import { cx, css } from '@emotion/css'; -import { forwardRef, ButtonHTMLAttributes } from 'react'; -import * as React from 'react'; +import { forwardRef, ButtonHTMLAttributes, ReactNode } from 'react'; import { GrafanaTheme2, IconName, isIconName } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; -import { styleMixins, useStyles2 } from '../../themes'; +import { styleMixins, useStyles2, useTheme2 } from '../../themes'; import { getFocusStyles, getMouseFocusStyles } from '../../themes/mixins'; import { IconSize } from '../../types/icon'; import { getPropertiesForVariant } from '../Button'; @@ -37,7 +37,8 @@ type CommonProps = { isHighlighted?: boolean; }; -export type ToolbarButtonProps = CommonProps & ButtonHTMLAttributes; +export type ToolbarButtonProps = CommonProps & + ButtonHTMLAttributes & { isHidden?: boolean; fnText?: ReactNode }; export type ToolbarButtonVariant = 'default' | 'primary' | 'destructive' | 'active' | 'canvas'; @@ -58,11 +59,14 @@ export const ToolbarButton = forwardRef( iconOnly, 'aria-label': ariaLabel, isHighlighted, + isHidden, + fnText = '', ...rest }, ref ) => { const styles = useStyles2(getStyles); + const theme2 = useTheme2(); const buttonStyles = cx( { @@ -87,6 +91,10 @@ export const ToolbarButton = forwardRef( aria-label={getButtonAriaLabel(ariaLabel, tooltip)} aria-expanded={isOpen} {...rest} + style={{ + display: isHidden ? 'none' : '', + border: `1px solid ${theme2.colors.border.weak}`, + }} > {renderIcon(icon, iconSize)} {imgSrc && {imgAlt} @@ -94,11 +102,12 @@ export const ToolbarButton = forwardRef( {isOpen === false && } {isOpen === true && } {isHighlighted &&
} + {fnText !== '' && fnText} ); return tooltip ? ( - + {body} ) : ( @@ -148,16 +157,14 @@ const getStyles = (theme: GrafanaTheme2) => { alignItems: 'center', height: theme.spacing(theme.components.height.md), padding: theme.spacing(0, 1), - borderRadius: theme.shape.radius.default, + borderRadius: theme.shape.borderRadius(), lineHeight: `${theme.components.height.md * theme.spacing.gridSize - 2}px`, fontWeight: theme.typography.fontWeightMedium, border: `1px solid ${theme.colors.secondary.border}`, whiteSpace: 'nowrap', - [theme.transitions.handleMotion('no-preference', 'reduce')]: { - transition: theme.transitions.create(['background', 'box-shadow', 'border-color', 'color'], { - duration: theme.transitions.duration.short, - }), - }, + transition: theme.transitions.create(['background', 'box-shadow', 'border-color', 'color'], { + duration: theme.transitions.duration.short, + }), '&:focus, &:focus-visible': { ...getFocusStyles(theme), @@ -185,7 +192,7 @@ const getStyles = (theme: GrafanaTheme2) => { }), default: css({ color: theme.colors.text.secondary, - background: 'transparent', + background: theme.colors.background.primary, border: `1px solid transparent`, '&:hover': { diff --git a/packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin2.tsx b/packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin2.tsx index 54b6648efefbc..3e916bc8e1ebb 100644 --- a/packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin2.tsx +++ b/packages/grafana-ui/src/components/uPlot/plugins/TooltipPlugin2.tsx @@ -1,7 +1,6 @@ import { css, cx } from '@emotion/css'; import { useLayoutEffect, useRef, useReducer, CSSProperties } from 'react'; import * as React from 'react'; -import { createPortal } from 'react-dom'; import uPlot from 'uplot'; import { GrafanaTheme2 } from '@grafana/data'; @@ -9,7 +8,7 @@ import { DashboardCursorSync } from '@grafana/schema'; import { useStyles2 } from '../../../themes'; import { RangeSelection1D, RangeSelection2D, OnSelectRangeCallback } from '../../PanelChrome'; -import { getPortalContainer } from '../../Portal/Portal'; +import { getPortalContainer, Portal } from '../../Portal/Portal'; import { UPlotConfigBuilder } from '../config/UPlotConfigBuilder'; import { CloseButton } from './CloseButton'; @@ -651,18 +650,18 @@ export const TooltipPlugin2 = ({ }, [isHovering]); if (plot && isHovering) { - return createPortal( -
- {isPinned && } - {contents} -
, - portalRoot.current + return ( + +
+ {isPinned && } + {contents} +
+
); } diff --git a/packages/grafana-ui/src/themes/GlobalStyles/forms.ts b/packages/grafana-ui/src/themes/GlobalStyles/forms.ts index 2cc1b03e94a23..317d92b3a075e 100644 --- a/packages/grafana-ui/src/themes/GlobalStyles/forms.ts +++ b/packages/grafana-ui/src/themes/GlobalStyles/forms.ts @@ -10,14 +10,12 @@ export function getFormElementStyles(theme: GrafanaTheme2) { fontWeight: theme.typography.body.fontWeight, lineHeight: theme.typography.body.lineHeight, }, - 'input, select': { backgroundColor: theme.components.input.background, color: theme.components.input.text, border: 'none', boxShadow: 'none', }, - textarea: { height: 'auto', }, diff --git a/packages/grafana-ui/src/themes/ThemeContext.tsx b/packages/grafana-ui/src/themes/ThemeContext.tsx index e83401a04deee..a9508dba300f4 100644 --- a/packages/grafana-ui/src/themes/ThemeContext.tsx +++ b/packages/grafana-ui/src/themes/ThemeContext.tsx @@ -36,6 +36,7 @@ export const withTheme =

(Component: Rea }; WithTheme.displayName = `WithTheme(${Component.displayName})`; + // @ts-ignore hoistNonReactStatics(WithTheme, Component); type Hoisted = typeof WithTheme & S; return WithTheme as Hoisted; @@ -56,6 +57,7 @@ export const withTheme2 =

(Component: R }; WithTheme.displayName = `WithTheme(${Component.displayName})`; + // @ts-ignore hoistNonReactStatics(WithTheme, Component); type Hoisted = typeof WithTheme & S; return WithTheme as Hoisted; diff --git a/packages/grafana-ui/src/themes/_variables.scss.tmpl.ts b/packages/grafana-ui/src/themes/_variables.scss.tmpl.ts index 75a8ad0d4af3d..3f6b60eed7fa5 100644 --- a/packages/grafana-ui/src/themes/_variables.scss.tmpl.ts +++ b/packages/grafana-ui/src/themes/_variables.scss.tmpl.ts @@ -75,10 +75,10 @@ $grid-breakpoints: ( // Define the maximum width of \`.container\` for different screen sizes. $container-max-widths: ( - sm: 576px, - md: 720px, - lg: 940px, - xl: 1080px, + sm: 640px, + md: 768px, + lg: 1024px, + xl: 1536px, ) !default; // Grid columns diff --git a/packages/grafana-ui/src/themes/default.ts b/packages/grafana-ui/src/themes/default.ts index f5490b72c0bc7..78fb03350cacf 100644 --- a/packages/grafana-ui/src/themes/default.ts +++ b/packages/grafana-ui/src/themes/default.ts @@ -31,8 +31,8 @@ const theme: GrafanaThemeCommons = { name: 'Grafana Default', typography: { fontFamily: { - sansSerif: '"Inter", "Helvetica", "Arial", sans-serif', - monospace: "'Roboto Mono', monospace", + sansSerif: '"Poppins", Inter, Satoshi, sans-serif', + monospace: '"SatoshiLight", "FigtreeLight", monospace', }, size: { base: '14px', diff --git a/packages/grafana-ui/tsconfig.json b/packages/grafana-ui/tsconfig.json index 7601a6e1e18a4..e0d37b754df8e 100644 --- a/packages/grafana-ui/tsconfig.json +++ b/packages/grafana-ui/tsconfig.json @@ -5,7 +5,8 @@ "declarationDir": "./compiled", "emitDeclarationOnly": true, "isolatedModules": true, - "rootDirs": ["."] + "rootDirs": ["."], + "moduleResolution": "node" }, "exclude": ["dist/**/*"], "extends": "@grafana/tsconfig", diff --git a/pkg/aggregator/go.mod b/pkg/aggregator/go.mod index 55398f00f5e60..60f1d9187cfbe 100644 --- a/pkg/aggregator/go.mod +++ b/pkg/aggregator/go.mod @@ -3,89 +3,92 @@ module github.com/grafana/grafana/pkg/aggregator go 1.23.0 require ( - github.com/emicklei/go-restful/v3 v3.11.0 - github.com/grafana/grafana-plugin-sdk-go v0.244.0 + github.com/emicklei/go-restful/v3 v3.12.1 + github.com/grafana/grafana-plugin-sdk-go v0.245.0 github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240808213237-f4d2e064f435 github.com/grafana/grafana/pkg/semconv v0.0.0-20240808213237-f4d2e064f435 github.com/mattbaird/jsonpatch v0.0.0-20240118010651-0ba75a80ca38 github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/otel v1.28.0 + go.opentelemetry.io/otel v1.29.0 k8s.io/api v0.31.0 k8s.io/apimachinery v0.31.0 k8s.io/apiserver v0.31.0 k8s.io/client-go v0.31.0 k8s.io/component-base v0.31.0 k8s.io/klog/v2 v2.130.1 - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 + k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2 sigs.k8s.io/structured-merge-diff/v4 v4.4.1 ) require ( - github.com/BurntSushi/toml v1.3.2 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect github.com/NYTimes/gziphandler v1.1.1 // indirect - github.com/antlr4-go/antlr/v4 v4.13.0 // indirect + github.com/antlr4-go/antlr/v4 v4.13.1 // indirect github.com/apache/arrow/go/v15 v15.0.2 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect + github.com/bufbuild/protocompile v0.14.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cheekybits/genny v1.0.0 // indirect - github.com/chromedp/cdproto v0.0.0-20240426225625-909263490071 // indirect + github.com/chromedp/cdproto v0.0.0-20240810084448-b931b754e476 // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/elazarl/goproxy v0.0.0-20231117061959-7cc037d33fb5 // indirect + github.com/elazarl/goproxy v0.0.0-20240726154733-8b0c20506380 // indirect github.com/evanphx/json-patch v5.6.0+incompatible // indirect - github.com/fatih/color v1.16.0 // indirect + github.com/fatih/color v1.17.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/getkin/kin-openapi v0.125.0 // indirect + github.com/getkin/kin-openapi v0.127.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-json v0.10.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/btree v1.1.2 // indirect - github.com/google/cel-go v0.20.1 // indirect + github.com/google/btree v1.1.3 // indirect + github.com/google/cel-go v0.21.0 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/mux v1.8.1 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/grafana/otel-profiling-go v0.5.1 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-plugin v1.6.1 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/imdario/mergo v0.3.16 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/invopop/yaml v0.3.1 // indirect + github.com/jhump/protoreflect v1.16.0 // indirect github.com/jonboulle/clockwork v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 // indirect github.com/klauspost/compress v1.17.9 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/magefile/mage v1.15.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattetti/filebuffer v1.0.1 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -97,9 +100,9 @@ require ( github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.20.0 // indirect + github.com/prometheus/client_golang v1.20.2 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/common v0.57.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -114,25 +117,25 @@ require ( github.com/urfave/cli v1.22.15 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect - go.etcd.io/etcd/api/v3 v3.5.14 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.14 // indirect - go.etcd.io/etcd/client/v3 v3.5.14 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.53.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/contrib/propagators/jaeger v1.28.0 // indirect - go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.etcd.io/etcd/api/v3 v3.5.15 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.15 // indirect + go.etcd.io/etcd/client/v3 v3.5.15 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.54.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect + go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 // indirect + go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 // indirect + go.opentelemetry.io/otel/metric v1.29.0 // indirect + go.opentelemetry.io/otel/sdk v1.29.0 // indirect + go.opentelemetry.io/otel/trace v1.29.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/crypto v0.26.0 // indirect - golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f // indirect - golang.org/x/mod v0.18.0 // indirect + golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 // indirect + golang.org/x/mod v0.20.0 // indirect golang.org/x/net v0.28.0 // indirect golang.org/x/oauth2 v0.22.0 // indirect golang.org/x/sync v0.8.0 // indirect @@ -140,20 +143,20 @@ require ( golang.org/x/term v0.23.0 // indirect golang.org/x/text v0.17.0 // indirect golang.org/x/time v0.6.0 // indirect - golang.org/x/tools v0.22.0 // indirect + golang.org/x/tools v0.24.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect - gonum.org/v1/gonum v0.14.0 // indirect - google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/grpc v1.65.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/grpc v1.66.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + k8s.io/utils v0.0.0-20240821151609-f90d01438635 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/yaml v1.4.0 // indirect diff --git a/pkg/aggregator/go.sum b/pkg/aggregator/go.sum index 365a5e0f8df2f..7907a6718b8cb 100644 --- a/pkg/aggregator/go.sum +++ b/pkg/aggregator/go.sum @@ -1,11 +1,12 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/NYTimes/gziphandler v1.1.1 h1:ZUDjpQae29j0ryrS0u/B8HZfJBtBQHjqw2rQ2cqUQ3I= github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMomdKFjzJNB0c= -github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= -github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= +github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= +github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= github.com/apache/arrow/go/v15 v15.0.2 h1:60IliRbiyTWCWjERBCkO1W4Qun9svcYoZrSLcyOsMLE= github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= @@ -16,8 +17,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= -github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= +github.com/bufbuild/protocompile v0.14.0 h1:z3DW4IvXE5G/uTOnSQn+qwQQxvhckkTWLS/0No/o7KU= +github.com/bufbuild/protocompile v0.14.0/go.mod h1:N6J1NYzkspJo3ZwyL4Xjvli86XOj1xq4qAasUFxGups= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -25,8 +26,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/chromedp/cdproto v0.0.0-20240426225625-909263490071 h1:RdCf9hH3xq5vJifrjGB7zQlFkdRB3pAppcX2helDq2U= -github.com/chromedp/cdproto v0.0.0-20240426225625-909263490071/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/cdproto v0.0.0-20240810084448-b931b754e476 h1:VnjHsRXCRti7Av7E+j4DCha3kf68echfDzQ+wD11SBU= +github.com/chromedp/cdproto v0.0.0-20240810084448-b931b754e476/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4= @@ -42,13 +43,12 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/elazarl/goproxy v0.0.0-20231117061959-7cc037d33fb5 h1:m62nsMU279qRD9PQSWD1l66kmkXzuYcnVJqL4XLeV2M= -github.com/elazarl/goproxy v0.0.0-20231117061959-7cc037d33fb5/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= +github.com/elazarl/goproxy v0.0.0-20240726154733-8b0c20506380 h1:1NyRx2f4W4WBRyg0Kys0ZbaNmDDzZ2R/C7DTi+bbsJ0= +github.com/elazarl/goproxy v0.0.0-20240726154733-8b0c20506380/go.mod h1:thX175TtLTzLj3p7N/Q9IiKZ7NF+p72cvL91emV0hzo= github.com/elazarl/goproxy/ext v0.0.0-20220115173737-adb46da277ac h1:9yrT5tmn9Zc0ytWPASlaPwQfQMQYnRf0RSDe1XvHw0Q= github.com/elazarl/goproxy/ext v0.0.0-20220115173737-adb46da277ac/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= +github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -56,8 +56,8 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -65,8 +65,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/getkin/kin-openapi v0.125.0 h1:jyQCyf2qXS1qvs2U00xQzkGCqYPhEhZDmSmVt65fXno= -github.com/getkin/kin-openapi v0.125.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= +github.com/getkin/kin-openapi v0.127.0 h1:Mghqi3Dhryf3F8vR370nN67pAERW+3a95vomb3MAREY= +github.com/getkin/kin-openapi v0.127.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -79,8 +79,8 @@ github.com/go-logr/zapr v1.3.0 h1:XGdV8XW8zdwFiwOA2Dryh1gj2KRQyOOoNmBy4EplIcQ= github.com/go-logr/zapr v1.3.0/go.mod h1:YKepepNBd1u/oyhd/yQmtjVXmm9uML4IXUgMOwR8/Gg= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -88,8 +88,8 @@ github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1v github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -104,10 +104,10 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.20.1 h1:nDx9r8S3L4pE61eDdt8igGj8rf5kjYR3ILxWIpWNi84= -github.com/google/cel-go v0.20.1/go.mod h1:kWcIzTsPX0zmQ+H3TirHstLLf9ep5QTsZBN9u4dOYLg= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/cel-go v0.21.0 h1:cl6uW/gxN+Hy50tNYvI691+sXxioCnstFzLp2WO4GCI= +github.com/google/cel-go v0.21.0/go.mod h1:rHUlWCcBKgyEk+eV03RPdZUekPp6YcJwV0FxuUksYxc= github.com/google/flatbuffers v24.3.25+incompatible h1:CX395cjN9Kke9mmalRoL3d81AtFUxJM+yDthflgJGkI= github.com/google/flatbuffers v24.3.25+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= @@ -119,8 +119,8 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= -github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -128,10 +128,10 @@ github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1 github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/grafana-plugin-sdk-go v0.244.0 h1:ZZxHbiiF6QcsnlbPFyZGmzNDoTC1pLeHXUQYoskWt5c= -github.com/grafana/grafana-plugin-sdk-go v0.244.0/go.mod h1:H3FXrJMUlwocQ6UYj8Ds5I9EzRAVOcdRcgaRE3mXQqk= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grafana/grafana-plugin-sdk-go v0.245.0 h1:2KCKA86//O20ffL6WKzHGx5scBbdV7GyEFGnH8Hdv7M= +github.com/grafana/grafana-plugin-sdk-go v0.245.0/go.mod h1:1X8Kgo/SK91Qo1WBCKjPSKrfgjpQys1OkQsHhA78TLg= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240808213237-f4d2e064f435 h1:lmw60EW7JWlAEvgggktOyVkH4hF1m/+LSF/Ap0NCyi8= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240808213237-f4d2e064f435/go.mod h1:ORVFiW/KNRY52lNjkGwnFWCxNVfE97bJG2jr2fetq0I= github.com/grafana/grafana/pkg/semconv v0.0.0-20240808213237-f4d2e064f435 h1:SNEeqY22DrGr5E9kGF1mKSqlOom14W9+b1u4XEGJowA= @@ -150,8 +150,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a534 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340/go.mod h1:3bDW6wMZJB7tiONtC/1Xpicra6Wp5GgbTbQWCbI5fkc= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-plugin v1.6.1 h1:P7MR2UP6gNKGPp+y7EZw2kOiq4IR9WiqLvp0XOsVdwI= @@ -164,8 +164,8 @@ github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2 github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= -github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= -github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= +github.com/jhump/protoreflect v1.16.0 h1:54fZg+49widqXYQ0b+usAFHbMkBGR4PpXrsHc8+TBDg= +github.com/jhump/protoreflect v1.16.0/go.mod h1:oYPd7nPvcBw/5wlDfm/AVmU9zH9BgqGCI469pGxfj/8= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -181,8 +181,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -211,8 +211,8 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= @@ -247,23 +247,22 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI= -github.com/prometheus/client_golang v1.20.0/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg= +github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common v0.57.0 h1:Ro/rKjwdq9mZn1K5QPctzh+MA4Lp0BuYk5ZZEVhoNcY= +github.com/prometheus/common v0.57.0/go.mod h1:7uRPFSUTbfZWsJ7MHY56sqt7hLQu3bxXHDnNhl8E9qI= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -329,46 +328,46 @@ github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= -go.etcd.io/etcd/api/v3 v3.5.14 h1:vHObSCxyB9zlF60w7qzAdTcGaglbJOpSj1Xj9+WGxq0= -go.etcd.io/etcd/api/v3 v3.5.14/go.mod h1:BmtWcRlQvwa1h3G2jvKYwIQy4PkHlDej5t7uLMUdJUU= -go.etcd.io/etcd/client/pkg/v3 v3.5.14 h1:SaNH6Y+rVEdxfpA2Jr5wkEvN6Zykme5+YnbCkxvuWxQ= -go.etcd.io/etcd/client/pkg/v3 v3.5.14/go.mod h1:8uMgAokyG1czCtIdsq+AGyYQMvpIKnSvPjFMunkgeZI= +go.etcd.io/etcd/api/v3 v3.5.15 h1:3KpLJir1ZEBrYuV2v+Twaa/e2MdDCEZ/70H+lzEiwsk= +go.etcd.io/etcd/api/v3 v3.5.15/go.mod h1:N9EhGzXq58WuMllgH9ZvnEr7SI9pS0k0+DHZezGp7jM= +go.etcd.io/etcd/client/pkg/v3 v3.5.15 h1:fo0HpWz/KlHGMCC+YejpiCmyWDEuIpnTDzpJLB5fWlA= +go.etcd.io/etcd/client/pkg/v3 v3.5.15/go.mod h1:mXDI4NAOwEiszrHCb0aqfAYNCrZP4e9hRca3d1YK8EU= go.etcd.io/etcd/client/v2 v2.305.13 h1:RWfV1SX5jTU0lbCvpVQe3iPQeAHETWdOTb6pxhd77C8= go.etcd.io/etcd/client/v2 v2.305.13/go.mod h1:iQnL7fepbiomdXMb3om1rHq96htNNGv2sJkEcZGDRRg= -go.etcd.io/etcd/client/v3 v3.5.14 h1:CWfRs4FDaDoSz81giL7zPpZH2Z35tbOrAJkkjMqOupg= -go.etcd.io/etcd/client/v3 v3.5.14/go.mod h1:k3XfdV/VIHy/97rqWjoUzrj9tk7GgJGH9J8L4dNXmAk= +go.etcd.io/etcd/client/v3 v3.5.15 h1:23M0eY4Fd/inNv1ZfU3AxrbbOdW79r9V9Rl62Nm6ip4= +go.etcd.io/etcd/client/v3 v3.5.15/go.mod h1:CLSJxrYjvLtHsrPKsy7LmZEE+DK2ktfd2bN4RhBMwlU= go.etcd.io/etcd/pkg/v3 v3.5.13 h1:st9bDWNsKkBNpP4PR1MvM/9NqUPfvYZx/YXegsYEH8M= go.etcd.io/etcd/pkg/v3 v3.5.13/go.mod h1:N+4PLrp7agI/Viy+dUYpX7iRtSPvKq+w8Y14d1vX+m0= go.etcd.io/etcd/raft/v3 v3.5.13 h1:7r/NKAOups1YnKcfro2RvGGo2PTuizF/xh26Z2CTAzA= go.etcd.io/etcd/raft/v3 v3.5.13/go.mod h1:uUFibGLn2Ksm2URMxN1fICGhk8Wu96EfDQyuLhAcAmw= go.etcd.io/etcd/server/v3 v3.5.13 h1:V6KG+yMfMSqWt+lGnhFpP5z5dRUj1BDRJ5k1fQ9DFok= go.etcd.io/etcd/server/v3 v3.5.13/go.mod h1:K/8nbsGupHqmr5MkgaZpLlH1QdX1pcNQLAkODy44XcQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.53.0 h1:IVtyPth4Rs5P8wIf0mP2KVKFNTJ4paX9qQ4Hkh5gFdc= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.53.0/go.mod h1:ImRBLMJv177/pwiLZ7tU7HDGNdBv7rS0HQ99eN/zBl8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/contrib/propagators/jaeger v1.28.0 h1:xQ3ktSVS128JWIaN1DiPGIjcH+GsvkibIAVRWFjS9eM= -go.opentelemetry.io/contrib/propagators/jaeger v1.28.0/go.mod h1:O9HIyI2kVBrFoEwQZ0IN6PHXykGoit4mZV2aEjkTRH4= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0 h1:OYxqumWcd1yaV/qvCt1B7Sru9OeUNGjeXq/oldx3AGk= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0/go.mod h1:2tZTRqCbvx7nG57wUwd5NQpNVujOWnR84iPLllIH0Ok= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.54.0 h1:U9ge/19g8pkNXL+0eqeWgiJAd8nSmmvbvwehqyxU/Lc= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.54.0/go.mod h1:dmNhUi0Tl5v/3e0QNp7/3KLMvAPoHh4lMbZU319UkM0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 h1:+YPiqF5rR6PqHBlmEFLPumbSP0gY0WmCGFayXRcCLvs= +go.opentelemetry.io/contrib/propagators/jaeger v1.29.0/go.mod h1:6PD7q7qquWSp3Z4HeM3e/2ipRubaY1rXZO8NIHVDZjs= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 h1:qKi9ntCcronqWqfuKxqrxZlZd82jXJEgGiAWH1+phxo= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0/go.mod h1:1kbAgQa5lgYC3rC6cE3jSxQ/Q13l33wv/WI8U+htwag= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 h1:nSiV3s7wiCam610XcLbYOmMfJxB9gO4uK3Xgv5gmTgg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0/go.mod h1:hKn/e/Nmd19/x1gvIHwtOwVWM+VhuITSWip3JUDghj0= go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -387,16 +386,16 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f h1:99ci1mjWVBWwJiEKYY6jWa4d2nTQVIEhZIptnrVb1XY= -golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -455,35 +454,35 @@ golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk= golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= -gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM= -google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c h1:TYOEhrQMrNDTAd2rX9m+WgGr8Ku6YNuj1D7OX6rWSok= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c/go.mod h1:2rC5OendXvZ8wGEo/cSLheztrZDZaSoHanUcd1xtZnw= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed h1:J6izYgfBXAI3xTKLgxzTmUltdYaLsuBxFCgDHWJ/eXg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c= +google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -521,10 +520,10 @@ k8s.io/component-base v0.31.0 h1:/KIzGM5EvPNQcYgwq5NwoQBaOlVFrghoVGr8lG6vNRs= k8s.io/component-base v0.31.0/go.mod h1:TYVuzI1QmN4L5ItVdMSXKvH7/DtvIuas5/mm8YT3rTo= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2 h1:GKE9U8BH16uynoxQii0auTjmmmuZ3O0LFMN6S0lPPhI= +k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2/go.mod h1:coRQXBK9NxO98XUv3ZD6AK3xzHCxV6+b7lrquKwaKzA= +k8s.io/utils v0.0.0-20240821151609-f90d01438635 h1:2wThSvJoW/Ncn9TmQEYXRnevZXi2duqHWf5OX9S3zjI= +k8s.io/utils v0.0.0-20240821151609-f90d01438635/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= diff --git a/pkg/api/dtos/dashboard.go b/pkg/api/dtos/dashboard.go index 9d8f96f8c7aa6..66a8922a4f1a3 100644 --- a/pkg/api/dtos/dashboard.go +++ b/pkg/api/dtos/dashboard.go @@ -35,6 +35,7 @@ type DashboardMeta struct { ProvisionedExternalId string `json:"provisionedExternalId"` AnnotationsPermissions *dashboardsV0.AnnotationPermission `json:"annotationsPermissions"` PublicDashboardEnabled bool `json:"publicDashboardEnabled,omitempty"` + HasPublicDashboard bool `json:"hasPublicDashboard,omitempty"` } type DashboardFullWithMeta struct { diff --git a/pkg/api/http_server.go b/pkg/api/http_server.go index 9f5ac6b79fd9c..c3742b15dad4c 100644 --- a/pkg/api/http_server.go +++ b/pkg/api/http_server.go @@ -602,7 +602,7 @@ func (hs *HTTPServer) addMiddlewaresAndStaticRoutes() { m.UseMiddleware(hs.Csrf.Middleware()) hs.mapStatic(m, hs.Cfg.StaticRootPath, "build", "public/build") - hs.mapStatic(m, hs.Cfg.StaticRootPath, "", "public", "/public/views/swagger.html") + hs.mapStatic(m, hs.Cfg.StaticRootPath, "", "public", "/public/views/swagger-template.html") hs.mapStatic(m, hs.Cfg.StaticRootPath, "robots.txt", "robots.txt") if hs.Cfg.ImageUploadProvider == "local" { diff --git a/pkg/api/plugin_resource_test.go b/pkg/api/plugin_resource_test.go index a83a9400cc504..9ac339edbde17 100644 --- a/pkg/api/plugin_resource_test.go +++ b/pkg/api/plugin_resource_test.go @@ -51,7 +51,7 @@ func TestCallResource(t *testing.T) { cfg.Azure = &azsettings.AzureSettings{} coreRegistry := coreplugin.ProvideCoreRegistry(tracing.InitializeTracerForTest(), nil, &cloudwatch.CloudWatchService{}, nil, nil, nil, nil, - nil, nil, nil, nil, testdatasource.ProvideService(), nil, nil, nil, nil, nil, nil) + nil, nil, nil, nil, testdatasource.ProvideService(), nil, nil, nil, nil, nil, nil, nil) testCtx := pluginsintegration.CreateIntegrationTestCtx(t, cfg, coreRegistry) diff --git a/pkg/api/static/static.go b/pkg/api/static/static.go index 786cc5c55ba0a..eacbf10a29f3a 100644 --- a/pkg/api/static/static.go +++ b/pkg/api/static/static.go @@ -149,6 +149,7 @@ func staticHandler(ctx *web.Context, log log.Logger, opt StaticOptions) bool { log.Error("Failed to close file", "error", err) } }() + httpFile := f fi, err := f.Stat() if err != nil { @@ -183,10 +184,11 @@ func staticHandler(ctx *web.Context, log log.Logger, opt StaticOptions) bool { } }() - fi, err = f.Stat() + fi, err = indexFile.Stat() if err != nil || fi.IsDir() { return true } + httpFile = indexFile } if !opt.SkipLogging { @@ -198,7 +200,7 @@ func staticHandler(ctx *web.Context, log log.Logger, opt StaticOptions) bool { opt.AddHeaders(ctx) } - http.ServeContent(ctx.Resp, ctx.Req, file, fi.ModTime(), f) + http.ServeContent(ctx.Resp, ctx.Req, file, fi.ModTime(), httpFile) return true } diff --git a/pkg/apimachinery/go.mod b/pkg/apimachinery/go.mod index 418e3beab91d6..7cae5389a2ccb 100644 --- a/pkg/apimachinery/go.mod +++ b/pkg/apimachinery/go.mod @@ -3,22 +3,22 @@ module github.com/grafana/grafana/pkg/apimachinery go 1.23.0 require ( - github.com/grafana/authlib v0.0.0-20240814074258-eae7d47f01db // @grafana/identity-access-team - github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db // @grafana/identity-access-team + github.com/grafana/authlib v0.0.0-20240828122726-9edfcbea43e2 // @grafana/identity-access-team + github.com/grafana/authlib/claims v0.0.0-20240828122726-9edfcbea43e2 // @grafana/identity-access-team github.com/stretchr/testify v1.9.0 k8s.io/apimachinery v0.31.0 k8s.io/apiserver v0.31.0 - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 + k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2 ) require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.1 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/go-jose/go-jose/v3 v3.0.3 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect @@ -37,14 +37,14 @@ require ( golang.org/x/sync v0.8.0 // indirect golang.org/x/sys v0.24.0 // indirect golang.org/x/text v0.17.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/grpc v1.65.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/grpc v1.66.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + k8s.io/utils v0.0.0-20240821151609-f90d01438635 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) diff --git a/pkg/apimachinery/go.sum b/pkg/apimachinery/go.sum index 66b4df6cb6c4a..46c32b3e12732 100644 --- a/pkg/apimachinery/go.sum +++ b/pkg/apimachinery/go.sum @@ -2,8 +2,8 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= +github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= @@ -12,8 +12,8 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= @@ -28,10 +28,10 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/grafana/authlib v0.0.0-20240814074258-eae7d47f01db h1:z++X4DdoX+aNlZNT1ZY4cykiFay4+f077pa0AG48SGg= -github.com/grafana/authlib v0.0.0-20240814074258-eae7d47f01db/go.mod h1:ptt910z9KFfpVSIbSbXvTRR7tS19mxD7EtmVbbJi/WE= -github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db h1:mDk0bwRV6rDrLSmKXftcPf9kLA9uH6EvxJvzpPW9bso= -github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A= +github.com/grafana/authlib v0.0.0-20240828122726-9edfcbea43e2 h1:SU+p1ck8037cz6F8W38PIL9MzRb6YMeNqc7+GHDuqiU= +github.com/grafana/authlib v0.0.0-20240828122726-9edfcbea43e2/go.mod h1:PFzXbCrn0GIpN4KwT6NP1l5Z1CPLfmKHnYx8rZzQcyY= +github.com/grafana/authlib/claims v0.0.0-20240828122726-9edfcbea43e2 h1:YTF1Y1BYCDkD7ssmbhzRqXlxevsYpXPmOnoO8qbOue8= +github.com/grafana/authlib/claims v0.0.0-20240828122726-9edfcbea43e2/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -131,10 +131,10 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed h1:J6izYgfBXAI3xTKLgxzTmUltdYaLsuBxFCgDHWJ/eXg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c= +google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -154,10 +154,10 @@ k8s.io/apiserver v0.31.0 h1:p+2dgJjy+bk+B1Csz+mc2wl5gHwvNkC9QJV+w55LVrY= k8s.io/apiserver v0.31.0/go.mod h1:KI9ox5Yu902iBnnyMmy7ajonhKnkeZYJhTZ/YI+WEMk= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2 h1:GKE9U8BH16uynoxQii0auTjmmmuZ3O0LFMN6S0lPPhI= +k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2/go.mod h1:coRQXBK9NxO98XUv3ZD6AK3xzHCxV6+b7lrquKwaKzA= +k8s.io/utils v0.0.0-20240821151609-f90d01438635 h1:2wThSvJoW/Ncn9TmQEYXRnevZXi2duqHWf5OX9S3zjI= +k8s.io/utils v0.0.0-20240821151609-f90d01438635/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= diff --git a/pkg/apimachinery/identity/wrapper.go b/pkg/apimachinery/identity/wrapper.go index 299a977a3cac0..a8171dc17ac06 100644 --- a/pkg/apimachinery/identity/wrapper.go +++ b/pkg/apimachinery/identity/wrapper.go @@ -102,3 +102,8 @@ func (i *IDClaimsWrapper) Scopes() []string { func (i *IDClaimsWrapper) Subject() string { return "" } + +// IsNil implements claims.AccessClaims. +func (i *IDClaimsWrapper) IsNil() bool { + return i.Source == nil +} diff --git a/pkg/apiserver/go.mod b/pkg/apiserver/go.mod index 5e7937c7e4c00..10d0f6a42cd6c 100644 --- a/pkg/apiserver/go.mod +++ b/pkg/apiserver/go.mod @@ -4,16 +4,16 @@ go 1.23.0 require ( github.com/google/go-cmp v0.6.0 - github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db + github.com/grafana/authlib/claims v0.0.0-20240828122726-9edfcbea43e2 github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240701135906-559738ce6ae1 - github.com/prometheus/client_golang v1.20.0 + github.com/prometheus/client_golang v1.20.2 github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/otel/trace v1.28.0 + go.opentelemetry.io/otel/trace v1.29.0 k8s.io/apimachinery v0.31.0 k8s.io/apiserver v0.31.0 k8s.io/component-base v0.31.0 k8s.io/klog/v2 v2.130.1 - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 + k8s.io/utils v0.0.0-20240821151609-f90d01438635 ) require ( @@ -23,18 +23,19 @@ require ( github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.1 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/btree v1.1.2 // indirect + github.com/google/btree v1.1.3 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 // indirect github.com/jonboulle/clockwork v0.4.0 // indirect @@ -48,16 +49,19 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/common v0.57.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/x448/float16 v0.8.4 // indirect - go.etcd.io/etcd/api/v3 v3.5.14 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.14 // indirect - go.etcd.io/etcd/client/v3 v3.5.14 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect + go.etcd.io/etcd/api/v3 v3.5.15 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.15 // indirect + go.etcd.io/etcd/client/v3 v3.5.15 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect + go.opentelemetry.io/otel v1.29.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 // indirect + go.opentelemetry.io/otel/sdk v1.29.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect golang.org/x/net v0.28.0 // indirect @@ -66,18 +70,17 @@ require ( golang.org/x/term v0.23.0 // indirect golang.org/x/text v0.17.0 // indirect golang.org/x/time v0.6.0 // indirect - golang.org/x/tools v0.22.0 // indirect - google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/grpc v1.65.0 // indirect + google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/grpc v1.66.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.31.0 // indirect k8s.io/client-go v0.31.0 // indirect - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect + k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect sigs.k8s.io/yaml v1.4.0 // indirect diff --git a/pkg/apiserver/go.sum b/pkg/apiserver/go.sum index 66724337e95cd..39766e6c64f9c 100644 --- a/pkg/apiserver/go.sum +++ b/pkg/apiserver/go.sum @@ -23,8 +23,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= +github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -41,8 +41,8 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= @@ -60,8 +60,8 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -71,14 +71,14 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= -github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db h1:mDk0bwRV6rDrLSmKXftcPf9kLA9uH6EvxJvzpPW9bso= -github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grafana/authlib/claims v0.0.0-20240828122726-9edfcbea43e2 h1:YTF1Y1BYCDkD7ssmbhzRqXlxevsYpXPmOnoO8qbOue8= +github.com/grafana/authlib/claims v0.0.0-20240828122726-9edfcbea43e2/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240701135906-559738ce6ae1 h1:ItDcDxUjVLPKja+hogpqgW/kj8LxUL2qscelXIsN1Bs= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240701135906-559738ce6ae1/go.mod h1:DkxMin+qOh1Fgkxfbt+CUfBqqsCQJMG9op8Os/irBPA= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= @@ -87,8 +87,8 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a534 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340/go.mod h1:3bDW6wMZJB7tiONtC/1Xpicra6Wp5GgbTbQWCbI5fkc= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -131,16 +131,16 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI= -github.com/prometheus/client_golang v1.20.0/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg= +github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common v0.57.0 h1:Ro/rKjwdq9mZn1K5QPctzh+MA4Lp0BuYk5ZZEVhoNcY= +github.com/prometheus/common v0.57.0/go.mod h1:7uRPFSUTbfZWsJ7MHY56sqt7hLQu3bxXHDnNhl8E9qI= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= @@ -173,36 +173,36 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= -go.etcd.io/etcd/api/v3 v3.5.14 h1:vHObSCxyB9zlF60w7qzAdTcGaglbJOpSj1Xj9+WGxq0= -go.etcd.io/etcd/api/v3 v3.5.14/go.mod h1:BmtWcRlQvwa1h3G2jvKYwIQy4PkHlDej5t7uLMUdJUU= -go.etcd.io/etcd/client/pkg/v3 v3.5.14 h1:SaNH6Y+rVEdxfpA2Jr5wkEvN6Zykme5+YnbCkxvuWxQ= -go.etcd.io/etcd/client/pkg/v3 v3.5.14/go.mod h1:8uMgAokyG1czCtIdsq+AGyYQMvpIKnSvPjFMunkgeZI= +go.etcd.io/etcd/api/v3 v3.5.15 h1:3KpLJir1ZEBrYuV2v+Twaa/e2MdDCEZ/70H+lzEiwsk= +go.etcd.io/etcd/api/v3 v3.5.15/go.mod h1:N9EhGzXq58WuMllgH9ZvnEr7SI9pS0k0+DHZezGp7jM= +go.etcd.io/etcd/client/pkg/v3 v3.5.15 h1:fo0HpWz/KlHGMCC+YejpiCmyWDEuIpnTDzpJLB5fWlA= +go.etcd.io/etcd/client/pkg/v3 v3.5.15/go.mod h1:mXDI4NAOwEiszrHCb0aqfAYNCrZP4e9hRca3d1YK8EU= go.etcd.io/etcd/client/v2 v2.305.13 h1:RWfV1SX5jTU0lbCvpVQe3iPQeAHETWdOTb6pxhd77C8= go.etcd.io/etcd/client/v2 v2.305.13/go.mod h1:iQnL7fepbiomdXMb3om1rHq96htNNGv2sJkEcZGDRRg= -go.etcd.io/etcd/client/v3 v3.5.14 h1:CWfRs4FDaDoSz81giL7zPpZH2Z35tbOrAJkkjMqOupg= -go.etcd.io/etcd/client/v3 v3.5.14/go.mod h1:k3XfdV/VIHy/97rqWjoUzrj9tk7GgJGH9J8L4dNXmAk= +go.etcd.io/etcd/client/v3 v3.5.15 h1:23M0eY4Fd/inNv1ZfU3AxrbbOdW79r9V9Rl62Nm6ip4= +go.etcd.io/etcd/client/v3 v3.5.15/go.mod h1:CLSJxrYjvLtHsrPKsy7LmZEE+DK2ktfd2bN4RhBMwlU= go.etcd.io/etcd/pkg/v3 v3.5.13 h1:st9bDWNsKkBNpP4PR1MvM/9NqUPfvYZx/YXegsYEH8M= go.etcd.io/etcd/pkg/v3 v3.5.13/go.mod h1:N+4PLrp7agI/Viy+dUYpX7iRtSPvKq+w8Y14d1vX+m0= go.etcd.io/etcd/raft/v3 v3.5.13 h1:7r/NKAOups1YnKcfro2RvGGo2PTuizF/xh26Z2CTAzA= go.etcd.io/etcd/raft/v3 v3.5.13/go.mod h1:uUFibGLn2Ksm2URMxN1fICGhk8Wu96EfDQyuLhAcAmw= go.etcd.io/etcd/server/v3 v3.5.13 h1:V6KG+yMfMSqWt+lGnhFpP5z5dRUj1BDRJ5k1fQ9DFok= go.etcd.io/etcd/server/v3 v3.5.13/go.mod h1:K/8nbsGupHqmr5MkgaZpLlH1QdX1pcNQLAkODy44XcQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 h1:nSiV3s7wiCam610XcLbYOmMfJxB9gO4uK3Xgv5gmTgg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0/go.mod h1:hKn/e/Nmd19/x1gvIHwtOwVWM+VhuITSWip3JUDghj0= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -272,8 +272,8 @@ golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -283,20 +283,20 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM= -google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c h1:TYOEhrQMrNDTAd2rX9m+WgGr8Ku6YNuj1D7OX6rWSok= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c/go.mod h1:2rC5OendXvZ8wGEo/cSLheztrZDZaSoHanUcd1xtZnw= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed h1:J6izYgfBXAI3xTKLgxzTmUltdYaLsuBxFCgDHWJ/eXg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c= +google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -332,10 +332,10 @@ k8s.io/component-base v0.31.0 h1:/KIzGM5EvPNQcYgwq5NwoQBaOlVFrghoVGr8lG6vNRs= k8s.io/component-base v0.31.0/go.mod h1:TYVuzI1QmN4L5ItVdMSXKvH7/DtvIuas5/mm8YT3rTo= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2 h1:GKE9U8BH16uynoxQii0auTjmmmuZ3O0LFMN6S0lPPhI= +k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2/go.mod h1:coRQXBK9NxO98XUv3ZD6AK3xzHCxV6+b7lrquKwaKzA= +k8s.io/utils v0.0.0-20240821151609-f90d01438635 h1:2wThSvJoW/Ncn9TmQEYXRnevZXi2duqHWf5OX9S3zjI= +k8s.io/utils v0.0.0-20240821151609-f90d01438635/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= diff --git a/pkg/build/go.mod b/pkg/build/go.mod index c547676f24c2d..852fc46d1ed4e 100644 --- a/pkg/build/go.mod +++ b/pkg/build/go.mod @@ -17,7 +17,7 @@ replace github.com/prometheus/prometheus => github.com/prometheus/prometheus v0. require ( cloud.google.com/go/storage v1.43.0 // @grafana/grafana-backend-group - github.com/Masterminds/semver/v3 v3.2.0 // @grafana/grafana-release-guild + github.com/Masterminds/semver/v3 v3.3.0 // @grafana/grafana-release-guild github.com/aws/aws-sdk-go v1.55.5 // @grafana/aws-datasources github.com/blang/semver/v4 v4.0.0 // @grafana/grafana-release-guild github.com/docker/docker v26.0.2+incompatible // @grafana/grafana-release-guild @@ -32,27 +32,27 @@ require ( github.com/stretchr/testify v1.9.0 // @grafana/grafana-backend-group github.com/urfave/cli v1.22.15 // @grafana/grafana-backend-group github.com/urfave/cli/v2 v2.27.1 // @grafana/grafana-backend-group - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect; @grafana/plugins-platform-backend - go.opentelemetry.io/otel v1.28.0 // indirect; @grafana/grafana-backend-group - go.opentelemetry.io/otel/sdk v1.28.0 // indirect; @grafana/grafana-backend-group - go.opentelemetry.io/otel/trace v1.28.0 // indirect; @grafana/grafana-backend-group + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect; @grafana/plugins-platform-backend + go.opentelemetry.io/otel v1.29.0 // indirect; @grafana/grafana-backend-group + go.opentelemetry.io/otel/sdk v1.29.0 // indirect; @grafana/grafana-backend-group + go.opentelemetry.io/otel/trace v1.29.0 // indirect; @grafana/grafana-backend-group golang.org/x/crypto v0.26.0 // indirect; @grafana/grafana-backend-group - golang.org/x/mod v0.18.0 // @grafana/grafana-backend-group + golang.org/x/mod v0.20.0 // @grafana/grafana-backend-group golang.org/x/net v0.28.0 // indirect; @grafana/oss-big-tent @grafana/partner-datasources golang.org/x/oauth2 v0.22.0 // @grafana/identity-access-team golang.org/x/sync v0.8.0 // indirect; @grafana/alerting-backend golang.org/x/text v0.17.0 // indirect; @grafana/grafana-backend-group golang.org/x/time v0.6.0 // indirect; @grafana/grafana-backend-group - golang.org/x/tools v0.22.0 // indirect; @grafana/grafana-as-code - google.golang.org/api v0.191.0 // @grafana/grafana-backend-group - google.golang.org/grpc v1.65.0 // indirect; @grafana/plugins-platform-backend + golang.org/x/tools v0.24.0 // indirect; @grafana/grafana-as-code + google.golang.org/api v0.195.0 // @grafana/grafana-backend-group + google.golang.org/grpc v1.66.0 // indirect; @grafana/plugins-platform-backend google.golang.org/protobuf v1.34.2 // indirect; @grafana/plugins-platform-backend gopkg.in/yaml.v3 v3.0.1 // @grafana/alerting-backend ) require ( - cloud.google.com/go v0.115.0 // indirect - cloud.google.com/go/auth v0.8.1 // indirect + cloud.google.com/go v0.115.1 // indirect + cloud.google.com/go/auth v0.9.1 // indirect cloud.google.com/go/auth/oauth2adapt v0.2.4 // indirect cloud.google.com/go/compute/metadata v0.5.0 // indirect cloud.google.com/go/iam v1.1.13 // indirect @@ -83,39 +83,38 @@ require ( github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect + go.opentelemetry.io/otel/metric v1.29.0 // indirect go.starlark.net v0.0.0-20230525235612-a134d8f9ddca // indirect golang.org/x/sys v0.24.0 // indirect - google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 // indirect; @grafana/grafana-backend-group - google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect + google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c // indirect; @grafana/grafana-backend-group + google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) require dagger.io/dagger v0.11.8-rc.2 require ( - cloud.google.com/go/longrunning v0.5.12 // indirect github.com/99designs/gqlgen v0.17.44 // indirect github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect github.com/Khan/genqlient v0.7.0 // indirect github.com/adrg/xdg v0.4.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/moby/term v0.5.0 // indirect github.com/sosodev/duration v1.2.0 // indirect github.com/vektah/gqlparser/v2 v2.5.11 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 // indirect go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.2.0-alpha // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0 // indirect go.opentelemetry.io/otel/log v0.2.0-alpha // indirect go.opentelemetry.io/otel/sdk/log v0.2.0-alpha // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect - golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f // indirect + golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 // indirect gotest.tools/v3 v3.5.1 // indirect ) diff --git a/pkg/build/go.sum b/pkg/build/go.sum index 5eef149b39b6c..b30a2f78a38ae 100644 --- a/pkg/build/go.sum +++ b/pkg/build/go.sum @@ -1,8 +1,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14= -cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU= -cloud.google.com/go/auth v0.8.1 h1:QZW9FjC5lZzN864p13YxvAtGUlQ+KgRL+8Sg45Z6vxo= -cloud.google.com/go/auth v0.8.1/go.mod h1:qGVp/Y3kDRSDZ5gFD/XPUfYQ9xW1iI7q8RIRoCyBbJc= +cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= +cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= +cloud.google.com/go/auth v0.9.1 h1:+pMtLEV2k0AXKvs/tGZojuj6QaioxfUjOpMsG5Gtx+w= +cloud.google.com/go/auth v0.9.1/go.mod h1:Sw8ocT5mhhXxFklyhT12Eiy0ed6tTrPMCJjSI8KhYLk= cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= cloud.google.com/go/compute/metadata v0.5.0 h1:Zr0eK8JbFv6+Wi4ilXAR8FJ3wyNdpxHKJNPos6LTZOY= @@ -26,8 +26,8 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03 github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/Khan/genqlient v0.7.0 h1:GZ1meyRnzcDTK48EjqB8t3bcfYvHArCUUvgOwpz1D4w= github.com/Khan/genqlient v0.7.0/go.mod h1:HNyy3wZvuYwmW3Y7mkoQLZsa/R5n5yIRajS1kPBvSFM= -github.com/Masterminds/semver/v3 v3.2.0 h1:3MEsd0SM6jqZojhjLWWeBY+Kcjy9i6MQAeY7YgDP83g= -github.com/Masterminds/semver/v3 v3.2.0/go.mod h1:qvl/7zhW3nngYb5+80sSMF+FG2BjYrf8m9wsX0PNOMQ= +github.com/Masterminds/semver/v3 v3.3.0 h1:B8LGeaivUe71a5qox1ICM/JLl0NqZSW5CHyL+hmvYS0= +github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.4.11/go.mod h1:VhR8bwka0BXejwEJY73c50VrPtXAaKcyvVC4A4RozmA= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= @@ -145,8 +145,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksP github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= github.com/gorilla/mux v1.7.4/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -223,32 +223,32 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88 h1:oM0GTNKGlc5qHctWeIGTVyda4iFFalOzMZ3Ehj5rwB4= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.0.0-20240518090000-14441aefdf88/go.mod h1:JGG8ebaMO5nXOPnvKEl+DiA4MGwFjCbjsxT1WHIEBPY= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.2.0-alpha h1:z2s6Zba+OUyayRv5m1AXWNUTGh57K1iMhy6emU5QT5Y= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp v0.2.0-alpha/go.mod h1:paOXXyUgPW6jYxYkP0pB47H2zHE1fPvMJ4E4G9LHOi0= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 h1:nSiV3s7wiCam610XcLbYOmMfJxB9gO4uK3Xgv5gmTgg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0/go.mod h1:hKn/e/Nmd19/x1gvIHwtOwVWM+VhuITSWip3JUDghj0= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0 h1:1wp/gyxsuYtuE/JFxsQRtcCDtMrO2qMvlfXALU5wkzI= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.26.0/go.mod h1:gbTHmghkGgqxMomVQQMur1Nba4M0MQ8AYThXDUjsJ38= go.opentelemetry.io/otel/log v0.2.0-alpha h1:ixOPvMzserpqA07SENHvRzkZOsnG0XbPr74hv1AQ+n0= go.opentelemetry.io/otel/log v0.2.0-alpha/go.mod h1:vbFZc65yq4c4ssvXY43y/nIqkNJLxORrqw0L85P59LA= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= go.opentelemetry.io/otel/sdk/log v0.2.0-alpha h1:jGTkL/jroJ31jnP6jDl34N/mDOfRGGYZHcHsCM+5kWA= go.opentelemetry.io/otel/sdk/log v0.2.0-alpha/go.mod h1:Hd8Lw9FPGUM3pfY7iGMRvFaC2Nyau4Ajb5WnQ9OdIho= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.starlark.net v0.0.0-20230525235612-a134d8f9ddca h1:VdD38733bfYv5tUZwEIskMM93VanwNIi5bIKnDrJdEY= @@ -262,15 +262,15 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.26.0 h1:RrRspgV4mU+YwB4FYnuBoKsUapNIL5cohGAmSH3azsw= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f h1:99ci1mjWVBWwJiEKYY6jWa4d2nTQVIEhZIptnrVb1XY= -golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -320,33 +320,33 @@ golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBn golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -google.golang.org/api v0.191.0 h1:cJcF09Z+4HAB2t5qTQM1ZtfL/PemsLFkcFG67qq2afk= -google.golang.org/api v0.191.0/go.mod h1:tD5dsFGxFza0hnQveGfVk9QQYKcfp+VzgRqyXFxE0+E= +google.golang.org/api v0.195.0 h1:Ude4N8FvTKnnQJHU48RFI40jOBgIrL8Zqr3/QeST6yU= +google.golang.org/api v0.195.0/go.mod h1:DOGRWuv3P8TU8Lnz7uQc4hyNqrBpMtD9ppW3wBJurgc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM= -google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c h1:TYOEhrQMrNDTAd2rX9m+WgGr8Ku6YNuj1D7OX6rWSok= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c/go.mod h1:2rC5OendXvZ8wGEo/cSLheztrZDZaSoHanUcd1xtZnw= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed h1:J6izYgfBXAI3xTKLgxzTmUltdYaLsuBxFCgDHWJ/eXg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c= +google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= diff --git a/pkg/build/wire/go.mod b/pkg/build/wire/go.mod index 9d3457f15bd33..0c5c674272f22 100644 --- a/pkg/build/wire/go.mod +++ b/pkg/build/wire/go.mod @@ -6,10 +6,10 @@ require ( github.com/google/go-cmp v0.6.0 github.com/google/subcommands v1.2.0 github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 - golang.org/x/tools v0.22.0 + golang.org/x/tools v0.24.0 ) require ( - golang.org/x/mod v0.18.0 // indirect + golang.org/x/mod v0.20.0 // indirect golang.org/x/sync v0.8.0 // indirect ) diff --git a/pkg/build/wire/go.sum b/pkg/build/wire/go.sum index 11eeab6f14af4..d5bd1d0d841ce 100644 --- a/pkg/build/wire/go.sum +++ b/pkg/build/wire/go.sum @@ -4,9 +4,9 @@ github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= diff --git a/pkg/plugins/backendplugin/coreplugin/registry.go b/pkg/plugins/backendplugin/coreplugin/registry.go index 23dc4524f75bb..e9faacbb5dc47 100644 --- a/pkg/plugins/backendplugin/coreplugin/registry.go +++ b/pkg/plugins/backendplugin/coreplugin/registry.go @@ -20,6 +20,7 @@ import ( "github.com/grafana/grafana/pkg/tsdb/azuremonitor" cloudmonitoring "github.com/grafana/grafana/pkg/tsdb/cloud-monitoring" "github.com/grafana/grafana/pkg/tsdb/cloudwatch" + "github.com/grafana/grafana/pkg/tsdb/druid" "github.com/grafana/grafana/pkg/tsdb/elasticsearch" postgres "github.com/grafana/grafana/pkg/tsdb/grafana-postgresql-datasource" pyroscope "github.com/grafana/grafana/pkg/tsdb/grafana-pyroscope-datasource" @@ -45,6 +46,7 @@ const ( InfluxDB = "influxdb" Loki = "loki" OpenTSDB = "opentsdb" + Druid = "grafadruid-druid-datasource" Prometheus = "prometheus" Tempo = "tempo" TestData = "grafana-testdata-datasource" @@ -93,8 +95,8 @@ func NewRegistry(store map[string]backendplugin.PluginFactoryFunc) *Registry { func ProvideCoreRegistry(tracer tracing.Tracer, am *azuremonitor.Service, cw *cloudwatch.CloudWatchService, cm *cloudmonitoring.Service, es *elasticsearch.Service, grap *graphite.Service, idb *influxdb.Service, lk *loki.Service, otsdb *opentsdb.Service, pr *prometheus.Service, t *tempo.Service, td *testdatasource.Service, pg *postgres.Service, my *mysql.Service, - ms *mssql.Service, graf *grafanads.Service, pyroscope *pyroscope.Service, parca *parca.Service) *Registry { - // Non-optimal global solution to replace plugin SDK default tracer for core plugins. + ms *mssql.Service, graf *grafanads.Service, pyroscope *pyroscope.Service, parca *parca.Service, dr *druid.Service) *Registry { + sdktracing.InitDefaultTracer(tracer) return NewRegistry(map[string]backendplugin.PluginFactoryFunc{ @@ -115,6 +117,7 @@ func ProvideCoreRegistry(tracer tracing.Tracer, am *azuremonitor.Service, cw *cl Grafana: asBackendPlugin(graf), Pyroscope: asBackendPlugin(pyroscope), Parca: asBackendPlugin(parca), + Druid: asBackendPlugin(dr), }) } diff --git a/pkg/promlib/go.mod b/pkg/promlib/go.mod index f3aea762a82a2..d78a49aaa90e0 100644 --- a/pkg/promlib/go.mod +++ b/pkg/promlib/go.mod @@ -3,50 +3,51 @@ module github.com/grafana/grafana/pkg/promlib go 1.23.0 require ( - github.com/grafana/dskit v0.0.0-20240805174438-dfa83b4ed2d3 - github.com/grafana/grafana-plugin-sdk-go v0.244.0 + github.com/grafana/dskit v0.0.0-20240827093408-28506cdffe6a + github.com/grafana/grafana-plugin-sdk-go v0.245.0 github.com/json-iterator/go v1.1.12 github.com/patrickmn/go-cache v2.1.0+incompatible - github.com/prometheus/client_golang v1.20.0 - github.com/prometheus/common v0.55.0 + github.com/prometheus/client_golang v1.20.2 + github.com/prometheus/common v0.57.0 github.com/prometheus/prometheus v1.8.2-0.20221021121301-51a44e6657c3 github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/otel v1.28.0 - go.opentelemetry.io/otel/trace v1.28.0 - golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f + go.opentelemetry.io/otel v1.29.0 + go.opentelemetry.io/otel/trace v1.29.0 + golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 k8s.io/apimachinery v0.31.0 ) require ( - github.com/BurntSushi/toml v1.3.2 // indirect - github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 // indirect + github.com/BurntSushi/toml v1.4.0 // indirect + github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 // indirect github.com/apache/arrow/go/v15 v15.0.2 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aws/aws-sdk-go v1.55.5 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect github.com/beorn7/perks v1.0.1 // indirect + github.com/bufbuild/protocompile v0.14.0 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/cheekybits/genny v1.0.0 // indirect - github.com/chromedp/cdproto v0.0.0-20240426225625-909263490071 // indirect + github.com/chromedp/cdproto v0.0.0-20240810084448-b931b754e476 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.4 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/dennwc/varint v1.0.0 // indirect - github.com/elazarl/goproxy v0.0.0-20231117061959-7cc037d33fb5 // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/fatih/color v1.16.0 // indirect + github.com/elazarl/goproxy v0.0.0-20240726154733-8b0c20506380 // indirect + github.com/emicklei/go-restful/v3 v3.12.1 // indirect + github.com/fatih/color v1.17.0 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect - github.com/getkin/kin-openapi v0.125.0 // indirect + github.com/getkin/kin-openapi v0.127.0 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect - github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-json v0.10.3 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect github.com/google/flatbuffers v24.3.25+incompatible // indirect @@ -57,26 +58,27 @@ require ( github.com/gorilla/mux v1.8.1 // indirect github.com/grafana/otel-profiling-go v0.5.1 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect - github.com/grafana/regexp v0.0.0-20221123153739-15dc172cd2db // indirect + github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-plugin v1.6.1 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/invopop/jsonschema v0.12.0 // indirect github.com/invopop/yaml v0.3.1 // indirect + github.com/jhump/protoreflect v1.16.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 // indirect github.com/klauspost/compress v1.17.9 // indirect - github.com/klauspost/cpuid/v2 v2.2.7 // indirect + github.com/klauspost/cpuid/v2 v2.2.8 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/magefile/mage v1.15.0 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattetti/filebuffer v1.0.1 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mitchellh/go-testing-interface v1.14.1 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -101,36 +103,36 @@ require ( github.com/wk8/go-ordered-map/v2 v2.1.8 // indirect github.com/x448/float16 v0.8.4 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.53.0 // indirect - go.opentelemetry.io/contrib/propagators/jaeger v1.28.0 // indirect - go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.28.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.54.0 // indirect + go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 // indirect + go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 // indirect + go.opentelemetry.io/otel/metric v1.29.0 // indirect + go.opentelemetry.io/otel/sdk v1.29.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/atomic v1.11.0 // indirect go.uber.org/goleak v1.3.0 // indirect - golang.org/x/mod v0.18.0 // indirect + golang.org/x/mod v0.20.0 // indirect golang.org/x/net v0.28.0 // indirect golang.org/x/sync v0.8.0 // indirect golang.org/x/sys v0.24.0 // indirect golang.org/x/text v0.17.0 // indirect - golang.org/x/tools v0.22.0 // indirect + golang.org/x/tools v0.24.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect - gonum.org/v1/gonum v0.14.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/grpc v1.65.0 // indirect + gonum.org/v1/gonum v0.15.1 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/grpc v1.66.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2 // indirect + k8s.io/utils v0.0.0-20240821151609-f90d01438635 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) diff --git a/pkg/promlib/go.sum b/pkg/promlib/go.sum index 8a3cfef31d138..dd2864aaec3b4 100644 --- a/pkg/promlib/go.sum +++ b/pkg/promlib/go.sum @@ -1,8 +1,9 @@ github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= -github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/BurntSushi/toml v1.4.0 h1:kuoIxZQy2WRRk1pttg9asf+WVv6tWQuBNVmK8+nqPr0= +github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30 h1:t3eaIm0rUkzbrIewtiFmMK5RXHej2XnoXNhxVsAYUfg= +github.com/alecthomas/units v0.0.0-20240626203959-61d1e3462e30/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= github.com/apache/arrow/go/v15 v15.0.2 h1:60IliRbiyTWCWjERBCkO1W4Qun9svcYoZrSLcyOsMLE= github.com/apache/arrow/go/v15 v15.0.2/go.mod h1:DGXsR3ajT524njufqf95822i+KTh+yea1jass9YXgjA= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= @@ -13,8 +14,8 @@ github.com/bahlo/generic-list-go v0.2.0 h1:5sz/EEAK+ls5wF+NeqDpk5+iNdMDXrh3z3nPn github.com/bahlo/generic-list-go v0.2.0/go.mod h1:2KvAjgMlE5NNynlg/5iLrrCCZ2+5xWbdbCW3pNTGyYg= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= -github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= +github.com/bufbuild/protocompile v0.14.0 h1:z3DW4IvXE5G/uTOnSQn+qwQQxvhckkTWLS/0No/o7KU= +github.com/bufbuild/protocompile v0.14.0/go.mod h1:N6J1NYzkspJo3ZwyL4Xjvli86XOj1xq4qAasUFxGups= github.com/buger/jsonparser v1.1.1 h1:2PnMjfWD7wBILjqQbt530v576A/cAbQvEW9gGIpYMUs= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= @@ -23,8 +24,8 @@ github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UF github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/chromedp/cdproto v0.0.0-20240426225625-909263490071 h1:RdCf9hH3xq5vJifrjGB7zQlFkdRB3pAppcX2helDq2U= -github.com/chromedp/cdproto v0.0.0-20240426225625-909263490071/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= +github.com/chromedp/cdproto v0.0.0-20240810084448-b931b754e476 h1:VnjHsRXCRti7Av7E+j4DCha3kf68echfDzQ+wD11SBU= +github.com/chromedp/cdproto v0.0.0-20240810084448-b931b754e476/go.mod h1:GKljq0VrfU4D5yc+2qA6OVr8pmO/MBbPEWqWQ/oqGEs= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= @@ -34,16 +35,15 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dennwc/varint v1.0.0 h1:kGNFFSSw8ToIy3obO/kKr8U9GZYUAxQEVuix4zfDWzE= github.com/dennwc/varint v1.0.0/go.mod h1:hnItb35rvZvJrbTALZtY/iQfDs48JKRG1RPpgziApxA= -github.com/elazarl/goproxy v0.0.0-20231117061959-7cc037d33fb5 h1:m62nsMU279qRD9PQSWD1l66kmkXzuYcnVJqL4XLeV2M= -github.com/elazarl/goproxy v0.0.0-20231117061959-7cc037d33fb5/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/elazarl/goproxy/ext v0.0.0-20190711103511-473e67f1d7d2/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= +github.com/elazarl/goproxy v0.0.0-20240726154733-8b0c20506380 h1:1NyRx2f4W4WBRyg0Kys0ZbaNmDDzZ2R/C7DTi+bbsJ0= +github.com/elazarl/goproxy v0.0.0-20240726154733-8b0c20506380/go.mod h1:thX175TtLTzLj3p7N/Q9IiKZ7NF+p72cvL91emV0hzo= github.com/elazarl/goproxy/ext v0.0.0-20220115173737-adb46da277ac h1:9yrT5tmn9Zc0ytWPASlaPwQfQMQYnRf0RSDe1XvHw0Q= github.com/elazarl/goproxy/ext v0.0.0-20220115173737-adb46da277ac/go.mod h1:gNh8nYJoAm43RfaxurUnxr+N1PwuFV3ZMl/efxlIlY8= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= +github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM= -github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE= +github.com/fatih/color v1.17.0 h1:GlRw1BRJxkpqUCBKzKOw098ed57fEsKeNjpTe3cSjK4= +github.com/fatih/color v1.17.0/go.mod h1:YZ7TlrGPkiz6ku9fK3TLD/pl3CpsiFyu8N92HLgmosI= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -51,8 +51,8 @@ github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nos github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= -github.com/getkin/kin-openapi v0.125.0 h1:jyQCyf2qXS1qvs2U00xQzkGCqYPhEhZDmSmVt65fXno= -github.com/getkin/kin-openapi v0.125.0/go.mod h1:wb1aSZA/iWmorQP9KTAS/phLj/t17B5jT7+fS8ed9NM= +github.com/getkin/kin-openapi v0.127.0 h1:Mghqi3Dhryf3F8vR370nN67pAERW+3a95vomb3MAREY= +github.com/getkin/kin-openapi v0.127.0/go.mod h1:OZrfXzUfGrNbsKj+xmFBx6E5c6yH3At/tAKSc2UszXM= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= @@ -65,14 +65,14 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= -github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= -github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-json v0.10.3 h1:KZ5WoDbxAIgm2HNbYckL0se1fHD6rz5j4ywS6ebzDqA= +github.com/goccy/go-json v0.10.3/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= @@ -96,22 +96,22 @@ github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1 github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/grafana/dskit v0.0.0-20240805174438-dfa83b4ed2d3 h1:as4PmrFoYI1byS5JjsgPC7uSGTMh+SgS0ePv6hOyDGU= -github.com/grafana/dskit v0.0.0-20240805174438-dfa83b4ed2d3/go.mod h1:lcjGB6SuaZ2o44A9nD6p/tR4QXSPbzViRY520Gy6pTQ= -github.com/grafana/grafana-plugin-sdk-go v0.244.0 h1:ZZxHbiiF6QcsnlbPFyZGmzNDoTC1pLeHXUQYoskWt5c= -github.com/grafana/grafana-plugin-sdk-go v0.244.0/go.mod h1:H3FXrJMUlwocQ6UYj8Ds5I9EzRAVOcdRcgaRE3mXQqk= +github.com/grafana/dskit v0.0.0-20240827093408-28506cdffe6a h1:W8y+Tcv22oamhXX9auACKIwLu7y3XmT/v1oF30g/vbE= +github.com/grafana/dskit v0.0.0-20240827093408-28506cdffe6a/go.mod h1:wJbJeQ2ygiGuBKsur7BPPNe+3pSyHEDPtKa7IU3I8ZA= +github.com/grafana/grafana-plugin-sdk-go v0.245.0 h1:2KCKA86//O20ffL6WKzHGx5scBbdV7GyEFGnH8Hdv7M= +github.com/grafana/grafana-plugin-sdk-go v0.245.0/go.mod h1:1X8Kgo/SK91Qo1WBCKjPSKrfgjpQys1OkQsHhA78TLg= github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8= github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU= -github.com/grafana/regexp v0.0.0-20221123153739-15dc172cd2db h1:7aN5cccjIqCLTzedH7MZzRZt5/lsAHch6Z3L2ZGn5FA= -github.com/grafana/regexp v0.0.0-20221123153739-15dc172cd2db/go.mod h1:M5qHK+eWfAv8VR/265dIuEpL3fNfeC21tXXp9itM24A= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= +github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1/go.mod h1:lXGCsh6c22WGtjr+qGHj1otzZpV/1kwTMAqkwZsnWRU= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0/go.mod h1:XKMd7iuf/RGPSMJ/U4HP0zS2Z9Fh8Ps9a+6X26m/tmI= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-plugin v1.6.1 h1:P7MR2UP6gNKGPp+y7EZw2kOiq4IR9WiqLvp0XOsVdwI= @@ -122,8 +122,8 @@ github.com/invopop/jsonschema v0.12.0 h1:6ovsNSuvn9wEQVOyc72aycBMVQFKz7cPdMJn10C github.com/invopop/jsonschema v0.12.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= github.com/invopop/yaml v0.3.1 h1:f0+ZpmhfBSS4MhG+4HYseMdJhoeeopbSKbq5Rpeelso= github.com/invopop/yaml v0.3.1/go.mod h1:PMOp3nn4/12yEZUFfmOuNHJsZToEEOwoWsT+D81KkeA= -github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= -github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= +github.com/jhump/protoreflect v1.16.0 h1:54fZg+49widqXYQ0b+usAFHbMkBGR4PpXrsHc8+TBDg= +github.com/jhump/protoreflect v1.16.0/go.mod h1:oYPd7nPvcBw/5wlDfm/AVmU9zH9BgqGCI469pGxfj/8= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -141,8 +141,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA= github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw= -github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM= -github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/klauspost/cpuid/v2 v2.2.8 h1:+StwCXwm9PdpiEkPyzBXIy+M9KUb4ODm0Zarf1kS5BM= +github.com/klauspost/cpuid/v2 v2.2.8/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -165,8 +165,8 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mitchellh/go-testing-interface v1.14.1 h1:jrgshOhYAUVNMAJiKbEu7EqAwgJJ2JqpQmpLJOu07cU= github.com/mitchellh/go-testing-interface v1.14.1/go.mod h1:gfgS7OtZj6MA4U1UrDRp04twqAjfvlZyCfX3sDjEym8= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= @@ -199,12 +199,12 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI= -github.com/prometheus/client_golang v1.20.0/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg= +github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common v0.57.0 h1:Ro/rKjwdq9mZn1K5QPctzh+MA4Lp0BuYk5ZZEVhoNcY= +github.com/prometheus/common v0.57.0/go.mod h1:7uRPFSUTbfZWsJ7MHY56sqt7hLQu3bxXHDnNhl8E9qI= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= @@ -214,7 +214,6 @@ github.com/prometheus/prometheus v1.8.2-0.20221021121301-51a44e6657c3/go.mod h1: github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4/go.mod h1:qgYeAmZ5ZIpBWTGllZSQnw97Dj+woV0toclVaRGI8pc= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -234,7 +233,6 @@ github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSS github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= @@ -263,32 +261,32 @@ github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= github.com/zeebo/assert v1.3.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.53.0 h1:IVtyPth4Rs5P8wIf0mP2KVKFNTJ4paX9qQ4Hkh5gFdc= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.53.0/go.mod h1:ImRBLMJv177/pwiLZ7tU7HDGNdBv7rS0HQ99eN/zBl8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/contrib/propagators/jaeger v1.28.0 h1:xQ3ktSVS128JWIaN1DiPGIjcH+GsvkibIAVRWFjS9eM= -go.opentelemetry.io/contrib/propagators/jaeger v1.28.0/go.mod h1:O9HIyI2kVBrFoEwQZ0IN6PHXykGoit4mZV2aEjkTRH4= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0 h1:OYxqumWcd1yaV/qvCt1B7Sru9OeUNGjeXq/oldx3AGk= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.22.0/go.mod h1:2tZTRqCbvx7nG57wUwd5NQpNVujOWnR84iPLllIH0Ok= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.54.0 h1:U9ge/19g8pkNXL+0eqeWgiJAd8nSmmvbvwehqyxU/Lc= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.54.0/go.mod h1:dmNhUi0Tl5v/3e0QNp7/3KLMvAPoHh4lMbZU319UkM0= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/contrib/propagators/jaeger v1.29.0 h1:+YPiqF5rR6PqHBlmEFLPumbSP0gY0WmCGFayXRcCLvs= +go.opentelemetry.io/contrib/propagators/jaeger v1.29.0/go.mod h1:6PD7q7qquWSp3Z4HeM3e/2ipRubaY1rXZO8NIHVDZjs= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0 h1:qKi9ntCcronqWqfuKxqrxZlZd82jXJEgGiAWH1+phxo= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.23.0/go.mod h1:1kbAgQa5lgYC3rC6cE3jSxQ/Q13l33wv/WI8U+htwag= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 h1:nSiV3s7wiCam610XcLbYOmMfJxB9gO4uK3Xgv5gmTgg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0/go.mod h1:hKn/e/Nmd19/x1gvIHwtOwVWM+VhuITSWip3JUDghj0= go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= @@ -298,12 +296,12 @@ go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f h1:99ci1mjWVBWwJiEKYY6jWa4d2nTQVIEhZIptnrVb1XY= -golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f/go.mod h1:/lliqkxwWAhPjf5oSOIJup2XcqJaw8RGS6k3TGEc7GI= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948 h1:kx6Ds3MlpiUHKj7syVnbp57++8WpuKPcR5yjLBjvLEA= +golang.org/x/exp v0.0.0-20240823005443-9b4947da3948/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.18.0 h1:5+9lSbEzPSdWkH32vYPBwEpX8KwDbM52Ud9xBUvNlb0= -golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.20.0 h1:utOm6MM3R3dnawAiJgn0y+xvuYRsm1RKM/4giyfDgV0= +golang.org/x/mod v0.20.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -342,22 +340,22 @@ golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk= golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.14.0 h1:2NiG67LD1tEH0D7kM+ps2V+fXmsAnpUeec7n8tcr4S0= -gonum.org/v1/gonum v0.14.0/go.mod h1:AoWeoz0becf9QMWtE8iWXNXc27fK4fNeHNf/oMejGfU= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= +gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed h1:J6izYgfBXAI3xTKLgxzTmUltdYaLsuBxFCgDHWJ/eXg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= +google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c= +google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -378,10 +376,10 @@ k8s.io/apimachinery v0.31.0 h1:m9jOiSr3FoSSL5WO9bjm1n6B9KROYYgNZOb4tyZ1lBc= k8s.io/apimachinery v0.31.0/go.mod h1:rsPdaZJfTfLsNJSQzNHQvYoTmxhoOEofxtOsF3rtsMo= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2 h1:GKE9U8BH16uynoxQii0auTjmmmuZ3O0LFMN6S0lPPhI= +k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2/go.mod h1:coRQXBK9NxO98XUv3ZD6AK3xzHCxV6+b7lrquKwaKzA= +k8s.io/utils v0.0.0-20240821151609-f90d01438635 h1:2wThSvJoW/Ncn9TmQEYXRnevZXi2duqHWf5OX9S3zjI= +k8s.io/utils v0.0.0-20240821151609-f90d01438635/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= diff --git a/pkg/semconv/go.mod b/pkg/semconv/go.mod index 1217b154a55d4..81429a73accd5 100644 --- a/pkg/semconv/go.mod +++ b/pkg/semconv/go.mod @@ -2,7 +2,7 @@ module github.com/grafana/grafana/pkg/semconv go 1.23.0 -require go.opentelemetry.io/otel v1.28.0 +require go.opentelemetry.io/otel v1.29.0 require ( github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect diff --git a/pkg/semconv/go.sum b/pkg/semconv/go.sum index 6601c18dd25f6..bf61a1563d6dd 100644 --- a/pkg/semconv/go.sum +++ b/pkg/semconv/go.sum @@ -6,7 +6,7 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/pkg/server/wire.go b/pkg/server/wire.go index 47aa9aedc38ff..4b2a8f9f62d0f 100644 --- a/pkg/server/wire.go +++ b/pkg/server/wire.go @@ -156,6 +156,7 @@ import ( "github.com/grafana/grafana/pkg/tsdb/azuremonitor" cloudmonitoring "github.com/grafana/grafana/pkg/tsdb/cloud-monitoring" "github.com/grafana/grafana/pkg/tsdb/cloudwatch" + "github.com/grafana/grafana/pkg/tsdb/druid" "github.com/grafana/grafana/pkg/tsdb/elasticsearch" postgres "github.com/grafana/grafana/pkg/tsdb/grafana-postgresql-datasource" pyroscope "github.com/grafana/grafana/pkg/tsdb/grafana-pyroscope-datasource" @@ -173,6 +174,9 @@ import ( ) var wireBasicSet = wire.NewSet( + druid.ProvideService, + // legacydataservice.ProvideService, + // wire.Bind(new(legacydata.RequestHandler), new(*legacydataservice.Service)), annotationsimpl.ProvideService, wire.Bind(new(annotations.Repository), new(*annotationsimpl.RepositoryImpl)), New, diff --git a/pkg/services/authn/clients/ext_jwt.go b/pkg/services/authn/clients/ext_jwt.go index f1fd557fc91a8..db7285c472980 100644 --- a/pkg/services/authn/clients/ext_jwt.go +++ b/pkg/services/authn/clients/ext_jwt.go @@ -8,7 +8,7 @@ import ( "github.com/go-jose/go-jose/v3/jwt" authlib "github.com/grafana/authlib/authn" - authlibclaims "github.com/grafana/authlib/claims" + "github.com/grafana/authlib/claims" "github.com/grafana/grafana/pkg/apimachinery/errutil" "github.com/grafana/grafana/pkg/apimachinery/identity" @@ -74,7 +74,7 @@ type ExtendedJWT struct { func (s *ExtendedJWT) Authenticate(ctx context.Context, r *authn.Request) (*authn.Identity, error) { jwtToken := s.retrieveAuthenticationToken(r.HTTPRequest) - claims, err := s.accessTokenVerifier.Verify(ctx, jwtToken) + accessTokenClaims, err := s.accessTokenVerifier.Verify(ctx, jwtToken) if err != nil { return nil, errExtJWTInvalid.Errorf("failed to verify access token: %w", err) } @@ -86,10 +86,10 @@ func (s *ExtendedJWT) Authenticate(ctx context.Context, r *authn.Request) (*auth return nil, errExtJWTInvalid.Errorf("failed to verify id token: %w", err) } - return s.authenticateAsUser(idTokenClaims, claims) + return s.authenticateAsUser(*idTokenClaims, *accessTokenClaims) } - return s.authenticateAsService(claims) + return s.authenticateAsService(*accessTokenClaims) } func (s *ExtendedJWT) IsEnabled() bool { @@ -97,16 +97,16 @@ func (s *ExtendedJWT) IsEnabled() bool { } func (s *ExtendedJWT) authenticateAsUser( - idTokenClaims *authlib.Claims[authlib.IDTokenClaims], - accessTokenClaims *authlib.Claims[authlib.AccessTokenClaims], + idTokenClaims authlib.Claims[authlib.IDTokenClaims], + accessTokenClaims authlib.Claims[authlib.AccessTokenClaims], ) (*authn.Identity, error) { // Only allow id tokens signed for namespace configured for this instance. - if allowedNamespace := s.namespaceMapper(s.getDefaultOrgID()); idTokenClaims.Rest.Namespace != allowedNamespace { + if allowedNamespace := s.namespaceMapper(s.getDefaultOrgID()); !claims.NamespaceMatches(authlib.NewIdentityClaims(idTokenClaims), allowedNamespace) { return nil, errExtJWTDisallowedNamespaceClaim.Errorf("unexpected id token namespace: %s", idTokenClaims.Rest.Namespace) } // Allow access tokens with either the same namespace as the validated id token namespace or wildcard (`*`). - if !accessTokenClaims.Rest.NamespaceMatches(idTokenClaims.Rest.Namespace) { + if !claims.NamespaceMatches(authlib.NewAccessClaims(accessTokenClaims), idTokenClaims.Rest.Namespace) { return nil, errExtJWTMisMatchedNamespaceClaims.Errorf("unexpected access token namespace: %s", accessTokenClaims.Rest.Namespace) } @@ -115,7 +115,7 @@ func (s *ExtendedJWT) authenticateAsUser( return nil, errExtJWTInvalidSubject.Errorf("unexpected identity: %s", accessTokenClaims.Subject) } - if !authlibclaims.IsIdentityType(accessType, authlibclaims.TypeAccessPolicy) { + if !claims.IsIdentityType(accessType, claims.TypeAccessPolicy) { return nil, errExtJWTInvalid.Errorf("unexpected identity: %s", accessTokenClaims.Subject) } @@ -124,7 +124,7 @@ func (s *ExtendedJWT) authenticateAsUser( return nil, errExtJWTInvalid.Errorf("failed to parse id token subject: %w", err) } - if !authlibclaims.IsIdentityType(t, authlibclaims.TypeUser) { + if !claims.IsIdentityType(t, claims.TypeUser) { return nil, errExtJWTInvalidSubject.Errorf("unexpected identity: %s", idTokenClaims.Subject) } @@ -139,6 +139,8 @@ func (s *ExtendedJWT) authenticateAsUser( ID: id, Type: t, OrgID: s.getDefaultOrgID(), + AccessTokenClaims: &accessTokenClaims, + IDTokenClaims: &idTokenClaims, AuthenticatedBy: login.ExtendedJWTModule, AuthID: accessTokenClaims.Subject, AllowedKubernetesNamespace: allowedKubernetesNamespace, @@ -151,19 +153,19 @@ func (s *ExtendedJWT) authenticateAsUser( }}, nil } -func (s *ExtendedJWT) authenticateAsService(claims *authlib.Claims[authlib.AccessTokenClaims]) (*authn.Identity, error) { +func (s *ExtendedJWT) authenticateAsService(accessTokenClaims authlib.Claims[authlib.AccessTokenClaims]) (*authn.Identity, error) { // Allow access tokens with that has a wildcard namespace or a namespace matching this instance. - if allowedNamespace := s.namespaceMapper(s.getDefaultOrgID()); !claims.Rest.NamespaceMatches(allowedNamespace) { - return nil, errExtJWTDisallowedNamespaceClaim.Errorf("unexpected access token namespace: %s", claims.Rest.Namespace) + if allowedNamespace := s.namespaceMapper(s.getDefaultOrgID()); !claims.NamespaceMatches(authlib.NewAccessClaims(accessTokenClaims), allowedNamespace) { + return nil, errExtJWTDisallowedNamespaceClaim.Errorf("unexpected access token namespace: %s", accessTokenClaims.Rest.Namespace) } - t, id, err := identity.ParseTypeAndID(claims.Subject) + t, id, err := identity.ParseTypeAndID(accessTokenClaims.Subject) if err != nil { return nil, fmt.Errorf("failed to parse access token subject: %w", err) } - if !authlibclaims.IsIdentityType(t, authlibclaims.TypeAccessPolicy) { - return nil, errExtJWTInvalidSubject.Errorf("unexpected identity: %s", claims.Subject) + if !claims.IsIdentityType(t, claims.TypeAccessPolicy) { + return nil, errExtJWTInvalidSubject.Errorf("unexpected identity: %s", accessTokenClaims.Subject) } return &authn.Identity{ @@ -171,13 +173,15 @@ func (s *ExtendedJWT) authenticateAsService(claims *authlib.Claims[authlib.Acces UID: id, Type: t, OrgID: s.getDefaultOrgID(), + AccessTokenClaims: &accessTokenClaims, + IDTokenClaims: nil, AuthenticatedBy: login.ExtendedJWTModule, - AuthID: claims.Subject, - AllowedKubernetesNamespace: claims.Rest.Namespace, + AuthID: accessTokenClaims.Subject, + AllowedKubernetesNamespace: accessTokenClaims.Rest.Namespace, ClientParams: authn.ClientParams{ SyncPermissions: true, FetchPermissionsParams: authn.FetchPermissionsParams{ - Roles: claims.Rest.Permissions, + Roles: accessTokenClaims.Rest.Permissions, }, FetchSyncedUser: false, }, diff --git a/pkg/services/authn/identity.go b/pkg/services/authn/identity.go index 4a0da892d8de0..3014c1148f556 100644 --- a/pkg/services/authn/identity.go +++ b/pkg/services/authn/identity.go @@ -72,8 +72,9 @@ type Identity struct { // Permissions is the list of permissions the entity has. Permissions map[int64]map[string][]string // IDToken is a signed token representing the identity that can be forwarded to plugins and external services. - IDToken string - IDTokenClaims *authn.Claims[authn.IDTokenClaims] + IDToken string + IDTokenClaims *authn.Claims[authn.IDTokenClaims] + AccessTokenClaims *authn.Claims[authn.AccessTokenClaims] } // Access implements claims.AuthInfo. diff --git a/pkg/services/authz/client.go b/pkg/services/authz/client.go index 69f68f5cf947d..eb22e20de87d5 100644 --- a/pkg/services/authz/client.go +++ b/pkg/services/authz/client.go @@ -8,6 +8,7 @@ import ( authnlib "github.com/grafana/authlib/authn" authzlib "github.com/grafana/authlib/authz" authzv1 "github.com/grafana/authlib/authz/proto/v1" + "github.com/grafana/authlib/claims" grpcAuth "github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/auth" "google.golang.org/grpc" "google.golang.org/grpc/credentials/insecure" @@ -105,7 +106,7 @@ func newInProcLegacyClient(server *legacyServer) (authzlib.MultiTenantClient, er &authzlib.MultiTenantClientConfig{}, authzlib.WithGrpcConnectionLCOption(channel), // nolint:staticcheck - authzlib.WithNamespaceFormatterLCOption(authnlib.OnPremNamespaceFormatter), + authzlib.WithNamespaceFormatterLCOption(claims.OrgNamespaceFormatter), authzlib.WithDisableAccessTokenLCOption(), ) } @@ -129,7 +130,7 @@ func newGrpcLegacyClient(address string) (authzlib.MultiTenantClient, error) { grpc.WithStreamInterceptor(clientInterceptor.StreamClientInterceptor), ), // nolint:staticcheck - authzlib.WithNamespaceFormatterLCOption(authnlib.OnPremNamespaceFormatter), + authzlib.WithNamespaceFormatterLCOption(claims.OrgNamespaceFormatter), // TODO(drclau): remove this once we have access token support on-prem authzlib.WithDisableAccessTokenLCOption(), ) diff --git a/pkg/services/featuremgmt/models.go b/pkg/services/featuremgmt/models.go index 6260547585ba3..c4b6d4a091c50 100644 --- a/pkg/services/featuremgmt/models.go +++ b/pkg/services/featuremgmt/models.go @@ -130,6 +130,8 @@ type FeatureFlag struct { // The server must be initialized with the value RequiresRestart bool `json:"requiresRestart,omitempty"` + + FlagPublicDashboards bool `json:"flagPublicDashboards,omitempty"` // flag for public dashboards } type FeatureToggleWebhookPayload struct { diff --git a/pkg/services/ldap/ldap_login_test.go b/pkg/services/ldap/ldap_login_test.go deleted file mode 100644 index 11d1d8a6cfc13..0000000000000 --- a/pkg/services/ldap/ldap_login_test.go +++ /dev/null @@ -1,258 +0,0 @@ -package ldap - -import ( - "errors" - "testing" - - "github.com/go-ldap/ldap/v3" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/grafana/grafana/pkg/infra/log" - "github.com/grafana/grafana/pkg/services/login" -) - -var defaultLogin = &login.LoginUserQuery{ - Username: "user", - Password: "pwd", - IpAddress: "192.168.1.1:56433", -} - -func TestServer_Login_UserBind_Fail(t *testing.T) { - connection := &MockConnection{} - entry := ldap.Entry{} - result := ldap.SearchResult{Entries: []*ldap.Entry{&entry}} - connection.setSearchResult(&result) - - connection.BindProvider = func(username, password string) error { - return &ldap.Error{ - ResultCode: 49, - } - } - - cfg := &Config{ - Enabled: true, - } - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: connection, - log: log.New("test-logger"), - } - - _, err := server.Login(defaultLogin) - - assert.ErrorIs(t, err, ErrInvalidCredentials) -} - -func TestServer_Login_Search_NoResult(t *testing.T) { - connection := &MockConnection{} - result := ldap.SearchResult{Entries: []*ldap.Entry{}} - connection.setSearchResult(&result) - - connection.BindProvider = func(username, password string) error { - return nil - } - server := &Server{ - Config: &ServerConfig{ - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: connection, - log: log.New("test-logger"), - } - - _, err := server.Login(defaultLogin) - assert.ErrorIs(t, err, ErrCouldNotFindUser) -} - -func TestServer_Login_Search_Error(t *testing.T) { - connection := &MockConnection{} - expected := errors.New("Killa-gorilla") - connection.setSearchError(expected) - - connection.BindProvider = func(username, password string) error { - return nil - } - server := &Server{ - Config: &ServerConfig{ - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: connection, - log: log.New("test-logger"), - } - - _, err := server.Login(defaultLogin) - assert.ErrorIs(t, err, expected) -} - -func TestServer_Login_ValidCredentials(t *testing.T) { - connection := &MockConnection{} - entry := ldap.Entry{ - DN: "dn", Attributes: []*ldap.EntryAttribute{ - {Name: "username", Values: []string{"markelog"}}, - {Name: "surname", Values: []string{"Gaidarenko"}}, - {Name: "email", Values: []string{"markelog@gmail.com"}}, - {Name: "name", Values: []string{"Oleg"}}, - {Name: "memberof", Values: []string{"admins"}}, - }, - } - result := ldap.SearchResult{Entries: []*ldap.Entry{&entry}} - connection.setSearchResult(&result) - - connection.BindProvider = func(username, password string) error { - return nil - } - - cfg := &Config{ - Enabled: true, - } - - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - Attr: AttributeMap{ - Username: "username", - Name: "name", - MemberOf: "memberof", - }, - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: connection, - log: log.New("test-logger"), - } - - resp, err := server.Login(defaultLogin) - require.NoError(t, err) - assert.Equal(t, "markelog", resp.Login) -} - -// TestServer_Login_UnauthenticatedBind tests that unauthenticated bind -// is called when there is no admin password or user wildcard in the -// bind_dn. -func TestServer_Login_UnauthenticatedBind(t *testing.T) { - connection := &MockConnection{} - entry := ldap.Entry{ - DN: "test", - } - result := ldap.SearchResult{Entries: []*ldap.Entry{&entry}} - connection.setSearchResult(&result) - - connection.UnauthenticatedBindProvider = func() error { - return nil - } - - cfg := &Config{ - Enabled: true, - } - - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: connection, - log: log.New("test-logger"), - } - - user, err := server.Login(defaultLogin) - require.NoError(t, err) - assert.Equal(t, "test", user.AuthId) - assert.True(t, connection.UnauthenticatedBindCalled) -} - -func TestServer_Login_AuthenticatedBind(t *testing.T) { - connection := &MockConnection{} - entry := ldap.Entry{ - DN: "test", - } - result := ldap.SearchResult{Entries: []*ldap.Entry{&entry}} - connection.setSearchResult(&result) - - adminUsername := "" - adminPassword := "" - username := "" - password := "" - - i := 0 - connection.BindProvider = func(name, pass string) error { - i++ - if i == 1 { - adminUsername = name - adminPassword = pass - } - - if i == 2 { - username = name - password = pass - } - - return nil - } - - cfg := &Config{ - Enabled: true, - } - - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - BindDN: "killa", - BindPassword: "gorilla", - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: connection, - log: log.New("test-logger"), - } - - user, err := server.Login(defaultLogin) - require.NoError(t, err) - - assert.Equal(t, "test", user.AuthId) - assert.True(t, connection.BindCalled) - - assert.Equal(t, "killa", adminUsername) - assert.Equal(t, "gorilla", adminPassword) - - assert.Equal(t, "test", username) - assert.Equal(t, "pwd", password) -} - -func TestServer_Login_UserWildcardBind(t *testing.T) { - connection := &MockConnection{} - entry := ldap.Entry{ - DN: "test", - } - connection.setSearchResult(&ldap.SearchResult{Entries: []*ldap.Entry{&entry}}) - - authBindUser := "" - authBindPassword := "" - - connection.BindProvider = func(name, pass string) error { - authBindUser = name - authBindPassword = pass - return nil - } - - cfg := &Config{ - Enabled: true, - } - - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - BindDN: "cn=%s,ou=users,dc=grafana,dc=org", - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: connection, - log: log.New("test-logger"), - } - - _, err := server.Login(defaultLogin) - require.NoError(t, err) - - assert.Equal(t, "cn=user,ou=users,dc=grafana,dc=org", authBindUser) - assert.Equal(t, "pwd", authBindPassword) - assert.True(t, connection.BindCalled) -} diff --git a/pkg/services/ldap/ldap_private_test.go b/pkg/services/ldap/ldap_private_test.go deleted file mode 100644 index 6dc52c19ba7c2..0000000000000 --- a/pkg/services/ldap/ldap_private_test.go +++ /dev/null @@ -1,283 +0,0 @@ -package ldap - -import ( - "testing" - - "github.com/go-ldap/ldap/v3" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/grafana/grafana/pkg/infra/log" - "github.com/grafana/grafana/pkg/services/login" - "github.com/grafana/grafana/pkg/services/org" -) - -func TestServer_getSearchRequest(t *testing.T) { - expected := &ldap.SearchRequest{ - BaseDN: "killa", - Scope: 2, - DerefAliases: 0, - SizeLimit: 0, - TimeLimit: 0, - TypesOnly: false, - Filter: "(|)", - Attributes: []string{ - "username", - "email", - "name", - "memberof", - "gansta", - }, - Controls: nil, - } - - server := &Server{ - Config: &ServerConfig{ - Attr: AttributeMap{ - Username: "username", - Name: "name", - MemberOf: "memberof", - Email: "email", - }, - GroupSearchFilterUserAttribute: "gansta", - SearchBaseDNs: []string{"BaseDNHere"}, - }, - log: log.New("test-logger"), - } - - result := server.getSearchRequest("killa", []string{"gorilla"}) - - assert.EqualValues(t, expected, result) -} - -func TestSerializeUsers(t *testing.T) { - t.Run("simple case", func(t *testing.T) { - cfg := &Config{ - Enabled: true, - } - - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - Attr: AttributeMap{ - Username: "username", - Name: "name", - MemberOf: "memberof", - Email: "email", - }, - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: &MockConnection{}, - log: log.New("test-logger"), - } - - entry := ldap.Entry{ - DN: "dn", - Attributes: []*ldap.EntryAttribute{ - {Name: "username", Values: []string{"roelgerrits"}}, - {Name: "surname", Values: []string{"Gerrits"}}, - {Name: "email", Values: []string{"roel@test.com"}}, - {Name: "name", Values: []string{"Roel"}}, - {Name: "memberof", Values: []string{"admins"}}, - }, - } - users := [][]*ldap.Entry{{&entry}} - - result, err := server.serializeUsers(users) - require.NoError(t, err) - - assert.Equal(t, "roelgerrits", result[0].Login) - assert.Equal(t, "roel@test.com", result[0].Email) - assert.Contains(t, result[0].Groups, "admins") - }) - - t.Run("without lastname", func(t *testing.T) { - cfg := &Config{ - Enabled: true, - } - - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - Attr: AttributeMap{ - Username: "username", - Name: "name", - MemberOf: "memberof", - Email: "email", - }, - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: &MockConnection{}, - log: log.New("test-logger"), - } - - entry := ldap.Entry{ - DN: "dn", - Attributes: []*ldap.EntryAttribute{ - {Name: "username", Values: []string{"roelgerrits"}}, - {Name: "email", Values: []string{"roel@test.com"}}, - {Name: "name", Values: []string{"Roel"}}, - {Name: "memberof", Values: []string{"admins"}}, - }, - } - users := [][]*ldap.Entry{{&entry}} - - result, err := server.serializeUsers(users) - require.NoError(t, err) - - assert.False(t, result[0].IsDisabled) - assert.Equal(t, "Roel", result[0].Name) - }) - - t.Run("mark user without matching group as disabled", func(t *testing.T) { - cfg := &Config{ - Enabled: true, - } - - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - Groups: []*GroupToOrgRole{{ - GroupDN: "foo", - OrgId: 1, - OrgRole: org.RoleEditor, - }}, - }, - Connection: &MockConnection{}, - log: log.New("test-logger"), - } - - entry := ldap.Entry{ - DN: "dn", - Attributes: []*ldap.EntryAttribute{ - {Name: "memberof", Values: []string{"admins"}}, - }, - } - users := [][]*ldap.Entry{{&entry}} - - result, err := server.serializeUsers(users) - require.NoError(t, err) - - assert.Len(t, result, 1) - assert.True(t, result[0].IsDisabled) - }) -} - -func TestServer_validateGrafanaUser(t *testing.T) { - t.Run("no group config", func(t *testing.T) { - cfg := &Config{ - Enabled: true, - } - - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - Groups: []*GroupToOrgRole{}, - }, - log: logger.New("test"), - } - - user := &login.ExternalUserInfo{ - Login: "markelog", - } - - err := server.validateGrafanaUser(user) - require.NoError(t, err) - }) - - t.Run("user in group", func(t *testing.T) { - cfg := &Config{ - Enabled: true, - } - - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - Groups: []*GroupToOrgRole{ - { - OrgId: 1, - }, - }, - }, - log: logger.New("test"), - } - - user := &login.ExternalUserInfo{ - Login: "markelog", - OrgRoles: map[int64]org.RoleType{ - 1: "test", - }, - } - - err := server.validateGrafanaUser(user) - require.NoError(t, err) - }) - - t.Run("user not in group", func(t *testing.T) { - cfg := &Config{ - Enabled: true, - } - - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - Groups: []*GroupToOrgRole{ - { - OrgId: 1, - }, - }, - }, - log: logger.New("test"), - } - - user := &login.ExternalUserInfo{ - Login: "markelog", - } - - err := server.validateGrafanaUser(user) - require.ErrorIs(t, err, ErrInvalidCredentials) - }) -} - -func TestServer_binds(t *testing.T) { - t.Run("single bind with cn wildcard", func(t *testing.T) { - server := &Server{ - Config: &ServerConfig{ - BindDN: "cn=%s,dc=grafana,dc=org", - }, - } - - assert.True(t, server.shouldSingleBind()) - assert.Equal(t, "cn=test,dc=grafana,dc=org", server.singleBindDN("test")) - }) - - t.Run("don't single bind", func(t *testing.T) { - server := &Server{ - Config: &ServerConfig{ - BindDN: "cn=admin,dc=grafana,dc=org", - }, - } - - assert.False(t, server.shouldSingleBind()) - }) - - t.Run("admin user bind", func(t *testing.T) { - server := &Server{ - Config: &ServerConfig{ - BindPassword: "test", - }, - } - - assert.True(t, server.shouldAdminBind()) - }) - - t.Run("don't admin user bind", func(t *testing.T) { - server := &Server{ - Config: &ServerConfig{ - BindPassword: "", - }, - } - - assert.False(t, server.shouldAdminBind()) - }) -} diff --git a/pkg/services/ldap/ldap_test.go b/pkg/services/ldap/ldap_test.go deleted file mode 100644 index b67686654184c..0000000000000 --- a/pkg/services/ldap/ldap_test.go +++ /dev/null @@ -1,647 +0,0 @@ -package ldap - -import ( - "errors" - "fmt" - "testing" - - "github.com/go-ldap/ldap/v3" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/grafana/grafana/pkg/apimachinery/identity" - "github.com/grafana/grafana/pkg/infra/log" -) - -const ( - validCert = `LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURYVENDQWtXZ0F3SUJBZ0lKQUxtVlZ1RFd1NE5ZTUEwR0NTcUdTSWIzRFFFQkN -3VUFNRVV4Q3pBSkJnTlYKQkFZVEFrRlZNUk13RVFZRFZRUUlEQXBUYjIxbExWTjBZWFJsTVNFd0h3WURWUVFLREJoSmJuUmxjbTVsZENCWAphV1JuYVhSekl -GQjBlU0JNZEdRd0hoY05NVFl4TWpNeE1UUXpORFEzV2hjTk5EZ3dOakkxTVRRek5EUTNXakJGCk1Rc3dDUVlEVlFRR0V3SkJWVEVUTUJFR0ExVUVDQXdLVTI -5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2d3WVNXNTAKWlhKdVpYUWdWMmxrWjJsMGN5QlFkSGtnVEhSa01JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUTh -BTUlJQgpDZ0tDQVFFQXpVQ0ZvemdOYjFoMU0wanpOUlNDamhPQm5SK3VWYlZwYVdmWFlJUitBaFdEZEVlNXJ5WStDZ2F2Ck9nOGJmTHlieXpGZGVobFlkRFJ -na2VkRUIvR2pHOGFKdzA2bDBxRjRqRE9BdzBrRXlnV0N1Mm1jSDdYT3hSdCsKWUFIM1RWSGEvSHUxVzNXanprb2JxcXFMUThna0tXV00yN2ZPZ0FaNkdpZWF -KQk42VkJTTU1jUGV5M0hXTEJtYworVFlKbXYxZGJhTzJqSGhLaDhwZkt3MFcxMlZNOFAxUElPOGd2NFBodS91dUpZaWVCV0tpeEJFeXkwbEhqeWl4CllGQ1I -xMnhkaDRDQTQ3cTk1OFpSR25uRFVHRlZFMVFoZ1JhY0pDT1o5YmQ1dDltcjhLTGFWQllUQ0pvNUVSRTgKanltYWI1ZFBxZTVxS2ZKc0NaaXFXZ2xialVvOXR -3SURBUUFCbzFBd1RqQWRCZ05WSFE0RUZnUVV4cHV3Y3MvQwpZUU95dWkrcjFHKzNLeEJOaHhrd0h3WURWUjBqQkJnd0ZvQVV4cHV3Y3MvQ1lRT3l1aStyMUc -rM0t4Qk5oeGt3CkRBWURWUjBUQkFVd0F3RUIvekFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBQWlXVUtzLzJ4L3ZpTkNLaTNZNmIKbEV1Q3RBR2h6T09aOUV -qcnZKOCtDT0gzUmFnM3RWQldyY0JaMy91aGhQcTVneTlscXc0T2t2RXdzOTkvNWpGcwpYMUZKNk1LQmdxZnV5N3loNXMxWWZNMEFOSFljek1tWXBaZUFjUWY -yQ0dBYVZmd1RUZlNsek5Mc0YybFcvbHk3CnlhcEZ6bFlTSkxHb1ZFK09IRXU4ZzVTbE5BQ1VFZmtYdys1RWdoaCtLemxJTjdSNlE3cjJpeFdORkJDL2pXZjc -KTktVZkp5WDhxSUc1bWQxWVVlVDZHQlc5Qm0yLzEvUmlPMjRKVGFZbGZMZEtLOVRZYjhzRzVCK09MYWIyREltRwo5OUNKMjVSa0FjU29iV05GNXpEME82bGd -PbzNjRWRCL2tzQ3EzaG10bEMvRGxMWi9EOENKKzdWdVpuUzFyUjJuCmFRPT0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQ==` - validKey = `LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFdlFJQkFEQU5CZ2txaGtpRzl3MEJBUUVGQUFTQ0JLY3dnZ1NqQWdFQUFv -SUJBUUROUUlXak9BMXZXSFV6ClNQTTFGSUtPRTRHZEg2NVZ0V2xwWjlkZ2hINENGWU4wUjdtdkpqNEtCcTg2RHh0OHZKdkxNVjE2R1ZoME5HQ1IKNTBRSDhh -TWJ4b25EVHFYU29YaU1NNEREU1FUS0JZSzdhWndmdGM3RkczNWdBZmROVWRyOGU3VmJkYVBPU2h1cQpxb3REeUNRcFpZemJ0ODZBQm5vYUo1b2tFM3BVRkl3 -eHc5N0xjZFlzR1p6NU5nbWEvVjF0bzdhTWVFcUh5bDhyCkRSYlhaVXp3L1U4Zzd5Qy9nK0c3KzY0bGlKNEZZcUxFRVRMTFNVZVBLTEZnVUpIWGJGMkhnSURq -dXIzbnhsRWEKZWNOUVlWVVRWQ0dCRnB3a0k1bjF0M20zMmF2d290cFVGaE1JbWprUkVUeVBLWnB2bDArcDdtb3A4bXdKbUtwYQpDVnVOU2oyM0FnTUJBQUVD -Z2dFQUJuNEkvQjIweHhYY056QVNpVlpKdnVhOURkUkh0bXhUbGtMem5CajB4Mm9ZCnkxL05iczNkM29GUm41dUV1aEJaT1RjcGhzZ3dkUlNIRFhac1AzZ1VP -YmV3K2QyTi96aWVVSWo4aExEVmx2SlAKclUvczRVL2w1M1EwTGlOQnlFOVRodkwrekpMUENLSnRkNXVIWmpCNWZGbTY5K1E3Z3U4eGc0eEhJdWIrMHBQNQpQ -SGFubUhDRHJiZ05OL29xbGFyNEZaMk1YVGdla1c2QW15Yy9rb0U5aEluNEJhYTJLZS9CL0FVR1k0cE1STHFwClRBcnQrR1RWZVdlb0ZZOVFBQ1VwYUhwSmhH -Yi9QaW91NnRsVTU3ZTQyY0xva2kxZjArU0FSc0JCS3lYQTdCQjEKMWZNSDEwS1FZRkE2OGRUWVdsS3pRYXUvSzR4YXFnNEZLbXR3RjY2R1FRS0JnUUQ5T3BO -VVM3b1J4TUhWSmFCUgpUTldXK1YxRlh5Y3FvamVrRnBEaWpQYjJYNUNXVjE2b2VXZ2FYcDBuT0hGZHk5RVdzM0d0R3BmWmFzYVJWSHNYClNIdFBoNE5iOEpx -SGRHRTAvQ0Q2dDArNERuczhCbjljU3F0ZFFCN1IzSm43SU1YaTlYL1U4TERLbytBMTgvSnEKVjhWZ1VuZ01ueTlZak1rUUliSzhUUldrWVFLQmdRRFBmNG54 -TzZqdSt0T0hIT1JRdHkzYllERDArT1YzSTArTAoweXowdVByZXJ5QlZpOW5ZNDNLYWtINTJEN1VaRXd3c0JqakdYRCtXSDh4RXNtQldzR05YSnUwMjVQdnpJ -Sm96CmxBRWlYdk1wL05tWXArdFk0ckRtTzhSaHlWb2NCcVdIemgzOG0wSUZPZDRCeUZENW5MRURyQTNwRFZvMGFOZ1kKbjBHd1J5c1pGd0tCZ1FEa0NqM202 -Wk1Vc1VXRXR5K2FSMEVKaG1LeU9EQkRPblkwOUlWaEgyUy9GZXhWRnpVTgpMdGZLOTIwNmhwL0F3ZXozTG4ydVQ0WnpxcTVLN2ZNelVuaUpkQldkVkIwMDRs -OHZvZVhwSWU5T1p1d2ZjQko5CmdGaTF6eXB4L3VGRHY0MjFCelFwQk4rUWZPZEtidmJkUVZGam5xQ3hiU0RyODB5VmxHTXJJNWZid1FLQmdHMDkKb1JyZXBP -N0VJTzhHTi9HQ3J1TEsvcHRLR2t5aHkzUTZ4blZFbWRiNDdoWDduY0pBNUlvWlBtcmJsQ1ZTVU5zdwpuMTFYSGFia3NMOE9CZ2c5cnQ4b1FFVGhRdi9hRHpU -T1c5YURsSk5yYWdlamlCVHdxOTlhWWVaMWdqbzFDWnE0CjJqS3VicENmeVpDNHJHRHRySWZaWWkxcStTMlVjUWh0ZDhEZGh3UWJBb0dBQU00RXBEQTR5SEI1 -eWllazFwL28KQ2JxUkN0YS9EeDZFeW8wS2xOQXlQdUZQQXNodXBHNE5CeDdtVDJBU2ZMKzJWQkhvaTZtSFNyaStCRFg1cnlZRgpmTVl2cDdVUllvcTd3N3Fp -dlJsdnZFZzV5b1lySzEzRjIrR2o2eEo0akVOOW0wS2RNL2czbUpHcTBIQlRJUXJwClNtNzVXWHNmbE94dVRuMDhMYmdHYzRzPQotLS0tLUVORCBSU0EgUFJJ -VkFURSBLRVktLS0tLQ==` -) - -func TestNew(t *testing.T) { - result := New(&ServerConfig{ - Attr: AttributeMap{}, - SearchBaseDNs: []string{"BaseDNHere"}, - }, &Config{}) - - assert.Implements(t, (*IServer)(nil), result) -} - -func TestServer_Dial(t *testing.T) { - t.Run("fails having no host but with valid root and client certificate files", func(t *testing.T) { - serverConfig := &ServerConfig{ - Host: "", - RootCACert: "./testdata/parsable.cert", - ClientCert: "./testdata/parsable.cert", - ClientKey: "./testdata/parsable.pem", - } - server := New(serverConfig, &Config{}) - - err := server.Dial() - require.Error(t, err) - require.ErrorContains(t, err, "connect") - }) - - t.Run("fails with invalid root certificate file", func(t *testing.T) { - serverConfig := &ServerConfig{ - RootCACert: "./testdata/invalid.cert", - } - server := New(serverConfig, &Config{}) - - err := server.Dial() - require.Error(t, err) - require.ErrorContains(t, err, "failed to append CA certificate") - }) - - t.Run("fails with non existing root certificate file", func(t *testing.T) { - serverConfig := &ServerConfig{ - RootCACert: "./testdata/nofile.cert", - } - server := New(serverConfig, &Config{}) - - err := server.Dial() - require.Error(t, err) - require.ErrorContains(t, err, "no such file or directory") - }) - - t.Run("fails with invalid client certificate file", func(t *testing.T) { - serverConfig := &ServerConfig{ - ClientCert: "./testdata/invalid.cert", - ClientKey: "./testdata/invalid.pem", - } - server := New(serverConfig, &Config{}) - - err := server.Dial() - require.Error(t, err) - require.ErrorContains(t, err, "failed to find any PEM data") - }) - - t.Run("fails with non existing client certificate file", func(t *testing.T) { - serverConfig := &ServerConfig{ - ClientCert: "./testdata/nofile.cert", - ClientKey: "./testdata/parsable.pem", - } - server := New(serverConfig, &Config{}) - - err := server.Dial() - require.Error(t, err) - require.ErrorContains(t, err, "no such file or directory") - }) - - t.Run("fails having no host but with valid root and client certificate values", func(t *testing.T) { - serverConfig := &ServerConfig{ - Host: "", - RootCACertValue: []string{validCert}, - ClientCertValue: validCert, - ClientKeyValue: validKey, - } - server := New(serverConfig, &Config{}) - - err := server.Dial() - require.Error(t, err) - require.ErrorContains(t, err, "connect") - }) - - t.Run("fails with invalid base64 root certificate value", func(t *testing.T) { - serverConfig := &ServerConfig{ - RootCACertValue: []string{"invalid-certificate"}, - } - server := New(serverConfig, &Config{}) - - err := server.Dial() - require.Error(t, err) - require.ErrorContains(t, err, "illegal base64 data") - }) - - t.Run("fails with invalid root certificate value", func(t *testing.T) { - serverConfig := &ServerConfig{ - RootCACertValue: []string{"aW52YWxpZC1jZXJ0aWZpY2F0ZQ=="}, - } - server := New(serverConfig, &Config{}) - - err := server.Dial() - require.Error(t, err) - require.ErrorContains(t, err, "failed to append CA certificate") - }) - - t.Run("fails with invalid base64 client certificate value", func(t *testing.T) { - serverConfig := &ServerConfig{ - ClientCertValue: "invalid-certificate", - ClientKeyValue: validKey, - } - server := New(serverConfig, &Config{}) - - err := server.Dial() - require.Error(t, err) - require.ErrorContains(t, err, "illegal base64 data") - }) - - t.Run("fails with invalid client certificate value", func(t *testing.T) { - serverConfig := &ServerConfig{ - ClientCertValue: validCert, - ClientKeyValue: "aW52YWxpZC1rZXk=", - } - server := New(serverConfig, &Config{}) - - err := server.Dial() - require.Error(t, err) - require.ErrorContains(t, err, "failed to find any PEM data") - }) -} - -func TestServer_Close(t *testing.T) { - t.Run("close the connection", func(t *testing.T) { - connection := &MockConnection{} - - server := &Server{ - Config: &ServerConfig{ - Attr: AttributeMap{}, - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: connection, - } - - assert.NotPanics(t, server.Close) - assert.True(t, connection.CloseCalled) - }) - - t.Run("panic if no connection", func(t *testing.T) { - server := &Server{ - Config: &ServerConfig{ - Attr: AttributeMap{}, - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: nil, - } - - assert.Panics(t, server.Close) - }) -} - -func TestServer_Users(t *testing.T) { - t.Run("one user", func(t *testing.T) { - conn := &MockConnection{} - entry := ldap.Entry{ - DN: "dn", Attributes: []*ldap.EntryAttribute{ - {Name: "username", Values: []string{"roelgerrits"}}, - {Name: "surname", Values: []string{"Gerrits"}}, - {Name: "email", Values: []string{"roel@test.com"}}, - {Name: "name", Values: []string{"Roel"}}, - {Name: "memberof", Values: []string{"admins"}}, - }} - result := ldap.SearchResult{Entries: []*ldap.Entry{&entry}} - conn.setSearchResult(&result) - - // Set up attribute map without surname and email - cfg := &Config{ - Enabled: true, - } - - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - Attr: AttributeMap{ - Username: "username", - Name: "name", - MemberOf: "memberof", - }, - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: conn, - log: log.New("test-logger"), - } - - searchResult, err := server.Users([]string{"roelgerrits"}) - - require.NoError(t, err) - assert.NotNil(t, searchResult) - - // User should be searched in ldap - assert.True(t, conn.SearchCalled) - // No empty attributes should be added to the search request - assert.Len(t, conn.SearchAttributes, 3) - }) - - t.Run("error", func(t *testing.T) { - expected := errors.New("Killa-gorilla") - conn := &MockConnection{} - conn.setSearchError(expected) - - // Set up attribute map without surname and email - server := &Server{ - Config: &ServerConfig{ - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: conn, - log: log.New("test-logger"), - } - - _, err := server.Users([]string{"roelgerrits"}) - - assert.ErrorIs(t, err, expected) - }) - - t.Run("no user", func(t *testing.T) { - conn := &MockConnection{} - result := ldap.SearchResult{Entries: []*ldap.Entry{}} - conn.setSearchResult(&result) - - // Set up attribute map without surname and email - server := &Server{ - Config: &ServerConfig{ - SearchBaseDNs: []string{"BaseDNHere"}, - }, - Connection: conn, - log: log.New("test-logger"), - } - - searchResult, err := server.Users([]string{"roelgerrits"}) - - require.NoError(t, err) - assert.Empty(t, searchResult) - }) - - t.Run("multiple DNs", func(t *testing.T) { - conn := &MockConnection{} - serviceDN := "dc=svc,dc=example,dc=org" - serviceEntry := ldap.Entry{ - DN: "dn", Attributes: []*ldap.EntryAttribute{ - {Name: "username", Values: []string{"imgrenderer"}}, - {Name: "name", Values: []string{"Image renderer"}}, - }} - services := ldap.SearchResult{Entries: []*ldap.Entry{&serviceEntry}} - - userDN := "dc=users,dc=example,dc=org" - userEntry := ldap.Entry{ - DN: "dn", Attributes: []*ldap.EntryAttribute{ - {Name: "username", Values: []string{"grot"}}, - {Name: "name", Values: []string{"Grot"}}, - }} - users := ldap.SearchResult{Entries: []*ldap.Entry{&userEntry}} - - conn.setSearchFunc(func(request *ldap.SearchRequest) (*ldap.SearchResult, error) { - switch request.BaseDN { - case userDN: - return &users, nil - case serviceDN: - return &services, nil - default: - return nil, fmt.Errorf("test case not defined for baseDN: '%s'", request.BaseDN) - } - }) - - server := &Server{ - cfg: &Config{}, - Config: &ServerConfig{ - Attr: AttributeMap{ - Username: "username", - Name: "name", - }, - SearchBaseDNs: []string{serviceDN, userDN}, - }, - Connection: conn, - log: log.New("test-logger"), - } - - searchResult, err := server.Users([]string{"imgrenderer", "grot"}) - require.NoError(t, err) - - assert.Len(t, searchResult, 2) - }) - - t.Run("same user in multiple DNs", func(t *testing.T) { - conn := &MockConnection{} - firstDN := "dc=users1,dc=example,dc=org" - firstEntry := ldap.Entry{ - DN: "dn", Attributes: []*ldap.EntryAttribute{ - {Name: "username", Values: []string{"grot"}}, - {Name: "name", Values: []string{"Grot the First"}}, - }} - firsts := ldap.SearchResult{Entries: []*ldap.Entry{&firstEntry}} - - secondDN := "dc=users2,dc=example,dc=org" - secondEntry := ldap.Entry{ - DN: "dn", Attributes: []*ldap.EntryAttribute{ - {Name: "username", Values: []string{"grot"}}, - {Name: "name", Values: []string{"Grot the Second"}}, - }} - seconds := ldap.SearchResult{Entries: []*ldap.Entry{&secondEntry}} - - conn.setSearchFunc(func(request *ldap.SearchRequest) (*ldap.SearchResult, error) { - switch request.BaseDN { - case secondDN: - return &seconds, nil - case firstDN: - return &firsts, nil - default: - return nil, fmt.Errorf("test case not defined for baseDN: '%s'", request.BaseDN) - } - }) - - cfg := &Config{ - Enabled: true, - } - - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - Attr: AttributeMap{ - Username: "username", - Name: "name", - }, - SearchBaseDNs: []string{firstDN, secondDN}, - }, - Connection: conn, - log: log.New("test-logger"), - } - - res, err := server.Users([]string{"grot"}) - require.NoError(t, err) - require.Len(t, res, 1) - assert.Equal(t, "Grot the First", res[0].Name) - }) - - t.Run("org role mapping", func(t *testing.T) { - conn := &MockConnection{} - - usersOU := "ou=users,dc=example,dc=org" - grootDN := "dn=groot," + usersOU - grootSearch := ldap.SearchResult{Entries: []*ldap.Entry{{DN: grootDN, - Attributes: []*ldap.EntryAttribute{ - {Name: "username", Values: []string{"groot"}}, - {Name: "name", Values: []string{"I am Groot"}}, - }}}} - babyGrootDN := "dn=babygroot," + usersOU - babyGrootSearch := ldap.SearchResult{Entries: []*ldap.Entry{{DN: grootDN, - Attributes: []*ldap.EntryAttribute{ - {Name: "username", Values: []string{"babygroot"}}, - {Name: "name", Values: []string{"I am baby Groot"}}, - }}}} - peterDN := "dn=peter," + usersOU - peterSearch := ldap.SearchResult{Entries: []*ldap.Entry{{DN: peterDN, - Attributes: []*ldap.EntryAttribute{ - {Name: "username", Values: []string{"peter"}}, - {Name: "name", Values: []string{"Peter"}}, - }}}} - groupsOU := "ou=groups,dc=example,dc=org" - creaturesDN := "dn=creatures," + groupsOU - grootGroups := ldap.SearchResult{Entries: []*ldap.Entry{{DN: creaturesDN, - Attributes: []*ldap.EntryAttribute{ - {Name: "member", Values: []string{grootDN}}, - }}}, - } - babyCreaturesDN := "dn=babycreatures," + groupsOU - babyGrootGroups := ldap.SearchResult{Entries: []*ldap.Entry{{DN: babyCreaturesDN, - Attributes: []*ldap.EntryAttribute{ - {Name: "member", Values: []string{babyGrootDN}}, - }}}, - } - humansDN := "dn=humans," + groupsOU - peterGroups := ldap.SearchResult{Entries: []*ldap.Entry{{DN: humansDN, - Attributes: []*ldap.EntryAttribute{ - {Name: "member", Values: []string{peterDN}}, - }}}, - } - - conn.setSearchFunc(func(request *ldap.SearchRequest) (*ldap.SearchResult, error) { - switch request.BaseDN { - case usersOU: - switch request.Filter { - case "(|(username=groot))": - return &grootSearch, nil - case "(|(username=babygroot))": - return &babyGrootSearch, nil - case "(|(username=peter))": - return &peterSearch, nil - default: - return nil, fmt.Errorf("test case not defined for user filter: '%s'", request.Filter) - } - case groupsOU: - switch request.Filter { - case "(member=groot)": - return &grootGroups, nil - case "(member=babygroot)": - return &babyGrootGroups, nil - case "(member=peter)": - return &peterGroups, nil - default: - return nil, fmt.Errorf("test case not defined for group filter: '%s'", request.Filter) - } - default: - return nil, fmt.Errorf("test case not defined for baseDN: '%s'", request.BaseDN) - } - }) - - isGrafanaAdmin := true - cfg := &Config{ - Enabled: true, - } - - server := &Server{ - cfg: cfg, - Config: &ServerConfig{ - Attr: AttributeMap{ - Username: "username", - Name: "name", - }, - SearchBaseDNs: []string{usersOU}, - SearchFilter: "(username=%s)", - GroupSearchFilter: "(member=%s)", - GroupSearchBaseDNs: []string{groupsOU}, - Groups: []*GroupToOrgRole{ - { - GroupDN: creaturesDN, - OrgId: 2, - IsGrafanaAdmin: &isGrafanaAdmin, - OrgRole: "Admin", - }, - { - GroupDN: babyCreaturesDN, - OrgId: 2, - OrgRole: "Editor", - }, - }, - }, - Connection: conn, - log: log.New("test-logger"), - } - - t.Run("disable user with no mapping", func(t *testing.T) { - res, err := server.Users([]string{"peter"}) - require.NoError(t, err) - require.Len(t, res, 1) - require.Equal(t, "Peter", res[0].Name) - require.ElementsMatch(t, res[0].Groups, []string{humansDN}) - require.Empty(t, res[0].OrgRoles) - require.True(t, res[0].IsDisabled) - }) - t.Run("skip org role sync", func(t *testing.T) { - server.cfg.SkipOrgRoleSync = true - - res, err := server.Users([]string{"groot"}) - require.NoError(t, err) - require.Len(t, res, 1) - require.Equal(t, "I am Groot", res[0].Name) - require.ElementsMatch(t, res[0].Groups, []string{creaturesDN}) - require.Empty(t, res[0].OrgRoles) - require.False(t, res[0].IsDisabled) - }) - t.Run("sync org role", func(t *testing.T) { - server.cfg.SkipOrgRoleSync = false - res, err := server.Users([]string{"groot"}) - require.NoError(t, err) - require.Len(t, res, 1) - require.Equal(t, "I am Groot", res[0].Name) - require.ElementsMatch(t, res[0].Groups, []string{creaturesDN}) - require.Len(t, res[0].OrgRoles, 1) - role, mappingExist := res[0].OrgRoles[2] - require.True(t, mappingExist) - require.Equal(t, identity.RoleAdmin, role) - require.False(t, res[0].IsDisabled) - require.NotNil(t, res[0].IsGrafanaAdmin) - assert.True(t, *res[0].IsGrafanaAdmin) - }) - t.Run("set Grafana Admin to false by default", func(t *testing.T) { - res, err := server.Users([]string{"babygroot"}) - require.NoError(t, err) - require.Len(t, res, 1) - require.Equal(t, "I am baby Groot", res[0].Name) - require.ElementsMatch(t, res[0].Groups, []string{babyCreaturesDN}) - require.Len(t, res[0].OrgRoles, 1) - role, mappingExist := res[0].OrgRoles[2] - require.True(t, mappingExist) - require.Equal(t, identity.RoleEditor, role) - require.False(t, res[0].IsDisabled) - require.NotNil(t, res[0].IsGrafanaAdmin) - assert.False(t, *res[0].IsGrafanaAdmin) - }) - }) -} - -func TestServer_UserBind(t *testing.T) { - t.Run("use provided DN and password", func(t *testing.T) { - connection := &MockConnection{} - var actualUsername, actualPassword string - connection.BindProvider = func(username, password string) error { - actualUsername = username - actualPassword = password - return nil - } - server := &Server{ - Connection: connection, - Config: &ServerConfig{ - BindDN: "cn=admin,dc=grafana,dc=org", - }, - } - - dn := "cn=user,ou=users,dc=grafana,dc=org" - err := server.UserBind(dn, "pwd") - - require.NoError(t, err) - assert.Equal(t, dn, actualUsername) - assert.Equal(t, "pwd", actualPassword) - }) - - t.Run("error", func(t *testing.T) { - connection := &MockConnection{} - expected := &ldap.Error{ - ResultCode: uint16(25), - } - connection.BindProvider = func(username, password string) error { - return expected - } - server := &Server{ - Connection: connection, - Config: &ServerConfig{ - BindDN: "cn=%s,ou=users,dc=grafana,dc=org", - }, - log: log.New("test-logger"), - } - err := server.UserBind("user", "pwd") - assert.ErrorIs(t, err, expected) - }) -} - -func TestServer_AdminBind(t *testing.T) { - t.Run("use admin DN and password", func(t *testing.T) { - connection := &MockConnection{} - var actualUsername, actualPassword string - connection.BindProvider = func(username, password string) error { - actualUsername = username - actualPassword = password - return nil - } - - dn := "cn=admin,dc=grafana,dc=org" - - server := &Server{ - Connection: connection, - Config: &ServerConfig{ - BindPassword: "pwd", - BindDN: dn, - }, - } - - err := server.AdminBind() - require.NoError(t, err) - - assert.Equal(t, dn, actualUsername) - assert.Equal(t, "pwd", actualPassword) - }) - - t.Run("error", func(t *testing.T) { - connection := &MockConnection{} - expected := &ldap.Error{ - ResultCode: uint16(25), - } - connection.BindProvider = func(username, password string) error { - return expected - } - - dn := "cn=admin,dc=grafana,dc=org" - - server := &Server{ - Connection: connection, - Config: &ServerConfig{ - BindPassword: "pwd", - BindDN: dn, - }, - log: log.New("test-logger"), - } - - err := server.AdminBind() - assert.ErrorIs(t, err, expected) - }) -} diff --git a/pkg/services/ldap/testing.go b/pkg/services/ldap/testing.go index 292b8be7d8a8f..a31951c7afb49 100644 --- a/pkg/services/ldap/testing.go +++ b/pkg/services/ldap/testing.go @@ -55,8 +55,10 @@ func (c *MockConnection) UnauthenticatedBind(username string) error { } // Close mocks Close connection function -func (c *MockConnection) Close() { +func (c *MockConnection) Close() error { c.CloseCalled = true + + return nil } func (c *MockConnection) setSearchResult(result *ldap.SearchResult) { diff --git a/pkg/services/pluginsintegration/plugins_integration_test.go b/pkg/services/pluginsintegration/plugins_integration_test.go index 66d6dda25d5fb..23dc547f3bbc3 100644 --- a/pkg/services/pluginsintegration/plugins_integration_test.go +++ b/pkg/services/pluginsintegration/plugins_integration_test.go @@ -26,6 +26,7 @@ import ( "github.com/grafana/grafana/pkg/tsdb/azuremonitor" cloudmonitoring "github.com/grafana/grafana/pkg/tsdb/cloud-monitoring" "github.com/grafana/grafana/pkg/tsdb/cloudwatch" + "github.com/grafana/grafana/pkg/tsdb/druid" "github.com/grafana/grafana/pkg/tsdb/elasticsearch" postgres "github.com/grafana/grafana/pkg/tsdb/grafana-postgresql-datasource" pyroscope "github.com/grafana/grafana/pkg/tsdb/grafana-pyroscope-datasource" @@ -94,7 +95,8 @@ func TestIntegrationPluginManager(t *testing.T) { graf := grafanads.ProvideService(sv2, nil) pyroscope := pyroscope.ProvideService(hcp) parca := parca.ProvideService(hcp) - coreRegistry := coreplugin.ProvideCoreRegistry(tracing.InitializeTracerForTest(), am, cw, cm, es, grap, idb, lk, otsdb, pr, tmpo, td, pg, my, ms, graf, pyroscope, parca) + dr := druid.ProvideService(hcp) + coreRegistry := coreplugin.ProvideCoreRegistry(tracing.InitializeTracerForTest(), am, cw, cm, es, grap, idb, lk, otsdb, pr, tmpo, td, pg, my, ms, graf, pyroscope, parca, dr) testCtx := CreateIntegrationTestCtx(t, cfg, coreRegistry) diff --git a/pkg/storage/unified/apistore/go.mod b/pkg/storage/unified/apistore/go.mod index cc553c54044b9..566c362bda8a3 100644 --- a/pkg/storage/unified/apistore/go.mod +++ b/pkg/storage/unified/apistore/go.mod @@ -3,13 +3,13 @@ module github.com/grafana/grafana/pkg/storage/unified/apistore go 1.23.0 require ( - github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db + github.com/grafana/authlib/claims v0.0.0-20240828122726-9edfcbea43e2 github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240821155123-6891eb1d35da github.com/grafana/grafana/pkg/apiserver v0.0.0-20240821155123-6891eb1d35da github.com/grafana/grafana/pkg/storage/unified/resource v0.0.0-20240821161612-71f0dae39e9d github.com/stretchr/testify v1.9.0 gocloud.dev v0.39.0 - google.golang.org/grpc v1.65.0 + google.golang.org/grpc v1.66.0 k8s.io/apimachinery v0.31.0 k8s.io/apiserver v0.31.0 k8s.io/client-go v0.31.0 @@ -19,13 +19,13 @@ require ( require ( github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect - github.com/bufbuild/protocompile v0.4.0 // indirect + github.com/bufbuild/protocompile v0.14.0 // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/coreos/go-semver v0.3.1 // indirect github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/emicklei/go-restful/v3 v3.11.0 // indirect + github.com/emicklei/go-restful/v3 v3.12.1 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fullstorydev/grpchan v1.1.1 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect @@ -33,21 +33,23 @@ require ( github.com/go-logr/logr v1.4.2 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect - github.com/go-openapi/jsonreference v0.20.4 // indirect + github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.4 // indirect + github.com/google/btree v1.1.3 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.6.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/googleapis/gax-go/v2 v2.13.0 // indirect - github.com/grafana/authlib v0.0.0-20240814074258-eae7d47f01db // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/grafana/authlib v0.0.0-20240828122726-9edfcbea43e2 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // indirect - github.com/jhump/protoreflect v1.15.1 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 // indirect + github.com/jhump/protoreflect v1.16.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.9 // indirect @@ -58,24 +60,24 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/prometheus/client_golang v1.20.0 // indirect + github.com/prometheus/client_golang v1.20.2 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/common v0.57.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/x448/float16 v0.8.4 // indirect - go.etcd.io/etcd/api/v3 v3.5.14 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.14 // indirect - go.etcd.io/etcd/client/v3 v3.5.14 // indirect + go.etcd.io/etcd/api/v3 v3.5.15 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.15 // indirect + go.etcd.io/etcd/client/v3 v3.5.15 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 // indirect - go.opentelemetry.io/otel/metric v1.28.0 // indirect - go.opentelemetry.io/otel/sdk v1.28.0 // indirect - go.opentelemetry.io/otel/trace v1.28.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect + go.opentelemetry.io/otel v1.29.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 // indirect + go.opentelemetry.io/otel/metric v1.29.0 // indirect + go.opentelemetry.io/otel/sdk v1.29.0 // indirect + go.opentelemetry.io/otel/trace v1.29.0 // indirect go.opentelemetry.io/proto/otlp v1.3.1 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect @@ -88,17 +90,17 @@ require ( golang.org/x/text v0.17.0 // indirect golang.org/x/time v0.6.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect - google.golang.org/api v0.191.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect + google.golang.org/api v0.195.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/api v0.31.0 // indirect k8s.io/component-base v0.31.0 // indirect - k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2 // indirect + k8s.io/utils v0.0.0-20240821151609-f90d01438635 // indirect sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect diff --git a/pkg/storage/unified/apistore/go.sum b/pkg/storage/unified/apistore/go.sum index f779d2b72816a..cc8aa706ab77a 100644 --- a/pkg/storage/unified/apistore/go.sum +++ b/pkg/storage/unified/apistore/go.sum @@ -1,8 +1,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14= -cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU= -cloud.google.com/go/auth v0.8.1 h1:QZW9FjC5lZzN864p13YxvAtGUlQ+KgRL+8Sg45Z6vxo= -cloud.google.com/go/auth v0.8.1/go.mod h1:qGVp/Y3kDRSDZ5gFD/XPUfYQ9xW1iI7q8RIRoCyBbJc= +cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= +cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= +cloud.google.com/go/auth v0.9.1 h1:+pMtLEV2k0AXKvs/tGZojuj6QaioxfUjOpMsG5Gtx+w= +cloud.google.com/go/auth v0.9.1/go.mod h1:Sw8ocT5mhhXxFklyhT12Eiy0ed6tTrPMCJjSI8KhYLk= cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= cloud.google.com/go/compute v1.23.4 h1:EBT9Nw4q3zyE7G45Wvv3MzolIrCJEuHys5muLY0wvAw= @@ -58,8 +58,8 @@ github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= github.com/blang/semver/v4 v4.0.0 h1:1PFHFE6yCCTv8C1TeyNNarDzntLi7wMI5i/pzqYIsAM= github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= -github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= -github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= +github.com/bufbuild/protocompile v0.14.0 h1:z3DW4IvXE5G/uTOnSQn+qwQQxvhckkTWLS/0No/o7KU= +github.com/bufbuild/protocompile v0.14.0/go.mod h1:N6J1NYzkspJo3ZwyL4Xjvli86XOj1xq4qAasUFxGups= github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -78,8 +78,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= -github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/emicklei/go-restful/v3 v3.12.1 h1:PJMDIM/ak7btuL8Ex0iYET9hxM3CI2sjZtzpL63nKAU= +github.com/emicklei/go-restful/v3 v3.12.1/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -100,8 +100,8 @@ github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= -github.com/go-openapi/jsonreference v0.20.4 h1:bKlDxQxQJgwpUSgOENiMPzCTBVuc7vTdXSSgNeAhojU= -github.com/go-openapi/jsonreference v0.20.4/go.mod h1:5pZJyJP2MnYCpoeoMAql78cCHauHj0V9Lhc506VOpw4= +github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= +github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= @@ -129,8 +129,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= -github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= +github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I= github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= @@ -146,8 +146,8 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af h1:kmjWCqn2qkEml422C2Rrd27c3VGxi6a/6HNq8QmHRKM= -github.com/google/pprof v0.0.0-20240525223248-4bfdf5a9a2af/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8 h1:FKHo8hFI3A+7w0aUQuYXQ+6EN5stWmeY/AZqtM8xk9k= +github.com/google/pprof v0.0.0-20240727154555-813a5fbdbec8/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo= github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -159,12 +159,12 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/grafana/authlib v0.0.0-20240814074258-eae7d47f01db h1:z++X4DdoX+aNlZNT1ZY4cykiFay4+f077pa0AG48SGg= -github.com/grafana/authlib v0.0.0-20240814074258-eae7d47f01db/go.mod h1:ptt910z9KFfpVSIbSbXvTRR7tS19mxD7EtmVbbJi/WE= -github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db h1:mDk0bwRV6rDrLSmKXftcPf9kLA9uH6EvxJvzpPW9bso= -github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/grafana/authlib v0.0.0-20240828122726-9edfcbea43e2 h1:SU+p1ck8037cz6F8W38PIL9MzRb6YMeNqc7+GHDuqiU= +github.com/grafana/authlib v0.0.0-20240828122726-9edfcbea43e2/go.mod h1:PFzXbCrn0GIpN4KwT6NP1l5Z1CPLfmKHnYx8rZzQcyY= +github.com/grafana/authlib/claims v0.0.0-20240828122726-9edfcbea43e2 h1:YTF1Y1BYCDkD7ssmbhzRqXlxevsYpXPmOnoO8qbOue8= +github.com/grafana/authlib/claims v0.0.0-20240828122726-9edfcbea43e2/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240821155123-6891eb1d35da h1:2E3c/I3ayAy4Z1GwIPqXNZcpUccRapE1aBXA1ho4g7o= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240821155123-6891eb1d35da/go.mod h1:p09fvU5ujNL/Ig8HB7g4f+S0zyYbQq3x/f0jA4ujVOM= github.com/grafana/grafana/pkg/apiserver v0.0.0-20240821155123-6891eb1d35da h1:xQMb8cRZYu7D0IO9q/lB7qFQpLGAoPUnCase1CGHrXY= @@ -179,14 +179,14 @@ github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a534 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340/go.mod h1:3bDW6wMZJB7tiONtC/1Xpicra6Wp5GgbTbQWCbI5fkc= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 h1:bkypFPDjIYGfCYD5mRBvpqxfYX1YCS1PXdKYWi8FsN0= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0 h1:asbCHRVmodnJTuQ3qamDwqVOIjwqUPTYmYuemVOx+Ys= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= -github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= -github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= +github.com/jhump/protoreflect v1.16.0 h1:54fZg+49widqXYQ0b+usAFHbMkBGR4PpXrsHc8+TBDg= +github.com/jhump/protoreflect v1.16.0/go.mod h1:oYPd7nPvcBw/5wlDfm/AVmU9zH9BgqGCI469pGxfj/8= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jonboulle/clockwork v0.4.0 h1:p4Cf1aMWXnXAUh8lVfewRBx1zaTSYKrKMF2g3ST4RZ4= @@ -230,16 +230,16 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= -github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI= -github.com/prometheus/client_golang v1.20.0/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg= +github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common v0.57.0 h1:Ro/rKjwdq9mZn1K5QPctzh+MA4Lp0BuYk5ZZEVhoNcY= +github.com/prometheus/common v0.57.0/go.mod h1:7uRPFSUTbfZWsJ7MHY56sqt7hLQu3bxXHDnNhl8E9qI= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= @@ -273,14 +273,14 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.etcd.io/bbolt v1.3.9 h1:8x7aARPEXiXbHmtUwAIv7eV2fQFHrLLavdiJ3uzJXoI= go.etcd.io/bbolt v1.3.9/go.mod h1:zaO32+Ti0PK1ivdPtgMESzuzL2VPoIG1PCQNvOdo/dE= -go.etcd.io/etcd/api/v3 v3.5.14 h1:vHObSCxyB9zlF60w7qzAdTcGaglbJOpSj1Xj9+WGxq0= -go.etcd.io/etcd/api/v3 v3.5.14/go.mod h1:BmtWcRlQvwa1h3G2jvKYwIQy4PkHlDej5t7uLMUdJUU= -go.etcd.io/etcd/client/pkg/v3 v3.5.14 h1:SaNH6Y+rVEdxfpA2Jr5wkEvN6Zykme5+YnbCkxvuWxQ= -go.etcd.io/etcd/client/pkg/v3 v3.5.14/go.mod h1:8uMgAokyG1czCtIdsq+AGyYQMvpIKnSvPjFMunkgeZI= +go.etcd.io/etcd/api/v3 v3.5.15 h1:3KpLJir1ZEBrYuV2v+Twaa/e2MdDCEZ/70H+lzEiwsk= +go.etcd.io/etcd/api/v3 v3.5.15/go.mod h1:N9EhGzXq58WuMllgH9ZvnEr7SI9pS0k0+DHZezGp7jM= +go.etcd.io/etcd/client/pkg/v3 v3.5.15 h1:fo0HpWz/KlHGMCC+YejpiCmyWDEuIpnTDzpJLB5fWlA= +go.etcd.io/etcd/client/pkg/v3 v3.5.15/go.mod h1:mXDI4NAOwEiszrHCb0aqfAYNCrZP4e9hRca3d1YK8EU= go.etcd.io/etcd/client/v2 v2.305.13 h1:RWfV1SX5jTU0lbCvpVQe3iPQeAHETWdOTb6pxhd77C8= go.etcd.io/etcd/client/v2 v2.305.13/go.mod h1:iQnL7fepbiomdXMb3om1rHq96htNNGv2sJkEcZGDRRg= -go.etcd.io/etcd/client/v3 v3.5.14 h1:CWfRs4FDaDoSz81giL7zPpZH2Z35tbOrAJkkjMqOupg= -go.etcd.io/etcd/client/v3 v3.5.14/go.mod h1:k3XfdV/VIHy/97rqWjoUzrj9tk7GgJGH9J8L4dNXmAk= +go.etcd.io/etcd/client/v3 v3.5.15 h1:23M0eY4Fd/inNv1ZfU3AxrbbOdW79r9V9Rl62Nm6ip4= +go.etcd.io/etcd/client/v3 v3.5.15/go.mod h1:CLSJxrYjvLtHsrPKsy7LmZEE+DK2ktfd2bN4RhBMwlU= go.etcd.io/etcd/pkg/v3 v3.5.13 h1:st9bDWNsKkBNpP4PR1MvM/9NqUPfvYZx/YXegsYEH8M= go.etcd.io/etcd/pkg/v3 v3.5.13/go.mod h1:N+4PLrp7agI/Viy+dUYpX7iRtSPvKq+w8Y14d1vX+m0= go.etcd.io/etcd/raft/v3 v3.5.13 h1:7r/NKAOups1YnKcfro2RvGGo2PTuizF/xh26Z2CTAzA= @@ -289,22 +289,22 @@ go.etcd.io/etcd/server/v3 v3.5.13 h1:V6KG+yMfMSqWt+lGnhFpP5z5dRUj1BDRJ5k1fQ9DFok go.etcd.io/etcd/server/v3 v3.5.13/go.mod h1:K/8nbsGupHqmr5MkgaZpLlH1QdX1pcNQLAkODy44XcQ= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0 h1:3Q/xZUyC1BBkualc9ROb4G8qkH90LXEIICcs5zv1OYY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.28.0/go.mod h1:s75jGIWA9OfCMzF0xr+ZgfrB5FEbbV7UuYo32ahUiFI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0 h1:R3X6ZXmNPRR8ul6i3WgFURCHzaXjHdm0karRG/+dj3s= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.28.0/go.mod h1:QWFXnDavXWwMx2EEcZsf3yxgEKAqsxQ+Syjp+seyInw= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/sdk v1.28.0 h1:b9d7hIry8yZsgtbmM0DKyPWMMUMlK9NEKuIG4aBqWyE= -go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0 h1:dIIDULZJpgdiHz5tXrTgKIMLkus6jEFa7x5SOKcyR7E= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.29.0/go.mod h1:jlRVBe7+Z1wyxFSUs48L6OBQZ5JwH2Hg/Vbl+t9rAgI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 h1:nSiV3s7wiCam610XcLbYOmMfJxB9gO4uK3Xgv5gmTgg= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0/go.mod h1:hKn/e/Nmd19/x1gvIHwtOwVWM+VhuITSWip3JUDghj0= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= +go.opentelemetry.io/otel/sdk v1.29.0 h1:vkqKjk7gwhS8VaWb0POZKmIEDimRCMsopNYnriHyryo= +go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= go.opentelemetry.io/proto/otlp v1.3.1 h1:TrMUixzpM0yuc/znrFTP9MMRh8trP93mkCiDVeXrui0= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= @@ -402,27 +402,27 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.22.0 h1:gqSGLZqv+AI9lIQzniJ0nZDRG5GBPsSi+DRNHWNz6yA= -golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c= +golang.org/x/tools v0.24.0 h1:J1shsA93PJUEVaUSaay7UXAyE8aimq3GW0pjlolpa24= +golang.org/x/tools v0.24.0/go.mod h1:YhNqVBIfWHdzvTLs0d8LCuMhkKUgSUKldakyV7W/WDQ= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk= golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.191.0 h1:cJcF09Z+4HAB2t5qTQM1ZtfL/PemsLFkcFG67qq2afk= -google.golang.org/api v0.191.0/go.mod h1:tD5dsFGxFza0hnQveGfVk9QQYKcfp+VzgRqyXFxE0+E= +google.golang.org/api v0.195.0 h1:Ude4N8FvTKnnQJHU48RFI40jOBgIrL8Zqr3/QeST6yU= +google.golang.org/api v0.195.0/go.mod h1:DOGRWuv3P8TU8Lnz7uQc4hyNqrBpMtD9ppW3wBJurgc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM= -google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c h1:TYOEhrQMrNDTAd2rX9m+WgGr8Ku6YNuj1D7OX6rWSok= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c/go.mod h1:2rC5OendXvZ8wGEo/cSLheztrZDZaSoHanUcd1xtZnw= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed h1:J6izYgfBXAI3xTKLgxzTmUltdYaLsuBxFCgDHWJ/eXg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.18.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= @@ -430,8 +430,8 @@ google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQ google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c= +google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -477,10 +477,10 @@ k8s.io/component-base v0.31.0 h1:/KIzGM5EvPNQcYgwq5NwoQBaOlVFrghoVGr8lG6vNRs= k8s.io/component-base v0.31.0/go.mod h1:TYVuzI1QmN4L5ItVdMSXKvH7/DtvIuas5/mm8YT3rTo= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= -k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340/go.mod h1:yD4MZYeKMBwQKVht279WycxKyM84kkAx2DPrTXaeb98= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2 h1:GKE9U8BH16uynoxQii0auTjmmmuZ3O0LFMN6S0lPPhI= +k8s.io/kube-openapi v0.0.0-20240827152857-f7e401e7b4c2/go.mod h1:coRQXBK9NxO98XUv3ZD6AK3xzHCxV6+b7lrquKwaKzA= +k8s.io/utils v0.0.0-20240821151609-f90d01438635 h1:2wThSvJoW/Ncn9TmQEYXRnevZXi2duqHWf5OX9S3zjI= +k8s.io/utils v0.0.0-20240821151609-f90d01438635/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3 h1:2770sDpzrjjsAtVhSeUFseziht227YAWYHLGNM8QPwY= sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.30.3/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= diff --git a/pkg/storage/unified/resource/go.mod b/pkg/storage/unified/resource/go.mod index 360723aab76dd..1f690404216b0 100644 --- a/pkg/storage/unified/resource/go.mod +++ b/pkg/storage/unified/resource/go.mod @@ -4,22 +4,22 @@ go 1.23.0 require ( github.com/fullstorydev/grpchan v1.1.1 - github.com/grafana/authlib v0.0.0-20240814074258-eae7d47f01db - github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db + github.com/grafana/authlib v0.0.0-20240828122726-9edfcbea43e2 + github.com/grafana/authlib/claims v0.0.0-20240828122726-9edfcbea43e2 github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240808164224-787abccfbc9e github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 - github.com/prometheus/client_golang v1.20.0 + github.com/prometheus/client_golang v1.20.2 github.com/stretchr/testify v1.9.0 - go.opentelemetry.io/otel/trace v1.28.0 + go.opentelemetry.io/otel/trace v1.29.0 gocloud.dev v0.39.0 - google.golang.org/grpc v1.65.0 + google.golang.org/grpc v1.66.0 google.golang.org/protobuf v1.34.2 k8s.io/apimachinery v0.31.0 ) require ( github.com/beorn7/perks v1.0.1 // indirect - github.com/bufbuild/protocompile v0.4.0 // indirect + github.com/bufbuild/protocompile v0.14.0 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect @@ -30,7 +30,7 @@ require ( github.com/golang/protobuf v1.5.4 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/googleapis/gax-go/v2 v2.13.0 // indirect - github.com/jhump/protoreflect v1.15.1 // indirect + github.com/jhump/protoreflect v1.16.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect @@ -38,25 +38,28 @@ require ( github.com/patrickmn/go-cache v2.1.0+incompatible // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/common v0.55.0 // indirect + github.com/prometheus/common v0.57.0 // indirect github.com/prometheus/procfs v0.15.1 // indirect github.com/x448/float16 v0.8.4 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.28.0 // indirect + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect + go.opentelemetry.io/otel v1.29.0 // indirect golang.org/x/crypto v0.26.0 // indirect golang.org/x/net v0.28.0 // indirect golang.org/x/sync v0.8.0 // indirect golang.org/x/sys v0.24.0 // indirect golang.org/x/text v0.17.0 // indirect golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 // indirect - google.golang.org/api v0.191.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 // indirect + google.golang.org/api v0.195.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect k8s.io/apiserver v0.31.0 // indirect k8s.io/klog/v2 v2.130.1 // indirect - k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 // indirect + k8s.io/utils v0.0.0-20240821151609-f90d01438635 // indirect sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect ) diff --git a/pkg/storage/unified/resource/go.sum b/pkg/storage/unified/resource/go.sum index 02d4c05722a9c..82ec4d611ab81 100644 --- a/pkg/storage/unified/resource/go.sum +++ b/pkg/storage/unified/resource/go.sum @@ -1,8 +1,8 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.115.0 h1:CnFSK6Xo3lDYRoBKEcAtia6VSC837/ZkJuRduSFnr14= -cloud.google.com/go v0.115.0/go.mod h1:8jIM5vVgoAEoiVxQ/O4BFTfHqulPZgs/ufEzMcFMdWU= -cloud.google.com/go/auth v0.8.1 h1:QZW9FjC5lZzN864p13YxvAtGUlQ+KgRL+8Sg45Z6vxo= -cloud.google.com/go/auth v0.8.1/go.mod h1:qGVp/Y3kDRSDZ5gFD/XPUfYQ9xW1iI7q8RIRoCyBbJc= +cloud.google.com/go v0.115.1 h1:Jo0SM9cQnSkYfp44+v+NQXHpcHqlnRJk2qxh6yvxxxQ= +cloud.google.com/go v0.115.1/go.mod h1:DuujITeaufu3gL68/lOFIirVNJwQeyf5UXyi+Wbgknc= +cloud.google.com/go/auth v0.9.1 h1:+pMtLEV2k0AXKvs/tGZojuj6QaioxfUjOpMsG5Gtx+w= +cloud.google.com/go/auth v0.9.1/go.mod h1:Sw8ocT5mhhXxFklyhT12Eiy0ed6tTrPMCJjSI8KhYLk= cloud.google.com/go/auth/oauth2adapt v0.2.4 h1:0GWE/FUsXhf6C+jAkWgYm7X9tK8cuEIfy19DBn6B6bY= cloud.google.com/go/auth/oauth2adapt v0.2.4/go.mod h1:jC/jOpwFP6JBxhB3P5Rr0a9HLMC/Pe3eaL4NmdvqPtc= cloud.google.com/go/compute v1.23.4 h1:EBT9Nw4q3zyE7G45Wvv3MzolIrCJEuHys5muLY0wvAw= @@ -55,8 +55,8 @@ github.com/aws/smithy-go v1.20.3 h1:ryHwveWzPV5BIof6fyDvor6V3iUL7nTfiTKXHiW05nE= github.com/aws/smithy-go v1.20.3/go.mod h1:krry+ya/rV9RDcV/Q16kpu6ypI4K2czasz0NC3qS14E= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZlaQsNA= -github.com/bufbuild/protocompile v0.4.0/go.mod h1:3v93+mbWn/v3xzN+31nwkJfrEpAUwp+BagBSZWx+TP8= +github.com/bufbuild/protocompile v0.14.0 h1:z3DW4IvXE5G/uTOnSQn+qwQQxvhckkTWLS/0No/o7KU= +github.com/bufbuild/protocompile v0.14.0/go.mod h1:N6J1NYzkspJo3ZwyL4Xjvli86XOj1xq4qAasUFxGups= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -128,10 +128,10 @@ github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfF github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.13.0 h1:yitjD5f7jQHhyDsnhKEBU52NdvvdSeGzlAnDPT0hH1s= github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= -github.com/grafana/authlib v0.0.0-20240814074258-eae7d47f01db h1:z++X4DdoX+aNlZNT1ZY4cykiFay4+f077pa0AG48SGg= -github.com/grafana/authlib v0.0.0-20240814074258-eae7d47f01db/go.mod h1:ptt910z9KFfpVSIbSbXvTRR7tS19mxD7EtmVbbJi/WE= -github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db h1:mDk0bwRV6rDrLSmKXftcPf9kLA9uH6EvxJvzpPW9bso= -github.com/grafana/authlib/claims v0.0.0-20240814074258-eae7d47f01db/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A= +github.com/grafana/authlib v0.0.0-20240828122726-9edfcbea43e2 h1:SU+p1ck8037cz6F8W38PIL9MzRb6YMeNqc7+GHDuqiU= +github.com/grafana/authlib v0.0.0-20240828122726-9edfcbea43e2/go.mod h1:PFzXbCrn0GIpN4KwT6NP1l5Z1CPLfmKHnYx8rZzQcyY= +github.com/grafana/authlib/claims v0.0.0-20240828122726-9edfcbea43e2 h1:YTF1Y1BYCDkD7ssmbhzRqXlxevsYpXPmOnoO8qbOue8= +github.com/grafana/authlib/claims v0.0.0-20240828122726-9edfcbea43e2/go.mod h1:r+F8H6awwjNQt/KPZ2GNwjk8TvsJ7/gxzkXN26GlL/A= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240808164224-787abccfbc9e h1:3vNpomyzv714Hgls5vn+fC0vgv8wUOSHepUl7PB5nUs= github.com/grafana/grafana/pkg/apimachinery v0.0.0-20240808164224-787abccfbc9e/go.mod h1:ORVFiW/KNRY52lNjkGwnFWCxNVfE97bJG2jr2fetq0I= github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.1.0 h1:pRhl55Yx1eC7BZ1N+BBWwnKaMyD8uC+34TLdndZMAKk= @@ -140,8 +140,8 @@ github.com/jhump/gopoet v0.0.0-20190322174617-17282ff210b3/go.mod h1:me9yfT6IJSl github.com/jhump/gopoet v0.1.0/go.mod h1:me9yfT6IJSlOL3FCfrg+L6yzUEZ+5jW6WHt4Sk+UPUI= github.com/jhump/goprotoc v0.5.0/go.mod h1:VrbvcYrQOrTi3i0Vf+m+oqQWk9l72mjkJCYo7UvLHRQ= github.com/jhump/protoreflect v1.11.0/go.mod h1:U7aMIjN0NWq9swDP7xDdoMfRHb35uiuTd3Z9nFXJf5E= -github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= -github.com/jhump/protoreflect v1.15.1/go.mod h1:jD/2GMKKE6OqX8qTjhADU1e6DShO+gavG9e0Q693nKo= +github.com/jhump/protoreflect v1.16.0 h1:54fZg+49widqXYQ0b+usAFHbMkBGR4PpXrsHc8+TBDg= +github.com/jhump/protoreflect v1.16.0/go.mod h1:oYPd7nPvcBw/5wlDfm/AVmU9zH9BgqGCI469pGxfj/8= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -169,13 +169,13 @@ github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTK github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.20.0 h1:jBzTZ7B099Rg24tny+qngoynol8LtVYlA2bqx3vEloI= -github.com/prometheus/client_golang v1.20.0/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.20.2 h1:5ctymQzZlyOON1666svgwn3s6IKWgfbjsejTMiXIyjg= +github.com/prometheus/client_golang v1.20.2/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= -github.com/prometheus/common v0.55.0 h1:KEi6DK7lXW/m7Ig5i47x0vRzuBsHuvJdi5ee6Y3G1dc= -github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= +github.com/prometheus/common v0.57.0 h1:Ro/rKjwdq9mZn1K5QPctzh+MA4Lp0BuYk5ZZEVhoNcY= +github.com/prometheus/common v0.57.0/go.mod h1:7uRPFSUTbfZWsJ7MHY56sqt7hLQu3bxXHDnNhl8E9qI= github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= @@ -200,16 +200,16 @@ github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9dec github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0 h1:9G6E0TXzGFVfTnawRzrPl83iHOAV7L8NJiR8RSGYV1g= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 h1:4K4tsIXefpVJtvA/8srF4V4y0akAoPHkIslgAkjixJA= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1:jjdQuTGVsXV4vSs+CJ2qYDeDPf9yIJV23qlIzBm73Vg= -go.opentelemetry.io/otel v1.28.0 h1:/SqNcYk+idO0CxKEUOtKQClMK/MimZihKYMruSMViUo= -go.opentelemetry.io/otel v1.28.0/go.mod h1:q68ijF8Fc8CnMHKyzqL6akLO46ePnjkgfIMIjUIX9z4= -go.opentelemetry.io/otel/metric v1.28.0 h1:f0HGvSl1KRAU1DLgLGFjrwVyismPlnuU6JD6bOeuA5Q= -go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= -go.opentelemetry.io/otel/trace v1.28.0 h1:GhQ9cUuQGmNDd5BTCP2dAvv75RdMxEfTmYejp+lkx9g= -go.opentelemetry.io/otel/trace v1.28.0/go.mod h1:jPyXzNPg6da9+38HEwElrQiHlVMTnVfM3/yv2OlIHaI= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= +go.opentelemetry.io/otel v1.29.0 h1:PdomN/Al4q/lN6iBJEN3AwPvUiHPMlt93c8bqTG5Llw= +go.opentelemetry.io/otel v1.29.0/go.mod h1:N/WtXPs1CNCUEx+Agz5uouwCba+i+bJGFicT8SR4NP8= +go.opentelemetry.io/otel/metric v1.29.0 h1:vPf/HFWTNkPu1aYeIsc98l4ktOQaL6LeSoeV2g+8YLc= +go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= +go.opentelemetry.io/otel/trace v1.29.0 h1:J/8ZNK4XgR7a21DZUAsbF8pZ5Jcw1VhACmnYt39JTi4= +go.opentelemetry.io/otel/trace v1.29.0/go.mod h1:eHl3w0sp3paPkYstJOmAimxhiFXPg+MMTlEh3nsQgWQ= gocloud.dev v0.39.0 h1:EYABYGhAalPUaMrbSKOr5lejxoxvXj99nE8XFtsDgds= gocloud.dev v0.39.0/go.mod h1:drz+VyYNBvrMTW0KZiBAYEdl8lbNZx+OQ7oQvdrFmSQ= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -301,27 +301,27 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9 h1:LLhsEBxRTBLuKlQxFBYUOU8xyFgXv6cOTp2HASDlsDk= golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -google.golang.org/api v0.191.0 h1:cJcF09Z+4HAB2t5qTQM1ZtfL/PemsLFkcFG67qq2afk= -google.golang.org/api v0.191.0/go.mod h1:tD5dsFGxFza0hnQveGfVk9QQYKcfp+VzgRqyXFxE0+E= +google.golang.org/api v0.195.0 h1:Ude4N8FvTKnnQJHU48RFI40jOBgIrL8Zqr3/QeST6yU= +google.golang.org/api v0.195.0/go.mod h1:DOGRWuv3P8TU8Lnz7uQc4hyNqrBpMtD9ppW3wBJurgc= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988 h1:CT2Thj5AuPV9phrYMtzX11k+XkzMGfRAet42PmoTATM= -google.golang.org/genproto v0.0.0-20240812133136-8ffd90a71988/go.mod h1:7uvplUBj4RjHAxIZ//98LzOvrQ04JBkaixRmCMI29hc= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988 h1:+/tmTy5zAieooKIXfzDm9KiA3Bv6JBwriRN9LY+yayk= -google.golang.org/genproto/googleapis/api v0.0.0-20240812133136-8ffd90a71988/go.mod h1:4+X6GvPs+25wZKbQq9qyAXrwIRExv7w0Ea6MgZLZiDM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988 h1:V71AcdLZr2p8dC9dbOIMCpqi4EmRl8wUwnJzXXLmbmc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240812133136-8ffd90a71988/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c h1:TYOEhrQMrNDTAd2rX9m+WgGr8Ku6YNuj1D7OX6rWSok= +google.golang.org/genproto v0.0.0-20240823204242-4ba0660f739c/go.mod h1:2rC5OendXvZ8wGEo/cSLheztrZDZaSoHanUcd1xtZnw= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed h1:3RgNmBoI9MZhsj3QxC+AP/qQhNwpCLOvYDYYsFrhFt0= +google.golang.org/genproto/googleapis/api v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:OCdP9MfskevB/rbYvHTsXTtKC+3bHWajPdoKgjcYkfo= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed h1:J6izYgfBXAI3xTKLgxzTmUltdYaLsuBxFCgDHWJ/eXg= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240827150818-7e3bb234dfed/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= +google.golang.org/grpc v1.66.0 h1:DibZuoBznOxbDQxRINckZcUvnCEvrW9pcWIE2yF9r1c= +google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -356,8 +356,8 @@ k8s.io/apiserver v0.31.0 h1:p+2dgJjy+bk+B1Csz+mc2wl5gHwvNkC9QJV+w55LVrY= k8s.io/apiserver v0.31.0/go.mod h1:KI9ox5Yu902iBnnyMmy7ajonhKnkeZYJhTZ/YI+WEMk= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8 h1:pUdcCO1Lk/tbT5ztQWOBi5HBgbBP1J8+AsQnQCKsi8A= -k8s.io/utils v0.0.0-20240711033017-18e509b52bc8/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +k8s.io/utils v0.0.0-20240821151609-f90d01438635 h1:2wThSvJoW/Ncn9TmQEYXRnevZXi2duqHWf5OX9S3zjI= +k8s.io/utils v0.0.0-20240821151609-f90d01438635/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= diff --git a/pkg/tsdb/cloudwatch/metric_data_query_builder_test.go b/pkg/tsdb/cloudwatch/metric_data_query_builder_test.go index 907516f0d80d3..6f8922f3e8d91 100644 --- a/pkg/tsdb/cloudwatch/metric_data_query_builder_test.go +++ b/pkg/tsdb/cloudwatch/metric_data_query_builder_test.go @@ -264,6 +264,51 @@ func TestMetricDataQueryBuilder(t *testing.T) { assert.Equal(t, "${LABEL}|&|${PROP('Dim.InstanceId')}|&|${PROP('Dim.LoadBalancer')}", *mdq.Label) }) + t.Run("Query has multiple dimensions and an account Id", func(t *testing.T) { + query := &models.CloudWatchQuery{ + Namespace: "AWS/EC2", + MetricName: "CPUUtilization", + Dimensions: map[string][]string{ + "LoadBalancer": {"lb1", "lb2", "lb3"}, + "InstanceId": {"i-123", "*", "i-789"}, + }, + Period: 300, + Expression: "", + MatchExact: matchExact, + Statistic: "Average", + MetricQueryType: models.MetricQueryTypeSearch, + MetricEditorMode: models.MetricEditorModeBuilder, + } + + mdq, err := executor.buildMetricDataQuery(contextWithFeaturesEnabled(features.FlagCloudWatchNewLabelParsing), query) + require.NoError(t, err) + assert.Equal(t, `REMOVE_EMPTY(SEARCH('{"AWS/EC2","InstanceId","LoadBalancer"} MetricName="CPUUtilization" "LoadBalancer"=("lb1" OR "lb2" OR "lb3")', 'Average', 300))`, *mdq.Expression) + assert.Equal(t, "${LABEL}|&|${PROP('Dim.InstanceId')}|&|${PROP('Dim.LoadBalancer')}", *mdq.Label) + }) + + t.Run("Query has multiple dimensions and an account Id", func(t *testing.T) { + query := &models.CloudWatchQuery{ + Namespace: "AWS/EC2", + MetricName: "CPUUtilization", + Dimensions: map[string][]string{ + "LoadBalancer": {"lb1", "lb2", "lb3"}, + "InstanceId": {"i-123", "*", "i-789"}, + }, + Period: 300, + Expression: "", + MatchExact: matchExact, + AccountId: aws.String("some account id"), + Statistic: "Average", + MetricQueryType: models.MetricQueryTypeSearch, + MetricEditorMode: models.MetricEditorModeBuilder, + } + + mdq, err := executor.buildMetricDataQuery(contextWithFeaturesEnabled(features.FlagCloudWatchNewLabelParsing), query) + require.NoError(t, err) + assert.Equal(t, `REMOVE_EMPTY(SEARCH('{"AWS/EC2","InstanceId","LoadBalancer"} MetricName="CPUUtilization" "LoadBalancer"=("lb1" OR "lb2" OR "lb3") :aws.AccountId="some account id"', 'Average', 300))`, *mdq.Expression) + assert.Equal(t, "${LABEL}|&|${PROP('Dim.InstanceId')}|&|${PROP('Dim.LoadBalancer')}", *mdq.Label) + }) + t.Run("Query has a dimension key with a space", func(t *testing.T) { query := &models.CloudWatchQuery{ Namespace: "AWS/Kafka", @@ -465,6 +510,74 @@ func TestMetricDataQueryBuilder(t *testing.T) { assert.Equal(t, `REMOVE_EMPTY(SEARCH('Namespace="AWS/EC2" MetricName="CPUUtilization" "LoadBalancer"="lb1" "InstanceId"', 'Average', 300))`, *mdq.Expression) assert.Equal(t, "LB: ${PROP('Dim.LoadBalancer')|&|${PROP('Dim.InstanceId')}", *mdq.Label) }) + + t.Run("query has multiple dimensions and an account Id", func(t *testing.T) { + query := &models.CloudWatchQuery{ + Namespace: "AWS/EC2", + MetricName: "CPUUtilization", + Dimensions: map[string][]string{ + "LoadBalancer": {"lb1", "lb2", "lb3"}, + "InstanceId": {"i-123", "*", "i-789"}, + }, + Period: 300, + Expression: "", + MatchExact: matchExact, + Statistic: "Average", + MetricQueryType: models.MetricQueryTypeSearch, + MetricEditorMode: models.MetricEditorModeBuilder, + } + + mdq, err := executor.buildMetricDataQuery(contextWithFeaturesEnabled(features.FlagCloudWatchNewLabelParsing), query) + require.NoError(t, err) + assert.Equal(t, `REMOVE_EMPTY(SEARCH('Namespace="AWS/EC2" MetricName="CPUUtilization" "LoadBalancer"=("lb1" OR "lb2" OR "lb3") "InstanceId"', 'Average', 300))`, *mdq.Expression) + assert.Equal(t, "${LABEL}|&|${PROP('Dim.InstanceId')}|&|${PROP('Dim.LoadBalancer')}", *mdq.Label) + }) + + t.Run("query has multiple dimensions and an account Id", func(t *testing.T) { + query := &models.CloudWatchQuery{ + Namespace: "AWS/EC2", + MetricName: "CPUUtilization", + Dimensions: map[string][]string{ + "LoadBalancer": {"lb1", "lb2", "lb3"}, + "InstanceId": {"i-123", "*", "i-789"}, + }, + Period: 300, + Expression: "", + MatchExact: matchExact, + AccountId: aws.String("some account id"), + Statistic: "Average", + MetricQueryType: models.MetricQueryTypeSearch, + MetricEditorMode: models.MetricEditorModeBuilder, + } + + mdq, err := executor.buildMetricDataQuery(contextWithFeaturesEnabled(features.FlagCloudWatchNewLabelParsing), query) + require.NoError(t, err) + assert.Equal(t, `REMOVE_EMPTY(SEARCH('Namespace="AWS/EC2" MetricName="CPUUtilization" "LoadBalancer"=("lb1" OR "lb2" OR "lb3") "InstanceId" :aws.AccountId="some account id"', 'Average', 300))`, *mdq.Expression) + assert.Equal(t, "${LABEL}|&|${PROP('Dim.InstanceId')}|&|${PROP('Dim.LoadBalancer')}", *mdq.Label) + }) + + t.Run("Query has a custom label", func(t *testing.T) { + query := &models.CloudWatchQuery{ + Namespace: "AWS/EC2", + MetricName: "CPUUtilization", + Dimensions: map[string][]string{ + "LoadBalancer": {"lb1"}, + "InstanceId": {"i-123", "*", "i-789"}, + }, + Period: 300, + Expression: "", + MatchExact: matchExact, + Statistic: "Average", + Label: "LB: ${PROP('Dim.LoadBalancer')", + MetricQueryType: models.MetricQueryTypeSearch, + MetricEditorMode: models.MetricEditorModeBuilder, + } + + mdq, err := executor.buildMetricDataQuery(contextWithFeaturesEnabled(features.FlagCloudWatchNewLabelParsing), query) + require.NoError(t, err) + assert.Equal(t, `REMOVE_EMPTY(SEARCH('Namespace="AWS/EC2" MetricName="CPUUtilization" "LoadBalancer"="lb1" "InstanceId"', 'Average', 300))`, *mdq.Expression) + assert.Equal(t, "LB: ${PROP('Dim.LoadBalancer')|&|${PROP('Dim.InstanceId')}", *mdq.Label) + }) }) t.Run("Query has invalid characters in dimension values", func(t *testing.T) { diff --git a/pkg/tsdb/cloudwatch/models/api.go b/pkg/tsdb/cloudwatch/models/api.go index c54c156b12397..236e0d189ed68 100644 --- a/pkg/tsdb/cloudwatch/models/api.go +++ b/pkg/tsdb/cloudwatch/models/api.go @@ -71,3 +71,8 @@ type EC2APIProvider interface { DescribeRegionsWithContext(ctx context.Context, in *ec2.DescribeRegionsInput, opts ...request.Option) (*ec2.DescribeRegionsOutput, error) DescribeInstancesPagesWithContext(ctx context.Context, in *ec2.DescribeInstancesInput, fn func(*ec2.DescribeInstancesOutput, bool) bool, opts ...request.Option) error } + +type OAMClientProvider interface { + ListSinks(*oam.ListSinksInput) (*oam.ListSinksOutput, error) + ListAttachedLinks(*oam.ListAttachedLinksInput) (*oam.ListAttachedLinksOutput, error) +} diff --git a/pkg/tsdb/druid/column_type.go b/pkg/tsdb/druid/column_type.go new file mode 100644 index 0000000000000..d29f9b9738c5f --- /dev/null +++ b/pkg/tsdb/druid/column_type.go @@ -0,0 +1,58 @@ +package druid + +import ( + "strconv" + "strings" + "time" +) + +func detectColumnType(c *responseColumn, pos int, rows [][]interface{}) { + if len(rows) == 0 { + c.Type = ColumnString + return + } + t := map[columnType]int{"nil": 0} + maxRowsToScan := (len(rows) / 5) + 1 + for _, row := range rows[:maxRowsToScan] { + switch v := row[pos].(type) { + case string: + _, err := strconv.Atoi(v) + if err == nil { + t[ColumnInt]++ + continue + } + _, err = strconv.ParseBool(v) + if err == nil { + t[ColumnBool]++ + continue + } + // TODO is there any other timestamp format possible? + _, err = time.Parse("2006-01-02T15:04:05.000Z", v) + if err == nil { + t[ColumnTime]++ + continue + } + t[ColumnString]++ + continue + case float64: + if c.Name == "__time" || strings.Contains(strings.ToLower(c.Name), "time_") { + t[ColumnTime]++ + continue + } + t[ColumnFloat]++ + continue + case bool: + t[ColumnBool]++ + continue + } + } + key := ColumnString + maxVal := 0 + for k, v := range t { + if v > maxVal { + maxVal = v + key = k + } + } + c.Type = key +} diff --git a/pkg/tsdb/druid/druid.go b/pkg/tsdb/druid/druid.go new file mode 100644 index 0000000000000..30b2ae4bc336e --- /dev/null +++ b/pkg/tsdb/druid/druid.go @@ -0,0 +1,943 @@ +package druid + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "math" + "net/http" + "strconv" + "strings" + "time" + + "github.com/Knetic/govaluate" + "github.com/bitly/go-simplejson" + "github.com/grafadruid/go-druid" + druidquerybuilder "github.com/grafadruid/go-druid/builder" + druidquery "github.com/grafadruid/go-druid/builder/query" + "github.com/grafana/grafana-plugin-sdk-go/backend" + "github.com/grafana/grafana-plugin-sdk-go/backend/datasource" + "github.com/grafana/grafana-plugin-sdk-go/backend/instancemgmt" + "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/grafana/grafana/pkg/infra/httpclient" + "github.com/grafana/grafana/pkg/tsdb/druid/result" +) + +// Internal interval and range variables +var ( + varInterval = variableVariants("__interval") + varIntervalMs = variableVariants("__interval_ms") + varRange = variableVariants("__range") + varRangeS = variableVariants("__range_s") + varRangeMs = variableVariants("__range_ms") + varRateInterval = variableVariants("__rate_interval") +) + +func variableVariants(base string) []string { + return []string{ + fmt.Sprintf(`"${%s}"`, base), + fmt.Sprintf(`"$%s"`, base), + fmt.Sprintf(`$%s`, base), + fmt.Sprintf(`${%s}`, base), + } +} + +type druidQuery struct { + Builder map[string]interface{} `json:"builder"` + Settings map[string]interface{} `json:"settings"` +} + +type druidResponse struct { + Reference string + Columns []responseColumn + Rows [][]interface{} +} + +type columnType string + +const ( + ColumnString columnType = "string" + ColumnTime columnType = "time" + ColumnBool columnType = "bool" + ColumnInt columnType = "int" + ColumnFloat columnType = "float" +) + +type responseColumn struct { + Name string + Type columnType +} + +type druidInstanceSettings struct { + client *druid.Client + defaultQuerySettings map[string]interface{} +} + +func (s *druidInstanceSettings) Dispose() { + s.client.Close() +} + +func newDataSourceInstance(ctx context.Context, settings backend.DataSourceInstanceSettings) (instancemgmt.Instance, error) { + data, err := simplejson.NewJson(settings.JSONData) + if err != nil { + return &druidInstanceSettings{}, err + } + secureData := settings.DecryptedSecureJSONData + + var druidOpts []druid.ClientOption + if retryMax := data.Get("connection.retryableRetryMax").MustInt(-1); retryMax != -1 { + druidOpts = append(druidOpts, druid.WithRetryMax(retryMax)) + } + if retryWaitMin := data.Get("connection.retryableRetryWaitMin").MustInt(-1); retryWaitMin != -1 { + druidOpts = append(druidOpts, druid.WithRetryWaitMin(time.Duration(retryWaitMin)*time.Millisecond)) + } + if retryWaitMax := data.Get("connection.retryableRetryWaitMax").MustInt(-1); retryWaitMax != -1 { + druidOpts = append(druidOpts, druid.WithRetryWaitMax(time.Duration(retryWaitMax)*time.Millisecond)) + } + if basicAuth := data.Get("connection.basicAuth").MustBool(); basicAuth { + druidOpts = append(druidOpts, druid.WithBasicAuth(data.Get("connection.basicAuthUser").MustString(), secureData["connection.basicAuthPassword"])) + } + if skipTLS := data.Get("connection.skipTls").MustBool(); skipTLS { + druidOpts = append(druidOpts, druid.WithSkipTLSVerify()) + } + + c, err := druid.NewClient(data.Get("connection.url").MustString(), druidOpts...) + if err != nil { + return &druidInstanceSettings{}, err + } + + return &druidInstanceSettings{ + client: c, + defaultQuerySettings: prepareQuerySettings(settings.JSONData), + }, nil +} + +func prepareQuerySettings(data json.RawMessage) map[string]interface{} { + var d map[string]interface{} + settings := make(map[string]interface{}) + err := json.Unmarshal(data, &d) + if err != nil { + return settings + } + for k, v := range d { + if strings.HasPrefix(k, "query.") { + settings[strings.TrimPrefix(k, "query.")] = v + } + } + return settings +} + +func mergeSettings(settings ...map[string]interface{}) map[string]interface{} { + stg := make(map[string]interface{}) + for _, s := range settings { + for k, v := range s { + stg[k] = v + } + } + return stg +} + +func newDatasource() datasource.ServeOpts { + ds := &Service{ + im: datasource.NewInstanceManager(newDataSourceInstance), + } + + return datasource.ServeOpts{ + QueryDataHandler: ds, + CheckHealthHandler: ds, + CallResourceHandler: ds, + } +} + +type Service struct { + im instancemgmt.InstanceManager +} + +func newInstanceSettings(httpClientProvider httpclient.Provider) datasource.InstanceFactoryFunc { + return newDataSourceInstance +} + +func ProvideService(httpClientProvider httpclient.Provider) *Service { + return &Service{ + im: datasource.NewInstanceManager(newInstanceSettings(httpClientProvider)), + } +} + +func (ds *Service) CallResource(ctx context.Context, req *backend.CallResourceRequest, sender backend.CallResourceResponseSender) error { + var err error + var body interface{} + var code int + body = "Unknown error" + code = 500 + switch req.Path { + case "query-variable": + switch req.Method { + case "POST": + body, err = ds.QueryVariableData(ctx, req) + if err == nil { + code = 200 + } + default: + body = "Method not supported" + } + default: + body = "Path not supported" + } + resp := &backend.CallResourceResponse{ + Headers: map[string][]string{}, + Status: code, + } + resp.Body, err = json.Marshal(body) + if err != nil { + resp.Body = []byte("Error marshalling response") + resp.Status = 500 + } + sender.Send(resp) + return nil +} + +type grafanaMetricFindValue struct { + Value interface{} `json:"value"` + Text string `json:"text"` +} + +func (ds *Service) QueryVariableData(ctx context.Context, req *backend.CallResourceRequest) ([]grafanaMetricFindValue, error) { + s, err := ds.settings(req.PluginContext, ctx) + if err != nil { + return []grafanaMetricFindValue{}, err + } + return ds.queryVariable(req.Body, s, toHTTPHeaders(req.Headers)) +} + +func (ds *Service) queryVariable(qry []byte, s *druidInstanceSettings, headers http.Header) ([]grafanaMetricFindValue, error) { + // feature: probably implement a short (1s ? 500ms ? configurable in datasource ? beware memory: constrain size ?) life cache (druidInstanceSettings.cache ?) and early return then + response := []grafanaMetricFindValue{} + q, stg, err := ds.prepareQuery(qry, s) + if err != nil { + return response, err + } + r, err := ds.oldExecuteQuery("variable", q, s, stg, headers) + if err != nil { + return response, err + } + response, err = ds.prepareVariableResponse(r, stg) + return response, err +} + +func (ds *Service) prepareVariableResponse(resp *druidResponse, settings map[string]interface{}) ([]grafanaMetricFindValue, error) { + // refactor: probably some method that returns a container (make([]whattypeever, 0)) and its related appender func based on column type) + response := []grafanaMetricFindValue{} + for ic, c := range resp.Columns { + for _, r := range resp.Rows { + switch c.Type { + case "string": + if r[ic] != nil { + response = append(response, grafanaMetricFindValue{Value: r[ic].(string), Text: r[ic].(string)}) + } + case "float": + if r[ic] != nil { + response = append(response, grafanaMetricFindValue{Value: r[ic].(float64), Text: fmt.Sprintf("%f", r[ic].(float64))}) + } + case "int": + if r[ic] != nil { + i, err := strconv.Atoi(r[ic].(string)) + if err != nil { + i = 0 + } + response = append(response, grafanaMetricFindValue{Value: i, Text: r[ic].(string)}) + } + case "bool": + var b bool + var err error + b, ok := r[ic].(bool) + if !ok { + b, err = strconv.ParseBool(r[ic].(string)) + if err != nil { + b = false + } + } + var i int + if b { + i = 1 + } else { + i = 0 + } + response = append(response, grafanaMetricFindValue{Value: i, Text: strconv.FormatBool(b)}) + case "time": + var t time.Time + var err error + if r[ic] == nil { + r[ic] = 0.0 + } + switch r[ic].(type) { + case string: + t, err = time.Parse("2006-01-02T15:04:05.000Z", r[ic].(string)) + if err != nil { + t = time.Now() + } + case float64: + sec, dec := math.Modf(r[ic].(float64) / 1000) + t = time.Unix(int64(sec), int64(dec*(1e9))) + } + response = append(response, grafanaMetricFindValue{Value: t.Unix(), Text: t.Format(time.UnixDate)}) + } + } + } + return response, nil +} + +func (ds *Service) CheckHealth(ctx context.Context, req *backend.CheckHealthRequest) (*backend.CheckHealthResult, error) { + result := &backend.CheckHealthResult{ + Status: backend.HealthStatusError, + Message: "Can't connect to Druid", + } + + i, err := ds.im.Get(ctx, req.PluginContext) + if err != nil { + result.Message = "Can't get Druid instance" + return result, nil + } + + status, _, err := i.(*druidInstanceSettings).client.Common().Status() + if err != nil { + result.Message = "Can't fetch Druid status" + return result, nil + } + + result.Status = backend.HealthStatusOk + result.Message = fmt.Sprintf("Succesfully connected to Druid %s", status.Version) + return result, nil +} + +func (ds *Service) QueryData(ctx context.Context, req *backend.QueryDataRequest) (*backend.QueryDataResponse, error) { + response := backend.NewQueryDataResponse() + s, err := ds.settings(req.PluginContext, ctx) + if err != nil { + return response, err + } + + for _, q := range req.Queries { + response.Responses[q.RefID] = ds.query(q, s, toHTTPHeaders(req.Headers)) + } + + return response, nil +} + +func toHTTPHeaders(rawOriginal interface{}) http.Header { + headers := http.Header{} + switch original := rawOriginal.(type) { + case map[string]string: + for k, v := range original { + // This is temporary fix. List of allowed headers should be configurable. + if k != "Cookie" { + continue + } + headers.Set(k, v) + } + case map[string][]string: + for k, vv := range original { + // This is temporary fix. List of allowed headers should be configurable. + if k != "Cookie" { + continue + } + for _, v := range vv { + headers.Set(k, v) + } + } + } + return headers +} + +func (ds *Service) settings(ctx backend.PluginContext, getCtx context.Context) (*druidInstanceSettings, error) { + s, err := ds.im.Get(getCtx, ctx) + if err != nil { + return nil, err + } + return s.(*druidInstanceSettings), nil +} + +func (ds *Service) query(qry backend.DataQuery, s *druidInstanceSettings, headers http.Header) backend.DataResponse { + rawQuery := interpolateVariables(string(qry.JSON), qry.Interval, qry.TimeRange.Duration()) + + // feature: probably implement a short (1s ? 500ms ? configurable in datasource ? beware memory: constrain size ?) life cache (druidInstanceSettings.cache ?) and early return then + response := backend.DataResponse{} + q, stg, err := ds.prepareQuery([]byte(rawQuery), s) + if err != nil { + response.Error = err + return response + } + r, err := ds.executeQuery(qry.RefID, q, s, stg, headers) + if err != nil { + response.Error = err + return response + } + response, err = ds.prepareResponse(r, stg) + if err != nil { + // note: error could be set from prepareResponse but this gives a chance to react to error here + response.Error = err + } + return response +} + +func interpolateVariables(expr string, interval time.Duration, timeRange time.Duration) string { + rangeMs := timeRange.Milliseconds() + rangeSRounded := int64(math.Round(float64(rangeMs) / 1000.0)) + + expr = multiReplace(expr, varIntervalMs, strconv.FormatInt(int64(interval/time.Millisecond), 10)) + expr = multiReplace(expr, varInterval, formatDuration(interval)) + expr = multiReplace(expr, varRangeMs, strconv.FormatInt(rangeMs, 10)) + expr = multiReplace(expr, varRangeS, strconv.FormatInt(rangeSRounded, 10)) + expr = multiReplace(expr, varRange, strconv.FormatInt(rangeSRounded, 10)+"s") + expr = multiReplace(expr, varRateInterval, interval.String()) + + return expr +} + +func multiReplace(s string, olds []string, new string) string { + res := s + for _, old := range olds { + res = strings.ReplaceAll(res, old, new) + } + return res +} + +func formatDuration(inter time.Duration) string { + day := time.Hour * 24 + year := day * 365 + if inter >= year { + return fmt.Sprintf("%dy", inter/year) + } + + if inter >= day { + return fmt.Sprintf("%dd", inter/day) + } + + if inter >= time.Hour { + return fmt.Sprintf("%dh", inter/time.Hour) + } + + if inter >= time.Minute { + return fmt.Sprintf("%dm", inter/time.Minute) + } + + if inter >= time.Second { + return fmt.Sprintf("%ds", inter/time.Second) + } + + if inter >= time.Millisecond { + return fmt.Sprintf("%dms", inter/time.Millisecond) + } + + return "1ms" +} + +func (ds *Service) prepareQuery(qry []byte, s *druidInstanceSettings) (druidquerybuilder.Query, map[string]interface{}, error) { + var q druidQuery + err := json.Unmarshal(qry, &q) + if err != nil { + return nil, nil, err + } + var defaultQueryContext map[string]interface{} + if defaultContextParameters, ok := s.defaultQuerySettings["contextParameters"]; ok { + defaultQueryContext = ds.prepareQueryContext(defaultContextParameters.([]interface{})) + } + q.Builder["context"] = defaultQueryContext + if queryContextParameters, ok := q.Settings["contextParameters"]; ok { + q.Builder["context"] = mergeSettings( + defaultQueryContext, + ds.prepareQueryContext(queryContextParameters.([]interface{}))) + } + if g, ok := q.Builder["granularity"].(map[string]any); ok { + q.Builder["granularity"] = resolveGranularity(g) + } + jsonQuery, err := json.Marshal(q.Builder) + if err != nil { + return nil, nil, err + } + query, err := s.client.Query().Load(jsonQuery) + // feature: could ensure __time column is selected, time interval is set based on qry given timerange and consider max data points ? + return query, mergeSettings(s.defaultQuerySettings, q.Settings), err +} + +func resolveGranularity(m map[string]any) map[string]any { + // granularity is optional, so return early if not set and is of wrong type + if m == nil || m["type"] != "duration" { + return m + } + expr, ok := m["duration"].(string) + if !ok { + return m + } + + eval, err := govaluate.NewEvaluableExpression(expr) + if err != nil { + return m + } + result, err := eval.Evaluate(nil) + if err != nil { + return m + } + m["duration"] = result + return m +} + +func (ds *Service) prepareQueryContext(parameters []interface{}) map[string]interface{} { + ctx := make(map[string]interface{}) + for _, parameter := range parameters { + p := parameter.(map[string]interface{}) + ctx[p["name"].(string)] = p["value"] + } + return ctx +} + +func (ds *Service) executeQuery( + queryRef string, + q druidquerybuilder.Query, + s *druidInstanceSettings, + settings map[string]interface{}, + headers http.Header, +) (*data.Frame, error) { + var resultFramer result.Framer + qtyp := q.Type() + switch qtyp { + case "sql": + q.(*druidquery.SQL).SetResultFormat("array").SetHeader(true) + return nil, errors.New("not implemented") + case "timeseries": + var r result.TimeseriesResult + _, err := s.client.Query().Execute(q, &r, headers) + if err != nil { + return nil, fmt.Errorf("Query error: %w", err) + } + resultFramer = &r + case "topN": + var r result.TopNResult + _, err := s.client.Query().Execute(q, &r, headers) + if err != nil { + return nil, fmt.Errorf("Query error: %w", err) + } + resultFramer = &r + case "groupBy": + var r result.GroupByResult + _, err := s.client.Query().Execute(q, &r, headers) + if err != nil { + return nil, fmt.Errorf("Query error: %w", err) + } + resultFramer = &r + case "scan": + q.(*druidquery.Scan).SetResultFormat("compactedList") + return nil, errors.New("not implemented") + case "search": + return nil, errors.New("not implemented") + case "timeBoundary": + return nil, errors.New("not implemented") + case "dataSourceMetadata": + return nil, errors.New("not implemented") + case "segmentMetadata": + return nil, errors.New("not implemented") + default: + return nil, errors.New("unknown query type") + } + f := resultFramer.Frame() + f.Name = queryRef + return f, nil +} + +func (ds *Service) oldExecuteQuery(queryRef string, q druidquerybuilder.Query, s *druidInstanceSettings, settings map[string]interface{}, headers http.Header) (*druidResponse, error) { + // refactor: probably need to extract per-query preprocessor and postprocessor into a per-query file. load those "plugins" (ak. QueryProcessor ?) into a register and then do something like plugins[q.Type()].preprocess(q) and plugins[q.Type()].postprocess(r) + r := &druidResponse{Reference: queryRef} + qtyp := q.Type() + switch qtyp { + case "sql": + q.(*druidquery.SQL).SetResultFormat("array").SetHeader(true) + case "scan": + q.(*druidquery.Scan).SetResultFormat("compactedList") + } + var res json.RawMessage + _, err := s.client.Query().Execute(q, &res, headers) + if err != nil { + return r, err + } + switch qtyp { + case "sql": + var sqlr []interface{} + err := json.Unmarshal(res, &sqlr) + if err == nil && len(sqlr) > 1 { + for _, row := range sqlr[1:] { + r.Rows = append(r.Rows, row.([]interface{})) + } + for i, c := range sqlr[0].([]interface{}) { + col := responseColumn{ + Name: c.(string), + } + detectColumnType(&col, i, r.Rows) + r.Columns = append(r.Columns, col) + } + } + case "timeseries": + var tsResult result.TimeseriesResult + err := json.Unmarshal(res, &tsResult) + if err != nil { + return r, err + } + if len(tsResult) == 0 { + return r, nil + } + columns := tsResult.Columns() + for _, result := range tsResult { + var row []interface{} + t := result.Timestamp + if t.IsZero() { + // If timestamp not set, use value from previous row. + // This can happen when grand total is calculated. + t = r.Rows[len(r.Rows)-1][0].(time.Time) + } + row = append(row, t) + colResults := result.Result + for _, c := range columns[1:] { + row = append(row, colResults[c]) + } + r.Rows = append(r.Rows, row) + } + for i, c := range columns { + col := responseColumn{ + Name: c, + } + detectColumnType(&col, i, r.Rows) + r.Columns = append(r.Columns, col) + } + case "topN": + var tn []map[string]interface{} + err := json.Unmarshal(res, &tn) + if err == nil && len(tn) > 0 { + columns := []string{"timestamp"} + results := tn[0]["result"].([]interface{}) + if len(results) > 0 { + for c := range results[0].(map[string]interface{}) { + columns = append(columns, c) + } + } + for _, result := range tn { + for _, record := range result["result"].([]interface{}) { + var row []interface{} + row = append(row, result["timestamp"]) + o := record.(map[string]interface{}) + for _, c := range columns[1:] { + row = append(row, o[c]) + } + r.Rows = append(r.Rows, row) + } + } + for i, c := range columns { + col := responseColumn{ + Name: c, + } + detectColumnType(&col, i, r.Rows) + r.Columns = append(r.Columns, col) + } + } + case "groupBy": + var gb []map[string]interface{} + err := json.Unmarshal(res, &gb) + if err == nil && len(gb) > 0 { + columns := []string{"timestamp"} + for c := range gb[0]["event"].(map[string]interface{}) { + columns = append(columns, c) + } + for _, result := range gb { + var row []interface{} + row = append(row, result["timestamp"]) + colResults := result["event"].(map[string]interface{}) + for _, c := range columns[1:] { + row = append(row, colResults[c]) + } + r.Rows = append(r.Rows, row) + } + for i, c := range columns { + col := responseColumn{ + Name: c, + } + detectColumnType(&col, i, r.Rows) + r.Columns = append(r.Columns, col) + } + } + case "scan": + var scanr []map[string]interface{} + err := json.Unmarshal(res, &scanr) + if err == nil && len(scanr) > 0 { + for _, e := range scanr[0]["events"].([]interface{}) { + r.Rows = append(r.Rows, e.([]interface{})) + } + for i, c := range scanr[0]["columns"].([]interface{}) { + col := responseColumn{ + Name: c.(string), + } + detectColumnType(&col, i, r.Rows) + r.Columns = append(r.Columns, col) + } + } + case "search": + var s []map[string]interface{} + err := json.Unmarshal(res, &s) + if err == nil && len(s) > 0 { + columns := []string{"timestamp"} + for c := range s[0]["result"].([]interface{})[0].(map[string]interface{}) { + columns = append(columns, c) + } + for _, result := range s { + for _, record := range result["result"].([]interface{}) { + var row []interface{} + row = append(row, result["timestamp"]) + o := record.(map[string]interface{}) + for _, c := range columns[1:] { + row = append(row, o[c]) + } + r.Rows = append(r.Rows, row) + } + } + for i, c := range columns { + col := responseColumn{ + Name: c, + } + detectColumnType(&col, i, r.Rows) + r.Columns = append(r.Columns, col) + } + } + case "timeBoundary": + var tb []map[string]interface{} + err := json.Unmarshal(res, &tb) + if err == nil && len(tb) > 0 { + columns := []string{"timestamp"} + for c := range tb[0]["result"].(map[string]interface{}) { + columns = append(columns, c) + } + for _, result := range tb { + var row []interface{} + row = append(row, result["timestamp"]) + colResults := result["result"].(map[string]interface{}) + for _, c := range columns[1:] { + row = append(row, colResults[c]) + } + r.Rows = append(r.Rows, row) + } + for i, c := range columns { + col := responseColumn{ + Name: c, + } + detectColumnType(&col, i, r.Rows) + r.Columns = append(r.Columns, col) + } + } + case "dataSourceMetadata": + var dsm []map[string]interface{} + err := json.Unmarshal(res, &dsm) + if err == nil && len(dsm) > 0 { + columns := []string{"timestamp"} + for c := range dsm[0]["result"].(map[string]interface{}) { + columns = append(columns, c) + } + for _, result := range dsm { + var row []interface{} + row = append(row, result["timestamp"]) + colResults := result["result"].(map[string]interface{}) + for _, c := range columns[1:] { + row = append(row, colResults[c]) + } + r.Rows = append(r.Rows, row) + } + for i, c := range columns { + col := responseColumn{ + Name: c, + } + detectColumnType(&col, i, r.Rows) + r.Columns = append(r.Columns, col) + } + } + case "segmentMetadata": + var sm []map[string]interface{} + err := json.Unmarshal(res, &sm) + if err == nil && len(sm) > 0 { + var columns []string + switch settings["view"].(string) { + case "base": + for k, v := range sm[0] { + if k != "aggregators" && k != "columns" && k != "timestampSpec" { + if k == "intervals" { + for i := range v.([]interface{}) { + pos := strconv.Itoa(i) + columns = append(columns, "interval_start_"+pos) + columns = append(columns, "interval_stop_"+pos) + } + } else { + columns = append(columns, k) + } + } + } + for _, result := range sm { + var row []interface{} + for _, c := range columns { + var col interface{} + if strings.HasPrefix(c, "interval_") { + parts := strings.Split(c, "_") + pos := 0 + if parts[1] == "stop" { + pos = 1 + } + idx, err := strconv.Atoi(parts[2]) + if err != nil { + return r, errors.New("interval parsing goes wrong") + } + ii := result["intervals"].([]interface{})[idx] + col = strings.Split(ii.(string), "/")[pos] + } else { + col = result[c] + } + row = append(row, col) + } + r.Rows = append(r.Rows, row) + } + case "aggregators": + for _, v := range sm[0]["aggregators"].(map[string]interface{}) { + columns = append(columns, "aggregator") + for k := range v.(map[string]interface{}) { + columns = append(columns, k) + } + break + } + for _, result := range sm { + for k, v := range result["aggregators"].(map[string]interface{}) { + var row []interface{} + for _, c := range columns { + var col interface{} + if c == "aggregator" { + col = k + } else { + col = v.(map[string]interface{})[c] + } + row = append(row, col) + } + r.Rows = append(r.Rows, row) + } + } + case "columns": + for _, v := range sm[0]["columns"].(map[string]interface{}) { + columns = append(columns, "column") + for k := range v.(map[string]interface{}) { + columns = append(columns, k) + } + break + } + for _, result := range sm { + for k, v := range result["columns"].(map[string]interface{}) { + var row []interface{} + for _, c := range columns { + var col interface{} + if c == "column" { + col = k + } else { + col = v.(map[string]interface{})[c] + } + row = append(row, col) + } + r.Rows = append(r.Rows, row) + } + } + case "timestampspec": + for k := range sm[0]["timestampSpec"].(map[string]interface{}) { + columns = append(columns, k) + } + for _, result := range sm { + var row []interface{} + for _, c := range columns { + col := result["timestampSpec"].(map[string]interface{})[c] + row = append(row, col) + } + r.Rows = append(r.Rows, row) + } + } + for i, c := range columns { + col := responseColumn{ + Name: c, + } + detectColumnType(&col, i, r.Rows) + r.Columns = append(r.Columns, col) + } + + } + default: + return r, errors.New("unknown query type") + } + return r, err +} + +func (ds *Service) prepareResponse(frame *data.Frame, settings map[string]interface{}) (backend.DataResponse, error) { + // refactor: probably some method that returns a container (make([]whattypeever, 0)) and its related appender func based on column type) + response := backend.DataResponse{} + // TODO support those settings + // hideEmptyColumns, _ := settings["hideEmptyColumns"].(bool) + // responseLimit, _ := settings["responseLimit"].(float64) + format, found := settings["format"] + if !found { + format = "long" + } else { + format = format.(string) + } + // convert to other formats if specified + if format == "wide" && len(frame.Fields) > 0 { + f, err := data.LongToWide(frame, nil) + if err == nil { + frame = f + } + } else if format == "log" && len(frame.Fields) > 0 { + f, err := longToLog(frame, settings) + if err == nil { + frame = f + } + } + response.Frames = append(response.Frames, frame) + return response, nil +} + +func longToLog(longFrame *data.Frame, settings map[string]interface{}) (*data.Frame, error) { + logFrame := data.NewFrame("response") + logFrame.SetMeta(&data.FrameMeta{PreferredVisualization: data.VisTypeLogs}) + // fetch settings + logColumnTime, found := settings["logColumnTime"] + if !found { + logColumnTime = "__time" + } else { + logColumnTime = logColumnTime.(string) + } + logColumnLevel, found := settings["logColumnLevel"] + if !found { + logColumnLevel = "level" + } else { + logColumnLevel = logColumnLevel.(string) + } + logColumnMessage, found := settings["logColumnMessage"] + if !found { + logColumnMessage = "message" + } else { + logColumnMessage = logColumnMessage.(string) + } + // make sure the special time and message fields come first in the frame because that's how + // the log ui decides what time and message to display + for _, f := range longFrame.Fields { + if f.Name == logColumnTime || f.Name == logColumnMessage { + logFrame.Fields = append(logFrame.Fields, f) + } + } + // now copy over the rest of the fields + for _, f := range longFrame.Fields { + if f.Name == logColumnTime { + // skip because time already copied above. does not skip message because we want it + // included twice since otherwise it won't be available as a detected field + continue + } else if f.Name == logColumnLevel { + f.Name = "level" + } + logFrame.Fields = append(logFrame.Fields, f) + } + return logFrame, nil +} diff --git a/pkg/tsdb/druid/druid_test.go b/pkg/tsdb/druid/druid_test.go new file mode 100644 index 0000000000000..2b1b41a9956b0 --- /dev/null +++ b/pkg/tsdb/druid/druid_test.go @@ -0,0 +1,21 @@ +package druid + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestResolveGranularity(t *testing.T) { + granularity := map[string]any{ + "type": "duration", + "duration": "10 * 10", + "origin": "2012-01-01T00:30:00Z", + } + gran := resolveGranularity(granularity) + assert.Equal(t, gran, map[string]any{ + "type": "duration", + "duration": 100, + "origin": "2012-01-01T00:30:00Z", + }) +} diff --git a/pkg/tsdb/druid/result/common.go b/pkg/tsdb/druid/result/common.go new file mode 100644 index 0000000000000..5d15a866c8d6b --- /dev/null +++ b/pkg/tsdb/druid/result/common.go @@ -0,0 +1,82 @@ +package result + +import ( + "fmt" + "time" + + "github.com/grafana/grafana-plugin-sdk-go/backend/log" + "github.com/grafana/grafana-plugin-sdk-go/data" +) + +type Framer interface { + Frame() *data.Frame +} + +const timestampColumn = "timestamp" + +func toTypedResults(raw []interface{}) interface{} { + // TODO this is not perfect. Maybe we should get this from the query? + switch raw[0].(type) { + // TODO this can be done with generics, but we should wait until go is updated in this repo + case string: + results := make([]string, len(raw)) + for i, v := range raw { + vv, _ := v.(string) + results[i] = vv + } + return results + case int: + results := make([]int, len(raw)) + for i, v := range raw { + vv, _ := v.(int) + results[i] = vv + } + return results + case int32: + results := make([]int32, len(raw)) + for i, v := range raw { + vv, _ := v.(int32) + results[i] = vv + } + return results + case int64: + results := make([]int64, len(raw)) + for i, v := range raw { + vv, _ := v.(int64) + results[i] = vv + } + return results + case float32: + results := make([]float32, len(raw)) + for i, v := range raw { + vv, _ := v.(float32) + results[i] = vv + } + return results + case float64: + results := make([]float64, len(raw)) + for i, v := range raw { + vv, _ := v.(float64) + results[i] = vv + } + return results + case bool: + results := make([]bool, len(raw)) + for i, v := range raw { + vv, _ := v.(bool) + results[i] = vv + } + return results + case time.Time: + results := make([]time.Time, len(raw)) + for i, v := range raw { + vv, _ := v.(time.Time) + results[i] = vv + } + return results + default: + // TODO better error handling + log.DefaultLogger.Debug(fmt.Sprintf("Unsupported type %T", raw[0])) + return nil + } +} diff --git a/pkg/tsdb/druid/result/groupby.go b/pkg/tsdb/druid/result/groupby.go new file mode 100644 index 0000000000000..e3cb2a49b9472 --- /dev/null +++ b/pkg/tsdb/druid/result/groupby.go @@ -0,0 +1,74 @@ +package result + +import ( + "sort" + "time" + + "github.com/grafana/grafana-plugin-sdk-go/data" +) + +type GroupByResult []GroupByRecord + +// Frame returns data formatted as Grafana Frame. +func (t *GroupByResult) Frame() *data.Frame { + columns := t.Columns() + fields := make([]*data.Field, len(columns)) + for i, column := range columns { + labels := data.Labels{} + fields[i] = data.NewField(column, labels, t.Values(column)) + } + return data.NewFrame("", fields...) +} + +// Columns returns list of columns. It calls `Columns()` on first record. If +// no records are available it returns nil. +func (t *GroupByResult) Columns() []string { + for _, r := range *t { + return r.Columns() + } + return nil +} + +// Values returns all values for given column. +func (t *GroupByResult) Values(column string) interface{} { + if len(*t) == 0 { + return nil + } + results := make([]interface{}, len(*t)) + for i, r := range *t { + results[i] = r.Value(column) + } + return toTypedResults(results) +} + +type GroupByRecord struct { + Timestamp time.Time `json:"timestamp"` + Event map[string]interface{} `json:"event"` +} + +// Columns returns list of columns for given record. +// The first column will always be "timestamp" followed by other columns sorted +// alphabetically. +func (t *GroupByRecord) Columns() []string { + columns := make([]string, len(t.Event)+1) + columns[0] = timestampColumn + i := 1 + for c := range t.Event { + columns[i] = c + i++ + } + sort.Strings(columns[1:]) + return columns +} + +// Value returns value for given column. +func (t *GroupByRecord) Value(column string) interface{} { + if column == timestampColumn { + return t.Timestamp + } + v, ok := t.Event[column] + if !ok { + return nil + } + return v +} diff --git a/pkg/tsdb/druid/result/groupby_test.go b/pkg/tsdb/druid/result/groupby_test.go new file mode 100644 index 0000000000000..80cc4cb335b67 --- /dev/null +++ b/pkg/tsdb/druid/result/groupby_test.go @@ -0,0 +1,60 @@ +package result + +import ( + "encoding/json" + "testing" + "time" + + "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/stretchr/testify/assert" +) + +func TestGroupByResultUnmarshal(t *testing.T) { + input := []byte(`[ + { + "timestamp": "2022-10-14T08:08:10.000Z", + "event": { + "dog_count": 47, + "dog_rate": 2.083, + "dog_name": "foo" + } + }, + { + "timestamp": "2022-10-14T08:08:11.000Z", + "event": { + "dog_count": 75, + "dog_rate": 3.846, + "dog_name": "bar" + } + } + ]`) + + var res GroupByResult + err := json.Unmarshal(input, &res) + assert.Nil(t, err, "Failed to unmarshal response") + assert.Equal(t, len(res), 2, "Wrong number of unmarshalled results") + frame := res.Frame() + assert.Equal(t, len(frame.Fields), 4, "Wrong number of framed fields") + + assert.Equal(t, frame.Fields[0].Name, "timestamp") + assert.Equal(t, frame.Fields[0].Type(), data.FieldTypeTime) + assert.Equal(t, frame.Fields[0].Len(), 2) + assert.Equal(t, frame.Fields[0].At(0), time.Time(time.Date(2022, time.October, 14, 8, 8, 10, 0, time.UTC))) + assert.Equal(t, frame.Fields[0].At(1), time.Time(time.Date(2022, time.October, 14, 8, 8, 11, 0, time.UTC))) + + assert.Equal(t, frame.Fields[1].Name, "dog_count") + assert.Equal(t, frame.Fields[1].Type(), data.FieldTypeFloat64) + assert.Equal(t, frame.Fields[1].At(0), float64(47)) + assert.Equal(t, frame.Fields[1].At(1), float64(75)) + + assert.Equal(t, frame.Fields[2].Name, "dog_name") + assert.Equal(t, frame.Fields[2].Type(), data.FieldTypeString) + assert.Equal(t, frame.Fields[2].At(0), "foo") + assert.Equal(t, frame.Fields[2].At(1), "bar") + + assert.Equal(t, frame.Fields[3].Name, "dog_rate") + assert.Equal(t, frame.Fields[3].Type(), data.FieldTypeFloat64) + assert.Equal(t, frame.Fields[3].At(0), float64(2.083)) + assert.Equal(t, frame.Fields[3].At(1), float64(3.846)) + +} diff --git a/pkg/tsdb/druid/result/timeseries.go b/pkg/tsdb/druid/result/timeseries.go new file mode 100644 index 0000000000000..ec9e20e64fa52 --- /dev/null +++ b/pkg/tsdb/druid/result/timeseries.go @@ -0,0 +1,74 @@ +package result + +import ( + "sort" + "time" + + "github.com/grafana/grafana-plugin-sdk-go/data" +) + +type TimeseriesResult []TimeseriesRecord + +// Frame returns data formatted as Grafana Frame. +func (t *TimeseriesResult) Frame() *data.Frame { + columns := t.Columns() + fields := make([]*data.Field, len(columns)) + for i, column := range columns { + labels := data.Labels{} + fields[i] = data.NewField(column, labels, t.Values(column)) + } + return data.NewFrame("", fields...) +} + +// Columns returns list of columns. It calls `Columns()` on first record. If +// no records are available it returns nil. +func (t *TimeseriesResult) Columns() []string { + for _, r := range *t { + return r.Columns() + } + return nil +} + +// Values returns all values for given column. +func (t *TimeseriesResult) Values(column string) interface{} { + if len(*t) == 0 { + return nil + } + results := make([]interface{}, len(*t)) + for i, r := range *t { + results[i] = r.Value(column) + } + return toTypedResults(results) +} + +type TimeseriesRecord struct { + Timestamp time.Time `json:"timestamp"` + Result map[string]interface{} `json:"result"` +} + +// Columns returns list of columns for given record. +// The first column will always be "timestamp" followed by other columns sorted +// alphabetically. +func (t *TimeseriesRecord) Columns() []string { + columns := make([]string, len(t.Result)+1) + columns[0] = timestampColumn + i := 1 + for c := range t.Result { + columns[i] = c + i++ + } + sort.Strings(columns[1:]) + return columns +} + +// Value returns value for given column. +func (t *TimeseriesRecord) Value(column string) interface{} { + if column == timestampColumn { + return t.Timestamp + } + v, ok := t.Result[column] + if !ok { + return nil + } + return v +} diff --git a/pkg/tsdb/druid/result/timeseries_test.go b/pkg/tsdb/druid/result/timeseries_test.go new file mode 100644 index 0000000000000..1154b0f0d522b --- /dev/null +++ b/pkg/tsdb/druid/result/timeseries_test.go @@ -0,0 +1,60 @@ +package result + +import ( + "encoding/json" + "testing" + "time" + + "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/stretchr/testify/assert" +) + +func TestTimeseriesResultUnmarshal(t *testing.T) { + input := []byte(`[ + { + "timestamp": "2022-10-14T08:08:10.000Z", + "result": { + "dog_count": 47, + "dog_rate": 2.083, + "dog_name": "foo" + } + }, + { + "timestamp": "2022-10-14T08:08:11.000Z", + "result": { + "dog_count": 75, + "dog_rate": 3.846, + "dog_name": "bar" + } + } + ]`) + + var res TimeseriesResult + err := json.Unmarshal(input, &res) + assert.Nil(t, err, "Failed to unmarshal response") + assert.Equal(t, len(res), 2, "Wrong number of unmarshalled results") + frame := res.Frame() + assert.Equal(t, len(frame.Fields), 4, "Wrong number of framed fields") + + assert.Equal(t, frame.Fields[0].Name, "timestamp") + assert.Equal(t, frame.Fields[0].Type(), data.FieldTypeTime) + assert.Equal(t, frame.Fields[0].Len(), 2) + assert.Equal(t, frame.Fields[0].At(0), time.Time(time.Date(2022, time.October, 14, 8, 8, 10, 0, time.UTC))) + assert.Equal(t, frame.Fields[0].At(1), time.Time(time.Date(2022, time.October, 14, 8, 8, 11, 0, time.UTC))) + + assert.Equal(t, frame.Fields[1].Name, "dog_count") + assert.Equal(t, frame.Fields[1].Type(), data.FieldTypeFloat64) + assert.Equal(t, frame.Fields[1].At(0), float64(47)) + assert.Equal(t, frame.Fields[1].At(1), float64(75)) + + assert.Equal(t, frame.Fields[2].Name, "dog_name") + assert.Equal(t, frame.Fields[2].Type(), data.FieldTypeString) + assert.Equal(t, frame.Fields[2].At(0), "foo") + assert.Equal(t, frame.Fields[2].At(1), "bar") + + assert.Equal(t, frame.Fields[3].Name, "dog_rate") + assert.Equal(t, frame.Fields[3].Type(), data.FieldTypeFloat64) + assert.Equal(t, frame.Fields[3].At(0), float64(2.083)) + assert.Equal(t, frame.Fields[3].At(1), float64(3.846)) + +} diff --git a/pkg/tsdb/druid/result/topn.go b/pkg/tsdb/druid/result/topn.go new file mode 100644 index 0000000000000..ba64fa7dc508b --- /dev/null +++ b/pkg/tsdb/druid/result/topn.go @@ -0,0 +1,78 @@ +package result + +import ( + "sort" + "time" + + "github.com/grafana/grafana-plugin-sdk-go/data" +) + +type TopNResult []TopNRecord + +// Frame returns data formatted as Grafana Frame. +func (t *TopNResult) Frame() *data.Frame { + columns := t.Columns() + fields := make([]*data.Field, len(columns)) + for i, column := range columns { + labels := data.Labels{} + fields[i] = data.NewField(column, labels, t.Values(column)) + } + return data.NewFrame("", fields...) +} + +// Columns returns list of columns. It calls `Columns()` on first record. If +// no records are available it returns nil. +func (t *TopNResult) Columns() []string { + for _, r := range *t { + return r.Columns() + } + return nil +} + +// Values returns all values for given column. +func (t *TopNResult) Values(column string) interface{} { + results := []interface{}{} + for _, r := range *t { + results = append(results, r.Values(column)...) + } + return toTypedResults(results) +} + +type TopNRecord struct { + Timestamp time.Time `json:"timestamp"` + Result []map[string]interface{} `json:"result"` +} + +// Columns returns list of columns for given record. +// It assumes that every map from Result has the same columns, so it gets +// the list from first item. +// The first column will always be "timestamp" followed by other columns sorted +// alphabetically. +func (t *TopNRecord) Columns() []string { + for _, result := range t.Result { + columns := make([]string, len(result)+1) + columns[0] = timestampColumn + i := 1 + for c := range result { + columns[i] = c + i++ + } + sort.Strings(columns[1:]) + return columns + } + return nil +} + +// Value returns values for given column. +func (t *TopNRecord) Values(column string) []interface{} { + values := []interface{}{} + for _, result := range t.Result { + if column == timestampColumn { + values = append(values, t.Timestamp) + continue + } + v, _ := result[column] + values = append(values, v) + } + return values +} diff --git a/pkg/tsdb/druid/result/topn_test.go b/pkg/tsdb/druid/result/topn_test.go new file mode 100644 index 0000000000000..7fb2503aae7cc --- /dev/null +++ b/pkg/tsdb/druid/result/topn_test.go @@ -0,0 +1,59 @@ +package result + +import ( + "encoding/json" + "testing" + "time" + + "github.com/grafana/grafana-plugin-sdk-go/data" + "github.com/stretchr/testify/assert" +) + +func TestTopNResultUnmarshal(t *testing.T) { + input := []byte(`[ + { + "timestamp": "2022-10-14T08:08:10.000Z", + "result": [ + { + "dog_count": 47, + "dog_rate": 2.083, + "dog_name": "foo" + }, + { + "dog_count": 75, + "dog_rate": 3.846, + "dog_name": "bar" + } + ] + } + ]`) + + var res TopNResult + err := json.Unmarshal(input, &res) + assert.Nil(t, err, "Failed to unmarshal response") + assert.Equal(t, len(res), 1, "Wrong number of unmarshalled results") + frame := res.Frame() + assert.Equal(t, len(frame.Fields), 4, "Wrong number of framed fields") + + assert.Equal(t, frame.Fields[0].Name, "timestamp") + assert.Equal(t, frame.Fields[0].Type(), data.FieldTypeTime) + assert.Equal(t, frame.Fields[0].Len(), 2) + assert.Equal(t, frame.Fields[0].At(0), time.Time(time.Date(2022, time.October, 14, 8, 8, 10, 0, time.UTC))) + assert.Equal(t, frame.Fields[0].At(1), time.Time(time.Date(2022, time.October, 14, 8, 8, 10, 0, time.UTC))) + + assert.Equal(t, frame.Fields[1].Name, "dog_count") + assert.Equal(t, frame.Fields[1].Type(), data.FieldTypeFloat64) + assert.Equal(t, frame.Fields[1].At(0), float64(47)) + assert.Equal(t, frame.Fields[1].At(1), float64(75)) + + assert.Equal(t, frame.Fields[2].Name, "dog_name") + assert.Equal(t, frame.Fields[2].Type(), data.FieldTypeString) + assert.Equal(t, frame.Fields[2].At(0), "foo") + assert.Equal(t, frame.Fields[2].At(1), "bar") + + assert.Equal(t, frame.Fields[3].Name, "dog_rate") + assert.Equal(t, frame.Fields[3].Type(), data.FieldTypeFloat64) + assert.Equal(t, frame.Fields[3].At(0), float64(2.083)) + assert.Equal(t, frame.Fields[3].At(1), float64(3.846)) + +} diff --git a/pkg/util/xorm/go.mod b/pkg/util/xorm/go.mod index 45b2e78666ad2..0980eb6993491 100644 --- a/pkg/util/xorm/go.mod +++ b/pkg/util/xorm/go.mod @@ -5,7 +5,7 @@ go 1.21.10 require ( github.com/mattn/go-sqlite3 v1.14.22 github.com/stretchr/testify v1.9.0 - xorm.io/builder v0.3.6 + xorm.io/builder v0.3.13 xorm.io/core v0.7.3 ) diff --git a/pkg/util/xorm/go.sum b/pkg/util/xorm/go.sum index 060ce3a658dc1..6afb0e24030dc 100644 --- a/pkg/util/xorm/go.sum +++ b/pkg/util/xorm/go.sum @@ -1,5 +1,7 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= +gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s= +gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -7,8 +9,6 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8Yc github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y= github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg= -github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y= -github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:56xuuqnHyryaerycW3BfssRdxQstACi0Epw/yC5E2xM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= @@ -41,7 +41,7 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EV gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -xorm.io/builder v0.3.6 h1:ha28mQ2M+TFx96Hxo+iq6tQgnkC9IZkM6D8w9sKHHF8= -xorm.io/builder v0.3.6/go.mod h1:LEFAPISnRzG+zxaxj2vPicRwz67BdhFreKg8yv8/TgU= +xorm.io/builder v0.3.13 h1:a3jmiVVL19psGeXx8GIurTp7p0IIgqeDmwhcR6BAOAo= +xorm.io/builder v0.3.13/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= xorm.io/core v0.7.3 h1:W8ws1PlrnkS1CZU1YWaYLMQcQilwAmQXU0BJDJon+H0= xorm.io/core v0.7.3/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM= diff --git a/public/app/core/components/Page/usePageTitle.ts b/public/app/core/components/Page/usePageTitle.ts index c2e53b23251dc..53a7e147ac2e1 100644 --- a/public/app/core/components/Page/usePageTitle.ts +++ b/public/app/core/components/Page/usePageTitle.ts @@ -1,6 +1,7 @@ import { useEffect } from 'react'; import { NavModel, NavModelItem } from '@grafana/data'; +import { FnGlobalState } from 'app/core/reducers/fn-slice'; import { HOME_NAV_ID } from 'app/core/reducers/navModel'; import { useSelector } from 'app/types'; @@ -8,7 +9,9 @@ import { Branding } from '../Branding/Branding'; import { buildBreadcrumbs } from '../Breadcrumbs/utils'; export function usePageTitle(navModel?: NavModel, pageNav?: NavModelItem) { - const homeNav = useSelector((state) => state.navIndex)?.[HOME_NAV_ID]; + const homeNav = useSelector((state) => state.navIndex)[HOME_NAV_ID]; + const { FNDashboard, pageTitle } = useSelector((state) => state.fnGlobalState); + useEffect(() => { const sectionNav = (navModel?.node !== navModel?.main ? navModel?.node : navModel?.main) ?? { text: 'Grafana' }; const parts: string[] = buildBreadcrumbs(sectionNav, pageNav, homeNav) @@ -18,6 +21,6 @@ export function usePageTitle(navModel?: NavModel, pageNav?: NavModelItem) { // Override `Home` with the custom brand title parts[parts.length - 1] = Branding.AppTitle; - document.title = parts.join(' - '); - }, [homeNav, navModel, pageNav]); + document.title = !FNDashboard ? parts.join(' - ') : pageTitle ? pageTitle : 'CodeRabbit'; + }, [FNDashboard, homeNav, navModel, pageNav, pageTitle]); } diff --git a/public/app/core/components/TimePicker/TimePickerWithHistory.tsx b/public/app/core/components/TimePicker/TimePickerWithHistory.tsx index 64c08d31b6703..12e351ff80443 100644 --- a/public/app/core/components/TimePicker/TimePickerWithHistory.tsx +++ b/public/app/core/components/TimePicker/TimePickerWithHistory.tsx @@ -1,9 +1,12 @@ -import { uniqBy } from 'lodash'; +import { isEqual, uniqBy } from 'lodash'; +import { CSSProperties, FC, useEffect, useRef } from 'react'; +// eslint-disable-next-line no-restricted-imports +import { useDispatch, useSelector } from 'react-redux'; -import { AppEvents, TimeRange, isDateTime, rangeUtil } from '@grafana/data'; -import { TimeRangePickerProps, TimeRangePicker } from '@grafana/ui'; -import { t } from '@grafana/ui/src/utils/i18n'; -import appEvents from 'app/core/app_events'; +import { TimeRange, isDateTime, rangeUtil } from '@grafana/data'; +import { TimeRangePickerProps, TimeRangePicker, useTheme2 } from '@grafana/ui'; +import { FnGlobalState, updatePartialFnStates } from 'app/core/reducers/fn-slice'; +import { StoreState } from 'app/types'; import { LocalStorageValueProvider } from '../LocalStorageValueProvider'; @@ -20,31 +23,66 @@ interface TimePickerHistoryItem { // We should only be storing TimePickerHistoryItem, but in the past we also stored TimeRange type LSTimePickerHistoryItem = TimePickerHistoryItem | TimeRange; -export const TimePickerWithHistory = (props: Props) => { - return ( - storageKey={LOCAL_STORAGE_KEY} defaultValue={[]}> - {(rawValues, onSaveToStore) => { - const values = migrateHistory(rawValues); - const history = deserializeHistory(values); - - return ( - { - onAppendToHistory(value, values, onSaveToStore); - props.onChange(value); - }} - onError={(error?: string) => - appEvents.emit(AppEvents.alertError, [ - t('time-picker.copy-paste.default-error-title', 'Invalid time range'), - t('time-picker.copy-paste.default-error-message', `{{error}} is not a valid time range`, { error }), - ]) - } - /> +const FnText: React.FC = () => { + const { FNDashboard } = useSelector(({ fnGlobalState }) => fnGlobalState); + const theme = useTheme2(); + + const FN_TEXT_STYLE: CSSProperties = { fontWeight: 700, fontSize: 14, marginLeft: 8 }; + + return <>{FNDashboard ? UTC : ''}; +}; + +export const TimePickerWithHistory: FC = (props) => ( + storageKey={LOCAL_STORAGE_KEY} defaultValue={[]}> + {(rawValues, onSaveToStore) => { + return ; + }} + +); + +export interface PickerProps { + rawValues: LSTimePickerHistoryItem[]; + onSaveToStore: (value: LSTimePickerHistoryItem[]) => void; + pickerProps: Props; +} + +export const Picker: FC = ({ rawValues, onSaveToStore, pickerProps }) => { + const { fnGlobalTimeRange } = useSelector(({ fnGlobalState }) => fnGlobalState); + const dispatch = useDispatch(); + + const values = migrateHistory(rawValues); + const history = deserializeHistory(values); + + const didMountRef = useRef(false); + useEffect(() => { + /* The condition below skips the first run of useeffect that happens when this component gets mounted */ + if (didMountRef.current) { + /* If the current timerange value has changed, update fnGlobalTimeRange */ + if (!isEqual(fnGlobalTimeRange?.raw, pickerProps.value.raw)) { + dispatch( + updatePartialFnStates({ + fnGlobalTimeRange: pickerProps.value, + }) ); + } + } else if (fnGlobalTimeRange && !isEqual(fnGlobalTimeRange.raw, pickerProps.value.raw)) { + /* If fnGlobalTimeRange exists in the initial render, set the time as that */ + pickerProps.onChange(fnGlobalTimeRange); + } + + didMountRef.current = true; + }, [dispatch, fnGlobalTimeRange, pickerProps]); + + return ( + { + onAppendToHistory(value, values, onSaveToStore); + pickerProps.onChange(value); }} - + fnText={} + /> ); }; diff --git a/public/app/core/internationalization/index.tsx b/public/app/core/internationalization/index.tsx index 2d31fc1d70873..006894cdfcae7 100644 --- a/public/app/core/internationalization/index.tsx +++ b/public/app/core/internationalization/index.tsx @@ -78,7 +78,7 @@ export const t = (id: string, defaultMessage: string, values?: Record>; + +export type SetFnStateAction = PayloadAction>; + +export type FnPropMappedFromState = Extract< + keyof FnGlobalState, + 'FNDashboard' | 'hiddenVariables' | 'mode' | 'uid' | 'queryParams' | 'slug' | 'version' | 'controlsContainer' +>; +export type FnStateProp = keyof FnGlobalState; + +export type FnPropsMappedFromState = Pick; + +export const fnStateProps: FnStateProp[] = [ + 'FNDashboard', + 'controlsContainer', + 'hiddenVariables', + 'mode', + 'pageTitle', + 'queryParams', + 'slug', + 'uid', + 'version', +]; + +export const fnPropsMappedFromState: readonly FnPropMappedFromState[] = [ + 'FNDashboard', + 'hiddenVariables', + 'mode', + 'uid', + 'queryParams', + 'slug', + 'version', +] as const; + +const INITIAL_MODE = GrafanaThemeType.Light; + +export const FN_STATE_KEY = 'fnGlobalState'; + +export const INITIAL_FN_STATE: FnGlobalState = { + // NOTE: initial value is false + FNDashboard: false, + uid: '', + slug: '', + version: 1, + mode: INITIAL_MODE, + controlsContainer: null, + pageTitle: '', + queryParams: {}, + hiddenVariables: [], + fnGlobalTimeRange: null, +} as const; + +const reducers: SliceCaseReducers = { + updateFnState: (state, action: SetFnStateAction) => { + return { ...state, ...action.payload }; + }, + updatePartialFnStates: (state, action: UpdateFNGlobalStateAction) => { + return { + ...state, + ...action.payload, + }; + }, +}; + +const fnSlice = createSlice, string, SliceSelectors>({ + name: FN_STATE_KEY, + initialState: INITIAL_FN_STATE, + reducers, +}); + +export const { updatePartialFnStates, updateFnState } = fnSlice.actions; +export const fnSliceReducer = fnSlice.reducer; diff --git a/public/app/core/reducers/index.ts b/public/app/core/reducers/index.ts index 6482f26c932ca..2d14820d77d62 100644 --- a/public/app/core/reducers/index.ts +++ b/public/app/core/reducers/index.ts @@ -1,4 +1,5 @@ import { appNotificationsReducer as appNotifications } from './appNotification'; +import { fnSliceReducer as fnGlobalState } from './fn-slice'; import { navTreeReducer as navBarTree } from './navBarTree'; import { navIndexReducer as navIndex } from './navModel'; @@ -6,4 +7,5 @@ export default { navBarTree, navIndex, appNotifications, + fnGlobalState, }; diff --git a/public/app/core/services/backend_srv.ts b/public/app/core/services/backend_srv.ts index 64ac099efbaf3..372170b6a72e2 100644 --- a/public/app/core/services/backend_srv.ts +++ b/public/app/core/services/backend_srv.ts @@ -65,6 +65,7 @@ export class BackendSrv implements BackendService { private readonly responseQueue: ResponseQueue; private _tokenRotationInProgress?: Observable | null = null; private deviceID?: string | null = null; + private grafanaPrefix: boolean; private dependencies: BackendSrvDependencies = { fromFetch: fromFetch, @@ -83,6 +84,7 @@ export class BackendSrv implements BackendService { }; } + this.grafanaPrefix = false; this.noBackendCache = false; this.internalFetch = this.internalFetch.bind(this); this.fetchQueue = new FetchQueue(); @@ -108,6 +110,12 @@ export class BackendSrv implements BackendService { } fetch(options: BackendSrvRequest): Observable> { + // prefix "/grafana" to options.url + if (this.grafanaPrefix) { + if (options.url.indexOf('/grafana') !== 0) { + options.url = '/grafana' + options.url; + } + } // We need to match an entry added to the queue stream with the entry that is eventually added to the response stream const id = uuidv4(); const fetchQueue = this.fetchQueue; @@ -181,6 +189,18 @@ export class BackendSrv implements BackendService { return lastValueFrom(this.fetch(options)); } + private getCodeRabbitOrg(): { id: string } | null { + const selectedOrgStorage = sessionStorage.getItem('selected_org'); + + try { + return selectedOrgStorage ? (JSON.parse(selectedOrgStorage) as { id: string }) : null; + } catch (e) { + console.error('Failed to parse selected_org', selectedOrgStorage, 'error:', e); + sessionStorage.removeItem('selected_org'); + return null; + } + } + private parseRequestOptions(options: BackendSrvRequest): BackendSrvRequest { const orgId = this.dependencies.contextSrv.user?.orgId; @@ -193,10 +213,22 @@ export class BackendSrv implements BackendService { options.headers['X-Grafana-Org-Id'] = orgId; } + const codeRabbitOrg = this.getCodeRabbitOrg(); + if (codeRabbitOrg) { + options.headers = options.headers ?? {}; + options.headers['x-coderabbit-organization'] = codeRabbitOrg.id; + } + if (options.url.startsWith('/')) { options.url = options.url.substring(1); } + const codeRabbitToken = sessionStorage.getItem('accessToken'); + if (codeRabbitToken) { + options.headers = options.headers ?? {}; + options.headers['x-coderabbit-token'] = `Bearer ${codeRabbitToken}`; + } + if (options.headers?.Authorization) { options.headers['X-DS-Authorization'] = options.headers.Authorization; delete options.headers.Authorization; @@ -516,13 +548,20 @@ export class BackendSrv implements BackendService { return getDashboardAPI().getDashboardDTO(uid); } - validateDashboard(dashboard: DashboardModel): Promise { - // support for this function will be implemented in the k8s flavored api-server - // hidden by experimental feature flag: - // config.featureToggles.showDashboardValidationWarnings - return Promise.resolve({ - isValid: false, - message: 'dashboard validation is not supported', + getDashboardByUidVersion(uid: string, version: number): Promise { + return this.get(`/api/dashboards/uid/${uid}/versions/${version}`); + } + + validateDashboard(dashboard: DashboardModel) { + // We want to send the dashboard as a JSON string (in the JSON body payload) so we can get accurate error line numbers back + const dashboardJson = JSON.stringify(dashboard, replaceJsonNulls, 2); + + return this.request({ + method: 'POST', + url: `/api/dashboards/validate`, + data: { dashboard: dashboardJson }, + showSuccessAlert: false, + showErrorAlert: false, }); } @@ -540,6 +579,10 @@ export class BackendSrv implements BackendService { showErrorAlert: false, }); } + + setGrafanaPrefix(prefix: boolean) { + this.grafanaPrefix = prefix; + } } // Used for testing and things that really need BackendSrv @@ -550,3 +593,10 @@ interface ValidateDashboardResponse { isValid: boolean; message?: string; } + +function replaceJsonNulls(key: string, value: T): T | undefined { + if (typeof value === 'number' && !isFinite(value)) { + return undefined; + } + return value; +} diff --git a/public/app/core/utils/ConfigProvider.tsx b/public/app/core/utils/ConfigProvider.tsx index 53cdc1c3fc4d7..702311aed674a 100644 --- a/public/app/core/utils/ConfigProvider.tsx +++ b/public/app/core/utils/ConfigProvider.tsx @@ -34,8 +34,8 @@ export const ThemeProvider = ({ children, value }: { children: React.ReactNode; ); }; -export const provideTheme =

(component: React.ComponentType

, theme: GrafanaTheme2) => { - return function ThemeProviderWrapper(props: P) { +export const provideTheme = (component: React.ComponentType, theme: GrafanaTheme2) => { + return function ThemeProviderWrapper(props: any) { return {React.createElement(component, { ...props })}; }; }; diff --git a/public/app/features/alerting/unified/state/actions.ts b/public/app/features/alerting/unified/state/actions.ts index 276c43a0bcca5..3927496017958 100644 --- a/public/app/features/alerting/unified/state/actions.ts +++ b/public/app/features/alerting/unified/state/actions.ts @@ -2,7 +2,6 @@ import { createAsyncThunk } from '@reduxjs/toolkit'; import { isEmpty } from 'lodash'; import { locationService } from '@grafana/runtime'; -import { logMeasurement } from '@grafana/runtime/src/utils/logging'; import { AlertManagerCortexConfig, AlertmanagerGroup, @@ -21,7 +20,12 @@ import { import { PromApplication, RulerRuleDTO, RulerRulesConfigDTO } from 'app/types/unified-alerting-dto'; import { backendSrv } from '../../../../core/services/backend_srv'; -import { withPerformanceLogging, withPromRulesMetadataLogging, withRulerRulesMetadataLogging } from '../Analytics'; +import { + logMeasurement, + withPerformanceLogging, + withPromRulesMetadataLogging, + withRulerRulesMetadataLogging, +} from '../Analytics'; import { deleteAlertManagerConfig, fetchAlertGroups, diff --git a/public/app/features/api-keys/ApiKeysPage.test.tsx b/public/app/features/api-keys/ApiKeysPage.test.tsx index 728508a14e8c7..a2ab2351547ba 100644 --- a/public/app/features/api-keys/ApiKeysPage.test.tsx +++ b/public/app/features/api-keys/ApiKeysPage.test.tsx @@ -6,6 +6,7 @@ import { ApiKey, OrgRole } from 'app/types'; import { mockToolkitActionCreator } from '../../../test/core/redux/mocks'; import { silenceConsoleOutput } from '../../../test/core/utils/silenceConsoleOutput'; +import { configureStore } from '../../store/configureStore'; import { ApiKeysPageUnconnected, Props } from './ApiKeysPage'; import { getMultipleMockKeys } from './__mocks__/apiKeysMock'; @@ -21,6 +22,7 @@ jest.mock('app/core/core', () => { }); const setup = (propOverrides: Partial) => { + const store = configureStore(); const loadApiKeysMock = jest.fn(); const deleteApiKeyMock = jest.fn(); const migrateApiKeyMock = jest.fn(); @@ -49,7 +51,7 @@ const setup = (propOverrides: Partial) => { Object.assign(props, propOverrides); const { rerender } = render( - + ); diff --git a/public/app/features/dashboard-scene/sharing/ExportButton/ExportMenu.tsx b/public/app/features/dashboard-scene/sharing/ExportButton/ExportMenu.tsx index a9b3f91b0aad7..02e99fe5ff92a 100644 --- a/public/app/features/dashboard-scene/sharing/ExportButton/ExportMenu.tsx +++ b/public/app/features/dashboard-scene/sharing/ExportButton/ExportMenu.tsx @@ -1,22 +1,16 @@ import { useCallback } from 'react'; import { selectors as e2eSelectors } from '@grafana/e2e-selectors'; -import { SceneObject } from '@grafana/scenes'; +import { locationService } from '@grafana/runtime'; import { IconName, Menu } from '@grafana/ui'; import { t } from 'app/core/internationalization'; import { getTrackingSource, shareDashboardType } from 'app/features/dashboard/components/ShareModal/utils'; import { DashboardScene } from '../../scene/DashboardScene'; import { DashboardInteractions } from '../../utils/interactions'; -import { ShareDrawer } from '../ShareDrawer/ShareDrawer'; -import { SceneShareDrawerState } from '../types'; - -import { ExportAsJson } from './ExportAsJson'; const newExportButtonSelector = e2eSelectors.pages.Dashboard.DashNav.NewExportButton.Menu; -type CustomDashboardDrawer = new (...args: SceneShareDrawerState[]) => SceneObject; - export interface ExportDrawerMenuItem { shareId: string; testId: string; @@ -34,17 +28,9 @@ export function addDashboardExportDrawerItem(item: ExportDrawerMenuItem) { } export default function ExportMenu({ dashboard }: { dashboard: DashboardScene }) { - const onMenuItemClick = useCallback( - (title: string, component: CustomDashboardDrawer) => { - const drawer = new ShareDrawer({ - title, - body: new component(), - }); - - dashboard.showModal(drawer); - }, - [dashboard] - ); + const onMenuItemClick = (shareView: string) => { + locationService.partial({ shareView }); + }; const buildMenuItems = useCallback(() => { const menuItems: ExportDrawerMenuItem[] = []; @@ -57,11 +43,11 @@ export default function ExportMenu({ dashboard }: { dashboard: DashboardScene }) icon: 'arrow', label: t('share-dashboard.menu.export-json-title', 'Export as JSON'), renderCondition: true, - onClick: () => onMenuItemClick(t('export.json.title', 'Save dashboard JSON'), ExportAsJson), + onClick: () => onMenuItemClick(shareDashboardType.export), }); return menuItems.filter((item) => item.renderCondition); - }, [onMenuItemClick]); + }, []); const onClick = (item: ExportDrawerMenuItem) => { DashboardInteractions.sharingCategoryClicked({ diff --git a/public/app/features/dashboard/components/DashNav/ShareButton.tsx b/public/app/features/dashboard/components/DashNav/ShareButton.tsx index 5a73143687e9a..5254e1c2b673d 100644 --- a/public/app/features/dashboard/components/DashNav/ShareButton.tsx +++ b/public/app/features/dashboard/components/DashNav/ShareButton.tsx @@ -1,11 +1,18 @@ +import { useContext } from 'react'; + import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { locationService } from '@grafana/runtime'; -import { Button } from '@grafana/ui'; +import { Button, ModalsContext } from '@grafana/ui'; import { Trans } from 'app/core/internationalization'; import { DashboardModel } from 'app/features/dashboard/state'; import { DashboardInteractions } from 'app/features/dashboard-scene/utils/interactions'; +import { ShareModal } from '../ShareModal'; +import { shareDashboardType } from '../ShareModal/utils'; + export const ShareButton = ({ dashboard }: { dashboard: DashboardModel }) => { + const { showModal, hideModal } = useContext(ModalsContext); + return (