diff --git a/.devcontainer/setup.py b/.devcontainer/setup.py index 829c77fb85..f57267ac07 100755 --- a/.devcontainer/setup.py +++ b/.devcontainer/setup.py @@ -1,8 +1,7 @@ -#!/usr/bin/python2 +#!/usr/bin/python3 # See CONTRIBUTING.md. -from __future__ import print_function, unicode_literals import os import subprocess import time @@ -10,7 +9,7 @@ GO_VERSION = os.getenv("GO_VERSION") if GO_VERSION is None: - raise "GO_VERSION is not set" + raise RuntimeError("GO_VERSION is not set") def run_commands(commands): @@ -25,21 +24,16 @@ def install_packages(): """Installs required and useful RPM packages.""" run_commands([ - # to install man pages - "sed -i '/nodocs/d' /etc/yum.conf", - - # reinstall with man pages - "yum reinstall -y yum rpm", - - "yum install -y gcc git make pkgconfig glibc-static \ + "dnf install -y gcc git make pkgconfig \ vim \ - ansible-lint \ mc tmux psmisc lsof which iproute \ - bash-completion bash-completion-extras \ + bash-completion \ man man-pages \ - dh-autoreconf \ openssl-devel \ - wget" + wget", + + "dnf install -y ansible-lint glibc-static --enablerepo=ol9_codeready_builder" + ]) @@ -51,7 +45,7 @@ def install_go(): "chmod +x /usr/local/bin/gimme" ]) - go_version = str(subprocess.check_output("gimme -r " + GO_VERSION, shell=True).strip()) + go_version = str(subprocess.check_output("gimme -r " + GO_VERSION, shell=True).strip().decode()) if GO_VERSION == "tip": run_commands([ @@ -105,7 +99,8 @@ def main(): make_init() # do basic setup - setup() + # TODO: fix the setup and revert + # setup() MARKER = "/tmp/devcontainer-setup-done" diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 30e1048dbb..caced98a72 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,16 +5,25 @@ updates: directory: "/" schedule: interval: "daily" + ignore: + - dependency-name: "*" + update-types: ["version-update:semver-patch"] - package-ecosystem: "gomod" directory: "/tools" schedule: interval: "daily" + ignore: + - dependency-name: "*" + update-types: ["version-update:semver-patch"] - package-ecosystem: "gomod" directory: "/api-tests/tools" schedule: interval: "daily" + ignore: + - dependency-name: "*" + update-types: ["version-update:semver-patch"] - package-ecosystem: "docker" directory: "/" @@ -45,3 +54,6 @@ updates: directory: "/cli-tests" schedule: interval: "daily" + ignore: + - dependency-name: "*" + update-types: ["version-update:semver-patch"] diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index dc57749d36..5a44a430a6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -133,7 +133,7 @@ jobs: token: ${{ secrets.GITHUB_TOKEN }} interval: 45 timeout: 1200 - ignored: "WhiteSource License Check" + ignored: "WhiteSource License Check, WhiteSource Security Check" ref: ${{ github.event.pull_request.head.sha || github.sha }} workflow_success: diff --git a/.github/workflows/managed.yml b/.github/workflows/managed.yml index ac69ccc5cd..fcb0678b44 100644 --- a/.github/workflows/managed.yml +++ b/.github/workflows/managed.yml @@ -9,14 +9,14 @@ on: pull_request: paths-ignore: - - "admin/**" - - "agent/**" - - "api-tests/**" - - "cli-tests/**" - - "docs/**" - - "qan-api2/**" - - "update/**" - - "vmproxy/**" + - 'admin/**' + - 'agent/**' + - 'api-tests/**' + - 'cli-tests/**' + - 'docs/**' + - 'qan-api2/**' + - 'update/**' + - 'vmproxy/**' jobs: test: @@ -63,26 +63,29 @@ jobs: popd && go mod download -x - name: Initialize CI environment - run: make env-compose-up + run: make env-compose-up # the container workdir is /root/go/src/github.com/percona/pmm - name: Restore Go build cache if: ${{ fromJSON(env.DEVCONTAINER_CACHE_ENABLED) }} continue-on-error: true - run: docker cp ~/.cache/go-build pmm-managed-server:/root/.cache/go-build + run: docker cp ~/.cache/go-build pmm-server:/root/.cache/go-build - name: Restore Go modules cache if: ${{ fromJSON(env.DEVCONTAINER_CACHE_ENABLED) }} continue-on-error: true - run: docker cp ~/go/pkg/mod pmm-managed-server:/root/go/pkg/mod + run: docker cp ~/go/pkg/mod pmm-server:/root/go/pkg/mod + + - name: Mark the root directory of pmm as safe + run: docker exec -i pmm-server git config --global --add safe.directory /root/go/src/github.com/percona/pmm - name: Update binaries - run: docker exec -i --workdir=/root/go/src/github.com/percona/pmm pmm-managed-server make run-managed-ci run-agent run-vmproxy + run: docker exec -i pmm-server make run-managed-ci run-agent run-vmproxy - name: Run tests - run: docker exec -i --workdir=/root/go/src/github.com/percona/pmm/managed pmm-managed-server make test-cover + run: docker exec -i pmm-server make -C managed test-cover - name: Run PMM server update test - run: docker exec -i --workdir=/root/go/src/github.com/percona/pmm/managed pmm-managed-server make test-update + run: docker exec -i pmm-server make -C managed test-update - name: Upload coverage results uses: codecov/codecov-action@v3 @@ -95,11 +98,11 @@ jobs: - name: Cache if: ${{ fromJSON(env.DEVCONTAINER_CACHE_ENABLED) }} run: | - docker exec pmm-managed-server go clean -testcache - docker exec --workdir=/root/go/src/github.com/percona/pmm/managed pmm-managed-server find . -type d -name fuzzdata -exec rm -r {} + + docker exec pmm-server go clean -testcache + docker exec pmm-server find ./managed -type d -name fuzzdata -exec rm -r {} + rm -fr ~/.cache/go-build mkdir -p ~/.cache - docker cp pmm-managed-server:/root/.cache/go-build ~/.cache/go-build + docker cp pmm-server:/root/.cache/go-build ~/.cache/go-build - name: Run debug commands on failure if: ${{ failure() }} @@ -109,4 +112,4 @@ jobs: go env pwd git status - kubectl version + kubectl version --short --output json diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index a6cf2ba771..a1ea10e660 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -45,7 +45,7 @@ jobs: uses: actions/checkout@v3 - name: Docker Up - run: docker-compose up -d + run: docker compose up -d - name: Install dev tools in container run: docker exec pmm-update-server /root/go/src/github.com/percona/pmm/update/.devcontainer/install-dev-tools.sh diff --git a/.golangci.yml b/.golangci.yml index d53f23da50..645ad885e3 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -29,6 +29,11 @@ linters-settings: godot: capital: true + period: false + scope: toplevel + exclude: + - go-sumtype:decl + - pmm-managed goimports: local-prefixes: github.com/percona/pmm @@ -45,11 +50,15 @@ linters-settings: - stdlib - github.com/charmbracelet/bubbletea.Model - github.com/percona/pmm/admin/commands.Result + - github.com/percona/pmm/agent/runner/actions.Action lll: line-length: 170 tab-width: 4 + maintidx: + under: 20 + nestif: min-complexity: 7 @@ -84,6 +93,7 @@ linters: - gochecknoglobals # mostly useless - gochecknoinits # we use init functions - gocyclo # using cyclop with the max 30 instead + - godox # we sometimes leave TODOS right in the code - goerr113 # extra work & poor benefit - golint # unmaintained, replaced by revive - gomnd # we are using numbers in many cases @@ -92,6 +102,7 @@ linters: - interfacer # deprecated - maligned # deprecated - nlreturn # too annoying + - nosnakecase # deprecated - scopelint # too many false positives - varnamelen # useless - wrapcheck # we do not use wrapping everywhere @@ -99,21 +110,10 @@ linters: # TODO: carefully review all the rules below and either fix the code # or leave disabled and provide a reason why - - paralleltest - tagliatelle - - tparallel - - gocritic - - godot - - godox - revive - - nosnakecase - paralleltest - - ireturn - gocognit - - maintidx - - interfacebloat - - gosimple - - forbidigo - errcheck # ENDTODO @@ -143,7 +143,9 @@ issues: - funlen # tests may be long - gocognit # triggered by subtests - gomnd # tests are full of magic numbers + - ireturn # we have exceptions, so need to silence them in tests - lll # tests often require long lines - - nonamedreturns # it's not critical for tests, albeit desirable + - maintidx # not critical for tests + - nonamedreturns # not critical for tests, albeit desirable - testpackage # senseless - unused # very annoying false positive: https://github.com/golangci/golangci-lint/issues/791 diff --git a/Makefile b/Makefile index 097de77dea..858336e987 100644 --- a/Makefile +++ b/Makefile @@ -23,7 +23,7 @@ env-compose-up: env-update-image docker compose up --detach --renew-anon-volumes --remove-orphans env-devcontainer: - docker exec -it --workdir=/root/go/src/github.com/percona/pmm pmm-managed-server .devcontainer/setup.py + docker exec -it --workdir=/root/go/src/github.com/percona/pmm pmm-server .devcontainer/setup.py env-down: ## Stop devcontainer COMPOSE_PROFILES=$(PROFILES) \ @@ -37,7 +37,7 @@ TARGET ?= _bash env: ## Run `make TARGET` in devcontainer (`make env TARGET=help`); TARGET defaults to bash COMPOSE_PROFILES=$(PROFILES) \ - docker exec -it --workdir=/root/go/src/github.com/percona/pmm pmm-managed-server make $(TARGET) + docker exec -it --workdir=/root/go/src/github.com/percona/pmm pmm-server make $(TARGET) update-dbaas-catalog: ## Update the DBaaS catalog from the latest production branch (percona-platform). wget https://raw.githubusercontent.com/percona/dbaas-catalog/percona-platform/percona-dbaas-catalog.yaml -O managed/data/crds/olm/percona-dbaas-catalog.yaml diff --git a/admin/commands/inventory/add_agent_qan_mysql_perfschema_agent.go b/admin/commands/inventory/add_agent_qan_mysql_perfschema_agent.go index 3195a93e5a..cf8939fc6f 100644 --- a/admin/commands/inventory/add_agent_qan_mysql_perfschema_agent.go +++ b/admin/commands/inventory/add_agent_qan_mysql_perfschema_agent.go @@ -60,6 +60,7 @@ type AddAgentQANMySQLPerfSchemaAgentCommand struct { Password string `help:"MySQL password for scraping metrics"` CustomLabels map[string]string `mapsep:"," help:"Custom user-assigned labels"` SkipConnectionCheck bool `help:"Skip connection check"` + CommentsParsing string `enum:"on,off" default:"off" help:"Enable/disable parsing comments from queries. One of: [on, off]"` MaxQueryLength int32 `placeholder:"NUMBER" help:"Limit query length in QAN (default: server-defined; -1: no limit)"` DisableQueryExamples bool `name:"disable-queryexamples" help:"Disable collection of query examples"` TLS bool `help:"Use TLS to connect to the database"` @@ -94,22 +95,28 @@ func (cmd *AddAgentQANMySQLPerfSchemaAgentCommand) RunCmd() (commands.Result, er } } + disableCommentsParsing := true + if cmd.CommentsParsing == "on" { + disableCommentsParsing = false + } + params := &agents.AddQANMySQLPerfSchemaAgentParams{ Body: agents.AddQANMySQLPerfSchemaAgentBody{ - PMMAgentID: cmd.PMMAgentID, - ServiceID: cmd.ServiceID, - Username: cmd.Username, - Password: cmd.Password, - CustomLabels: customLabels, - SkipConnectionCheck: cmd.SkipConnectionCheck, - MaxQueryLength: cmd.MaxQueryLength, - DisableQueryExamples: cmd.DisableQueryExamples, - TLS: cmd.TLS, - TLSSkipVerify: cmd.TLSSkipVerify, - TLSCa: tlsCa, - TLSCert: tlsCert, - TLSKey: tlsKey, - LogLevel: &cmd.LogLevel, + PMMAgentID: cmd.PMMAgentID, + ServiceID: cmd.ServiceID, + Username: cmd.Username, + Password: cmd.Password, + CustomLabels: customLabels, + SkipConnectionCheck: cmd.SkipConnectionCheck, + DisableCommentsParsing: disableCommentsParsing, + MaxQueryLength: cmd.MaxQueryLength, + DisableQueryExamples: cmd.DisableQueryExamples, + TLS: cmd.TLS, + TLSSkipVerify: cmd.TLSSkipVerify, + TLSCa: tlsCa, + TLSCert: tlsCert, + TLSKey: tlsKey, + LogLevel: &cmd.LogLevel, }, Context: commands.Ctx, } diff --git a/admin/commands/inventory/add_agent_qan_mysql_slowlog_agent.go b/admin/commands/inventory/add_agent_qan_mysql_slowlog_agent.go index 9030cf631b..c74af0a3c7 100644 --- a/admin/commands/inventory/add_agent_qan_mysql_slowlog_agent.go +++ b/admin/commands/inventory/add_agent_qan_mysql_slowlog_agent.go @@ -72,6 +72,7 @@ type AddAgentQANMySQLSlowlogAgentCommand struct { Password string `help:"MySQL password for scraping metrics"` CustomLabels map[string]string `mapsep:"," help:"Custom user-assigned labels"` SkipConnectionCheck bool `help:"Skip connection check"` + CommentsParsing string `enum:"on,off" default:"off" help:"Enable/disable parsing comments from queries. One of: [on, off]"` MaxQueryLength int32 `placeholder:"NUMBER" help:"Limit query length in QAN (default: server-defined; -1: no limit)"` DisableQueryExamples bool `name:"disable-queryexamples" help:"Disable collection of query examples"` MaxSlowlogFileSize units.Base2Bytes `name:"size-slow-logs" placeholder:"size" help:"Rotate slow log file at this size (default: 0; 0 or negative value disables rotation). Ex.: 1GiB"` @@ -107,23 +108,29 @@ func (cmd *AddAgentQANMySQLSlowlogAgentCommand) RunCmd() (commands.Result, error } } + disableCommentsParsing := true + if cmd.CommentsParsing == "on" { + disableCommentsParsing = false + } + params := &agents.AddQANMySQLSlowlogAgentParams{ Body: agents.AddQANMySQLSlowlogAgentBody{ - PMMAgentID: cmd.PMMAgentID, - ServiceID: cmd.ServiceID, - Username: cmd.Username, - Password: cmd.Password, - CustomLabels: customLabels, - SkipConnectionCheck: cmd.SkipConnectionCheck, - MaxQueryLength: cmd.MaxQueryLength, - DisableQueryExamples: cmd.DisableQueryExamples, - MaxSlowlogFileSize: strconv.FormatInt(int64(cmd.MaxSlowlogFileSize), 10), - TLS: cmd.TLS, - TLSSkipVerify: cmd.TLSSkipVerify, - TLSCa: tlsCa, - TLSCert: tlsCert, - TLSKey: tlsKey, - LogLevel: &cmd.LogLevel, + PMMAgentID: cmd.PMMAgentID, + ServiceID: cmd.ServiceID, + Username: cmd.Username, + Password: cmd.Password, + CustomLabels: customLabels, + SkipConnectionCheck: cmd.SkipConnectionCheck, + DisableCommentsParsing: disableCommentsParsing, + MaxQueryLength: cmd.MaxQueryLength, + DisableQueryExamples: cmd.DisableQueryExamples, + MaxSlowlogFileSize: strconv.FormatInt(int64(cmd.MaxSlowlogFileSize), 10), + TLS: cmd.TLS, + TLSSkipVerify: cmd.TLSSkipVerify, + TLSCa: tlsCa, + TLSCert: tlsCert, + TLSKey: tlsKey, + LogLevel: &cmd.LogLevel, }, Context: commands.Ctx, } diff --git a/admin/commands/inventory/add_agent_qan_postgres_pgstatements_agent.go b/admin/commands/inventory/add_agent_qan_postgres_pgstatements_agent.go index bf892d9734..8c04c0f234 100644 --- a/admin/commands/inventory/add_agent_qan_postgres_pgstatements_agent.go +++ b/admin/commands/inventory/add_agent_qan_postgres_pgstatements_agent.go @@ -52,6 +52,7 @@ type AddAgentQANPostgreSQLPgStatementsAgentCommand struct { Password string `help:"PostgreSQL password for QAN agent"` CustomLabels map[string]string `mapsep:"," help:"Custom user-assigned labels"` SkipConnectionCheck bool `help:"Skip connection check"` + CommentsParsing string `enum:"on,off" default:"off" help:"Enable/disable parsing comments from queries. One of: [on, off]"` MaxQueryLength int32 `placeholder:"NUMBER" help:"Limit query length in QAN (default: server-defined; -1: no limit)"` TLS bool `help:"Use TLS to connect to the database"` TLSSkipVerify bool `help:"Skip TLS certificates validation"` @@ -85,15 +86,21 @@ func (cmd *AddAgentQANPostgreSQLPgStatementsAgentCommand) RunCmd() (commands.Res } } + disableCommentsParsing := true + if cmd.CommentsParsing == "on" { + disableCommentsParsing = false + } + params := &agents.AddQANPostgreSQLPgStatementsAgentParams{ Body: agents.AddQANPostgreSQLPgStatementsAgentBody{ - PMMAgentID: cmd.PMMAgentID, - ServiceID: cmd.ServiceID, - Username: cmd.Username, - Password: cmd.Password, - CustomLabels: customLabels, - SkipConnectionCheck: cmd.SkipConnectionCheck, - MaxQueryLength: cmd.MaxQueryLength, + PMMAgentID: cmd.PMMAgentID, + ServiceID: cmd.ServiceID, + Username: cmd.Username, + Password: cmd.Password, + CustomLabels: customLabels, + SkipConnectionCheck: cmd.SkipConnectionCheck, + DisableCommentsParsing: disableCommentsParsing, + MaxQueryLength: cmd.MaxQueryLength, TLS: cmd.TLS, TLSSkipVerify: cmd.TLSSkipVerify, diff --git a/admin/commands/inventory/add_agent_qan_postgres_pgstatmonitor_agent.go b/admin/commands/inventory/add_agent_qan_postgres_pgstatmonitor_agent.go index d66973b62d..f18b16506a 100644 --- a/admin/commands/inventory/add_agent_qan_postgres_pgstatmonitor_agent.go +++ b/admin/commands/inventory/add_agent_qan_postgres_pgstatmonitor_agent.go @@ -53,6 +53,7 @@ type AddAgentQANPostgreSQLPgStatMonitorAgentCommand struct { Password string `help:"PostgreSQL password for QAN agent"` CustomLabels map[string]string `mapsep:"," help:"Custom user-assigned labels"` SkipConnectionCheck bool `help:"Skip connection check"` + CommentsParsing string `enum:"on,off" default:"off" help:"Enable/disable parsing comments from queries. One of: [on, off]"` MaxQueryLength int32 `placeholder:"NUMBER" help:"Limit query length in QAN (default: server-defined; -1: no limit)"` QueryExamplesDisabled bool `name:"disable-queryexamples" help:"Disable collection of query examples"` TLS bool `help:"Use TLS to connect to the database"` @@ -87,16 +88,22 @@ func (cmd *AddAgentQANPostgreSQLPgStatMonitorAgentCommand) RunCmd() (commands.Re } } + disableCommentsParsing := true + if cmd.CommentsParsing == "on" { + disableCommentsParsing = false + } + params := &agents.AddQANPostgreSQLPgStatMonitorAgentParams{ Body: agents.AddQANPostgreSQLPgStatMonitorAgentBody{ - PMMAgentID: cmd.PMMAgentID, - ServiceID: cmd.ServiceID, - Username: cmd.Username, - Password: cmd.Password, - CustomLabels: customLabels, - SkipConnectionCheck: cmd.SkipConnectionCheck, - MaxQueryLength: cmd.MaxQueryLength, - DisableQueryExamples: cmd.QueryExamplesDisabled, + PMMAgentID: cmd.PMMAgentID, + ServiceID: cmd.ServiceID, + Username: cmd.Username, + Password: cmd.Password, + CustomLabels: customLabels, + SkipConnectionCheck: cmd.SkipConnectionCheck, + DisableCommentsParsing: disableCommentsParsing, + MaxQueryLength: cmd.MaxQueryLength, + DisableQueryExamples: cmd.QueryExamplesDisabled, TLS: cmd.TLS, TLSSkipVerify: cmd.TLSSkipVerify, diff --git a/admin/commands/list.go b/admin/commands/list.go index 6843d4729d..d508e9de02 100644 --- a/admin/commands/list.go +++ b/admin/commands/list.go @@ -123,7 +123,7 @@ type ListCommand struct { NodeID string `help:"Node ID (default is autodetected)"` } -func (cmd *ListCommand) RunCmd() (Result, error) { //nolint:cyclop +func (cmd *ListCommand) RunCmd() (Result, error) { //nolint:cyclop,maintidx if cmd.NodeID == "" { status, err := agentlocal.GetStatus(agentlocal.DoNotRequestNetworkInfo) if err != nil { diff --git a/admin/commands/management/add_mysql.go b/admin/commands/management/add_mysql.go index aa33607178..13e5cd24ba 100644 --- a/admin/commands/management/add_mysql.go +++ b/admin/commands/management/add_mysql.go @@ -111,6 +111,7 @@ type AddMySQLCommand struct { ReplicationSet string `help:"Replication set name"` CustomLabels map[string]string `mapsep:"," help:"Custom user-assigned labels"` SkipConnectionCheck bool `help:"Skip connection check"` + CommentsParsing string `enum:"on,off" default:"off" help:"Enable/disable parsing comments from queries. One of: [on, off]"` TLS bool `help:"Use TLS to connect to the database"` TLSSkipVerify bool `help:"Skip TLS certificates validation"` TLSCaFile string `name:"tls-ca" help:"Path to certificate authority certificate file"` @@ -169,6 +170,11 @@ func (cmd *AddMySQLCommand) RunCmd() (commands.Result, error) { } } + disableCommentsParsing := true + if cmd.CommentsParsing == "on" { + disableCommentsParsing = false + } + if cmd.PMMAgentID == "" || cmd.NodeID == "" { status, err := agentlocal.GetStatus(agentlocal.DoNotRequestNetworkInfo) if err != nil { @@ -215,9 +221,11 @@ func (cmd *AddMySQLCommand) RunCmd() (commands.Result, error) { QANMysqlSlowlog: cmd.QuerySource == MysqlQuerySourceSlowLog, QANMysqlPerfschema: cmd.QuerySource == MysqlQuerySourcePerfSchema, - SkipConnectionCheck: cmd.SkipConnectionCheck, - MaxQueryLength: cmd.MaxQueryLength, - DisableQueryExamples: cmd.DisableQueryExamples, + SkipConnectionCheck: cmd.SkipConnectionCheck, + DisableCommentsParsing: disableCommentsParsing, + MaxQueryLength: cmd.MaxQueryLength, + DisableQueryExamples: cmd.DisableQueryExamples, + MaxSlowlogFileSize: strconv.FormatInt(int64(cmd.MaxSlowlogFileSize), 10), TLS: cmd.TLS, TLSSkipVerify: cmd.TLSSkipVerify, diff --git a/admin/commands/management/add_postgresql.go b/admin/commands/management/add_postgresql.go index 11fd31f09e..af61b7a9a4 100644 --- a/admin/commands/management/add_postgresql.go +++ b/admin/commands/management/add_postgresql.go @@ -63,6 +63,7 @@ type AddPostgreSQLCommand struct { ReplicationSet string `help:"Replication set name"` CustomLabels map[string]string `mapsep:"," help:"Custom user-assigned labels"` SkipConnectionCheck bool `help:"Skip connection check"` + CommentsParsing string `enum:"on,off" default:"off" help:"Enable/disable parsing comments from queries. One of: [on, off]"` TLS bool `help:"Use TLS to connect to the database"` TLSCAFile string `name:"tls-ca-file" help:"TLS CA certificate file"` TLSCertFile string `help:"TLS certificate file"` @@ -157,6 +158,11 @@ func (cmd *AddPostgreSQLCommand) RunCmd() (commands.Result, error) { } } + disableCommentsParsing := true + if cmd.CommentsParsing == "on" { + disableCommentsParsing = false + } + if cmd.CredentialsSource != "" { if err := cmd.GetCredentials(); err != nil { return nil, fmt.Errorf("failed to retrieve credentials from %s: %w", cmd.CredentialsSource, err) @@ -168,14 +174,15 @@ func (cmd *AddPostgreSQLCommand) RunCmd() (commands.Result, error) { NodeID: cmd.NodeID, ServiceName: serviceName, - Address: host, - Port: int64(port), - Username: cmd.Username, - Password: cmd.Password, - Database: cmd.Database, - AgentPassword: cmd.AgentPassword, - Socket: socket, - SkipConnectionCheck: cmd.SkipConnectionCheck, + Address: host, + Port: int64(port), + Username: cmd.Username, + Password: cmd.Password, + Database: cmd.Database, + AgentPassword: cmd.AgentPassword, + Socket: socket, + SkipConnectionCheck: cmd.SkipConnectionCheck, + DisableCommentsParsing: disableCommentsParsing, PMMAgentID: cmd.PMMAgentID, Environment: cmd.Environment, diff --git a/admin/commands/pmm/server/docker/base.go b/admin/commands/pmm/server/docker/base.go index 3bf27dad12..643fae3d71 100644 --- a/admin/commands/pmm/server/docker/base.go +++ b/admin/commands/pmm/server/docker/base.go @@ -35,7 +35,7 @@ type prepareOpts struct { install bool } -func prepareDocker(ctx context.Context, dockerFn Functions, opts prepareOpts) (Functions, error) { +func prepareDocker(ctx context.Context, dockerFn Functions, opts prepareOpts) (Functions, error) { //nolint:ireturn if dockerFn == nil { d, err := docker.New(nil) if err != nil { diff --git a/admin/commands/pmm/server/docker/deps.go b/admin/commands/pmm/server/docker/deps.go index 1c5eed963e..45664aa57b 100644 --- a/admin/commands/pmm/server/docker/deps.go +++ b/admin/commands/pmm/server/docker/deps.go @@ -27,10 +27,10 @@ import ( "github.com/percona/pmm/admin/pkg/docker" ) -//go:generate ../../../../../bin/mockery -name=Functions -case=snake -inpkg -testonly +//go:generate ../../../../../bin/mockery --name=Functions --case=snake --inpackage --testonly // Functions contain methods required to interact with Docker. -type Functions interface { +type Functions interface { //nolint:interfacebloat Imager Installer diff --git a/admin/commands/pmm/server/docker/mock_functions_test.go b/admin/commands/pmm/server/docker/mock_functions_test.go index bdb8413c80..0e3b7add67 100644 --- a/admin/commands/pmm/server/docker/mock_functions_test.go +++ b/admin/commands/pmm/server/docker/mock_functions_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package docker @@ -13,7 +13,7 @@ import ( client "github.com/docker/docker/client" mock "github.com/stretchr/testify/mock" - "github.com/percona/pmm/admin/pkg/docker" + pkgdocker "github.com/percona/pmm/admin/pkg/docker" ) // MockFunctions is an autogenerated mock type for the Functions type @@ -40,13 +40,16 @@ func (_m *MockFunctions) ContainerInspect(ctx context.Context, containerID strin ret := _m.Called(ctx, containerID) var r0 types.ContainerJSON + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (types.ContainerJSON, error)); ok { + return rf(ctx, containerID) + } if rf, ok := ret.Get(0).(func(context.Context, string) types.ContainerJSON); ok { r0 = rf(ctx, containerID) } else { r0 = ret.Get(0).(types.ContainerJSON) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, containerID) } else { @@ -75,13 +78,16 @@ func (_m *MockFunctions) ContainerUpdate(ctx context.Context, containerID string ret := _m.Called(ctx, containerID, updateConfig) var r0 container.ContainerUpdateOKBody + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, container.UpdateConfig) (container.ContainerUpdateOKBody, error)); ok { + return rf(ctx, containerID, updateConfig) + } if rf, ok := ret.Get(0).(func(context.Context, string, container.UpdateConfig) container.ContainerUpdateOKBody); ok { r0 = rf(ctx, containerID, updateConfig) } else { r0 = ret.Get(0).(container.ContainerUpdateOKBody) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, container.UpdateConfig) error); ok { r1 = rf(ctx, containerID, updateConfig) } else { @@ -96,6 +102,10 @@ func (_m *MockFunctions) ContainerWait(ctx context.Context, containerID string, ret := _m.Called(ctx, containerID, condition) var r0 <-chan container.WaitResponse + var r1 <-chan error + if rf, ok := ret.Get(0).(func(context.Context, string, container.WaitCondition) (<-chan container.WaitResponse, <-chan error)); ok { + return rf(ctx, containerID, condition) + } if rf, ok := ret.Get(0).(func(context.Context, string, container.WaitCondition) <-chan container.WaitResponse); ok { r0 = rf(ctx, containerID, condition) } else { @@ -104,7 +114,6 @@ func (_m *MockFunctions) ContainerWait(ctx context.Context, containerID string, } } - var r1 <-chan error if rf, ok := ret.Get(1).(func(context.Context, string, container.WaitCondition) <-chan error); ok { r1 = rf(ctx, containerID, condition) } else { @@ -121,6 +130,10 @@ func (_m *MockFunctions) CreateVolume(ctx context.Context, volumeName string, la ret := _m.Called(ctx, volumeName, labels) var r0 *volume.Volume + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, map[string]string) (*volume.Volume, error)); ok { + return rf(ctx, volumeName, labels) + } if rf, ok := ret.Get(0).(func(context.Context, string, map[string]string) *volume.Volume); ok { r0 = rf(ctx, volumeName, labels) } else { @@ -129,7 +142,6 @@ func (_m *MockFunctions) CreateVolume(ctx context.Context, volumeName string, la } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, map[string]string) error); ok { r1 = rf(ctx, volumeName, labels) } else { @@ -144,6 +156,10 @@ func (_m *MockFunctions) FindServerContainers(ctx context.Context) ([]types.Cont ret := _m.Called(ctx) var r0 []types.Container + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) ([]types.Container, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) []types.Container); ok { r0 = rf(ctx) } else { @@ -152,7 +168,6 @@ func (_m *MockFunctions) FindServerContainers(ctx context.Context) ([]types.Cont } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -211,13 +226,16 @@ func (_m *MockFunctions) IsDockerInstalled() (bool, error) { ret := _m.Called() var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func() (bool, error)); ok { + return rf() + } if rf, ok := ret.Get(0).(func() bool); ok { r0 = rf() } else { r0 = ret.Get(0).(bool) } - var r1 error if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { @@ -232,6 +250,10 @@ func (_m *MockFunctions) ParsePullImageProgress(r io.Reader, p *tea.Program) (<- ret := _m.Called(r, p) var r0 <-chan struct{} + var r1 <-chan error + if rf, ok := ret.Get(0).(func(io.Reader, *tea.Program) (<-chan struct{}, <-chan error)); ok { + return rf(r, p) + } if rf, ok := ret.Get(0).(func(io.Reader, *tea.Program) <-chan struct{}); ok { r0 = rf(r, p) } else { @@ -240,7 +262,6 @@ func (_m *MockFunctions) ParsePullImageProgress(r io.Reader, p *tea.Program) (<- } } - var r1 <-chan error if rf, ok := ret.Get(1).(func(io.Reader, *tea.Program) <-chan error); ok { r1 = rf(r, p) } else { @@ -257,6 +278,10 @@ func (_m *MockFunctions) PullImage(ctx context.Context, dockerImage string, opts ret := _m.Called(ctx, dockerImage, opts) var r0 io.Reader + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ImagePullOptions) (io.Reader, error)); ok { + return rf(ctx, dockerImage, opts) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ImagePullOptions) io.Reader); ok { r0 = rf(ctx, dockerImage, opts) } else { @@ -265,7 +290,6 @@ func (_m *MockFunctions) PullImage(ctx context.Context, dockerImage string, opts } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.ImagePullOptions) error); ok { r1 = rf(ctx, dockerImage, opts) } else { @@ -280,13 +304,16 @@ func (_m *MockFunctions) RunContainer(ctx context.Context, config *container.Con ret := _m.Called(ctx, config, hostConfig, containerName) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *container.Config, *container.HostConfig, string) (string, error)); ok { + return rf(ctx, config, hostConfig, containerName) + } if rf, ok := ret.Get(0).(func(context.Context, *container.Config, *container.HostConfig, string) string); ok { r0 = rf(ctx, config, hostConfig, containerName) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *container.Config, *container.HostConfig, string) error); ok { r1 = rf(ctx, config, hostConfig, containerName) } else { @@ -297,17 +324,32 @@ func (_m *MockFunctions) RunContainer(ctx context.Context, config *container.Con } // WaitForHealthyContainer provides a mock function with given fields: ctx, containerID -func (_m *MockFunctions) WaitForHealthyContainer(ctx context.Context, containerID string) <-chan docker.WaitHealthyResponse { +func (_m *MockFunctions) WaitForHealthyContainer(ctx context.Context, containerID string) <-chan pkgdocker.WaitHealthyResponse { ret := _m.Called(ctx, containerID) - var r0 <-chan docker.WaitHealthyResponse - if rf, ok := ret.Get(0).(func(context.Context, string) <-chan docker.WaitHealthyResponse); ok { + var r0 <-chan pkgdocker.WaitHealthyResponse + if rf, ok := ret.Get(0).(func(context.Context, string) <-chan pkgdocker.WaitHealthyResponse); ok { r0 = rf(ctx, containerID) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).(<-chan docker.WaitHealthyResponse) + r0 = ret.Get(0).(<-chan pkgdocker.WaitHealthyResponse) } } return r0 } + +// NewMockFunctions creates a new instance of MockFunctions. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockFunctions(t interface { + mock.TestingT + Cleanup(func()) +}, +) *MockFunctions { + mock := &MockFunctions{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/admin/commands/pmm/server/docker/upgrade.go b/admin/commands/pmm/server/docker/upgrade.go index 62aa18b865..31e7ebeff9 100644 --- a/admin/commands/pmm/server/docker/upgrade.go +++ b/admin/commands/pmm/server/docker/upgrade.go @@ -137,6 +137,7 @@ func (c *UpgradeCommand) isInstalledViaCli(container types.ContainerJSON) bool { } func (c *UpgradeCommand) confirmToContinue(containerID string) bool { + //nolint:forbidigo fmt.Printf(` PMM Server in the container %[1]q was not installed via pmm cli. We will attempt to upgrade the container and perform the following actions: @@ -154,7 +155,7 @@ The container %[1]q will NOT be removed. You can remove it manually later, if ne return true } - fmt.Print("Are you sure you want to continue? [y/N] ") + fmt.Print("Are you sure you want to continue? [y/N] ") //nolint:forbidigo s := bufio.NewScanner(os.Stdin) s.Scan() diff --git a/admin/commands/pmm/server/docker/upgrade_test.go b/admin/commands/pmm/server/docker/upgrade_test.go index 3d286cfe45..e9d9e04099 100644 --- a/admin/commands/pmm/server/docker/upgrade_test.go +++ b/admin/commands/pmm/server/docker/upgrade_test.go @@ -134,8 +134,8 @@ func TestUpgradeCmd(t *testing.T) { } func setWaitForContainerMock(m *MockFunctions) { - ch := func() <-chan container.ContainerWaitOKBody { - c := make(chan container.ContainerWaitOKBody) + ch := func() <-chan container.WaitResponse { + c := make(chan container.WaitResponse) close(c) return c }() diff --git a/agent/agentlocal/deps.go b/agent/agentlocal/deps.go index 8ff7b79c3b..b948131412 100644 --- a/agent/agentlocal/deps.go +++ b/agent/agentlocal/deps.go @@ -23,8 +23,8 @@ import ( "github.com/percona/pmm/api/agentpb" ) -//go:generate ../../bin/mockery -name=client -case=snake -inpkg -testonly -//go:generate ../../bin/mockery -name=supervisor -case=snake -inpkg -testonly +//go:generate ../../bin/mockery --name=client --case=snake --inpackage --testonly +//go:generate ../../bin/mockery --name=supervisor --case=snake --inpackage --testonly // client is a subset of methods of client.Client used by this package. // We use it instead of real type for testing and to avoid dependency cycle. diff --git a/agent/agentlocal/mock_client_test.go b/agent/agentlocal/mock_client_test.go index 4714bf1a41..4420488498 100644 --- a/agent/agentlocal/mock_client_test.go +++ b/agent/agentlocal/mock_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package agentlocal @@ -45,20 +45,23 @@ func (_m *mockClient) GetNetworkInformation() (time.Duration, time.Duration, err ret := _m.Called() var r0 time.Duration + var r1 time.Duration + var r2 error + if rf, ok := ret.Get(0).(func() (time.Duration, time.Duration, error)); ok { + return rf() + } if rf, ok := ret.Get(0).(func() time.Duration); ok { r0 = rf() } else { r0 = ret.Get(0).(time.Duration) } - var r1 time.Duration if rf, ok := ret.Get(1).(func() time.Duration); ok { r1 = rf() } else { r1 = ret.Get(1).(time.Duration) } - var r2 error if rf, ok := ret.Get(2).(func() error); ok { r2 = rf() } else { @@ -83,3 +86,18 @@ func (_m *mockClient) GetServerConnectMetadata() *agentpb.ServerConnectMetadata return r0 } + +// newMockClient creates a new instance of mockClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockClient(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockClient { + mock := &mockClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/agent/agentlocal/mock_supervisor_test.go b/agent/agentlocal/mock_supervisor_test.go index 1fbcbc0cc0..87544e77cd 100644 --- a/agent/agentlocal/mock_supervisor_test.go +++ b/agent/agentlocal/mock_supervisor_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package agentlocal @@ -44,3 +44,18 @@ func (_m *mockSupervisor) AgentsLogs() map[string][]string { return r0 } + +// newMockSupervisor creates a new instance of mockSupervisor. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockSupervisor(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockSupervisor { + mock := &mockSupervisor{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/agent/agents/cache/cache_test.go b/agent/agents/cache/cache_test.go index 5a1e937826..fd82ab594a 100644 --- a/agent/agents/cache/cache_test.go +++ b/agent/agents/cache/cache_test.go @@ -34,6 +34,7 @@ type someType struct { type innerStruct struct{ float64 } func TestCache(t *testing.T) { + t.Parallel() set1 := map[int64]*someType{ 1: {}, 2: {}, @@ -140,6 +141,7 @@ func TestCache(t *testing.T) { } func TestCacheErrors(t *testing.T) { + t.Parallel() t.Run("WrongTypeOnNew", func(t *testing.T) { t.Parallel() var err error diff --git a/agent/agents/mongodb/mongodb.go b/agent/agents/mongodb/mongodb.go index e987cd6564..0c98a8e75e 100644 --- a/agent/agents/mongodb/mongodb.go +++ b/agent/agents/mongodb/mongodb.go @@ -91,7 +91,6 @@ func (m *MongoDB) Run(ctx context.Context) { <-ctx.Done() m.changes <- agents.Change{Status: inventorypb.AgentStatus_STOPPING} - return } // Changes returns channel that should be read until it is closed. diff --git a/agent/agents/mysql/perfschema/perfschema.go b/agent/agents/mysql/perfschema/perfschema.go index 1293219394..ad300484c5 100644 --- a/agent/agents/mysql/perfschema/perfschema.go +++ b/agent/agents/mysql/perfschema/perfschema.go @@ -82,39 +82,42 @@ const ( // PerfSchema QAN services connects to MySQL and extracts performance data. type PerfSchema struct { - q *reform.Querier - dbCloser io.Closer - agentID string - maxQueryLength int32 - disableQueryExamples bool - l *logrus.Entry - changes chan agents.Change - historyCache *historyCache - summaryCache *summaryCache - versionsCache *versionsCache + q *reform.Querier + dbCloser io.Closer + agentID string + disableCommentsParsing bool + maxQueryLength int32 + disableQueryExamples bool + l *logrus.Entry + changes chan agents.Change + historyCache *historyCache + summaryCache *summaryCache + versionsCache *versionsCache } // Params represent Agent parameters. type Params struct { - DSN string - AgentID string - MaxQueryLength int32 - DisableQueryExamples bool - TextFiles *agentpb.TextFiles - TLSSkipVerify bool + DSN string + AgentID string + DisableCommentsParsing bool + MaxQueryLength int32 + DisableQueryExamples bool + TextFiles *agentpb.TextFiles + TLSSkipVerify bool } // newPerfSchemaParams holds all required parameters to instantiate a new PerfSchema type newPerfSchemaParams struct { - Querier *reform.Querier - DBCloser io.Closer - AgentID string - MaxQueryLength int32 - DisableQueryExamples bool - LogEntry *logrus.Entry + Querier *reform.Querier + DBCloser io.Closer + AgentID string + DisableCommentsParsing bool + MaxQueryLength int32 + DisableQueryExamples bool + LogEntry *logrus.Entry } -const queryTag = "pmm-agent:perfschema" +const queryTag = "agent='perfschema'" // New creates new PerfSchema QAN service. func New(params *Params, l *logrus.Entry) (*PerfSchema, error) { @@ -137,12 +140,13 @@ func New(params *Params, l *logrus.Entry) (*PerfSchema, error) { q := reform.NewDB(sqlDB, mysqlDialects.Dialect, reformL).WithTag(queryTag) newParams := &newPerfSchemaParams{ - Querier: q, - DBCloser: sqlDB, - AgentID: params.AgentID, - MaxQueryLength: params.MaxQueryLength, - DisableQueryExamples: params.DisableQueryExamples, - LogEntry: l, + Querier: q, + DBCloser: sqlDB, + AgentID: params.AgentID, + DisableCommentsParsing: params.DisableCommentsParsing, + MaxQueryLength: params.MaxQueryLength, + DisableQueryExamples: params.DisableQueryExamples, + LogEntry: l, } return newPerfSchema(newParams) } @@ -159,16 +163,17 @@ func newPerfSchema(params *newPerfSchemaParams) (*PerfSchema, error) { } return &PerfSchema{ - q: params.Querier, - dbCloser: params.DBCloser, - agentID: params.AgentID, - maxQueryLength: params.MaxQueryLength, - disableQueryExamples: params.DisableQueryExamples, - l: params.LogEntry, - changes: make(chan agents.Change, 10), - historyCache: historyCache, - summaryCache: summaryCache, - versionsCache: &versionsCache{items: make(map[string]*mySQLVersion)}, + q: params.Querier, + dbCloser: params.DBCloser, + agentID: params.AgentID, + disableCommentsParsing: params.DisableCommentsParsing, + maxQueryLength: params.MaxQueryLength, + disableQueryExamples: params.DisableQueryExamples, + l: params.LogEntry, + changes: make(chan agents.Change, 10), + historyCache: historyCache, + summaryCache: summaryCache, + versionsCache: &versionsCache{items: make(map[string]*mySQLVersion)}, }, nil } @@ -352,6 +357,14 @@ func (m *PerfSchema) getNewBuckets(periodStart time.Time, periodLengthSecs uint3 b.Common.Example = example b.Common.ExampleType = agentpb.ExampleType_RANDOM } + + if !m.disableCommentsParsing { + comments, err := queryparser.MySQLComments(*esh.SQLText) + if err != nil { + m.l.Infof("cannot parse comments from query: %s", *esh.SQLText) + } + b.Common.Comments = comments + } } } @@ -370,8 +383,7 @@ func inc(current, prev uint64) float32 { } // makeBuckets uses current state of events_statements_summary_by_digest table and accumulated previous state -// to make metrics buckets. -// +// to make metrics buckets; // makeBuckets is a pure function for easier testing. func makeBuckets(current, prev summaryMap, l *logrus.Entry, maxQueryLength int32) []*agentpb.MetricsBucket { res := make([]*agentpb.MetricsBucket, 0, len(current)) @@ -420,7 +432,7 @@ func makeBuckets(current, prev summaryMap, l *logrus.Entry, maxQueryLength int32 sum *float32 // MetricsBucket.XXXSum field to write value cnt *float32 // MetricsBucket.XXXCnt field to write count }{ - // in order of events_statements_summary_by_digest columns + // Ordered the same as events_statements_summary_by_digest columns // convert picoseconds to seconds {inc(currentESS.SumTimerWait, prevESS.SumTimerWait) / 1000000000000, &mb.Common.MQueryTimeSum, &mb.Common.MQueryTimeCnt}, diff --git a/agent/agents/mysql/perfschema/perfschema_test.go b/agent/agents/mysql/perfschema/perfschema_test.go index 5510c29e7f..9db43c60ab 100644 --- a/agent/agents/mysql/perfschema/perfschema_test.go +++ b/agent/agents/mysql/perfschema/perfschema_test.go @@ -204,11 +204,11 @@ func filter(mb []*agentpb.MetricsBucket) []*agentpb.MetricsBucket { res := make([]*agentpb.MetricsBucket, 0, len(mb)) for _, b := range mb { switch { - case strings.Contains(b.Common.Example, "/* pmm-agent:perfschema */"): + case strings.Contains(b.Common.Example, "/* agent='perfschema' */"): continue - case strings.Contains(b.Common.Example, "/* pmm-agent:slowlog */"): + case strings.Contains(b.Common.Example, "/* agent='slowlog' */"): continue - case strings.Contains(b.Common.Example, "/* pmm-agent:connectionchecker */"): + case strings.Contains(b.Common.Example, "/* agent='connectionchecker' */"): continue case strings.Contains(b.Common.Example, "/* pmm-agent-tests:MySQLVersion */"): @@ -322,7 +322,7 @@ func TestPerfSchema(t *testing.T) { disableQueryExamples: false, }) - _, err := db.Exec("SELECT /* Sleep */ sleep(0.1)") + _, err := db.Exec("SELECT /* Sleep controller='test' */ sleep(0.1)") require.NoError(t, err) require.NoError(t, m.refreshHistoryCache()) @@ -334,17 +334,19 @@ func TestPerfSchema(t *testing.T) { actual := buckets[0] assert.InDelta(t, 0.1, actual.Common.MQueryTimeSum, 0.09) + expected := &agentpb.MetricsBucket{ Common: &agentpb.MetricsBucket_Common{ ExplainFingerprint: "SELECT `sleep` (:1)", PlaceholdersCount: 1, + Comments: map[string]string{"controller": "test"}, Fingerprint: "SELECT `sleep` (?)", Schema: "world", AgentId: "agent_id", PeriodStartUnixSecs: 1554116340, PeriodLengthSecs: 60, AgentType: inventorypb.AgentType_QAN_MYSQL_PERFSCHEMA_AGENT, - Example: "SELECT /* Sleep */ sleep(0.1)", + Example: "SELECT /* Sleep controller='test' */ sleep(0.1)", ExampleType: agentpb.ExampleType_RANDOM, NumQueries: 1, MQueryTimeCnt: 1, @@ -367,7 +369,7 @@ func TestPerfSchema(t *testing.T) { disableQueryExamples: false, }) - _, err := db.Exec("SELECT /* AllCities */ * FROM city") + _, err := db.Exec("SELECT /* AllCities controller='test' */ * FROM city") require.NoError(t, err) require.NoError(t, m.refreshHistoryCache()) @@ -384,12 +386,13 @@ func TestPerfSchema(t *testing.T) { Common: &agentpb.MetricsBucket_Common{ ExplainFingerprint: "SELECT * FROM `city`", Fingerprint: "SELECT * FROM `city`", + Comments: map[string]string{"controller": "test"}, Schema: "world", AgentId: "agent_id", PeriodStartUnixSecs: 1554116340, PeriodLengthSecs: 60, AgentType: inventorypb.AgentType_QAN_MYSQL_PERFSCHEMA_AGENT, - Example: "SELECT /* AllCities */ * FROM city", + Example: "SELECT /* AllCities controller='test' */ * FROM city", ExampleType: agentpb.ExampleType_RANDOM, NumQueries: 1, MQueryTimeCnt: 1, @@ -425,7 +428,7 @@ func TestPerfSchema(t *testing.T) { require.NoError(t, err) }() - _, err = db.Exec("SELECT /* t1 */ * FROM t1 where col1='Bu\xf1rk'") + _, err = db.Exec("SELECT /* t1 controller='test' */ * FROM t1 where col1='Bu\xf1rk'") require.NoError(t, err) require.NoError(t, m.refreshHistoryCache()) @@ -433,9 +436,9 @@ func TestPerfSchema(t *testing.T) { switch mySQLVersion.String() { // Perf schema truncates queries with non-utf8 characters. case "8.0": - example = "SELECT /* t1 */ * FROM t1 where col1='Bu" + example = "SELECT /* t1 controller='test' */ * FROM t1 where col1='Bu" default: - example = "SELECT /* t1 */ * FROM t1 where col1=..." + example = "SELECT /* t1 controller='test' */ * FROM t1 where col1=..." } var numQueriesWithWarnings float32 @@ -456,6 +459,7 @@ func TestPerfSchema(t *testing.T) { ExplainFingerprint: "SELECT * FROM `t1` WHERE `col1` = :1", PlaceholdersCount: 1, Fingerprint: "SELECT * FROM `t1` WHERE `col1` = ?", + Comments: map[string]string{"controller": "test"}, Schema: "world", AgentId: "agent_id", PeriodStartUnixSecs: 1554116340, diff --git a/agent/agents/mysql/slowlog/parser/continuous_file_reader_test.go b/agent/agents/mysql/slowlog/parser/continuous_file_reader_test.go index 0912591c72..d2190bc7e9 100644 --- a/agent/agents/mysql/slowlog/parser/continuous_file_reader_test.go +++ b/agent/agents/mysql/slowlog/parser/continuous_file_reader_test.go @@ -32,6 +32,7 @@ func cleanup(t *testing.T, files []string) { } func TestContinuousFileReader(t *testing.T) { + t.Parallel() t.Run("Normal", func(t *testing.T) { t.Parallel() diff --git a/agent/agents/mysql/slowlog/parser/parser.go b/agent/agents/mysql/slowlog/parser/parser.go index d15bb4ea9f..e7cae9ca1e 100644 --- a/agent/agents/mysql/slowlog/parser/parser.go +++ b/agent/agents/mysql/slowlog/parser/parser.go @@ -246,7 +246,8 @@ func (p *SlowLogParser) parseMetrics(line string) { return } - line = strings.Replace(line, ": ", ":", -1) // we need skip redundant space for correcting split process + // we need to skip redundant space to correct the split process + line = strings.Replace(line, ": ", ":", -1) //nolint:gocritic for _, kv := range strings.Split(line, " ") { if len(kv) == 0 { continue diff --git a/agent/agents/mysql/slowlog/parser/parser_test.go b/agent/agents/mysql/slowlog/parser/parser_test.go index c3a68bf315..2e30d4db9f 100644 --- a/agent/agents/mysql/slowlog/parser/parser_test.go +++ b/agent/agents/mysql/slowlog/parser/parser_test.go @@ -66,6 +66,7 @@ func TestParserGolden(t *testing.T) { goldenFile := strings.TrimSuffix(file, ".log") + ".json" name := strings.TrimSuffix(filepath.Base(file), ".log") t.Run(name, func(t *testing.T) { + t.Parallel() opts := log.Options{ DefaultLocation: time.UTC, } diff --git a/agent/agents/mysql/slowlog/slowlog.go b/agent/agents/mysql/slowlog/slowlog.go index 381db27287..2c7f359031 100644 --- a/agent/agents/mysql/slowlog/slowlog.go +++ b/agent/agents/mysql/slowlog/slowlog.go @@ -60,18 +60,19 @@ type SlowLog struct { // Params represent Agent parameters. type Params struct { - DSN string - AgentID string - MaxQueryLength int32 - DisableQueryExamples bool - MaxSlowlogFileSize int64 - SlowLogFilePrefix string // for development and testing - TextFiles *agentpb.TextFiles - TLS bool - TLSSkipVerify bool + DSN string + AgentID string + DisableCommentsParsing bool + MaxQueryLength int32 + DisableQueryExamples bool + MaxSlowlogFileSize int64 + SlowLogFilePrefix string // for development and testing + TextFiles *agentpb.TextFiles + TLS bool + TLSSkipVerify bool } -const queryTag = "pmm-agent:slowlog" +const queryTag = "agent='slowlog'" type slowLogInfo struct { path string @@ -375,7 +376,7 @@ func (s *SlowLog) processFile(ctx context.Context, file string, outlierTime floa case <-t.C: lengthS := uint32(math.Round(wait.Seconds())) // round 59.9s/60.1s to 60s res := aggregator.Finalize() - buckets := makeBuckets(s.params.AgentID, res, start, lengthS, s.params.DisableQueryExamples, s.params.MaxQueryLength) + buckets := makeBuckets(s.params.AgentID, res, start, lengthS, s.params.DisableCommentsParsing, s.params.DisableQueryExamples, s.params.MaxQueryLength, s.l) s.l.Debugf("Made %d buckets out of %d classes in %s+%d interval. Wait time: %s.", len(buckets), len(res.Class), start.Format("15:04:05"), lengthS, time.Since(start)) @@ -392,14 +393,16 @@ func (s *SlowLog) processFile(ctx context.Context, file string, outlierTime floa // makeBuckets is a pure function for easier testing. // -//nolint:cyclop +//nolint:cyclop,maintidx func makeBuckets( agentID string, res event.Result, periodStart time.Time, periodLengthSecs uint32, + disableCommentsParsing bool, disableQueryExamples bool, maxQueryLength int32, + l *logrus.Entry, ) []*agentpb.MetricsBucket { buckets := make([]*agentpb.MetricsBucket, 0, len(res.Class)) @@ -445,15 +448,21 @@ func makeBuckets( mb.Common.PlaceholdersCount = placeholdersCount } - if v.Example != nil { - if !disableQueryExamples { - example, truncated := truncate.Query(v.Example.Query, maxQueryLength) - if truncated { - mb.Common.IsTruncated = truncated - } - mb.Common.Example = example - mb.Common.ExampleType = agentpb.ExampleType_RANDOM + if !disableCommentsParsing { + comments, err := queryparser.MySQLComments(q) + if err != nil { + l.Infof("cannot parse comments from query: %s", q) + } + mb.Common.Comments = comments + } + + if v.Example != nil && !disableQueryExamples { + example, truncated := truncate.Query(v.Example.Query, maxQueryLength) + if truncated { + mb.Common.IsTruncated = truncated } + mb.Common.Example = example + mb.Common.ExampleType = agentpb.ExampleType_RANDOM } // If key has suffix _time or _wait than field is TimeMetrics. diff --git a/agent/agents/mysql/slowlog/slowlog_test.go b/agent/agents/mysql/slowlog/slowlog_test.go index 6e0b338ded..e0c78f0208 100644 --- a/agent/agents/mysql/slowlog/slowlog_test.go +++ b/agent/agents/mysql/slowlog/slowlog_test.go @@ -54,26 +54,27 @@ func TestSlowLogMakeBucketsInvalidUTF8(t *testing.T) { Class: map[string]*event.Class{ "example": { Metrics: &event.Metrics{}, - Fingerprint: "SELECT * FROM contacts t0 WHERE t0.person_id = '߿�\xff\\ud83d\xdd'", + Fingerprint: "SELECT /* controller='test' */ * FROM contacts t0 WHERE t0.person_id = '߿�\xff\\ud83d\xdd'", Example: &event.Example{ - Query: "SELECT * FROM contacts t0 WHERE t0.person_id = '߿�\xff\\ud83d\xdd'", + Query: "SELECT /* controller='test' */ * FROM contacts t0 WHERE t0.person_id = '߿�\xff\\ud83d\xdd'", }, }, }, } - actualBuckets := makeBuckets(agentID, parsingResult, periodStart, 60, false, truncate.GetDefaultMaxQueryLength()) + actualBuckets := makeBuckets(agentID, parsingResult, periodStart, 60, false, false, truncate.GetDefaultMaxQueryLength(), logrus.NewEntry(logrus.New())) expectedBuckets := []*agentpb.MetricsBucket{ { Common: &agentpb.MetricsBucket_Common{ Fingerprint: "select * from contacts t0 where t0.person_id = ?", ExplainFingerprint: "select * from contacts t0 where t0.person_id = :1", PlaceholdersCount: 1, + Comments: map[string]string{"controller": "test"}, AgentId: agentID, AgentType: inventorypb.AgentType_QAN_MYSQL_SLOWLOG_AGENT, PeriodStartUnixSecs: 1557137220, PeriodLengthSecs: 60, - Example: "SELECT * FROM contacts t0 WHERE t0.person_id = '߿�\ufffd\\ud83d\ufffd'", + Example: "SELECT /* controller='test' */ * FROM contacts t0 WHERE t0.person_id = '߿�\ufffd\\ud83d\ufffd'", ExampleType: agentpb.ExampleType_RANDOM, }, Mysql: &agentpb.MetricsBucket_MySQL{}, @@ -94,7 +95,7 @@ func TestSlowLogMakeBuckets(t *testing.T) { parsingResult := event.Result{} getDataFromFile(t, "slowlog_fixture.json", &parsingResult) - actualBuckets := makeBuckets(agentID, parsingResult, periodStart, 60, false, truncate.GetDefaultMaxQueryLength()) + actualBuckets := makeBuckets(agentID, parsingResult, periodStart, 60, false, false, truncate.GetDefaultMaxQueryLength(), logrus.NewEntry(logrus.New())) var expectedBuckets []*agentpb.MetricsBucket getDataFromFile(t, "slowlog_expected.json", &expectedBuckets) @@ -113,8 +114,9 @@ func TestSlowLogMakeBuckets(t *testing.T) { } func TestSlowLog(t *testing.T) { + t.Parallel() sqlDB := tests.OpenTestMySQL(t) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { sqlDB.Close() }) //nolint:errcheck q := reform.NewDB(sqlDB, mysql.Dialect, reform.NewPrintfLogger(t.Logf)).WithTag(queryTag) ctx := context.Background() diff --git a/agent/agents/postgres/pgstatmonitor/pgstatmonitor.go b/agent/agents/postgres/pgstatmonitor/pgstatmonitor.go index 2b9fce1110..b5d4b80485 100644 --- a/agent/agents/postgres/pgstatmonitor/pgstatmonitor.go +++ b/agent/agents/postgres/pgstatmonitor/pgstatmonitor.go @@ -33,6 +33,7 @@ import ( "gopkg.in/reform.v1/dialects/postgresql" "github.com/percona/pmm/agent/agents" + "github.com/percona/pmm/agent/queryparser" "github.com/percona/pmm/agent/utils/version" "github.com/percona/pmm/api/agentpb" "github.com/percona/pmm/api/inventorypb" @@ -43,23 +44,25 @@ const defaultWaitTime = 60 * time.Second // PGStatMonitorQAN QAN services connects to PostgreSQL and extracts stats. type PGStatMonitorQAN struct { - q *reform.Querier - dbCloser io.Closer - agentID string - l *logrus.Entry - changes chan agents.Change - monitorCache *statMonitorCache - maxQueryLength int32 - disableQueryExamples bool + q *reform.Querier + dbCloser io.Closer + agentID string + l *logrus.Entry + changes chan agents.Change + monitorCache *statMonitorCache + maxQueryLength int32 + disableQueryExamples bool + disableCommentsParsing bool } // Params represent Agent parameters. type Params struct { - DSN string - MaxQueryLength int32 - DisableQueryExamples bool - TextFiles *agentpb.TextFiles - AgentID string + DSN string + MaxQueryLength int32 + DisableQueryExamples bool + DisableCommentsParsing bool + TextFiles *agentpb.TextFiles + AgentID string } type ( @@ -85,7 +88,7 @@ const ( ) const ( - queryTag = "pmm-agent:pgstatmonitor" + queryTag = "agent='pgstatmonitor'" pgsm20SettingsQuery = "SELECT name, setting FROM pg_settings WHERE name like 'pg_stat_monitor.%'" // There is a feature in the FE that shows "n/a" for empty responses for dimensions. commandTextNotAvailable = "" @@ -120,7 +123,7 @@ func New(params *Params, l *logrus.Entry) (*PGStatMonitorQAN, error) { // TODO register reformL metrics https://jira.percona.com/browse/PMM-4087 q := reform.NewDB(sqlDB, postgresql.Dialect, reformL).WithTag(queryTag) - return newPgStatMonitorQAN(q, sqlDB, params.AgentID, params.DisableQueryExamples, params.MaxQueryLength, l) + return newPgStatMonitorQAN(q, sqlDB, params.AgentID, params.DisableCommentsParsing, params.DisableQueryExamples, params.MaxQueryLength, l) } func areSettingsTextValues(q *reform.Querier) (bool, error) { @@ -136,16 +139,17 @@ func areSettingsTextValues(q *reform.Querier) (bool, error) { return false, nil } -func newPgStatMonitorQAN(q *reform.Querier, dbCloser io.Closer, agentID string, disableQueryExamples bool, maxQueryLength int32, l *logrus.Entry) (*PGStatMonitorQAN, error) { //nolint:lll +func newPgStatMonitorQAN(q *reform.Querier, dbCloser io.Closer, agentID string, disableCommentsParsing, disableQueryExamples bool, maxQueryLength int32, l *logrus.Entry) (*PGStatMonitorQAN, error) { //nolint:lll return &PGStatMonitorQAN{ - q: q, - dbCloser: dbCloser, - agentID: agentID, - l: l, - changes: make(chan agents.Change, 10), - monitorCache: newStatMonitorCache(l), - maxQueryLength: maxQueryLength, - disableQueryExamples: disableQueryExamples, + q: q, + dbCloser: dbCloser, + agentID: agentID, + l: l, + changes: make(chan agents.Change, 10), + monitorCache: newStatMonitorCache(l), + maxQueryLength: maxQueryLength, + disableQueryExamples: disableQueryExamples, + disableCommentsParsing: disableCommentsParsing, }, nil } @@ -571,6 +575,14 @@ func (m *PGStatMonitorQAN) makeBuckets(current, cache map[time.Time]map[string]* mb.Common.ExampleType = agentpb.ExampleType_RANDOM } + if !m.disableCommentsParsing && currentPSM.Comments != nil { + comments, err := queryparser.PostgreSQLComments(*currentPSM.Comments) + if err != nil { + m.l.Errorf("failed to parse comments from: %s", *currentPSM.Comments) + } + mb.Common.Comments = comments + } + var cpuSysTime, cpuUserTime float64 // Since PGSM 2.0 and higher we should not cumulate times, because its already done on PGSM side if vPGSM >= pgStatMonitorVersion20PG12 { diff --git a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_models.go b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_models.go index 76db75ebb8..a3f865d70f 100644 --- a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_models.go +++ b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_models.go @@ -51,6 +51,7 @@ type pgStatMonitor struct { ClientIP string QueryID string // we select only non-NULL rows Query string // we select only non-NULL rows + Comments *string Relations pq.StringArray Calls int64 SharedBlksHit int64 @@ -104,7 +105,7 @@ type field struct { pointer interface{} } -func newPgStatMonitorStructs(vPGSM pgStatMonitorVersion, vPG pgVersion) (*pgStatMonitor, reform.View) { +func newPgStatMonitorStructs(vPGSM pgStatMonitorVersion, vPG pgVersion) (*pgStatMonitor, reform.View) { //nolint:ireturn s := &pgStatMonitor{} fields := []field{ {info: parse.FieldInfo{Name: "Bucket", Type: "int64", Column: "bucket"}, pointer: &s.Bucket}, @@ -205,6 +206,7 @@ func newPgStatMonitorStructs(vPGSM pgStatMonitorVersion, vPG pgVersion) (*pgStat if vPGSM >= pgStatMonitorVersion20PG12 { fields = append(fields, field{info: parse.FieldInfo{Name: "PlansCalls", Type: "int64", Column: "plans"}, pointer: &s.PlansCalls}) + fields = append(fields, field{info: parse.FieldInfo{Name: "Comments", Type: "string", Column: "comments"}, pointer: &s.Comments}) } else { fields = append(fields, field{info: parse.FieldInfo{Name: "PlansCalls", Type: "int64", Column: "plans_calls"}, pointer: &s.PlansCalls}) } @@ -264,7 +266,7 @@ func (v *pgStatMonitorAllViewType) Columns() []string { } // NewStruct makes a new struct for that view or table. -func (v *pgStatMonitorAllViewType) NewStruct() reform.Struct { +func (v *pgStatMonitorAllViewType) NewStruct() reform.Struct { //nolint:ireturn str, _ := newPgStatMonitorStructs(v.vPGSM, v.vPG) return str } @@ -341,12 +343,12 @@ func (s *pgStatMonitor) Pointers() []interface{} { } // View returns View object for that struct. -func (s *pgStatMonitor) View() reform.View { +func (s *pgStatMonitor) View() reform.View { //nolint:ireturn return s.view } var ( - // check interfaces + // Check interfaces _ reform.Struct = (*pgStatMonitor)(nil) _ fmt.Stringer = (*pgStatMonitor)(nil) ) diff --git a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go index a9775a27b0..9e99e1b9bc 100644 --- a/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go +++ b/agent/agents/postgres/pgstatmonitor/pgstatmonitor_test.go @@ -38,14 +38,14 @@ import ( "github.com/percona/pmm/api/inventorypb" ) -func setup(t *testing.T, db *reform.DB, disableQueryExamples bool) *PGStatMonitorQAN { //nolint:unparam +func setup(t *testing.T, db *reform.DB, disableCommentsParsing, disableQueryExamples bool) *PGStatMonitorQAN { //nolint:unparam t.Helper() selectQuery := fmt.Sprintf("SELECT /* %s */ ", queryTag) _, err := db.Exec(selectQuery + "* from pg_stat_monitor_reset()") require.NoError(t, err) - pgStatMonitorQAN, err := newPgStatMonitorQAN(db.WithTag(queryTag), nil, "agent_id", disableQueryExamples, truncate.GetDefaultMaxQueryLength(), logrus.WithField("test", t.Name())) + pgStatMonitorQAN, err := newPgStatMonitorQAN(db.WithTag(queryTag), nil, "agent_id", disableCommentsParsing, disableQueryExamples, truncate.GetDefaultMaxQueryLength(), logrus.WithField("test", t.Name())) require.NoError(t, err) return pgStatMonitorQAN @@ -72,9 +72,9 @@ func filter(mb []*agentpb.MetricsBucket) []*agentpb.MetricsBucket { res := make([]*agentpb.MetricsBucket, 0, len(mb)) for _, b := range mb { switch { - case strings.Contains(b.Common.Fingerprint, "/* pmm-agent:pgstatmonitor */"): + case strings.Contains(b.Common.Fingerprint, "/* agent='pgstatmonitor' */"): continue - case strings.Contains(b.Common.Example, "/* pmm-agent:pgstatmonitor */"): + case strings.Contains(b.Common.Example, "/* agent='pgstatmonitor' */"): continue case strings.Contains(b.Common.Fingerprint, "pg_stat_monitor_reset()"): continue @@ -125,8 +125,8 @@ func TestPGStatMonitorSchema(t *testing.T) { require.NoError(t, err) tests.LogTable(t, structs) - const selectAllCountries = "SELECT /* AllCountries:PGStatMonitor */ * FROM country" - const selectAllCountriesLong = "SELECT /* AllCountriesTruncated:PGStatMonitor */ * FROM country WHERE capital IN " + + const selectAllCountries = "SELECT /* AllCountries:PGStatMonitor controller='test' */ * FROM country" + const selectAllCountriesLong = "SELECT /* AllCountriesTruncated:PGStatMonitor controller='test' */ * FROM country WHERE capital IN " + "($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, " + "$21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, " + "$41, $42, $43, $44, $45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55, $56, $57, $58, $59, $60, " + @@ -144,7 +144,7 @@ func TestPGStatMonitorSchema(t *testing.T) { "$281, $282, $283, $284, $285, $286, $287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297, $298, $299, $300, " + "$301, $302, $303, $304, $305, $306, $307, $308, $309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319, $320, " + "$321, $322, $323, $324, $325, $326, $327, $328, $329, $330, $331, $332, $333, $334, $335, $336, $337, $338, $339, $340, " + - "$341, $342, $343, $344, $345, ..." + "$341, $342, $343, $3 ..." var digests map[string]string switch engineVersion { @@ -203,7 +203,7 @@ func TestPGStatMonitorSchema(t *testing.T) { } t.Run("AllCountries", func(t *testing.T) { - m := setup(t, db, false) + m := setup(t, db, false, false) _, err := db.Exec(selectAllCountries) require.NoError(t, err) @@ -237,6 +237,7 @@ func TestPGStatMonitorSchema(t *testing.T) { ExampleType: agentpb.ExampleType_RANDOM, Database: "pmm-agent", Tables: []string{"public.country"}, + Comments: map[string]string{"controller": "test"}, Username: "pmm-agent", ClientHost: actual.Common.ClientHost, AgentId: "agent_id", @@ -294,6 +295,7 @@ func TestPGStatMonitorSchema(t *testing.T) { ExampleType: agentpb.ExampleType_RANDOM, Database: "pmm-agent", Tables: []string{"public.country"}, + Comments: map[string]string{"controller": "test"}, Username: "pmm-agent", ClientHost: actual.Common.ClientHost, AgentId: "agent_id", @@ -331,7 +333,7 @@ func TestPGStatMonitorSchema(t *testing.T) { }) t.Run("AllCountriesTruncated", func(t *testing.T) { - m := setup(t, db, false) + m := setup(t, db, false, false) const n = 500 placeholders := db.Placeholders(1, n) @@ -339,7 +341,7 @@ func TestPGStatMonitorSchema(t *testing.T) { for i := 0; i < n; i++ { args[i] = i } - q := fmt.Sprintf("SELECT /* AllCountriesTruncated:PGStatMonitor */ * FROM country WHERE capital IN (%s)", strings.Join(placeholders, ", ")) + q := fmt.Sprintf("SELECT /* AllCountriesTruncated:PGStatMonitor controller='test' */ * FROM country WHERE capital IN (%s)", strings.Join(placeholders, ", ")) _, err := db.Exec(q, args...) require.NoError(t, err) @@ -366,6 +368,7 @@ func TestPGStatMonitorSchema(t *testing.T) { ExampleType: agentpb.ExampleType_RANDOM, Database: "pmm-agent", Tables: []string{"public.country"}, + Comments: map[string]string{"controller": "test"}, Username: "pmm-agent", ClientHost: actual.Common.ClientHost, AgentId: "agent_id", @@ -426,6 +429,7 @@ func TestPGStatMonitorSchema(t *testing.T) { ExampleType: agentpb.ExampleType_RANDOM, Database: "pmm-agent", Tables: []string{"public.country"}, + Comments: map[string]string{"controller": "test"}, Username: "pmm-agent", ClientHost: actual.Common.ClientHost, AgentId: "agent_id", @@ -478,13 +482,13 @@ func TestPGStatMonitorSchema(t *testing.T) { _, err := db.Exec(fmt.Sprintf(`DROP TABLE %s`, tableName)) require.NoError(t, err) }() - m := setup(t, db, false) + m := setup(t, db, false, false) var waitGroup sync.WaitGroup n := 1000 for i := 0; i < n; i++ { id := i - query := fmt.Sprintf(`INSERT /* CheckMBlkReadTime */ INTO %s (customer_id, first_name, last_name, active) VALUES (%d, 'John', 'Dow', TRUE)`, tableName, id) + query := fmt.Sprintf(`INSERT /* CheckMBlkReadTime controller='test' */ INTO %s (customer_id, first_name, last_name, active) VALUES (%d, 'John', 'Dow', TRUE)`, tableName, id) waitGroup.Add(1) go func() { defer waitGroup.Done() @@ -515,13 +519,14 @@ func TestPGStatMonitorSchema(t *testing.T) { actual := buckets[0] actual.Common.Username = strings.ReplaceAll(actual.Common.Username, `"`, "") assert.NotZero(t, actual.Postgresql.MBlkReadTimeSum) - expectedFingerprint := fmt.Sprintf("INSERT /* CheckMBlkReadTime */ INTO %s (customer_id, first_name, last_name, active) VALUES ($1, $2, $3, $4)", tableName) + expectedFingerprint := fmt.Sprintf("INSERT /* CheckMBlkReadTime controller='test' */ INTO %s (customer_id, first_name, last_name, active) VALUES ($1, $2, $3, $4)", tableName) expected := &agentpb.MetricsBucket{ Common: &agentpb.MetricsBucket_Common{ Queryid: actual.Common.Queryid, Fingerprint: expectedFingerprint, Example: actual.Common.Example, ExampleType: agentpb.ExampleType_RANDOM, + Comments: map[string]string{"controller": "test"}, Database: "pmm-agent", Username: "pmm-agent", ClientHost: actual.Common.ClientHost, diff --git a/agent/agents/postgres/pgstatmonitor/stat_monitor_cache_test.go b/agent/agents/postgres/pgstatmonitor/stat_monitor_cache_test.go index b235882649..bfaf963560 100644 --- a/agent/agents/postgres/pgstatmonitor/stat_monitor_cache_test.go +++ b/agent/agents/postgres/pgstatmonitor/stat_monitor_cache_test.go @@ -45,7 +45,7 @@ func TestPGStatMonitorStructs(t *testing.T) { assert.NoError(t, err) }() - m := setup(t, db, false) + m := setup(t, db, false, false) settings, err := m.getSettings() assert.NoError(t, err) normalizedQuery, err := settings.getNormalizedQueryValue() diff --git a/agent/agents/postgres/pgstatstatements/models.go b/agent/agents/postgres/pgstatstatements/models.go index 4a106ec9c2..8b7b52a5aa 100644 --- a/agent/agents/postgres/pgstatstatements/models.go +++ b/agent/agents/postgres/pgstatstatements/models.go @@ -72,9 +72,10 @@ type pgStatStatementsExtended struct { Username string Tables []string IsQueryTruncated bool + Comments map[string]string } func (e *pgStatStatementsExtended) String() string { - return fmt.Sprintf("%q %q %v: %d: %s (truncated = %t)", - e.Database, e.Username, e.Tables, e.QueryID, e.Query, e.IsQueryTruncated) + return fmt.Sprintf("%q %q %v: %d: %s (truncated = %t) %v", + e.Database, e.Username, e.Tables, e.QueryID, e.Query, e.IsQueryTruncated, e.Comments) } diff --git a/agent/agents/postgres/pgstatstatements/pgstatstatements.go b/agent/agents/postgres/pgstatstatements/pgstatstatements.go index b60b32257f..2a86d4e8a4 100644 --- a/agent/agents/postgres/pgstatstatements/pgstatstatements.go +++ b/agent/agents/postgres/pgstatstatements/pgstatstatements.go @@ -35,6 +35,7 @@ import ( "github.com/percona/pmm/agent/agents" "github.com/percona/pmm/agent/agents/cache" + "github.com/percona/pmm/agent/queryparser" "github.com/percona/pmm/agent/utils/truncate" "github.com/percona/pmm/api/agentpb" "github.com/percona/pmm/api/inventorypb" @@ -53,24 +54,26 @@ type statementsMap map[int64]*pgStatStatementsExtended // PGStatStatementsQAN QAN services connects to PostgreSQL and extracts stats. type PGStatStatementsQAN struct { - q *reform.Querier - dbCloser io.Closer - agentID string - maxQueryLength int32 - l *logrus.Entry - changes chan agents.Change - statementsCache *statementsCache + q *reform.Querier + dbCloser io.Closer + agentID string + maxQueryLength int32 + disableCommentsParsing bool + l *logrus.Entry + changes chan agents.Change + statementsCache *statementsCache } // Params represent Agent parameters. type Params struct { - DSN string - AgentID string - MaxQueryLength int32 - TextFiles *agentpb.TextFiles + DSN string + AgentID string + MaxQueryLength int32 + DisableCommentsParsing bool + TextFiles *agentpb.TextFiles } -const queryTag = "pmm-agent:pgstatstatements" +const queryTag = "agent='pgstatstatements'" // New creates new PGStatStatementsQAN QAN service. func New(params *Params, l *logrus.Entry) (*PGStatStatementsQAN, error) { @@ -85,23 +88,24 @@ func New(params *Params, l *logrus.Entry) (*PGStatStatementsQAN, error) { reformL := sqlmetrics.NewReform("postgres", params.AgentID, l.Tracef) // TODO register reformL metrics https://jira.percona.com/browse/PMM-4087 q := reform.NewDB(sqlDB, postgresql.Dialect, reformL).WithTag(queryTag) - return newPgStatStatementsQAN(q, sqlDB, params.AgentID, params.MaxQueryLength, l) + return newPgStatStatementsQAN(q, sqlDB, params.AgentID, params.MaxQueryLength, params.DisableCommentsParsing, l) } -func newPgStatStatementsQAN(q *reform.Querier, dbCloser io.Closer, agentID string, maxQueryLength int32, l *logrus.Entry) (*PGStatStatementsQAN, error) { +func newPgStatStatementsQAN(q *reform.Querier, dbCloser io.Closer, agentID string, maxQueryLength int32, disableCommentsParsing bool, l *logrus.Entry) (*PGStatStatementsQAN, error) { //nolint:lll statementCache, err := newStatementsCache(statementsMap{}, retainStatStatements, statStatementsCacheSize, l) if err != nil { return nil, errors.Wrap(err, "cannot create cache") } return &PGStatStatementsQAN{ - q: q, - dbCloser: dbCloser, - agentID: agentID, - maxQueryLength: maxQueryLength, - l: l, - changes: make(chan agents.Change, 10), - statementsCache: statementCache, + q: q, + dbCloser: dbCloser, + agentID: agentID, + maxQueryLength: maxQueryLength, + disableCommentsParsing: disableCommentsParsing, + l: l, + changes: make(chan agents.Change, 10), + statementsCache: statementCache, }, nil } @@ -130,8 +134,7 @@ func rowsByVersion(q *reform.Querier, tail string) (*sql.Rows, error) { } columns := strings.Join(q.QualifiedColumns(pgStatStatementsView), ", ") - switch { - case pgStatVersion.GE(pgStatVer18): + if pgStatVersion.GE(pgStatVer18) { columns = strings.Replace(columns, `"total_time"`, `"total_exec_time"`, 1) } @@ -285,7 +288,7 @@ func (m *PGStatStatementsQAN) getNewBuckets(ctx context.Context, periodStart tim return nil, err } - buckets := makeBuckets(current, prev, m.l) + buckets := makeBuckets(current, prev, m.disableCommentsParsing, m.l) startS := uint32(periodStart.Unix()) m.l.Debugf("Made %d buckets out of %d stat statements in %s+%d interval.", len(buckets), len(current), periodStart.Format("15:04:05"), periodLengthSecs) @@ -309,10 +312,8 @@ func (m *PGStatStatementsQAN) getNewBuckets(ctx context.Context, periodStart tim } // makeBuckets uses current state of pg_stat_statements table and accumulated previous state -// to make metrics buckets. -// -// makeBuckets is a pure function for easier testing. -func makeBuckets(current, prev statementsMap, l *logrus.Entry) []*agentpb.MetricsBucket { +// to make metrics buckets. It's a pure function for easier testing. +func makeBuckets(current, prev statementsMap, disableCommentsParsing bool, l *logrus.Entry) []*agentpb.MetricsBucket { res := make([]*agentpb.MetricsBucket, 0, len(current)) for queryID, currentPSS := range current { @@ -342,12 +343,21 @@ func makeBuckets(current, prev statementsMap, l *logrus.Entry) []*agentpb.Metric currentPSS.Tables = extractTables(currentPSS.Query, l) } + if !disableCommentsParsing { + comments, err := queryparser.PostgreSQLComments(currentPSS.Query) + if err != nil { + l.Errorf("failed to parse comments for query: %s", currentPSS.Query) + } + currentPSS.Comments = comments + } + mb := &agentpb.MetricsBucket{ Common: &agentpb.MetricsBucket_Common{ Database: currentPSS.Database, Tables: currentPSS.Tables, Username: currentPSS.Username, Queryid: strconv.FormatInt(currentPSS.QueryID, 10), + Comments: currentPSS.Comments, Fingerprint: currentPSS.Query, NumQueries: count, AgentType: inventorypb.AgentType_QAN_POSTGRESQL_PGSTATEMENTS_AGENT, diff --git a/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go b/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go index 9f85ef6396..eac93e5d3a 100644 --- a/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go +++ b/agent/agents/postgres/pgstatstatements/pgstatstatements_test.go @@ -45,7 +45,7 @@ func setup(t *testing.T, db *reform.DB) *PGStatStatementsQAN { _, err := db.Exec(selectQuery + "pg_stat_statements_reset()") require.NoError(t, err) - p, err := newPgStatStatementsQAN(db.WithTag(queryTag), nil, "agent_id", truncate.GetDefaultMaxQueryLength(), logrus.WithField("test", t.Name())) + p, err := newPgStatStatementsQAN(db.WithTag(queryTag), nil, "agent_id", truncate.GetDefaultMaxQueryLength(), false, logrus.WithField("test", t.Name())) require.NoError(t, err) return p @@ -56,7 +56,7 @@ func filter(mb []*agentpb.MetricsBucket) []*agentpb.MetricsBucket { res := make([]*agentpb.MetricsBucket, 0, len(mb)) for _, b := range mb { switch { - case strings.Contains(b.Common.Fingerprint, "/* pmm-agent:pgstatstatements */"): + case strings.Contains(b.Common.Fingerprint, "/* agent='pgstatstatements' */"): continue default: res = append(res, b) @@ -104,8 +104,8 @@ func TestPGStatStatementsQAN(t *testing.T) { require.NoError(t, err) tests.LogTable(t, structs) - const selectAllCities = "SELECT /* AllCities:pgstatstatements */ * FROM city" - const selectAllCitiesLong = "SELECT /* AllCitiesTruncated:pgstatstatements */ * FROM city WHERE id IN " + + const selectAllCities = "SELECT /* AllCities:pgstatstatements controller='test' */ * FROM city" + const selectAllCitiesLong = "SELECT /* AllCitiesTruncated:pgstatstatements controller='test' */ * FROM city WHERE id IN " + "($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20, " + "$21, $22, $23, $24, $25, $26, $27, $28, $29, $30, $31, $32, $33, $34, $35, $36, $37, $38, $39, $40, " + "$41, $42, $43, $44, $45, $46, $47, $48, $49, $50, $51, $52, $53, $54, $55, $56, $57, $58, $59, $60, " + @@ -123,7 +123,7 @@ func TestPGStatStatementsQAN(t *testing.T) { "$281, $282, $283, $284, $285, $286, $287, $288, $289, $290, $291, $292, $293, $294, $295, $296, $297, $298, $299, $300, " + "$301, $302, $303, $304, $305, $306, $307, $308, $309, $310, $311, $312, $313, $314, $315, $316, $317, $318, $319, $320, " + "$321, $322, $323, $324, $325, $326, $327, $328, $329, $330, $331, $332, $333, $334, $335, $336, $337, $338, $339, $340, " + - "$341, $342, $343, $344, $345, $346, $3 ..." + "$341, $342, $343, $3 ..." engineVersion := tests.PostgreSQLVersion(t, sqlDB) var digests map[string]string // digest_text/fingerprint to digest/query_id @@ -198,6 +198,7 @@ func TestPGStatStatementsQAN(t *testing.T) { Fingerprint: selectAllCities, Database: "pmm-agent", Tables: []string{"city"}, + Comments: map[string]string{"controller": "test"}, Username: "pmm-agent", AgentId: "agent_id", PeriodStartUnixSecs: 1554116340, @@ -238,6 +239,7 @@ func TestPGStatStatementsQAN(t *testing.T) { Fingerprint: selectAllCities, Database: "pmm-agent", Tables: []string{"city"}, + Comments: map[string]string{"controller": "test"}, Username: "pmm-agent", AgentId: "agent_id", PeriodStartUnixSecs: 1554116340, @@ -270,7 +272,7 @@ func TestPGStatStatementsQAN(t *testing.T) { for i := 0; i < n; i++ { args[i] = i } - q := fmt.Sprintf("SELECT /* AllCitiesTruncated:pgstatstatements */ * FROM city WHERE id IN (%s)", strings.Join(placeholders, ", ")) + q := fmt.Sprintf("SELECT /* AllCitiesTruncated:pgstatstatements controller='test' */ * FROM city WHERE id IN (%s)", strings.Join(placeholders, ", ")) _, err := db.Exec(q, args...) require.NoError(t, err) @@ -289,6 +291,7 @@ func TestPGStatStatementsQAN(t *testing.T) { Fingerprint: selectAllCitiesLong, Database: "pmm-agent", Tables: []string{}, + Comments: map[string]string{"controller": "test"}, Username: "pmm-agent", AgentId: "agent_id", PeriodStartUnixSecs: 1554116340, @@ -332,6 +335,7 @@ func TestPGStatStatementsQAN(t *testing.T) { Fingerprint: selectAllCitiesLong, Database: "pmm-agent", Tables: []string{}, + Comments: map[string]string{"controller": "test"}, Username: "pmm-agent", AgentId: "agent_id", PeriodStartUnixSecs: 1554116340, @@ -381,7 +385,7 @@ func TestPGStatStatementsQAN(t *testing.T) { go func() { defer waitGroup.Done() _, err := db.Exec( - fmt.Sprintf(`INSERT /* CheckMBlkReadTime */ INTO %s (customer_id, first_name, last_name, active) VALUES (%d, 'John', 'Dow', TRUE)`, tableName, id)) + fmt.Sprintf(`INSERT /* CheckMBlkReadTime controller='test' */ INTO %s (customer_id, first_name, last_name, active) VALUES (%d, 'John', 'Dow', TRUE)`, tableName, id)) require.NoError(t, err) }() } @@ -396,10 +400,10 @@ func TestPGStatStatementsQAN(t *testing.T) { var fingerprint string switch engineVersion { case "9.4", "9.5", "9.6": - fingerprint = fmt.Sprintf(`INSERT /* CheckMBlkReadTime */ INTO %s (customer_id, first_name, last_name, active) VALUES (?, ?, ?, ?)`, tableName) + fingerprint = fmt.Sprintf(`INSERT /* CheckMBlkReadTime controller='test' */ INTO %s (customer_id, first_name, last_name, active) VALUES (?, ?, ?, ?)`, tableName) default: - fingerprint = fmt.Sprintf(`INSERT /* CheckMBlkReadTime */ INTO %s (customer_id, first_name, last_name, active) VALUES ($1, $2, $3, $4)`, tableName) + fingerprint = fmt.Sprintf(`INSERT /* CheckMBlkReadTime controller='test' */ INTO %s (customer_id, first_name, last_name, active) VALUES ($1, $2, $3, $4)`, tableName) } actual := buckets[0] assert.NotZero(t, actual.Postgresql.MBlkReadTimeSum) @@ -409,6 +413,7 @@ func TestPGStatStatementsQAN(t *testing.T) { Fingerprint: fingerprint, Database: "pmm-agent", Tables: []string{tableName}, + Comments: map[string]string{"controller": "test"}, Username: "pmm-agent", AgentId: "agent_id", PeriodStartUnixSecs: 1590404340, diff --git a/agent/agents/process/process_child.go b/agent/agents/process/process_child.go index 261c3d988f..d1ed2b3c19 100644 --- a/agent/agents/process/process_child.go +++ b/agent/agents/process/process_child.go @@ -52,6 +52,7 @@ func main() { panic("process isn't moved to running state.") } - fmt.Println(process.GetPID(p)) // Printing PID of the child process to let test check if the child process is dead or not. + // Printing PID of the child process to let test check if the child process is dead or not. + fmt.Println(process.GetPID(p)) //nolint:forbidigo time.Sleep(30 * time.Second) // Waiting until test kills this process. } diff --git a/agent/agents/process/process_logger.go b/agent/agents/process/process_logger.go index 5c986612de..319bdf2ad5 100644 --- a/agent/agents/process/process_logger.go +++ b/agent/agents/process/process_logger.go @@ -80,17 +80,17 @@ func (pl *processLogger) Write(p []byte) (n int, err error) { //nolint:nonamedre if pl.l != nil { level, found, err := extractLogLevel(line) - if err != nil { + switch { + case err != nil: pl.l.Warnf("Extract log level error: %v.", err) - pl.l.Infoln(line) - } else if found { + case found: if level < logrus.ErrorLevel { level = logrus.ErrorLevel } pl.l.Logln(level, line) - } else { + default: pl.l.Infoln(line) } } diff --git a/agent/agents/process/process_test.go b/agent/agents/process/process_test.go index 749ccd5abe..719d23138e 100644 --- a/agent/agents/process/process_test.go +++ b/agent/agents/process/process_test.go @@ -62,7 +62,6 @@ func build(t *testing.T, tag string, fileName string, outputFile string) *exec.C func setup(t *testing.T) (context.Context, context.CancelFunc, *logrus.Entry) { t.Helper() - t.Parallel() ctx, cancel := context.WithCancel(context.Background()) l := logrus.WithField("test", t.Name()) diff --git a/agent/agents/supervisor/supervisor.go b/agent/agents/supervisor/supervisor.go index b23bd488b6..3538644ba4 100644 --- a/agent/agents/supervisor/supervisor.go +++ b/agent/agents/supervisor/supervisor.go @@ -512,12 +512,13 @@ func (s *Supervisor) startBuiltin(agentID string, builtinAgent *agentpb.SetState switch builtinAgent.Type { case inventorypb.AgentType_QAN_MYSQL_PERFSCHEMA_AGENT: params := &perfschema.Params{ - DSN: dsn, - AgentID: agentID, - MaxQueryLength: builtinAgent.MaxQueryLength, - DisableQueryExamples: builtinAgent.DisableQueryExamples, - TextFiles: builtinAgent.GetTextFiles(), - TLSSkipVerify: builtinAgent.TlsSkipVerify, + DSN: dsn, + AgentID: agentID, + MaxQueryLength: builtinAgent.MaxQueryLength, + DisableCommentsParsing: builtinAgent.DisableCommentsParsing, + DisableQueryExamples: builtinAgent.DisableQueryExamples, + TextFiles: builtinAgent.GetTextFiles(), + TLSSkipVerify: builtinAgent.TlsSkipVerify, } agent, err = perfschema.New(params, l) @@ -531,34 +532,37 @@ func (s *Supervisor) startBuiltin(agentID string, builtinAgent *agentpb.SetState case inventorypb.AgentType_QAN_MYSQL_SLOWLOG_AGENT: params := &slowlog.Params{ - DSN: dsn, - AgentID: agentID, - SlowLogFilePrefix: cfg.Paths.SlowLogFilePrefix, - MaxQueryLength: builtinAgent.MaxQueryLength, - DisableQueryExamples: builtinAgent.DisableQueryExamples, - MaxSlowlogFileSize: builtinAgent.MaxQueryLogSize, - TextFiles: builtinAgent.GetTextFiles(), - TLSSkipVerify: builtinAgent.TlsSkipVerify, - TLS: false, + DSN: dsn, + AgentID: agentID, + SlowLogFilePrefix: cfg.Paths.SlowLogFilePrefix, + MaxQueryLength: builtinAgent.MaxQueryLength, + DisableCommentsParsing: builtinAgent.DisableCommentsParsing, + DisableQueryExamples: builtinAgent.DisableQueryExamples, + MaxSlowlogFileSize: builtinAgent.MaxQueryLogSize, + TextFiles: builtinAgent.GetTextFiles(), + TLSSkipVerify: builtinAgent.TlsSkipVerify, + TLS: false, } agent, err = slowlog.New(params, l) case inventorypb.AgentType_QAN_POSTGRESQL_PGSTATEMENTS_AGENT: params := &pgstatstatements.Params{ - DSN: dsn, - AgentID: agentID, - MaxQueryLength: builtinAgent.MaxQueryLength, - TextFiles: builtinAgent.GetTextFiles(), + DSN: dsn, + AgentID: agentID, + MaxQueryLength: builtinAgent.MaxQueryLength, + DisableCommentsParsing: builtinAgent.DisableCommentsParsing, + TextFiles: builtinAgent.GetTextFiles(), } agent, err = pgstatstatements.New(params, l) case inventorypb.AgentType_QAN_POSTGRESQL_PGSTATMONITOR_AGENT: params := &pgstatmonitor.Params{ - DSN: dsn, - AgentID: agentID, - MaxQueryLength: builtinAgent.MaxQueryLength, - TextFiles: builtinAgent.GetTextFiles(), - DisableQueryExamples: builtinAgent.DisableQueryExamples, + DSN: dsn, + AgentID: agentID, + MaxQueryLength: builtinAgent.MaxQueryLength, + TextFiles: builtinAgent.GetTextFiles(), + DisableCommentsParsing: builtinAgent.DisableCommentsParsing, + DisableQueryExamples: builtinAgent.DisableQueryExamples, } agent, err = pgstatmonitor.New(params, l) diff --git a/agent/agents/supervisor/supervisor_test.go b/agent/agents/supervisor/supervisor_test.go index 4432c69d8f..33673f0462 100644 --- a/agent/agents/supervisor/supervisor_test.go +++ b/agent/agents/supervisor/supervisor_test.go @@ -280,6 +280,7 @@ func TestFilter(t *testing.T) { } func TestSupervisorProcessParams(t *testing.T) { + t.Parallel() setup := func(t *testing.T) (*Supervisor, func()) { t.Helper() diff --git a/agent/client/channel/channel.go b/agent/client/channel/channel.go index 9dcb0620a1..a7313ea584 100644 --- a/agent/client/channel/channel.go +++ b/agent/client/channel/channel.go @@ -165,7 +165,7 @@ func (c *Channel) Send(resp *AgentResponse) { // If error occurred - subscription got canceled - returned payload is nil and error contains reason for cancelation. // Response and error will be both nil if channel is closed. // It is no-op once channel is closed (see Wait). -func (c *Channel) SendAndWaitResponse(payload agentpb.AgentRequestPayload) (agentpb.ServerResponsePayload, error) { +func (c *Channel) SendAndWaitResponse(payload agentpb.AgentRequestPayload) (agentpb.ServerResponsePayload, error) { //nolint:ireturn id := atomic.AddUint32(&c.lastSentRequestID, 1) ch := c.subscribe(id) diff --git a/agent/client/client.go b/agent/client/client.go index 259447e5d8..e4e3b6c5ed 100644 --- a/agent/client/client.go +++ b/agent/client/client.go @@ -671,7 +671,7 @@ func (c *Client) handleStartJobRequest(p *agentpb.StartJobRequest) error { } func (c *Client) getMongoDSN(dsn string, files *agentpb.TextFiles, jobID string) (string, error) { - tempDir := filepath.Join(c.cfg.Get().Paths.TempDir, "mongodb-backup-restore", strings.Replace(jobID, "/", "_", -1)) + tempDir := filepath.Join(c.cfg.Get().Paths.TempDir, "mongodb-backup-restore", strings.Replace(jobID, "/", "_", -1)) //nolint:gocritic res, err := templates.RenderDSN(dsn, files, tempDir) if err != nil { return "", errors.WithStack(err) diff --git a/agent/client/client_test.go b/agent/client/client_test.go index 10a551e97d..afb17d091b 100644 --- a/agent/client/client_test.go +++ b/agent/client/client_test.go @@ -76,6 +76,8 @@ func setup(t *testing.T, connect func(agentpb.Agent_ConnectServer) error) (port } func TestClient(t *testing.T) { + t.Parallel() + t.Run("NoAddress", func(t *testing.T) { t.Parallel() ctx, cancel := context.WithCancel(context.Background()) diff --git a/agent/client/deps.go b/agent/client/deps.go index 830ff9dfac..4310931445 100644 --- a/agent/client/deps.go +++ b/agent/client/deps.go @@ -23,8 +23,8 @@ import ( "github.com/percona/pmm/api/agentpb" ) -//go:generate ../../bin/mockery -name=connectionChecker -case=snake -inpkg -testonly -//go:generate ../../bin/mockery -name=supervisor -case=snake -inpkg -testonly +//go:generate ../../bin/mockery --name=connectionChecker --case=snake --inpackage --testonly +//go:generate ../../bin/mockery --name=supervisor --case=snake --inpackage --testonly // connectionChecker is a subset of methods of connectionchecker.ConnectionChecker used by this package. // We use it instead of real type for testing and to avoid dependency cycle. diff --git a/agent/client/mock_connection_checker_test.go b/agent/client/mock_connection_checker_test.go index 77e0a17cb9..b51b749909 100644 --- a/agent/client/mock_connection_checker_test.go +++ b/agent/client/mock_connection_checker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package client @@ -30,3 +30,18 @@ func (_m *mockConnectionChecker) Check(ctx context.Context, req *agentpb.CheckCo return r0 } + +// newMockConnectionChecker creates a new instance of mockConnectionChecker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockConnectionChecker(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockConnectionChecker { + mock := &mockConnectionChecker{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/agent/client/mock_supervisor_test.go b/agent/client/mock_supervisor_test.go index 9e96ef2a92..3fae474213 100644 --- a/agent/client/mock_supervisor_test.go +++ b/agent/client/mock_supervisor_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package client @@ -20,6 +20,10 @@ func (_m *mockSupervisor) AgentLogByID(_a0 string) ([]string, uint) { ret := _m.Called(_a0) var r0 []string + var r1 uint + if rf, ok := ret.Get(0).(func(string) ([]string, uint)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(string) []string); ok { r0 = rf(_a0) } else { @@ -28,7 +32,6 @@ func (_m *mockSupervisor) AgentLogByID(_a0 string) ([]string, uint) { } } - var r1 uint if rf, ok := ret.Get(1).(func(string) uint); ok { r1 = rf(_a0) } else { @@ -110,3 +113,18 @@ func (_m *mockSupervisor) RestartAgents() { func (_m *mockSupervisor) SetState(_a0 *agentpb.SetStateRequest) { _m.Called(_a0) } + +// newMockSupervisor creates a new instance of mockSupervisor. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockSupervisor(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockSupervisor { + mock := &mockSupervisor{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/agent/cmd/pmm-agent-entrypoint/main.go b/agent/cmd/pmm-agent-entrypoint/main.go index 636bbf874e..6004cd126f 100644 --- a/agent/cmd/pmm-agent-entrypoint/main.go +++ b/agent/cmd/pmm-agent-entrypoint/main.go @@ -1,4 +1,3 @@ -// pmm-agent // Copyright 2019 Percona LLC // // Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/agent/commands/clients.go b/agent/commands/clients.go index 43c4ae949e..32641052aa 100644 --- a/agent/commands/clients.go +++ b/agent/commands/clients.go @@ -138,7 +138,7 @@ func setServerTransport(u *url.URL, insecureTLS bool, l *logrus.Entry) { // ParseCustomLabels parses --custom-labels flag value. // // Note that quotes around value are parsed and removed by shell before this function is called. -// E.g. the value of [[--custom-labels='region=us-east1, mylabel=mylab-22']] will be received by this function +// For example, the value of [[--custom-labels='region=us-east1, mylabel=mylab-22']] will be received by this function // as [[region=us-east1, mylabel=mylab-22]]. func ParseCustomLabels(labels string) (map[string]string, error) { result := make(map[string]string) diff --git a/agent/commands/setup.go b/agent/commands/setup.go index df79e2076d..8489a5dbf9 100644 --- a/agent/commands/setup.go +++ b/agent/commands/setup.go @@ -12,6 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. +//nolint:forbidigo package commands import ( @@ -50,7 +51,7 @@ func Setup() { var e config.ConfigFileDoesNotExistError if err != nil && !errors.As(err, &e) { - fmt.Printf("Failed to load configuration: %s.\n", err) //nolint:forbidigo + fmt.Printf("Failed to load configuration: %s.\n", err) os.Exit(1) } @@ -60,12 +61,12 @@ func Setup() { configFilepath, running := checkStatus(configFilepath, l) if cfg.ID == "" && cfg.Setup.SkipRegistration { - fmt.Printf("Can't skip registration: pmm-agent ID is empty.\n") //nolint:forbidigo + fmt.Printf("Can't skip registration: pmm-agent ID is empty.\n") os.Exit(1) } if err := config.IsWritable(configFilepath); err != nil { - fmt.Printf("Config file %s is not writable: %v.\n", configFilepath, err) //nolint:forbidigo + fmt.Printf("Config file %s is not writable: %v.\n", configFilepath, err) os.Exit(1) } @@ -74,13 +75,13 @@ func Setup() { } if err = config.SaveToFile(configFilepath, cfg, "Updated by `pmm-agent setup`."); err != nil { - fmt.Printf("Failed to write configuration file %s: %s.\n", configFilepath, err) //nolint:forbidigo + fmt.Printf("Failed to write configuration file %s: %s.\n", configFilepath, err) os.Exit(1) } - fmt.Printf("Configuration file %s updated.\n", configFilepath) //nolint:forbidigo + fmt.Printf("Configuration file %s updated.\n", configFilepath) if !running { - fmt.Printf("Please start pmm-agent: `pmm-agent --config-file=%s`.\n", configFilepath) //nolint:forbidigo + fmt.Printf("Please start pmm-agent: `pmm-agent --config-file=%s`.\n", configFilepath) return } diff --git a/agent/connectionchecker/connection_checker.go b/agent/connectionchecker/connection_checker.go index 6d6ef9ecaf..280c406844 100644 --- a/agent/connectionchecker/connection_checker.go +++ b/agent/connectionchecker/connection_checker.go @@ -90,7 +90,7 @@ func (cc *ConnectionChecker) Check(ctx context.Context, msg *agentpb.CheckConnec func (cc *ConnectionChecker) sqlPing(ctx context.Context, db *sql.DB) error { // use both query tag and SELECT value to cover both comments and values stripping by the server var dest string - err := db.QueryRowContext(ctx, `SELECT /* pmm-agent:connectionchecker */ 'pmm-agent'`).Scan(&dest) + err := db.QueryRowContext(ctx, `SELECT /* agent='connectionchecker' */ 'pmm-agent'`).Scan(&dest) cc.l.Debugf("sqlPing: %v", err) return err } @@ -144,7 +144,7 @@ func (cc *ConnectionChecker) checkMySQLConnection(ctx context.Context, dsn strin } var count uint64 - if err = db.QueryRowContext(ctx, "SELECT /* pmm-agent:connectionchecker */ COUNT(*) FROM information_schema.tables").Scan(&count); err != nil { + if err = db.QueryRowContext(ctx, "SELECT /* agent='connectionchecker' */ COUNT(*) FROM information_schema.tables").Scan(&count); err != nil { res.Error = err.Error() return &res } diff --git a/agent/connectionuptime/service.go b/agent/connectionuptime/service.go index febf2420ea..49ec3bc0b0 100644 --- a/agent/connectionuptime/service.go +++ b/agent/connectionuptime/service.go @@ -1,4 +1,3 @@ -// pmm-agent // Copyright 2019 Percona LLC // // Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/agent/connectionuptime/service_test.go b/agent/connectionuptime/service_test.go index 5d562b63e4..e6ddcc1c41 100644 --- a/agent/connectionuptime/service_test.go +++ b/agent/connectionuptime/service_test.go @@ -1,4 +1,3 @@ -// pmm-agent // Copyright 2019 Percona LLC // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -26,6 +25,7 @@ import ( ) func TestConnectionUpTime(t *testing.T) { + t.Parallel() now := time.Now() tests := []struct { name string @@ -175,6 +175,7 @@ func TestConnectionUpTime(t *testing.T) { } func TestConnectionUpTimeWithUpdatingConnectionUptime(t *testing.T) { + t.Parallel() now := time.Now() tests := []struct { name string @@ -269,6 +270,7 @@ func compareFloatWithTolerance(a, b float32) bool { } func TestCalculationConnectionUpTimeWhenCleanupMethodIsNotCalled(t *testing.T) { + t.Parallel() now := time.Now() tests := []struct { name string diff --git a/agent/docker-compose-pg-load.yml b/agent/docker-compose-pg-load.yml index 53f013f437..a2c238007e 100644 --- a/agent/docker-compose-pg-load.yml +++ b/agent/docker-compose-pg-load.yml @@ -11,6 +11,7 @@ services: -c track_activity_query_size=2048 -c pg_stat_monitor.pgsm_query_max_len=10000 -c pg_stat_monitor.pgsm_normalized_query=0 + -c pg_stat_monitor.pgsm_extract_comments=yes -c track_io_timing=on ports: - 127.0.0.1:5432:5432 diff --git a/agent/main_test.go b/agent/main_test.go index 23cb4f460c..4c6cd30161 100644 --- a/agent/main_test.go +++ b/agent/main_test.go @@ -73,23 +73,23 @@ func TestVersionPlain(t *testing.T) { // 2. Just building the agent does not guarantees that there is a version set. // go run main.go --version // panic: pmm-agent version is not set during build. -// -// goroutine 1 [running]: -// main.main() -// /home/user/go/src/github.com/percona/pmm-agent/main.go:34 +0x22a -// exit status 2 -// 3. Do we really need to test the output of a command? It is making local tests to always fail. -func TestVersionJson(t *testing.T) { - t.Parallel() - cmd := exec.Command("pmm-agent", "--version", "--json") - b, err := cmd.CombinedOutput() - require.NoError(t, err, "%s", b) - - var jsonStruct interface{} - err = json.Unmarshal(b, &jsonStruct) - require.NoError(t, err, `'pmm-agent --version --json' produces incorrect output format`) -} +goroutine 1 [running]: +main.main() + /home/user/go/src/github.com/percona/pmm-agent/main.go:34 +0x22a +exit status 2 +3. Do we really need to test the output of a command? It is making local tests to always fail. + + func TestVersionJson(t *testing.T) { + t.Parallel() + cmd := exec.Command("pmm-agent", "--version", "--json") + b, err := cmd.CombinedOutput() + require.NoError(t, err, "%s", b) + + var jsonStruct interface{} + err = json.Unmarshal(b, &jsonStruct) + require.NoError(t, err, `'pmm-agent --version --json' produces incorrect output format`) + } */ func TestImports(t *testing.T) { diff --git a/agent/queryparser/helpers.go b/agent/queryparser/helpers.go new file mode 100644 index 0000000000..2862a2f3b0 --- /dev/null +++ b/agent/queryparser/helpers.go @@ -0,0 +1,285 @@ +// Copyright 2019 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package queryparser provides functionality for queries parsing. +package queryparser + +import ( + "bufio" + "fmt" + "regexp" + "strings" + "sync" +) + +var ( + spaceRegexp *regexp.Regexp + spaceOnce sync.Once + errSpace error + + multilineRegexp *regexp.Regexp + multilineOnce sync.Once + errMultiline error + + dashRegexp *regexp.Regexp + dashOnce sync.Once + errDash error + + sharpRegexp *regexp.Regexp + sharpOnce sync.Once + errSharp error + + keyValueRegexp *regexp.Regexp + keyValueOnce sync.Once + errKeyValue error +) + +func parseMySQLComments(q string) (map[string]bool, error) { + if err := prepareMultilineRegexp(); err != nil { + return nil, err + } + + // comments using comment as a key to avoid duplicates + comments := make(map[string]bool) + for _, v := range multilineRegexp.FindAllStringSubmatch(q, -1) { + if len(v) < 2 { + continue + } + + value := removeFormatting(v[1]) + + var err error + value, err = removeSpaces(value) + if err != nil { + return nil, err + } + + parsed, err := parseKeyValueFromComment(value) + if err != nil { + continue + } + for k := range parsed { + comments[k] = true + } + } + + hashComments, err := parseSinglelineComments(q, "#") + if err != nil { + return nil, err + } + for c := range hashComments { + parsed, err := parseKeyValueFromComment(c) + if err != nil { + continue + } + for k := range parsed { + comments[k] = true + } + } + + dashComments, err := parseSinglelineComments(q, "--") + if err != nil { + return nil, err + } + for c := range dashComments { + parsed, err := parseKeyValueFromComment(c) + if err != nil { + continue + } + for k := range parsed { + comments[k] = true + } + } + + return comments, nil +} + +func parsePostgreSQLComments(q string) (map[string]bool, error) { + if err := prepareMultilineRegexp(); err != nil { + return nil, err + } + + // comments using comment as a key to avoid duplicates + comments := make(map[string]bool) + for _, v := range multilineRegexp.FindAllStringSubmatch(q, -1) { + if len(v) < 2 { + continue + } + + value := removeFormatting(v[1]) + + var err error + value, err = removeSpaces(strings.ReplaceAll(value, "*", "")) + if err != nil { + return nil, err + } + + parsed, err := parseKeyValueFromComment(value) + if err != nil { + continue + } + for k := range parsed { + comments[k] = true + } + } + + dashComments, err := parseSinglelineComments(q, "--") + if err != nil { + return nil, err + } + for c := range dashComments { + parsed, err := parseKeyValueFromComment(c) + if err != nil { + continue + } + for k := range parsed { + comments[k] = true + } + } + + return comments, nil +} + +func parseSinglelineComments(q, startChar string) (map[string]bool, error) { + var r *regexp.Regexp + switch startChar { + case "--": + if err := prepareDashRegexp(); err != nil { + return nil, err + } + r = dashRegexp + case "#": + if err := prepareSharpRegexp(); err != nil { + return nil, err + } + r = sharpRegexp + } + + // comments using comment as a key to avoid duplicates + comments := make(map[string]bool) + lines, err := stringToLines(q) + if err != nil { + return nil, err + } + for _, l := range lines { + for _, v := range r.FindStringSubmatch(l) { + comments[strings.TrimLeft(v, fmt.Sprintf("%s ", startChar))] = true + } + } + + return comments, nil +} + +func parseKeyValueFromComment(s string) (map[string]bool, error) { + if err := prepareKeyValueRegexp(); err != nil { + return nil, err + } + + res := make(map[string]bool) + matches := keyValueRegexp.FindAllStringSubmatch(removeFormatting(s), -1) + for _, v := range matches { + if len(v) < 2 { + continue + } + res[v[1]] = true + } + + return res, nil +} + +func prepareMultilineRegexp() error { + // to compile regexp only once + multilineOnce.Do(func() { + multilineRegexp, errMultiline = regexp.Compile(`(?s)\/\*(.*?)\*\/`) //nolint:gocritic + }) + if errMultiline != nil { + return errMultiline + } + + return nil +} + +func prepareSpaceRegexp() error { + // to compile regexp only once + spaceOnce.Do(func() { + spaceRegexp, errSpace = regexp.Compile(`\s+`) //nolint:gocritic + }) + if errSpace != nil { + return errSpace + } + + return nil +} + +func prepareDashRegexp() error { + // to compile regexp only once + dashOnce.Do(func() { + dashRegexp, errDash = regexp.Compile(`--.*`) //nolint:gocritic + }) + if errDash != nil { + return errDash + } + + return nil +} + +func prepareSharpRegexp() error { + // to compile regexp only once + sharpOnce.Do(func() { + sharpRegexp, errSharp = regexp.Compile(`#.*`) //nolint:gocritic + }) + if errSharp != nil { + return errSharp + } + + return nil +} + +func prepareKeyValueRegexp() error { + // to compile regexp only once + keyValueOnce.Do(func() { + keyValueRegexp, errKeyValue = regexp.Compile(`(?s)([a-zA-Z-\d]+='.+?')`) //nolint:gocritic + }) + if errKeyValue != nil { + return errKeyValue + } + + return nil +} + +func removeFormatting(s string) string { + value := strings.ReplaceAll(s, "\n", "") + return strings.ReplaceAll(value, "\t", "") +} + +func removeSpaces(s string) (string, error) { + if err := prepareSpaceRegexp(); err != nil { + return "", err + } + + value := spaceRegexp.ReplaceAllString(s, " ") + value = strings.TrimLeft(value, " ") + return strings.TrimRight(value, " "), nil +} + +func stringToLines(s string) ([]string, error) { + var lines []string + scanner := bufio.NewScanner(strings.NewReader(s)) + for scanner.Scan() { + lines = append(lines, scanner.Text()) + } + err := scanner.Err() + + return lines, err +} diff --git a/agent/queryparser/parser.go b/agent/queryparser/parser.go index b3f4b9dae8..a8e4c3e2f3 100644 --- a/agent/queryparser/parser.go +++ b/agent/queryparser/parser.go @@ -59,8 +59,44 @@ func GetMySQLFingerprintPlaceholders(query, digestText string) (string, uint32) return strings.TrimSpace(result), count } -// GetMySQLFingerprintFromExplainFingerprint convert placeholders in fingerprint from our format (:1, :2 etc) into ? +// GetMySQLFingerprintFromExplainFingerprint converts placeholders in fingerprint from our format (:1, :2 etc) into '?' // to make it compatible with sql.Query functions. func GetMySQLFingerprintFromExplainFingerprint(explainFingerprint string) string { return decimalsPlaceholdersRegexp.ReplaceAllString(explainFingerprint, "?") } + +// MySQLComments parse query and return its comments. Can parse multi comments. +// Multi comments support should be dropped in future MySQL versions. +// Doc: https://dev.mysql.com/doc/refman/8.0/en/comments.html +func MySQLComments(q string) (map[string]string, error) { + comments, err := parseMySQLComments(q) + if err != nil { + return nil, err + } + + return commentsIntoMap(comments), nil +} + +// PostgreSQLComments parse query and return its comments. Can parse multi comments. +// Doc: https://www.postgresql.org/docs/current/sql-syntax-lexical.html#SQL-SYNTAX-COMMENTS +func PostgreSQLComments(q string) (map[string]string, error) { + comments, err := parsePostgreSQLComments(q) + if err != nil { + return nil, err + } + + return commentsIntoMap(comments), nil +} + +func commentsIntoMap(comments map[string]bool) map[string]string { + res := make(map[string]string) + for c := range comments { + split := strings.Split(c, "=") + if len(split) < 2 { + continue + } + res[split[0]] = strings.ReplaceAll(split[1], "'", "") + } + + return res +} diff --git a/agent/queryparser/parser_test.go b/agent/queryparser/parser_test.go index f68fafe430..6528941277 100644 --- a/agent/queryparser/parser_test.go +++ b/agent/queryparser/parser_test.go @@ -18,9 +18,10 @@ import ( "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) -type test struct { +type testCase struct { Query string DigestText string ExpectedFingerprint string @@ -28,7 +29,7 @@ type test struct { } func TestMySQL(t *testing.T) { - sqls := []test{ + sqls := []testCase{ { Query: "SELECT /* Sleep */ sleep(0.1)", DigestText: "SELECT `sleep` (?)", @@ -79,3 +80,116 @@ func TestMySQL(t *testing.T) { assert.Equal(t, sql.ExpectedPlaceHoldersCount, placeholdersCount) } } + +type testCaseComments struct { + Name string + Query string + Comments map[string]string +} + +func TestMySQLComments(t *testing.T) { + testCases := []testCaseComments{ + { + Name: "No comment", + Query: `SELECT * FROM people WHERE name = 'John' + AND name != 'Doe'`, + Comments: make(map[string]string), + }, + { + Name: "Dash comment", + Query: `SELECT * FROM people -- web-framework='Django', controller='unknown'`, + Comments: map[string]string{ + "web-framework": "Django", + "controller": "unknown", + }, + }, + { + Name: "Hash comment", + Query: `SELECT * FROM people # framework='Django' + WHERE name = 'John' + `, + Comments: map[string]string{ + "framework": "Django", + }, + }, + { + Name: "Multiline comment with new line", + Query: `SELECT * FROM people /* Huh framework='Django', + controller='unknown' */`, + Comments: map[string]string{ + "framework": "Django", + "controller": "unknown", + }, + }, + { + Name: "Multicomment case with new line", + Query: `SELECT * FROM people /* + framework='Django', + controller='unknown' + */ WHERE name = 'John' # os='unix' + AND name != 'Doe'`, + Comments: map[string]string{ + "framework": "Django", + "controller": "unknown", + "os": "unix", + }, + }, + } + + for _, c := range testCases { + t.Run(c.Name, func(t *testing.T) { + comments, err := MySQLComments(c.Query) + require.NoError(t, err) + require.Equal(t, c.Comments, comments) + }) + } +} + +func TestPostgreSQLComments(t *testing.T) { + testCases := []testCaseComments{ + { + Name: "No comment", + Query: `SELECT * FROM people WHERE name = 'John' + AND name != 'Doe'`, + Comments: make(map[string]string), + }, + { + Name: "Dash comment", + Query: `SELECT * FROM people -- framework='Django', controller='unknown'`, + Comments: map[string]string{ + "framework": "Django", + "controller": "unknown", + }, + }, + { + Name: "Multiline comment with new line", + Query: `SELECT * FROM people /* framework='Django', + controller='unknown' */`, + Comments: map[string]string{ + "framework": "Django", + "controller": "unknown", + }, + }, + { + Name: "Multicomment case with new line", + Query: `SELECT * FROM people /* + framework='Django', + controller='unknown' + */ WHERE name = 'John' -- os='unix' + AND name != 'Doe'`, + Comments: map[string]string{ + "framework": "Django", + "controller": "unknown", + "os": "unix", + }, + }, + } + + for _, c := range testCases { + t.Run(c.Name, func(t *testing.T) { + comments, err := PostgreSQLComments(c.Query) + require.NoError(t, err) + require.Equal(t, c.Comments, comments) + }) + } +} diff --git a/agent/runner/actions/mysql_explain_action_test.go b/agent/runner/actions/mysql_explain_action_test.go index 1e32edfd8d..5ee6843eb2 100644 --- a/agent/runner/actions/mysql_explain_action_test.go +++ b/agent/runner/actions/mysql_explain_action_test.go @@ -37,7 +37,7 @@ func TestMySQLExplain(t *testing.T) { dsn := tests.GetTestMySQLDSN(t) sqlDB := tests.OpenTestMySQL(t) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { sqlDB.Close() }) //nolint:errcheck q := reform.NewDB(sqlDB, mysql.Dialect, reform.NewPrintfLogger(t.Logf)).WithTag(queryTag) ctx := context.Background() @@ -46,6 +46,7 @@ func TestMySQLExplain(t *testing.T) { const query = "SELECT * FROM city ORDER BY Population" t.Run("Default", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_MySQLExplainParams{ Dsn: dsn, Query: query, @@ -72,6 +73,7 @@ func TestMySQLExplain(t *testing.T) { }) t.Run("JSON", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_MySQLExplainParams{ Dsn: dsn, Query: query, @@ -116,6 +118,8 @@ func TestMySQLExplain(t *testing.T) { }) t.Run("TraditionalJSON", func(t *testing.T) { + t.Parallel() + params := &agentpb.StartActionRequest_MySQLExplainParams{ Dsn: dsn, Query: query, @@ -157,6 +161,8 @@ func TestMySQLExplain(t *testing.T) { }) t.Run("Error", func(t *testing.T) { + t.Parallel() + params := &agentpb.StartActionRequest_MySQLExplainParams{ Dsn: "pmm-agent:pmm-agent-wrong-password@tcp(127.0.0.1:3306)/world", OutputFormat: agentpb.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_DEFAULT, @@ -171,6 +177,8 @@ func TestMySQLExplain(t *testing.T) { }) t.Run("DML Query Insert", func(t *testing.T) { + t.Parallel() + params := &agentpb.StartActionRequest_MySQLExplainParams{ Dsn: dsn, Query: `INSERT INTO city (Name) VALUES ('Rosario')`, @@ -190,6 +198,8 @@ func TestMySQLExplain(t *testing.T) { }) t.Run("LittleBobbyTables", func(t *testing.T) { + t.Parallel() + checkCity := func(t *testing.T) { t.Helper() @@ -200,6 +210,8 @@ func TestMySQLExplain(t *testing.T) { } t.Run("Drop", func(t *testing.T) { + t.Parallel() + params := &agentpb.StartActionRequest_MySQLExplainParams{ Dsn: dsn, Query: `SELECT 1; DROP TABLE city; --`, @@ -218,6 +230,8 @@ func TestMySQLExplain(t *testing.T) { }) t.Run("Delete", func(t *testing.T) { + t.Parallel() + params := &agentpb.StartActionRequest_MySQLExplainParams{ Dsn: dsn, Query: `DELETE FROM city`, diff --git a/agent/runner/actions/mysql_query_select_action_test.go b/agent/runner/actions/mysql_query_select_action_test.go index 4afe4acdee..30d778d3d4 100644 --- a/agent/runner/actions/mysql_query_select_action_test.go +++ b/agent/runner/actions/mysql_query_select_action_test.go @@ -32,9 +32,11 @@ func TestMySQLQuerySelect(t *testing.T) { dsn := tests.GetTestMySQLDSN(t) db := tests.OpenTestMySQL(t) - defer db.Close() //nolint:errcheck + t.Cleanup(func() { db.Close() }) //nolint:errcheck t.Run("Default", func(t *testing.T) { + t.Parallel() + params := &agentpb.StartActionRequest_MySQLQuerySelectParams{ Dsn: dsn, Query: "COUNT(*) AS count FROM mysql.user WHERE plugin NOT IN ('caching_sha2_password')", @@ -55,6 +57,8 @@ func TestMySQLQuerySelect(t *testing.T) { }) t.Run("Binary", func(t *testing.T) { + t.Parallel() + params := &agentpb.StartActionRequest_MySQLQuerySelectParams{ Dsn: dsn, Query: `x'0001feff' AS bytes`, @@ -78,6 +82,8 @@ func TestMySQLQuerySelect(t *testing.T) { }) t.Run("LittleBobbyTables", func(t *testing.T) { + t.Parallel() + params := &agentpb.StartActionRequest_MySQLQuerySelectParams{ Dsn: dsn, Query: "* FROM city; DROP TABLE city; --", diff --git a/agent/runner/actions/mysql_query_show_action_test.go b/agent/runner/actions/mysql_query_show_action_test.go index bb5fa68963..f2baefee7d 100644 --- a/agent/runner/actions/mysql_query_show_action_test.go +++ b/agent/runner/actions/mysql_query_show_action_test.go @@ -32,9 +32,10 @@ func TestMySQLQueryShow(t *testing.T) { dsn := tests.GetTestMySQLDSN(t) db := tests.OpenTestMySQL(t) - defer db.Close() //nolint:errcheck + t.Cleanup(func() { db.Close() }) //nolint:errcheck t.Run("Default", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_MySQLQueryShowParams{ Dsn: dsn, Query: "VARIABLES", diff --git a/agent/runner/actions/mysql_show_create_table_action_test.go b/agent/runner/actions/mysql_show_create_table_action_test.go index 586608b571..f61e7abd3a 100644 --- a/agent/runner/actions/mysql_show_create_table_action_test.go +++ b/agent/runner/actions/mysql_show_create_table_action_test.go @@ -35,7 +35,7 @@ func TestMySQLShowCreateTable(t *testing.T) { dsn := tests.GetTestMySQLDSN(t) sqlDB := tests.OpenTestMySQL(t) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { sqlDB.Close() }) //nolint:errcheck q := reform.NewDB(sqlDB, mysql.Dialect, reform.NewPrintfLogger(t.Logf)).WithTag(queryTag) ctx := context.Background() @@ -43,6 +43,7 @@ func TestMySQLShowCreateTable(t *testing.T) { t.Logf("version = %q, vendor = %q", mySQLVersion, mySQLVendor) t.Run("Default", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_MySQLShowCreateTableParams{ Dsn: dsn, Table: "city", @@ -121,6 +122,7 @@ CREATE TABLE "city" ( }) t.Run("Error", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_MySQLShowCreateTableParams{ Dsn: dsn, Table: "no_such_table", @@ -134,6 +136,7 @@ CREATE TABLE "city" ( }) t.Run("LittleBobbyTables", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_MySQLShowCreateTableParams{ Dsn: dsn, Table: `city"; DROP TABLE city; --`, diff --git a/agent/runner/actions/mysql_show_index_action_test.go b/agent/runner/actions/mysql_show_index_action_test.go index 369b2601f4..9ddf0f7ed9 100644 --- a/agent/runner/actions/mysql_show_index_action_test.go +++ b/agent/runner/actions/mysql_show_index_action_test.go @@ -35,13 +35,14 @@ func TestMySQLShowIndex(t *testing.T) { dsn := tests.GetTestMySQLDSN(t) sqlDB := tests.OpenTestMySQL(t) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { sqlDB.Close() }) //nolint:errcheck q := reform.NewDB(sqlDB, mysql.Dialect, reform.NewPrintfLogger(t.Logf)).WithTag(queryTag) ctx := context.Background() mySQLVersion, mySQLVendor, _ := version.GetMySQLVersion(ctx, q) t.Run("Default", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_MySQLShowIndexParams{ Dsn: dsn, Table: "city", @@ -102,6 +103,7 @@ func TestMySQLShowIndex(t *testing.T) { }) t.Run("Error", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_MySQLShowIndexParams{ Dsn: dsn, Table: "no_such_table", @@ -115,6 +117,7 @@ func TestMySQLShowIndex(t *testing.T) { }) t.Run("LittleBobbyTables", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_MySQLShowIndexParams{ Dsn: dsn, Table: `city"; DROP TABLE city; --`, diff --git a/agent/runner/actions/mysql_show_table_status_action_test.go b/agent/runner/actions/mysql_show_table_status_action_test.go index 17680ed485..9c82418364 100644 --- a/agent/runner/actions/mysql_show_table_status_action_test.go +++ b/agent/runner/actions/mysql_show_table_status_action_test.go @@ -32,9 +32,10 @@ func TestShowTableStatus(t *testing.T) { dsn := tests.GetTestMySQLDSN(t) db := tests.OpenTestMySQL(t) - defer db.Close() //nolint:errcheck + t.Cleanup(func() { db.Close() }) //nolint:errcheck t.Run("Default", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_MySQLShowTableStatusParams{ Dsn: dsn, Table: "city", @@ -79,6 +80,7 @@ func TestShowTableStatus(t *testing.T) { }) t.Run("Error", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_MySQLShowTableStatusParams{ Dsn: dsn, Table: "no_such_table", @@ -92,6 +94,7 @@ func TestShowTableStatus(t *testing.T) { }) t.Run("LittleBobbyTables", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_MySQLShowTableStatusParams{ Dsn: dsn, Table: `city"; DROP TABLE city; --`, diff --git a/agent/runner/actions/postgresql_query_select_action_test.go b/agent/runner/actions/postgresql_query_select_action_test.go index f25ab986e9..74451f4efc 100644 --- a/agent/runner/actions/postgresql_query_select_action_test.go +++ b/agent/runner/actions/postgresql_query_select_action_test.go @@ -33,9 +33,10 @@ func TestPostgreSQLQuerySelect(t *testing.T) { dsn := tests.GetTestPostgreSQLDSN(t) db := tests.OpenTestPostgreSQL(t) - defer db.Close() //nolint:errcheck + t.Cleanup(func() { db.Close() }) //nolint:errcheck t.Run("Default", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_PostgreSQLQuerySelectParams{ Dsn: dsn, Query: "* FROM pg_extension", @@ -68,6 +69,7 @@ func TestPostgreSQLQuerySelect(t *testing.T) { }) t.Run("Binary", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_PostgreSQLQuerySelectParams{ Dsn: dsn, Query: `'\x0001feff'::bytea AS bytes`, @@ -91,6 +93,7 @@ func TestPostgreSQLQuerySelect(t *testing.T) { }) t.Run("LittleBobbyTables", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_PostgreSQLQuerySelectParams{ Dsn: dsn, Query: "* FROM city; DROP TABLE city CASCADE; --", diff --git a/agent/runner/actions/postgresql_query_show_action_test.go b/agent/runner/actions/postgresql_query_show_action_test.go index 3ff31771ba..e95c8b52ed 100644 --- a/agent/runner/actions/postgresql_query_show_action_test.go +++ b/agent/runner/actions/postgresql_query_show_action_test.go @@ -33,9 +33,10 @@ func TestPostgreSQLQueryShow(t *testing.T) { dsn := tests.GetTestPostgreSQLDSN(t) db := tests.OpenTestPostgreSQL(t) - defer db.Close() //nolint:errcheck + t.Cleanup(func() { db.Close() }) //nolint:errcheck t.Run("Default", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_PostgreSQLQueryShowParams{ Dsn: dsn, } diff --git a/agent/runner/actions/postgresql_show_create_table_action_test.go b/agent/runner/actions/postgresql_show_create_table_action_test.go index 695042b989..ba74a95304 100644 --- a/agent/runner/actions/postgresql_show_create_table_action_test.go +++ b/agent/runner/actions/postgresql_show_create_table_action_test.go @@ -32,9 +32,10 @@ func TestPostgreSQLShowCreateTable(t *testing.T) { dsn := tests.GetTestPostgreSQLDSN(t) db := tests.OpenTestPostgreSQL(t) - defer db.Close() //nolint:errcheck + t.Cleanup(func() { db.Close() }) //nolint:errcheck t.Run("With Schema Name", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_PostgreSQLShowCreateTableParams{ Dsn: dsn, Table: "public.country", @@ -77,6 +78,7 @@ Referenced by: }) t.Run("Without constraints", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_PostgreSQLShowCreateTableParams{ Dsn: dsn, Table: "city", @@ -105,6 +107,7 @@ Referenced by: }) t.Run("Without references", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_PostgreSQLShowCreateTableParams{ Dsn: dsn, Table: "countrylanguage", @@ -132,6 +135,7 @@ Foreign-key constraints: }) t.Run("LittleBobbyTables", func(t *testing.T) { + t.Parallel() params := &agentpb.StartActionRequest_PostgreSQLShowCreateTableParams{ Dsn: dsn, Table: `city; DROP TABLE city; --`, diff --git a/agent/runner/actions/postgresql_show_index_action_test.go b/agent/runner/actions/postgresql_show_index_action_test.go index 1ff794e914..32daae5bf3 100644 --- a/agent/runner/actions/postgresql_show_index_action_test.go +++ b/agent/runner/actions/postgresql_show_index_action_test.go @@ -33,9 +33,11 @@ func TestPostgreSQLShowIndex(t *testing.T) { dsn := tests.GetTestPostgreSQLDSN(t) db := tests.OpenTestPostgreSQL(t) - defer db.Close() //nolint:errcheck + t.Cleanup(func() { db.Close() }) //nolint:errcheck t.Run("Default", func(t *testing.T) { + t.Parallel() + params := &agentpb.StartActionRequest_PostgreSQLShowIndexParams{ Dsn: dsn, Table: "city", @@ -60,6 +62,8 @@ func TestPostgreSQLShowIndex(t *testing.T) { }) t.Run("WithSchemaName", func(t *testing.T) { + t.Parallel() + params := &agentpb.StartActionRequest_PostgreSQLShowIndexParams{ Dsn: dsn, Table: "public.city", diff --git a/agent/runner/actions/query_transform.go b/agent/runner/actions/query_transform.go index 5a91af7608..574f9e604f 100644 --- a/agent/runner/actions/query_transform.go +++ b/agent/runner/actions/query_transform.go @@ -48,6 +48,7 @@ are needed and the pmm user is a not privileged user. This function converts DML queries to the equivalent SELECT to make it able to explain DML queries on older MySQL versions and for unprivileged users. */ + // dmlToSelect returns query converted to select and boolean, if conversion were needed. func dmlToSelect(query string) (string, bool) { query = strings.ReplaceAll(query, "\n", " ") diff --git a/agent/runner/jobs/errors.go b/agent/runner/jobs/errors.go index 21a320008a..0010e58982 100644 --- a/agent/runner/jobs/errors.go +++ b/agent/runner/jobs/errors.go @@ -18,3 +18,6 @@ import "github.com/pkg/errors" // ErrNotFound returned when backup record is not found by backup tool. var ErrNotFound = errors.New("backup record not found by backup tool") + +// ErrPBMArtifactProblem returned when PBM reports artifact error. +var ErrPBMArtifactProblem = errors.New("pbm artifact problem") diff --git a/agent/runner/jobs/mongodb_backup_job.go b/agent/runner/jobs/mongodb_backup_job.go index 5320fa8eab..12f4d51620 100644 --- a/agent/runner/jobs/mongodb_backup_job.go +++ b/agent/runner/jobs/mongodb_backup_job.go @@ -158,7 +158,7 @@ func (j *MongoDBBackupJob) Run(ctx context.Context, send Send) error { return err } - backupTimestamp, err := pbmGetSnapshotTimestamp(ctx, j.dbURL, pbmBackupOut.Name) + backupTimestamp, err := pbmGetSnapshotTimestamp(ctx, j.l, j.dbURL, pbmBackupOut.Name) if err != nil { return err } diff --git a/agent/runner/jobs/mongodb_restore_job.go b/agent/runner/jobs/mongodb_restore_job.go index cc6edbd636..a95f8e856f 100644 --- a/agent/runner/jobs/mongodb_restore_job.go +++ b/agent/runner/jobs/mongodb_restore_job.go @@ -134,12 +134,17 @@ func (j *MongoDBRestoreJob) Run(ctx context.Context, send Send) error { } cancel() - snapshot, err := j.findSnapshot(ctx, j.pbmBackupName) + snapshot, err := j.findCurrentSnapshot(ctx, j.pbmBackupName) if err != nil { j.jobLogger.sendLog(send, err.Error(), false) return errors.WithStack(err) } + if snapshot.Status == "error" { //nolint:goconst + j.jobLogger.sendLog(send, snapshot.Error, false) + return errors.Wrap(ErrPBMArtifactProblem, snapshot.Error) + } + defer j.agentsRestarter.RestartAgents() restoreOut, err := j.startRestore(ctx, snapshot.Name) if err != nil { @@ -172,44 +177,25 @@ func (j *MongoDBRestoreJob) Run(ctx context.Context, send Send) error { return nil } -func (j *MongoDBRestoreJob) findSnapshot(ctx context.Context, snapshotName string) (*pbmSnapshot, error) { +func (j *MongoDBRestoreJob) findCurrentSnapshot(ctx context.Context, snapshotName string) (*pbmSnapshot, error) { j.l.Info("Finding backup entity name.") - var list pbmList - ticker := time.NewTicker(listCheckInterval) - defer ticker.Stop() - - checks := 0 - for { - select { - case <-ticker.C: - checks++ - if err := execPBMCommand(ctx, j.dbURL, &list, "list"); err != nil { - return nil, err - } - - if len(list.Snapshots) == 0 { - j.l.Debugf("Try number %d of getting list of artifacts from PBM is failed.", checks) - if checks > maxListChecks { - return nil, errors.Wrap(ErrNotFound, "got no one snapshot") - } - continue - } + snapshots, err := getSnapshots(ctx, j.l, j.dbURL) + if err != nil { + return nil, err + } - // Old artifacts don't contain pbm backup name. - if snapshotName == "" { - return &list.Snapshots[len(list.Snapshots)-1], nil - } + // Old artifacts don't contain pbm backup name. + if snapshotName == "" { + return &snapshots[0], nil + } - for _, s := range list.Snapshots { - if s.Name == snapshotName { - return &s, nil - } - } - case <-ctx.Done(): - return nil, ctx.Err() + for _, s := range snapshots { + if s.Name == snapshotName { + return &s, nil } } + return nil, errors.WithStack(ErrNotFound) } func (j *MongoDBRestoreJob) startRestore(ctx context.Context, backupName string) (*pbmRestore, error) { diff --git a/agent/runner/jobs/mysql_restore_job.go b/agent/runner/jobs/mysql_restore_job.go index e355b9fee6..761ce2ef5e 100644 --- a/agent/runner/jobs/mysql_restore_job.go +++ b/agent/runner/jobs/mysql_restore_job.go @@ -433,7 +433,7 @@ func getMysqlServiceName(ctx context.Context) (string, error) { ctx, cancel := context.WithTimeout(ctx, systemctlTimeout) defer cancel() - cmd := exec.CommandContext(ctx, "systemctl", "list-units", "--type=service") + cmd := exec.CommandContext(ctx, "systemctl", "list-unit-files", "--type=service") output, err := cmd.CombinedOutput() if err != nil { return "", errors.Wrapf(err, "failed to list system services, output: %s", string(output)) diff --git a/agent/runner/jobs/pbm_helpers.go b/agent/runner/jobs/pbm_helpers.go index 241cccf2f9..c1afcd5505 100644 --- a/agent/runner/jobs/pbm_helpers.go +++ b/agent/runner/jobs/pbm_helpers.go @@ -120,14 +120,7 @@ type pbmSnapshot struct { RestoreTo int64 `json:"restoreTo"` PbmVersion string `json:"pbmVersion"` Type string `json:"type"` -} - -type pbmList struct { - Snapshots []pbmSnapshot `json:"snapshots"` - Pitr struct { - On bool `json:"on"` - Ranges interface{} `json:"ranges"` - } `json:"pitr"` + Error string `json:"error"` } type pbmListRestore struct { @@ -556,17 +549,13 @@ func groupPartlyDoneErrors(info describeInfo) error { } // pbmGetSnapshotTimestamp returns time the backup restores target db to. -func pbmGetSnapshotTimestamp(ctx context.Context, dbURL *string, backupName string) (*time.Time, error) { - var list pbmList - if err := execPBMCommand(ctx, dbURL, &list, "list"); err != nil { +func pbmGetSnapshotTimestamp(ctx context.Context, l logrus.FieldLogger, dbURL *string, backupName string) (*time.Time, error) { + snapshots, err := getSnapshots(ctx, l, dbURL) + if err != nil { return nil, err } - if len(list.Snapshots) == 0 { - return nil, errors.Wrapf(ErrNotFound, "got no one snapshot") - } - - for _, snapshot := range list.Snapshots { + for _, snapshot := range snapshots { if snapshot.Name == backupName { return pointer.ToTime(time.Unix(snapshot.RestoreTo, 0)), nil } @@ -574,3 +563,35 @@ func pbmGetSnapshotTimestamp(ctx context.Context, dbURL *string, backupName stri return nil, errors.Wrap(ErrNotFound, "couldn't find required snapshot") } + +// getSnapshots returns all PBM snapshots found in configured location. +func getSnapshots(ctx context.Context, l logrus.FieldLogger, dbURL *string) ([]pbmSnapshot, error) { + // Sometimes PBM returns empty list of snapshots, that's why we're trying to get them several times. + ticker := time.NewTicker(listCheckInterval) + defer ticker.Stop() + + checks := 0 + for { + select { + case <-ticker.C: + checks++ + status, err := getPBMStatus(ctx, dbURL) + if err != nil { + return nil, err + } + + if len(status.Backups.Snapshot) == 0 { + l.Debugf("Attempt %d to get a list of PBM artifacts has failed.", checks) + if checks > maxListChecks { + return nil, errors.Wrap(ErrNotFound, "got no one snapshot") + } + continue + } + + return status.Backups.Snapshot, nil + + case <-ctx.Done(): + return nil, ctx.Err() + } + } +} diff --git a/agent/tailog/store.go b/agent/tailog/store.go index f3ee18f96c..45ff99c8d9 100644 --- a/agent/tailog/store.go +++ b/agent/tailog/store.go @@ -1,4 +1,3 @@ -// pmm-agent // Copyright 2019 Percona LLC // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -13,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -// Package tailog help to store tail logs +// Package tailog helps store tail logs package tailog import ( @@ -22,7 +21,7 @@ import ( "sync" ) -// Store implement ring save logs. +// Store implements ring save logs. type Store struct { log *ring.Ring capacity uint @@ -37,7 +36,7 @@ func NewStore(capacity uint) *Store { } } -// Write writes log for store. +// Write writes log to the store. func (l *Store) Write(b []byte) (int, error) { //nolint:unparam l.m.Lock() defer l.m.Unlock() diff --git a/agent/versioner/mock_exec_functions_test.go b/agent/versioner/mock_exec_functions_test.go index 7d664f0390..b3fdee3c42 100644 --- a/agent/versioner/mock_exec_functions_test.go +++ b/agent/versioner/mock_exec_functions_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package versioner @@ -41,13 +41,16 @@ func (_m *MockExecFunctions) LookPath(file string) (string, error) { ret := _m.Called(file) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(string) (string, error)); ok { + return rf(file) + } if rf, ok := ret.Get(0).(func(string) string); ok { r0 = rf(file) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(file) } else { @@ -56,3 +59,18 @@ func (_m *MockExecFunctions) LookPath(file string) (string, error) { return r0, r1 } + +// NewMockExecFunctions creates a new instance of MockExecFunctions. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockExecFunctions(t interface { + mock.TestingT + Cleanup(func()) +}, +) *MockExecFunctions { + mock := &MockExecFunctions{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/agent/versioner/versioner.go b/agent/versioner/versioner.go index ec30e4e91a..8cb4a12191 100644 --- a/agent/versioner/versioner.go +++ b/agent/versioner/versioner.go @@ -51,7 +51,7 @@ type CombinedOutputer interface { CombinedOutput() ([]byte, error) } -//go:generate ../../bin/mockery -name=ExecFunctions -case=snake -inpkg -testonly +//go:generate ../../bin/mockery --name=ExecFunctions --case=snake --inpackage --testonly // ExecFunctions is an interface for the LookPath() and CommandContext() functions. type ExecFunctions interface { @@ -68,7 +68,7 @@ func (RealExecFunctions) LookPath(file string) (string, error) { } // CommandContext calls Go's implementation of the CommandContext() function. -func (RealExecFunctions) CommandContext(ctx context.Context, name string, arg ...string) CombinedOutputer { +func (RealExecFunctions) CommandContext(ctx context.Context, name string, arg ...string) CombinedOutputer { //nolint:ireturn return exec.CommandContext(ctx, name, arg...) } diff --git a/api-tests/helpers.go b/api-tests/helpers.go index cda4027a77..20d27307a6 100644 --- a/api-tests/helpers.go +++ b/api-tests/helpers.go @@ -89,8 +89,8 @@ func ExpectFailure(t *testing.T, link string) *expectedFailureTestingT { } // expectedFailureTestingT expects that test will fail. -// if test is failed we skip it -// if it doesn't we call Fail +// If the test fails - we skip it, +// if it doesn't - we call Fail. type expectedFailureTestingT struct { t *testing.T errors []string diff --git a/api-tests/inventory/agents_azure_database_exporter_test.go b/api-tests/inventory/agents_azure_database_exporter_test.go index 172bf443f4..8762c1866a 100644 --- a/api-tests/inventory/agents_azure_database_exporter_test.go +++ b/api-tests/inventory/agents_azure_database_exporter_test.go @@ -27,10 +27,11 @@ import ( "github.com/percona/pmm/api/inventorypb/json/client/agents" ) -func TestAzureDatabaseExporter(t *testing.T) { +func TestAzureDatabaseExporter(t *testing.T) { //nolint:tparallel + // TODO Fix this test to run in parallel. + // t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() - genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) defer pmmapitests.RemoveNodes(t, genericNodeID) diff --git a/api-tests/inventory/agents_external_exporter_test.go b/api-tests/inventory/agents_external_exporter_test.go index d1e35739ef..a39632cc46 100644 --- a/api-tests/inventory/agents_external_exporter_test.go +++ b/api-tests/inventory/agents_external_exporter_test.go @@ -29,6 +29,7 @@ import ( ) func TestExternalExporter(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() diff --git a/api-tests/inventory/agents_mongodb_exporter_test.go b/api-tests/inventory/agents_mongodb_exporter_test.go index 2ed805374e..3485be366a 100644 --- a/api-tests/inventory/agents_mongodb_exporter_test.go +++ b/api-tests/inventory/agents_mongodb_exporter_test.go @@ -29,6 +29,7 @@ import ( ) func TestMongoDBExporter(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() diff --git a/api-tests/inventory/agents_mysqld_exporter_test.go b/api-tests/inventory/agents_mysqld_exporter_test.go index fcfa1bd31e..963cbb7781 100644 --- a/api-tests/inventory/agents_mysqld_exporter_test.go +++ b/api-tests/inventory/agents_mysqld_exporter_test.go @@ -29,6 +29,7 @@ import ( ) func TestMySQLdExporter(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() diff --git a/api-tests/inventory/agents_node_exporter_test.go b/api-tests/inventory/agents_node_exporter_test.go index e68cdcb548..f1e66e7086 100644 --- a/api-tests/inventory/agents_node_exporter_test.go +++ b/api-tests/inventory/agents_node_exporter_test.go @@ -28,6 +28,7 @@ import ( ) func TestNodeExporter(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() diff --git a/api-tests/inventory/agents_postgres_exporter_test.go b/api-tests/inventory/agents_postgres_exporter_test.go index e9acc16319..d81f5c80e4 100644 --- a/api-tests/inventory/agents_postgres_exporter_test.go +++ b/api-tests/inventory/agents_postgres_exporter_test.go @@ -29,6 +29,7 @@ import ( ) func TestPostgresExporter(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() diff --git a/api-tests/inventory/agents_proxysql_exporter_test.go b/api-tests/inventory/agents_proxysql_exporter_test.go index edd57ab1e5..472360232e 100644 --- a/api-tests/inventory/agents_proxysql_exporter_test.go +++ b/api-tests/inventory/agents_proxysql_exporter_test.go @@ -29,6 +29,7 @@ import ( ) func TestProxySQLExporter(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() diff --git a/api-tests/inventory/agents_rds_exporter_test.go b/api-tests/inventory/agents_rds_exporter_test.go index 95ea82df18..9fd25072a6 100644 --- a/api-tests/inventory/agents_rds_exporter_test.go +++ b/api-tests/inventory/agents_rds_exporter_test.go @@ -28,9 +28,8 @@ import ( ) func TestRDSExporter(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { - t.Parallel() - genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) defer pmmapitests.RemoveNodes(t, genericNodeID) diff --git a/api-tests/inventory/agents_test.go b/api-tests/inventory/agents_test.go index 46c6733304..f760ab10ce 100644 --- a/api-tests/inventory/agents_test.go +++ b/api-tests/inventory/agents_test.go @@ -36,6 +36,7 @@ import ( var AgentStatusUnknown = inventorypb.AgentStatus_name[int32(inventorypb.AgentStatus_UNKNOWN)] func TestAgents(t *testing.T) { + t.Parallel() t.Run("List", func(t *testing.T) { t.Parallel() @@ -235,6 +236,7 @@ func TestAgents(t *testing.T) { } func TestPMMAgent(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -446,6 +448,7 @@ func TestPMMAgent(t *testing.T) { } func TestQanAgentExporter(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -675,6 +678,7 @@ func TestQanAgentExporter(t *testing.T) { } func TestPGStatStatementsQanAgent(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -904,6 +908,7 @@ func TestPGStatStatementsQanAgent(t *testing.T) { } func TestPGStatMonitorQanAgent(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() diff --git a/api-tests/inventory/nodes_test.go b/api-tests/inventory/nodes_test.go index 7844890ba3..e3adc01ac9 100644 --- a/api-tests/inventory/nodes_test.go +++ b/api-tests/inventory/nodes_test.go @@ -32,6 +32,7 @@ import ( ) func TestNodes(t *testing.T) { + t.Parallel() t.Run("List", func(t *testing.T) { t.Parallel() @@ -91,6 +92,7 @@ func TestNodes(t *testing.T) { } func TestGetNode(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -144,6 +146,7 @@ func TestGetNode(t *testing.T) { } func TestGenericNode(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -203,6 +206,7 @@ func TestGenericNode(t *testing.T) { } func TestContainerNode(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -267,6 +271,7 @@ func TestContainerNode(t *testing.T) { } func TestRemoteNode(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -331,6 +336,7 @@ func TestRemoteNode(t *testing.T) { } func TestRemoveNode(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() diff --git a/api-tests/inventory/services_test.go b/api-tests/inventory/services_test.go index 8d3fe8f0c9..21c83853bf 100644 --- a/api-tests/inventory/services_test.go +++ b/api-tests/inventory/services_test.go @@ -31,6 +31,7 @@ import ( ) func TestServices(t *testing.T) { + t.Parallel() t.Run("List", func(t *testing.T) { t.Parallel() @@ -172,6 +173,7 @@ func TestServices(t *testing.T) { } func TestGetService(t *testing.T) { + t.Parallel() t.Run("NotFound", func(t *testing.T) { t.Parallel() @@ -198,6 +200,7 @@ func TestGetService(t *testing.T) { } func TestRemoveService(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -319,6 +322,7 @@ func TestRemoveService(t *testing.T) { } func TestMySQLService(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -521,6 +525,7 @@ func TestMySQLService(t *testing.T) { } func TestMongoDBService(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -732,6 +737,7 @@ func TestMongoDBService(t *testing.T) { } func TestPostgreSQLService(t *testing.T) { + t.Parallel() const defaultPostgresDBName = "postgres" t.Run("Basic", func(t *testing.T) { @@ -937,6 +943,7 @@ func TestPostgreSQLService(t *testing.T) { } func TestProxySQLService(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -1139,6 +1146,7 @@ func TestProxySQLService(t *testing.T) { } func TestExternalService(t *testing.T) { + t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() diff --git a/api-tests/management/alerting/alerting_test.go b/api-tests/management/alerting/alerting_test.go index c8ca4835de..960500e36e 100644 --- a/api-tests/management/alerting/alerting_test.go +++ b/api-tests/management/alerting/alerting_test.go @@ -118,6 +118,7 @@ func assertTemplate(t *testing.T, expectedTemplate alert.Template, listTemplates } func TestTemplatesAPI(t *testing.T) { + t.Parallel() client := alertingClient.Default.Alerting templateData, err := os.ReadFile("../../testdata/ia/template.yaml") diff --git a/api-tests/management/ia/channels_test.go b/api-tests/management/ia/channels_test.go index 72b271c426..fa29d7bbde 100644 --- a/api-tests/management/ia/channels_test.go +++ b/api-tests/management/ia/channels_test.go @@ -34,7 +34,9 @@ import ( // we don't enable or disable IA explicit in our tests since it is enabled by default through // ENABLE_ALERTING env var. -func TestChannelsAPI(t *testing.T) { +func TestChannelsAPI(t *testing.T) { //nolint:tparallel + // TODO Fix this test to run in parallel. + // t.Parallel() client := channelsClient.Default.Channels t.Run("add", func(t *testing.T) { diff --git a/api-tests/management/ia/rules_test.go b/api-tests/management/ia/rules_test.go index e7e0e0764b..7015c1228e 100644 --- a/api-tests/management/ia/rules_test.go +++ b/api-tests/management/ia/rules_test.go @@ -39,6 +39,7 @@ import ( // we don't enable or disable IA explicit in our tests since it is enabled by default through // ENABLE_ALERTING env var. func TestRulesAPI(t *testing.T) { + t.Parallel() rulesClient := client.Default.Rules templatesClient := alertingClient.Default.Alerting channelsClient := client.Default.Channels diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index cbee3479e1..f58a205190 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -94,6 +94,7 @@ func TestAuth(t *testing.T) { } func TestSetup(t *testing.T) { + t.Parallel() // make a BaseURL without authentication baseURL, err := url.Parse(pmmapitests.BaseURL.String()) require.NoError(t, err) @@ -125,6 +126,7 @@ func TestSetup(t *testing.T) { }) t.Run("Redirect", func(t *testing.T) { + t.Parallel() paths := map[string]int{ "graph": 303, "graph/": 303, @@ -185,6 +187,7 @@ func TestSetup(t *testing.T) { } func TestSwagger(t *testing.T) { + t.Parallel() for _, path := range []string{ "swagger", "swagger/", @@ -194,6 +197,7 @@ func TestSwagger(t *testing.T) { path := path t.Run(path, func(t *testing.T) { + t.Parallel() t.Run("NoAuth", func(t *testing.T) { t.Parallel() diff --git a/api-tests/server/panics_test.go b/api-tests/server/panics_test.go index 8570d73ac3..216a0645e7 100644 --- a/api-tests/server/panics_test.go +++ b/api-tests/server/panics_test.go @@ -27,6 +27,7 @@ import ( ) func TestPanics(t *testing.T) { + t.Parallel() for _, mode := range []string{"panic-error", "panic-fmterror", "panic-string"} { mode := mode t.Run(mode, func(t *testing.T) { diff --git a/api-tests/server/readyz_test.go b/api-tests/server/readyz_test.go index f9259385db..093ea8c57e 100644 --- a/api-tests/server/readyz_test.go +++ b/api-tests/server/readyz_test.go @@ -28,6 +28,7 @@ import ( ) func TestReadyz(t *testing.T) { + t.Parallel() paths := []string{ "ping", "v1/readyz", diff --git a/api-tests/server/version_test.go b/api-tests/server/version_test.go index 9546e921bf..0332c31c30 100644 --- a/api-tests/server/version_test.go +++ b/api-tests/server/version_test.go @@ -32,6 +32,7 @@ import ( ) func TestVersion(t *testing.T) { + t.Parallel() paths := []string{ "managed/v1/version", "v1/version", diff --git a/api/agentlocalpb/agentlocal.pb.go b/api/agentlocalpb/agentlocal.pb.go index 9e5b587b83..1e3c06fd6f 100644 --- a/api/agentlocalpb/agentlocal.pb.go +++ b/api/agentlocalpb/agentlocal.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: agentlocalpb/agentlocal.proto diff --git a/api/agentpb/agent.go b/api/agentpb/agent.go index e503dc118c..b866f40fe9 100644 --- a/api/agentpb/agent.go +++ b/api/agentpb/agent.go @@ -28,7 +28,7 @@ import "google.golang.org/protobuf/proto" //go-sumtype:decl isStartActionRequest_Params -// code below uses the same order as payload types at AgentMessage / ServerMessage +// Code below uses the same order as payload types at AgentMessage / ServerMessage. // AgentRequestPayload represents agent's request payload. type AgentRequestPayload interface { @@ -56,145 +56,145 @@ type ServerRequestPayload interface { // A list of AgentMessage request payloads. -func (m *Ping) AgentMessageRequestPayload() isAgentMessage_Payload { +func (m *Ping) AgentMessageRequestPayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_Ping{Ping: m} } -func (m *StateChangedRequest) AgentMessageRequestPayload() isAgentMessage_Payload { +func (m *StateChangedRequest) AgentMessageRequestPayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_StateChanged{StateChanged: m} } -func (m *QANCollectRequest) AgentMessageRequestPayload() isAgentMessage_Payload { +func (m *QANCollectRequest) AgentMessageRequestPayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_QanCollect{QanCollect: m} } -func (m *ActionResultRequest) AgentMessageRequestPayload() isAgentMessage_Payload { +func (m *ActionResultRequest) AgentMessageRequestPayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_ActionResult{ActionResult: m} } -func (m *JobProgress) AgentMessageRequestPayload() isAgentMessage_Payload { +func (m *JobProgress) AgentMessageRequestPayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_JobProgress{JobProgress: m} } -func (m *JobResult) AgentMessageRequestPayload() isAgentMessage_Payload { +func (m *JobResult) AgentMessageRequestPayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_JobResult{JobResult: m} } // A list of AgentMessage response payloads. -func (m *Pong) AgentMessageResponsePayload() isAgentMessage_Payload { +func (m *Pong) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_Pong{Pong: m} } -func (m *SetStateResponse) AgentMessageResponsePayload() isAgentMessage_Payload { +func (m *SetStateResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_SetState{SetState: m} } -func (m *StartActionResponse) AgentMessageResponsePayload() isAgentMessage_Payload { +func (m *StartActionResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_StartAction{StartAction: m} } -func (m *StopActionResponse) AgentMessageResponsePayload() isAgentMessage_Payload { +func (m *StopActionResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_StopAction{StopAction: m} } -func (m *CheckConnectionResponse) AgentMessageResponsePayload() isAgentMessage_Payload { +func (m *CheckConnectionResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_CheckConnection{CheckConnection: m} } -func (m *JobStatusResponse) AgentMessageResponsePayload() isAgentMessage_Payload { +func (m *JobStatusResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_JobStatus{JobStatus: m} } -func (m *StartJobResponse) AgentMessageResponsePayload() isAgentMessage_Payload { +func (m *StartJobResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_StartJob{StartJob: m} } -func (m *StopJobResponse) AgentMessageResponsePayload() isAgentMessage_Payload { +func (m *StopJobResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_StopJob{StopJob: m} } -func (m *JobProgress) AgentMessageResponsePayload() isAgentMessage_Payload { +func (m *JobProgress) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_JobProgress{JobProgress: m} } -func (m *JobResult) AgentMessageResponsePayload() isAgentMessage_Payload { +func (m *JobResult) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_JobResult{JobResult: m} } -func (m *GetVersionsResponse) AgentMessageResponsePayload() isAgentMessage_Payload { +func (m *GetVersionsResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_GetVersions{GetVersions: m} } -func (m *PBMSwitchPITRResponse) AgentMessageResponsePayload() isAgentMessage_Payload { +func (m *PBMSwitchPITRResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_PbmSwitchPitr{PbmSwitchPitr: m} } -func (m *AgentLogsResponse) AgentMessageResponsePayload() isAgentMessage_Payload { +func (m *AgentLogsResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_AgentLogs{AgentLogs: m} } // A list of ServerMessage response payloads. -func (m *Pong) ServerMessageResponsePayload() isServerMessage_Payload { +func (m *Pong) ServerMessageResponsePayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_Pong{Pong: m} } -func (m *StateChangedResponse) ServerMessageResponsePayload() isServerMessage_Payload { +func (m *StateChangedResponse) ServerMessageResponsePayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_StateChanged{StateChanged: m} } -func (m *QANCollectResponse) ServerMessageResponsePayload() isServerMessage_Payload { +func (m *QANCollectResponse) ServerMessageResponsePayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_QanCollect{QanCollect: m} } -func (m *ActionResultResponse) ServerMessageResponsePayload() isServerMessage_Payload { +func (m *ActionResultResponse) ServerMessageResponsePayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_ActionResult{ActionResult: m} } // A list of ServerMessage request payloads. -func (m *Ping) ServerMessageRequestPayload() isServerMessage_Payload { +func (m *Ping) ServerMessageRequestPayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_Ping{Ping: m} } -func (m *SetStateRequest) ServerMessageRequestPayload() isServerMessage_Payload { +func (m *SetStateRequest) ServerMessageRequestPayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_SetState{SetState: m} } -func (m *StartActionRequest) ServerMessageRequestPayload() isServerMessage_Payload { +func (m *StartActionRequest) ServerMessageRequestPayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_StartAction{StartAction: m} } -func (m *StopActionRequest) ServerMessageRequestPayload() isServerMessage_Payload { +func (m *StopActionRequest) ServerMessageRequestPayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_StopAction{StopAction: m} } -func (m *CheckConnectionRequest) ServerMessageRequestPayload() isServerMessage_Payload { +func (m *CheckConnectionRequest) ServerMessageRequestPayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_CheckConnection{CheckConnection: m} } -func (m *StartJobRequest) ServerMessageRequestPayload() isServerMessage_Payload { +func (m *StartJobRequest) ServerMessageRequestPayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_StartJob{StartJob: m} } -func (m *StopJobRequest) ServerMessageRequestPayload() isServerMessage_Payload { +func (m *StopJobRequest) ServerMessageRequestPayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_StopJob{StopJob: m} } -func (m *JobStatusRequest) ServerMessageRequestPayload() isServerMessage_Payload { +func (m *JobStatusRequest) ServerMessageRequestPayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_JobStatus{JobStatus: m} } -func (m *GetVersionsRequest) ServerMessageRequestPayload() isServerMessage_Payload { +func (m *GetVersionsRequest) ServerMessageRequestPayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_GetVersions{GetVersions: m} } -func (m *PBMSwitchPITRRequest) ServerMessageRequestPayload() isServerMessage_Payload { +func (m *PBMSwitchPITRRequest) ServerMessageRequestPayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_PbmSwitchPitr{PbmSwitchPitr: m} } -func (m *AgentLogsRequest) ServerMessageRequestPayload() isServerMessage_Payload { +func (m *AgentLogsRequest) ServerMessageRequestPayload() isServerMessage_Payload { //nolint:ireturn return &ServerMessage_AgentLogs{AgentLogs: m} } diff --git a/api/agentpb/agent.pb.go b/api/agentpb/agent.pb.go index 52ce671b6d..f06a953aa9 100644 --- a/api/agentpb/agent.pb.go +++ b/api/agentpb/agent.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: agentpb/agent.proto @@ -3518,6 +3518,8 @@ type SetStateRequest_BuiltinAgent struct { Dsn string `protobuf:"bytes,2,opt,name=dsn,proto3" json:"dsn,omitempty"` // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `protobuf:"varint,8,opt,name=max_query_length,json=maxQueryLength,proto3" json:"max_query_length,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `protobuf:"varint,9,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` // Disables query examples for QAN Agents if true. DisableQueryExamples bool `protobuf:"varint,3,opt,name=disable_query_examples,json=disableQueryExamples,proto3" json:"disable_query_examples,omitempty"` // Instructs QAN Agents to rotate query log file or table at this size if > 0. @@ -3583,6 +3585,13 @@ func (x *SetStateRequest_BuiltinAgent) GetMaxQueryLength() int32 { return 0 } +func (x *SetStateRequest_BuiltinAgent) GetDisableCommentsParsing() bool { + if x != nil { + return x.DisableCommentsParsing + } + return false +} + func (x *SetStateRequest_BuiltinAgent) GetDisableQueryExamples() bool { if x != nil { return x.DisableQueryExamples @@ -6594,7 +6603,7 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x16, 0x0a, 0x14, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xc3, 0x08, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfd, 0x08, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x0f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x67, 0x65, @@ -6636,264 +6645,287 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xc2, 0x02, 0x0a, 0x0c, 0x42, 0x75, 0x69, 0x6c, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xfc, 0x02, 0x0a, 0x0c, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, - 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, - 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, - 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x73, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, - 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, - 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, - 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x65, 0x0a, 0x12, - 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x75, 0x69, 0x6c, - 0x74, 0x69, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x12, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf4, 0x02, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x03, - 0x6e, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x03, 0x6e, 0x69, 0x6c, - 0x12, 0x14, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, - 0x52, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x12, 0x16, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x05, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x18, - 0x0a, 0x06, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, - 0x52, 0x06, 0x75, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x18, 0x0a, 0x06, 0x64, 0x6f, 0x75, 0x62, - 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x06, 0x64, 0x6f, 0x75, 0x62, - 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0c, 0x48, 0x00, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x48, 0x00, - 0x52, 0x05, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x12, 0x29, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x48, 0x00, 0x52, 0x03, 0x6d, - 0x61, 0x70, 0x12, 0x32, 0x0a, 0x06, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x48, 0x00, 0x52, 0x06, - 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x41, - 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, - 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x6c, 0x69, 0x63, - 0x65, 0x22, 0x93, 0x01, 0x0a, 0x0e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x61, 0x70, 0x12, 0x30, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x1a, 0x4f, 0x0a, 0x08, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x43, 0x0a, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, - 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, 0x85, 0x01, 0x0a, - 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x04, - 0x72, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, - 0x69, 0x63, 0x65, 0x52, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x12, 0x29, 0x0a, 0x04, 0x64, 0x6f, 0x63, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x52, 0x04, - 0x64, 0x6f, 0x63, 0x73, 0x22, 0xe9, 0x2a, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x60, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, - 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, - 0x6c, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x7a, 0x0a, 0x1e, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, - 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1a, 0x6d, 0x79, 0x73, 0x71, - 0x6c, 0x53, 0x68, 0x6f, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x7a, 0x0a, 0x1e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, - 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, - 0x68, 0x6f, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1a, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x68, 0x6f, - 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x67, 0x0a, 0x17, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x68, 0x6f, 0x77, - 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x68, 0x6f, 0x77, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x23, - 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, - 0x68, 0x6f, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, - 0x71, 0x6c, 0x53, 0x68, 0x6f, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x76, 0x0a, 0x1c, 0x70, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, + 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x38, + 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x2b, + 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6d, 0x61, 0x78, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x4c, 0x6f, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x2f, 0x0a, 0x0a, 0x74, + 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, + 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, + 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, + 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x65, 0x0a, 0x12, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, + 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x74, 0x69, 0x6e, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x12, 0x0a, + 0x10, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0xf4, 0x02, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x12, 0x0a, 0x03, 0x6e, 0x69, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x03, 0x6e, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x04, 0x62, 0x6f, + 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x04, 0x62, 0x6f, 0x6f, 0x6c, + 0x12, 0x16, 0x0a, 0x05, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x48, + 0x00, 0x52, 0x05, 0x69, 0x6e, 0x74, 0x36, 0x34, 0x12, 0x18, 0x0a, 0x06, 0x75, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x00, 0x52, 0x06, 0x75, 0x69, 0x6e, 0x74, + 0x36, 0x34, 0x12, 0x18, 0x0a, 0x06, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x01, 0x48, 0x00, 0x52, 0x06, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x05, + 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x12, 0x2f, 0x0a, 0x05, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x05, 0x73, 0x6c, 0x69, 0x63, + 0x65, 0x12, 0x29, 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x70, 0x12, 0x32, 0x0a, 0x06, + 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x48, 0x00, 0x52, 0x06, 0x62, 0x69, 0x6e, 0x61, 0x72, 0x79, + 0x42, 0x06, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x22, 0x41, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x12, 0x2d, 0x0a, 0x05, + 0x73, 0x6c, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x22, 0x93, 0x01, 0x0a, 0x0e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x12, 0x30, + 0x0a, 0x03, 0x6d, 0x61, 0x70, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x61, 0x70, 0x2e, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x03, 0x6d, 0x61, 0x70, + 0x1a, 0x4f, 0x0a, 0x08, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x43, 0x0a, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x75, 0x62, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x62, 0x79, 0x74, 0x65, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, 0x69, 0x63, 0x65, 0x52, 0x04, 0x72, + 0x6f, 0x77, 0x73, 0x12, 0x29, 0x0a, 0x04, 0x64, 0x6f, 0x63, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x52, 0x04, 0x64, 0x6f, 0x63, 0x73, 0x22, 0xe9, + 0x2a, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x60, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6c, + 0x61, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x2c, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, + 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x7a, 0x0a, 0x1e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x68, + 0x6f, 0x77, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, + 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1a, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x68, 0x6f, 0x77, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x7a, 0x0a, 0x1e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, + 0x52, 0x1a, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x67, 0x0a, 0x17, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x48, 0x00, 0x52, 0x19, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, - 0x53, 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x66, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x61, - 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, - 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, - 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x57, 0x0a, 0x11, 0x70, 0x74, 0x5f, 0x73, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x54, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, - 0x0f, 0x70, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x5e, 0x0a, 0x14, 0x70, 0x74, 0x5f, 0x70, 0x67, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x54, 0x50, 0x67, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x11, 0x70, - 0x74, 0x50, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x6d, 0x0a, 0x19, 0x70, 0x74, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x73, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x68, + 0x6f, 0x77, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, + 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x89, 0x01, 0x0a, 0x23, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, - 0x54, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x16, 0x70, 0x74, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x67, 0x0a, 0x17, 0x70, 0x74, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x54, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x48, 0x00, 0x52, 0x14, 0x70, 0x74, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x67, 0x0a, 0x17, 0x6d, 0x79, 0x73, 0x71, - 0x6c, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, + 0x52, 0x1f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x53, 0x68, 0x6f, 0x77, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x76, 0x0a, 0x1c, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, + 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, + 0x77, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x19, + 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x53, 0x68, 0x6f, 0x77, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x66, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, - 0x68, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x68, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x6d, 0x0a, 0x19, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x33, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x16, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x51, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6c, + 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x57, 0x0a, 0x11, 0x70, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x54, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x74, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x5e, 0x0a, 0x14, 0x70, 0x74, + 0x5f, 0x70, 0x67, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x50, 0x54, 0x50, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x11, 0x70, 0x74, 0x50, 0x67, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x6d, 0x0a, 0x19, 0x70, 0x74, + 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x54, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, + 0x44, 0x42, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, + 0x00, 0x52, 0x16, 0x70, 0x74, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x67, 0x0a, 0x17, 0x70, 0x74, 0x5f, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x54, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, 0x70, 0x74, + 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x12, 0x67, 0x0a, 0x17, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x32, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, + 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x68, 0x6f, 0x77, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x53, 0x68, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x6d, 0x0a, 0x19, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x76, 0x0a, 0x1c, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x68, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x53, 0x68, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x19, 0x70, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x68, - 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x7c, 0x0a, 0x1e, 0x70, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x6c, - 0x65, 0x63, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x35, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, + 0x48, 0x00, 0x52, 0x16, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x76, 0x0a, 0x1c, 0x70, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, + 0x68, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x34, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x33, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1b, 0x70, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x85, 0x01, 0x0a, 0x21, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x67, 0x65, 0x74, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x36, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, - 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1e, - 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x7c, - 0x0a, 0x1e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, - 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, - 0x1b, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x69, 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x8b, 0x01, 0x0a, - 0x23, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x67, - 0x65, 0x74, 0x63, 0x6d, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x6f, 0x70, 0x74, 0x73, 0x5f, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x18, 0x38, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x4f, 0x70, 0x74, 0x73, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x20, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x63, 0x6d, 0x64, 0x6c, 0x69, 0x6e, 0x65, - 0x6f, 0x70, 0x74, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x25, 0x6d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x70, - 0x6c, 0x73, 0x65, 0x74, 0x67, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x18, 0x39, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x61, 0x67, 0x65, + 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x68, 0x6f, 0x77, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x19, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x71, 0x6c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x68, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x12, 0x7c, 0x0a, 0x1e, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, + 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x18, 0x35, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x22, 0x6d, 0x6f, 0x6e, 0x67, - 0x6f, 0x64, 0x62, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x73, 0x65, 0x74, 0x67, - 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x94, - 0x01, 0x0a, 0x26, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x5f, 0x67, 0x65, 0x74, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x3d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, - 0x73, 0x74, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, - 0x52, 0x23, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, - 0x74, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x64, 0x61, 0x74, 0x61, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x73, 0x0a, 0x1a, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x73, 0x79, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x48, 0x00, 0x52, 0x1b, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x85, 0x01, 0x0a, 0x21, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x5f, 0x67, 0x65, 0x74, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x36, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, + 0x62, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x7c, 0x0a, 0x1e, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x69, + 0x6e, 0x66, 0x6f, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x37, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x35, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x1b, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x69, 0x6e, 0x66, 0x6f, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x8b, 0x01, 0x0a, 0x23, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x67, 0x65, 0x74, 0x63, 0x6d, 0x64, 0x6c, + 0x69, 0x6e, 0x65, 0x6f, 0x70, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x38, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, + 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x4f, 0x70, 0x74, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x48, 0x00, 0x52, 0x20, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x47, 0x65, 0x74, 0x63, 0x6d, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x6f, 0x70, 0x74, 0x73, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x91, 0x01, 0x0a, 0x25, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, + 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x73, 0x65, 0x74, 0x67, 0x65, + 0x74, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x39, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, + 0x53, 0x65, 0x74, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x48, 0x00, 0x52, 0x22, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x73, 0x65, 0x74, 0x67, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x94, 0x01, 0x0a, 0x26, 0x6d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x67, 0x65, 0x74, 0x64, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, - 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, - 0x00, 0x52, 0x17, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x79, 0x73, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x1a, - 0xf1, 0x01, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x16, - 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x44, 0x0a, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, - 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6c, 0x61, - 0x69, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0c, - 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x2d, 0x0a, 0x09, - 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, - 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x1a, 0x9b, 0x01, 0x0a, 0x1a, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, - 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x65, 0x74, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x44, 0x61, + 0x74, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x23, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x64, 0x69, 0x61, 0x67, 0x6e, + 0x6f, 0x73, 0x74, 0x69, 0x63, 0x64, 0x61, 0x74, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x73, 0x0a, 0x1a, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x79, 0x73, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x3b, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, + 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x48, 0x00, 0x52, 0x17, 0x72, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x53, 0x79, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x1a, 0xf1, 0x01, 0x0a, 0x12, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, + 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x12, 0x44, 0x0a, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, + 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x9b, 0x01, + 0x0a, 0x1a, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, + 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, + 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x9b, 0x01, 0x0a, 0x1a, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, + 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, + 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x95, 0x01, 0x0a, 0x14, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, @@ -6902,89 +6934,60 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x1a, 0x9b, 0x01, 0x0a, 0x1a, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x54, - 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, - 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, - 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, - 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, - 0x95, 0x01, 0x0a, 0x14, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, - 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0xa0, 0x01, 0x0a, 0x1f, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, - 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, - 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, - 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, - 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x9a, 0x01, 0x0a, 0x19, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, - 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x6f, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, - 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, - 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x11, 0x0a, 0x0f, 0x50, 0x54, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x73, 0x0a, 0x11, 0x50, - 0x54, 0x50, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x1a, 0x78, 0x0a, 0x16, 0x50, 0x54, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x75, 0x6d, + 0x79, 0x1a, 0xa0, 0x01, 0x0a, 0x1f, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x53, 0x68, 0x6f, 0x77, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2d, 0x0a, + 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x1a, 0x9a, 0x01, 0x0a, 0x19, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x53, 0x51, 0x4c, 0x53, 0x68, 0x6f, 0x77, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, + 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, + 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x1a, 0x6f, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6c, + 0x61, 0x69, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, + 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x1a, 0x11, 0x0a, 0x0f, 0x50, 0x54, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x73, 0x0a, 0x11, 0x50, 0x54, 0x50, 0x67, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x1a, 0x8e, 0x01, 0x0a, 0x14, 0x50, - 0x54, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, - 0x6b, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x1a, 0x95, 0x01, 0x0a, 0x14, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x68, 0x6f, 0x77, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2d, 0x0a, 0x09, - 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, - 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x1a, 0x97, 0x01, 0x0a, 0x16, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, + 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x1a, 0x78, 0x0a, 0x16, 0x50, 0x54, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x1a, 0x8e, 0x01, 0x0a, 0x14, 0x50, 0x54, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x1a, 0x95, 0x01, 0x0a, 0x14, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x53, 0x68, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, @@ -6992,188 +6995,210 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x84, 0x01, - 0x0a, 0x19, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x53, 0x68, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, - 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2d, 0x0a, - 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, - 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, - 0x72, 0x69, 0x66, 0x79, 0x1a, 0x9c, 0x01, 0x0a, 0x1b, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2d, 0x0a, 0x09, - 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, - 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x1a, 0x63, 0x0a, 0x1e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x50, + 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x97, 0x01, + 0x0a, 0x16, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, + 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x84, 0x01, 0x0a, 0x19, 0x50, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x68, 0x6f, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, - 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x60, 0x0a, 0x1b, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, - 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x65, 0x0a, 0x20, 0x4d, 0x6f, - 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, 0x6d, 0x64, - 0x4c, 0x69, 0x6e, 0x65, 0x4f, 0x70, 0x74, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, + 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, + 0x73, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, + 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x9c, + 0x01, 0x0a, 0x1b, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, - 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, - 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x1a, 0x67, 0x0a, 0x22, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x65, 0x70, 0x6c, 0x53, 0x65, 0x74, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, - 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x68, 0x0a, 0x23, 0x4d, 0x6f, - 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x44, 0x69, 0x61, - 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x44, 0x61, 0x74, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x12, 0x14, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2d, 0x0a, 0x09, 0x74, 0x6c, 0x73, 0x5f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x08, 0x74, 0x6c, 0x73, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, + 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x1a, 0x63, 0x0a, + 0x1e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, + 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, + 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x1a, 0x60, 0x0a, 0x1b, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x1a, 0xcf, 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x69, 0x0a, 0x0e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x42, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x2e, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x0d, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x46, - 0x0a, 0x0d, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x1a, 0x0a, 0x16, 0x53, 0x59, 0x53, 0x54, 0x45, 0x4d, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, - 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4d, - 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x42, 0x4d, 0x5f, 0x41, - 0x47, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x42, 0x08, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x22, 0x15, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x30, 0x0a, 0x11, 0x53, 0x74, 0x6f, 0x70, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x53, 0x74, 0x6f, - 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x74, 0x0a, 0x13, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, + 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x65, 0x0a, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x4f, 0x70, + 0x74, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, + 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x67, 0x0a, 0x22, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x70, 0x6c, 0x53, + 0x65, 0x74, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x68, 0x0a, 0x23, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, + 0x63, 0x44, 0x61, 0x74, 0x61, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, + 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, + 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0xcf, + 0x01, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x69, 0x0a, + 0x0e, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x42, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x53, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0d, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0x46, 0x0a, 0x0d, 0x53, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x59, 0x53, + 0x54, 0x45, 0x4d, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, + 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x10, + 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x42, 0x4d, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x02, + 0x42, 0x08, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x30, 0x0a, 0x11, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x6f, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x16, 0x0a, 0x14, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x73, 0x0a, - 0x14, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, + 0x6e, 0x49, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x74, 0x0a, 0x13, 0x41, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x16, 0x0a, + 0x06, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x6f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0x16, 0x0a, 0x14, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x73, 0x0a, 0x14, 0x50, 0x42, 0x4d, 0x53, 0x77, + 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, + 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, + 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x2d, 0x0a, 0x15, + 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x43, 0x0a, 0x10, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x22, 0x67, 0x0a, 0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x1c, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, + 0x6e, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x18, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x6f, 0x67, 0x4c, + 0x69, 0x6e, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe4, 0x01, 0x0a, 0x16, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, + 0x73, 0x6e, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, - 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x22, 0x2d, 0x0a, 0x15, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, - 0x49, 0x54, 0x52, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x22, 0x43, 0x0a, 0x10, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x67, 0x0a, 0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, - 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, - 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, - 0x3e, 0x0a, 0x1c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, - 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0xe4, 0x01, 0x0a, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2f, 0x0a, - 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, - 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, - 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0x95, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x73, 0x1a, 0x28, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1f, 0x0a, - 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x29, - 0x0a, 0x10, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x29, 0x0a, 0x11, 0x4a, 0x6f, 0x62, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, - 0x6c, 0x69, 0x76, 0x65, 0x22, 0xb2, 0x01, 0x0a, 0x10, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x72, - 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x63, - 0x6b, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x18, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xc3, 0x0f, 0x0a, 0x0f, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, - 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, - 0x6f, 0x62, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0c, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, - 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x12, 0x4d, 0x0a, 0x0e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, + 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x22, 0x95, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x28, + 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x10, 0x4a, 0x6f, 0x62, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, + 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, + 0x62, 0x49, 0x64, 0x22, 0x29, 0x0a, 0x11, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x76, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x22, 0xb2, + 0x01, 0x0a, 0x10, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, + 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, + 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x67, + 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, + 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x22, 0xc3, 0x0f, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x33, + 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, - 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x12, 0x63, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, - 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x93, 0x02, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, + 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x14, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x4d, 0x0a, 0x0e, 0x6d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x63, 0x0a, 0x16, 0x6d, 0x6f, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, + 0x93, 0x02, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, + 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, + 0x10, 0x0c, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xc3, 0x01, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, @@ -7181,361 +7206,349 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xc3, 0x01, 0x0a, 0x12, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, - 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, - 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x52, 0x11, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x1a, 0xf9, 0x03, 0x0a, 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, 0x6f, 0x72, - 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x69, 0x74, 0x72, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x69, - 0x74, 0x72, 0x12, 0x33, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x09, 0x64, 0x61, - 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, 0x66, - 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, - 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xa8, 0x04, - 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, - 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, - 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, - 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, - 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x69, 0x74, 0x72, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x70, 0x69, 0x74, 0x72, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, 0x66, - 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0c, 0x70, 0x62, 0x6d, 0x5f, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x62, 0x6d, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x70, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x05, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x22, - 0x28, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x27, 0x0a, 0x0e, 0x53, 0x74, 0x6f, - 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, - 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, - 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x05, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, - 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x12, 0x47, 0x0a, 0x0e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x67, - 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, - 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, + 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xf9, 0x03, 0x0a, 0x0d, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, + 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, + 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, + 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, + 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x69, 0x74, 0x72, 0x12, 0x33, 0x0a, 0x0a, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x14, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, + 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, + 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, + 0x72, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xa8, 0x04, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x48, 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x21, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x6e, 0x0a, 0x0d, 0x4d, - 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2c, 0x0a, 0x12, - 0x69, 0x73, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x53, 0x68, 0x61, 0x72, - 0x64, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3e, 0x0a, 0x0b, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x0a, 0x12, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x1a, 0x16, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x22, 0xa7, 0x03, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x12, 0x43, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x59, 0x0a, 0x14, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, - 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x14, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x73, 0x48, 0x00, 0x52, 0x04, 0x6c, - 0x6f, 0x67, 0x73, 0x1a, 0x0d, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x1a, 0x14, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x49, 0x0a, 0x04, 0x4c, 0x6f, 0x67, 0x73, - 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x07, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, - 0x6f, 0x6e, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x9d, 0x04, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x73, 0x6f, 0x66, - 0x74, 0x77, 0x61, 0x72, 0x65, 0x73, 0x1a, 0x08, 0x0a, 0x06, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, - 0x1a, 0x0c, 0x0a, 0x0a, 0x58, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x09, - 0x0a, 0x07, 0x58, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x51, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x1a, 0x05, - 0x0a, 0x03, 0x50, 0x42, 0x4d, 0x1a, 0x85, 0x03, 0x0a, 0x08, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, - 0x72, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x64, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x12, 0x46, - 0x0a, 0x0a, 0x78, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, 0x74, - 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x78, 0x74, 0x72, 0x61, - 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x3d, 0x0a, 0x07, 0x78, 0x62, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x58, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x48, 0x00, 0x52, 0x07, 0x78, 0x62, - 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x51, 0x70, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, + 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, + 0x0a, 0x0e, 0x70, 0x69, 0x74, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0d, 0x70, 0x69, 0x74, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, + 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, + 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, + 0x72, 0x12, 0x39, 0x0a, 0x0c, 0x70, 0x62, 0x6d, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, + 0x0b, 0x70, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, + 0x64, 0x73, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, + 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, + 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x42, 0x05, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x22, 0x28, 0x0a, 0x10, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x27, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, + 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0xdb, 0x05, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x15, 0x0a, + 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, + 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x41, + 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x47, 0x0a, 0x0e, 0x6d, 0x6f, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x6f, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x1a, 0x21, 0x0a, 0x05, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x6e, 0x0a, 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2c, 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x61, + 0x72, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x53, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, 0x75, + 0x73, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3e, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, + 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x16, 0x0a, 0x14, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa7, 0x03, + 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x15, 0x0a, + 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, + 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x43, + 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x12, 0x59, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, + 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2d, + 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x2e, 0x4c, 0x6f, 0x67, 0x73, 0x48, 0x00, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x0d, 0x0a, + 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x14, 0x0a, 0x12, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x1a, 0x49, 0x0a, 0x04, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x42, 0x08, 0x0a, + 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x9d, 0x04, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, + 0x0a, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x66, + 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x73, + 0x1a, 0x08, 0x0a, 0x06, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x1a, 0x0c, 0x0a, 0x0a, 0x58, 0x74, + 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x09, 0x0a, 0x07, 0x58, 0x62, 0x63, 0x6c, + 0x6f, 0x75, 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x51, 0x70, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x09, 0x0a, + 0x07, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x1a, 0x05, 0x0a, 0x03, 0x50, 0x42, 0x4d, 0x1a, + 0x85, 0x03, 0x0a, 0x08, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x12, 0x3a, 0x0a, 0x06, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x48, 0x00, + 0x52, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x12, 0x46, 0x0a, 0x0a, 0x78, 0x74, 0x72, 0x61, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x78, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x12, 0x3d, 0x0a, 0x07, 0x78, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x44, 0x42, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x12, 0x31, - 0x0a, 0x03, 0x70, 0x62, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, 0x62, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x48, 0x00, 0x52, 0x07, 0x78, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, + 0x3a, 0x0a, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x51, 0x70, 0x72, 0x65, 0x73, + 0x73, 0x48, 0x00, 0x52, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x6d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x48, 0x00, 0x52, 0x03, 0x70, 0x62, - 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x90, 0x01, - 0x0a, 0x13, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x39, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x22, 0xbb, 0x08, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, - 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, - 0x67, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, - 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x70, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, - 0x6f, 0x6e, 0x67, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, - 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, - 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, - 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0b, - 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, - 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x10, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x12, - 0x33, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, - 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x39, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x3f, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x48, 0x00, 0x52, 0x0b, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x46, 0x0a, 0x0f, 0x70, 0x62, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x70, - 0x69, 0x74, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, 0x77, - 0x69, 0x74, 0x63, 0x68, 0x50, 0x69, 0x74, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, - 0x6f, 0x67, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xc9, - 0x07, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, - 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, - 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x12, 0x42, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x69, 0x6e, - 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x09, 0x73, 0x65, 0x74, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x3b, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, - 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, - 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, - 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, - 0x12, 0x32, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, - 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, - 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x38, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3e, - 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, - 0x00, 0x52, 0x0b, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45, - 0x0a, 0x0f, 0x70, 0x62, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x69, 0x74, - 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, 0x77, 0x69, 0x74, 0x63, - 0x68, 0x50, 0x69, 0x74, 0x72, 0x12, 0x38, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6c, - 0x6f, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x42, - 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2a, 0xc4, 0x01, 0x0a, 0x18, 0x4d, - 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, - 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, - 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, - 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, - 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, - 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, - 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4d, 0x59, 0x53, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x48, 0x00, + 0x52, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x12, 0x31, 0x0a, 0x03, 0x70, 0x62, 0x6d, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x50, 0x42, 0x4d, 0x48, 0x00, 0x52, 0x03, 0x70, 0x62, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x73, + 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x90, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3e, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x39, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0xbb, 0x08, 0x0a, 0x0c, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, + 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0d, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3b, + 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, + 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x31, + 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6a, + 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, + 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x36, 0x0a, + 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, + 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, + 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x74, 0x6f, + 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x39, + 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, + 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x67, 0x65, 0x74, + 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x67, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x46, 0x0a, 0x0f, 0x70, 0x62, + 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x13, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, + 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x69, + 0x74, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, + 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x42, 0x09, 0x0a, + 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0xc9, 0x07, 0x0a, 0x0d, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, + 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x42, 0x0a, 0x0d, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, + 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3c, + 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, + 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x12, 0x42, 0x0a, 0x0d, + 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, + 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, + 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x0b, 0x73, 0x74, + 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x73, 0x74, 0x6f, + 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x10, 0x63, 0x68, 0x65, 0x63, 0x6b, + 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x74, + 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x38, + 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, + 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3e, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x67, 0x65, 0x74, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x0f, 0x70, 0x62, 0x6d, 0x5f, + 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, + 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, + 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x69, 0x74, 0x72, 0x12, + 0x38, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x13, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x2a, 0xc4, 0x01, 0x0a, 0x18, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, + 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, + 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, + 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, + 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, + 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, + 0x54, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, + 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, + 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x30, 0x0a, 0x2c, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, - 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x02, 0x12, - 0x30, 0x0a, 0x2c, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, - 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x54, - 0x52, 0x41, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, - 0x03, 0x32, 0x41, 0x0a, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x13, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x14, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x28, 0x01, 0x30, 0x01, 0x42, 0x6f, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x42, 0x0a, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, - 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0xca, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x11, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x05, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x54, 0x52, 0x41, 0x44, 0x49, 0x54, 0x49, + 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x10, 0x03, 0x32, 0x41, 0x0a, 0x05, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, + 0x13, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x1a, 0x14, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x28, 0x01, 0x30, 0x01, 0x42, 0x6f, + 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, + 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, + 0x41, 0x58, 0x58, 0xaa, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x05, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/agentpb/agent.pb.validate.go b/api/agentpb/agent.pb.validate.go index ad3c4128c0..a3bf0afae2 100644 --- a/api/agentpb/agent.pb.validate.go +++ b/api/agentpb/agent.pb.validate.go @@ -7894,6 +7894,8 @@ func (m *SetStateRequest_BuiltinAgent) validate(all bool) error { // no validation rules for MaxQueryLength + // no validation rules for DisableCommentsParsing + // no validation rules for DisableQueryExamples // no validation rules for MaxQueryLogSize diff --git a/api/agentpb/agent.proto b/api/agentpb/agent.proto index 973b064286..6aafb4a4ed 100644 --- a/api/agentpb/agent.proto +++ b/api/agentpb/agent.proto @@ -70,6 +70,8 @@ message SetStateRequest { string dsn = 2; // Limit query length in QAN (default: server-defined; -1: no limit). int32 max_query_length = 8; + // Disable parsing comments from queries and showing them in QAN. + bool disable_comments_parsing = 9; // Disables query examples for QAN Agents if true. bool disable_query_examples = 3; // Instructs QAN Agents to rotate query log file or table at this size if > 0. diff --git a/api/agentpb/collector.pb.go b/api/agentpb/collector.pb.go index 27346a7c84..6119d23c42 100644 --- a/api/agentpb/collector.pb.go +++ b/api/agentpb/collector.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: agentpb/collector.proto @@ -275,6 +275,8 @@ type MetricsBucket_Common struct { ExplainFingerprint string `protobuf:"bytes,25,opt,name=explain_fingerprint,json=explainFingerprint,proto3" json:"explain_fingerprint,omitempty"` // ammount of variables in query. PlaceholdersCount uint32 `protobuf:"varint,26,opt,name=placeholders_count,json=placeholdersCount,proto3" json:"placeholders_count,omitempty"` + // List of keys and values of comments. + Comments map[string]string `protobuf:"bytes,27,rep,name=comments,proto3" json:"comments,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // digest_text - query signature. Query without values. Fingerprint string `protobuf:"bytes,2,opt,name=fingerprint,proto3" json:"fingerprint,omitempty"` // Dimension Group. @@ -381,6 +383,13 @@ func (x *MetricsBucket_Common) GetPlaceholdersCount() uint32 { return 0 } +func (x *MetricsBucket_Common) GetComments() map[string]string { + if x != nil { + return x.Comments + } + return nil +} + func (x *MetricsBucket_Common) GetFingerprint() string { if x != nil { return x.Fingerprint @@ -2168,7 +2177,7 @@ var file_agentpb_collector_proto_rawDesc = []byte{ 0x0a, 0x17, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x18, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x70, 0x62, 0x2f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9a, 0x4c, 0x0a, 0x0d, 0x4d, + 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9e, 0x4d, 0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x42, 0x75, 0x63, 0x6b, @@ -2183,7 +2192,7 @@ var file_agentpb_collector_proto_rawDesc = []byte{ 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, - 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x1a, 0xf1, 0x08, 0x0a, + 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x1a, 0xf5, 0x09, 0x0a, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x13, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6e, @@ -2192,616 +2201,625 @@ var file_agentpb_collector_proto_rawDesc = []byte{ 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x68, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, - 0x69, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x16, - 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x75, 0x6e, 0x69, - 0x78, 0x5f, 0x73, 0x65, 0x63, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x55, 0x6e, 0x69, 0x78, 0x53, 0x65, 0x63, - 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x70, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x53, 0x65, 0x63, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x65, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0d, 0x65, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x35, 0x0a, 0x0c, 0x65, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x12, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x74, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x54, 0x72, 0x75, 0x6e, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x6e, 0x75, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, - 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x16, 0x6e, 0x75, 0x6d, 0x51, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x35, 0x0a, 0x17, 0x6e, 0x75, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x77, - 0x69, 0x74, 0x68, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x14, 0x6e, 0x75, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x3f, 0x0a, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, - 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x71, - 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x6e, 0x75, - 0x6d, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x13, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x43, 0x6e, - 0x74, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x14, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x15, + 0x74, 0x12, 0x45, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x1b, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x67, + 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x66, + 0x69, 0x6e, 0x67, 0x65, 0x72, 0x70, 0x72, 0x69, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x6f, 0x73, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x48, + 0x6f, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x33, + 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x78, 0x5f, 0x73, 0x65, 0x63, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x13, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x55, 0x6e, 0x69, 0x78, 0x53, 0x65, 0x63, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x73, 0x65, 0x63, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x4c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x53, 0x65, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x12, 0x3f, 0x0a, 0x0e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x0d, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x35, 0x0a, 0x0c, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x74, + 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x69, 0x73, 0x54, 0x72, 0x75, 0x6e, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x19, 0x6e, + 0x75, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x16, + 0x6e, 0x75, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x57, 0x61, + 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x35, 0x0a, 0x17, 0x6e, 0x75, 0x6d, 0x5f, 0x71, 0x75, + 0x65, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6e, 0x75, 0x6d, 0x51, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x3f, 0x0a, + 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x42, 0x75, 0x63, + 0x6b, 0x65, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x1f, + 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x63, 0x6e, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x54, 0x69, 0x6d, 0x65, 0x43, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x75, + 0x6d, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x15, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x16, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, - 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x16, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x10, - 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x39, 0x39, - 0x18, 0x17, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, - 0x6d, 0x65, 0x50, 0x39, 0x39, 0x1a, 0x39, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0xa8, 0x2a, 0x0a, 0x05, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x43, 0x6e, - 0x74, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x4c, 0x6f, 0x63, - 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x0c, 0x6d, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x69, 0x6e, 0x12, - 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, - 0x61, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x4c, 0x6f, 0x63, 0x6b, 0x54, - 0x69, 0x6d, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x0c, 0x6d, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x39, 0x39, 0x12, 0x25, 0x0a, - 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x53, 0x65, 0x6e, - 0x74, 0x43, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x73, - 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, - 0x52, 0x6f, 0x77, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, - 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x4d, - 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x73, 0x65, 0x6e, - 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, - 0x77, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, - 0x6f, 0x77, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x50, 0x39, 0x39, + 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x17, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x39, 0x39, 0x1a, 0x3b, 0x0a, 0x0d, + 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xa8, 0x2a, 0x0a, 0x05, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x12, 0x25, + 0x0a, 0x0f, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, + 0x6d, 0x65, 0x43, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, + 0x6d, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, + 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, + 0x4d, 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x4c, + 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x4c, 0x6f, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x39, + 0x39, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, + 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, 0x77, + 0x73, 0x53, 0x65, 0x6e, 0x74, 0x43, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, 0x6f, + 0x77, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x6d, 0x12, + 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x6d, + 0x69, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x53, + 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, + 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, + 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x39, 0x39, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x53, 0x65, 0x6e, + 0x74, 0x50, 0x39, 0x39, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x65, + 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x10, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x45, 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, + 0x43, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x65, 0x78, + 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x10, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x45, 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x53, + 0x75, 0x6d, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x65, 0x78, 0x61, + 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x10, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x45, 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x4d, 0x69, + 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x65, 0x78, 0x61, 0x6d, + 0x69, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, + 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x45, 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x78, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x69, - 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, - 0x52, 0x6f, 0x77, 0x73, 0x45, 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x43, 0x6e, 0x74, 0x12, - 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x69, 0x6e, - 0x65, 0x64, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, - 0x6f, 0x77, 0x73, 0x45, 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x2d, - 0x0a, 0x13, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, - 0x64, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, 0x6f, - 0x77, 0x73, 0x45, 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x4d, 0x69, 0x6e, 0x12, 0x2d, 0x0a, - 0x13, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, - 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, 0x6f, 0x77, - 0x73, 0x45, 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x78, 0x12, 0x2d, 0x0a, 0x13, - 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x5f, - 0x70, 0x39, 0x39, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, 0x6f, 0x77, 0x73, - 0x45, 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x50, 0x39, 0x39, 0x12, 0x2d, 0x0a, 0x13, 0x6d, - 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, - 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x41, - 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, - 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x75, - 0x6d, 0x18, 0x11, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, - 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x72, - 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x69, 0x6e, - 0x18, 0x12, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x65, 0x64, 0x4d, 0x69, 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x72, 0x6f, - 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x78, 0x18, - 0x13, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x4d, 0x61, 0x78, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x72, 0x6f, 0x77, - 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x50, 0x39, 0x39, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, - 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x25, 0x0a, - 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x75, 0x6d, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x61, - 0x64, 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, - 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x17, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, - 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x61, 0x64, 0x4d, 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0f, 0x6d, - 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x18, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x61, 0x64, 0x4d, - 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x61, - 0x64, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x19, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, - 0x77, 0x73, 0x52, 0x65, 0x61, 0x64, 0x50, 0x39, 0x39, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x6d, - 0x65, 0x72, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, - 0x1a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x50, 0x61, 0x73, - 0x73, 0x65, 0x73, 0x43, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x6d, 0x65, 0x72, 0x67, - 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x1b, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x65, 0x73, - 0x53, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x70, - 0x61, 0x73, 0x73, 0x65, 0x73, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x0f, 0x6d, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x65, 0x73, 0x4d, 0x69, 0x6e, - 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, - 0x65, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x4d, - 0x65, 0x72, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x12, 0x2b, 0x0a, + 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, + 0x52, 0x6f, 0x77, 0x73, 0x45, 0x78, 0x61, 0x6d, 0x69, 0x6e, 0x65, 0x64, 0x50, 0x39, 0x39, 0x12, + 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, + 0x6f, 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x2d, + 0x0a, 0x13, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x11, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, 0x6f, + 0x77, 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x2d, 0x0a, + 0x13, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x12, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, 0x6f, 0x77, + 0x73, 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4d, 0x69, 0x6e, 0x12, 0x2d, 0x0a, 0x13, + 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, + 0x6d, 0x61, 0x78, 0x18, 0x13, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, 0x6f, 0x77, 0x73, + 0x41, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4d, 0x61, 0x78, 0x12, 0x2d, 0x0a, 0x13, 0x6d, + 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x70, + 0x39, 0x39, 0x18, 0x14, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x41, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x50, 0x39, 0x39, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, + 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6e, + 0x74, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x16, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, 0x77, + 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, 0x6f, + 0x77, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x61, 0x64, 0x4d, 0x69, 0x6e, 0x12, + 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6d, + 0x61, 0x78, 0x18, 0x18, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x52, + 0x65, 0x61, 0x64, 0x4d, 0x61, 0x78, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, + 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x19, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x0c, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x61, 0x64, 0x50, 0x39, 0x39, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5f, - 0x70, 0x39, 0x39, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x4d, 0x65, 0x72, 0x67, - 0x65, 0x50, 0x61, 0x73, 0x73, 0x65, 0x73, 0x50, 0x39, 0x39, 0x12, 0x2f, 0x0a, 0x15, 0x6d, 0x5f, - 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x6f, 0x70, 0x73, 0x5f, - 0x63, 0x6e, 0x74, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, - 0x64, 0x62, 0x49, 0x6f, 0x52, 0x4f, 0x70, 0x73, 0x43, 0x6e, 0x74, 0x12, 0x2f, 0x0a, 0x15, 0x6d, - 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x6f, 0x70, 0x73, - 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x20, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x49, 0x6e, 0x6e, - 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x4f, 0x70, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x2f, 0x0a, 0x15, - 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x6f, 0x70, - 0x73, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x49, 0x6e, - 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x4f, 0x70, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x2f, 0x0a, - 0x15, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x6f, - 0x70, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x22, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x49, - 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x4f, 0x70, 0x73, 0x4d, 0x61, 0x78, 0x12, 0x2f, + 0x63, 0x6e, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x4d, 0x65, 0x72, 0x67, + 0x65, 0x50, 0x61, 0x73, 0x73, 0x65, 0x73, 0x43, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, + 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5f, 0x73, 0x75, 0x6d, + 0x18, 0x1b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x50, 0x61, + 0x73, 0x73, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x6d, 0x65, 0x72, + 0x67, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x1c, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x65, + 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, + 0x70, 0x61, 0x73, 0x73, 0x65, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x0f, 0x6d, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x65, 0x73, 0x4d, 0x61, + 0x78, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x73, + 0x73, 0x65, 0x73, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, + 0x4d, 0x65, 0x72, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x65, 0x73, 0x50, 0x39, 0x39, 0x12, 0x2f, 0x0a, 0x15, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, - 0x6f, 0x70, 0x73, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x23, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, - 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x4f, 0x70, 0x73, 0x50, 0x39, 0x39, 0x12, - 0x33, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, - 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x12, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x43, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, - 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, - 0x25, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, - 0x52, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x33, 0x0a, 0x17, 0x6d, 0x5f, 0x69, - 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x26, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x49, 0x6e, 0x6e, - 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x33, - 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x27, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x12, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x4d, 0x61, 0x78, 0x12, 0x33, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, - 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x28, + 0x6f, 0x70, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, + 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x4f, 0x70, 0x73, 0x43, 0x6e, 0x74, 0x12, + 0x2f, 0x0a, 0x15, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, + 0x5f, 0x6f, 0x70, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x20, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, + 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x4f, 0x70, 0x73, 0x53, 0x75, 0x6d, + 0x12, 0x2f, 0x0a, 0x15, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, + 0x72, 0x5f, 0x6f, 0x70, 0x73, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x21, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x10, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x4f, 0x70, 0x73, 0x4d, 0x69, + 0x6e, 0x12, 0x2f, 0x0a, 0x15, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, + 0x5f, 0x72, 0x5f, 0x6f, 0x70, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x22, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x10, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x4f, 0x70, 0x73, 0x4d, + 0x61, 0x78, 0x12, 0x2f, 0x0a, 0x15, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, + 0x6f, 0x5f, 0x72, 0x5f, 0x6f, 0x70, 0x73, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x23, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x10, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x4f, 0x70, 0x73, + 0x50, 0x39, 0x39, 0x12, 0x33, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, + 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x39, 0x39, 0x12, 0x31, 0x0a, 0x16, 0x6d, 0x5f, 0x69, 0x6e, - 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x63, - 0x6e, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, - 0x62, 0x49, 0x6f, 0x52, 0x57, 0x61, 0x69, 0x74, 0x43, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x16, 0x6d, - 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x77, 0x61, 0x69, - 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x49, 0x6e, - 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x57, 0x61, 0x69, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x31, - 0x0a, 0x16, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, - 0x77, 0x61, 0x69, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, - 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x57, 0x61, 0x69, 0x74, 0x4d, 0x69, - 0x6e, 0x12, 0x31, 0x0a, 0x16, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, - 0x5f, 0x72, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x2c, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x11, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x57, 0x61, 0x69, - 0x74, 0x4d, 0x61, 0x78, 0x12, 0x31, 0x0a, 0x16, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, - 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x2d, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, - 0x57, 0x61, 0x69, 0x74, 0x50, 0x39, 0x39, 0x12, 0x39, 0x0a, 0x1a, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, + 0x42, 0x79, 0x74, 0x65, 0x73, 0x43, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, + 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, + 0x73, 0x75, 0x6d, 0x18, 0x25, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, + 0x64, 0x62, 0x49, 0x6f, 0x52, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x33, 0x0a, + 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x26, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, + 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4d, + 0x69, 0x6e, 0x12, 0x33, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, + 0x6f, 0x5f, 0x72, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x27, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x12, 0x33, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, + 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x70, + 0x39, 0x39, 0x18, 0x28, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, + 0x62, 0x49, 0x6f, 0x52, 0x42, 0x79, 0x74, 0x65, 0x73, 0x50, 0x39, 0x39, 0x12, 0x31, 0x0a, 0x16, + 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x77, 0x61, + 0x69, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x29, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x49, + 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x57, 0x61, 0x69, 0x74, 0x43, 0x6e, 0x74, 0x12, + 0x31, 0x0a, 0x16, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, + 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x11, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x57, 0x61, 0x69, 0x74, 0x53, + 0x75, 0x6d, 0x12, 0x31, 0x0a, 0x16, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, + 0x6f, 0x5f, 0x72, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x2b, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x11, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, 0x52, 0x57, 0x61, + 0x69, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x31, 0x0a, 0x16, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, + 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, + 0x2c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x49, 0x6f, + 0x52, 0x57, 0x61, 0x69, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x31, 0x0a, 0x16, 0x6d, 0x5f, 0x69, 0x6e, + 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x69, 0x6f, 0x5f, 0x72, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, + 0x39, 0x39, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, + 0x62, 0x49, 0x6f, 0x52, 0x57, 0x61, 0x69, 0x74, 0x50, 0x39, 0x39, 0x12, 0x39, 0x0a, 0x1a, 0x6d, + 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x15, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x63, 0x4c, 0x6f, 0x63, 0x6b, 0x57, + 0x61, 0x69, 0x74, 0x43, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x1a, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, + 0x64, 0x62, 0x5f, 0x72, 0x65, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x77, 0x61, 0x69, 0x74, + 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x49, 0x6e, 0x6e, + 0x6f, 0x64, 0x62, 0x52, 0x65, 0x63, 0x4c, 0x6f, 0x63, 0x6b, 0x57, 0x61, 0x69, 0x74, 0x53, 0x75, + 0x6d, 0x12, 0x39, 0x0a, 0x1a, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, + 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, + 0x30, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x52, 0x65, + 0x63, 0x4c, 0x6f, 0x63, 0x6b, 0x57, 0x61, 0x69, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x39, 0x0a, 0x1a, + 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x63, 0x5f, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x31, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x15, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x63, 0x4c, 0x6f, 0x63, 0x6b, + 0x57, 0x61, 0x69, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x39, 0x0a, 0x1a, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x77, 0x61, 0x69, - 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x2e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x49, 0x6e, - 0x6e, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x63, 0x4c, 0x6f, 0x63, 0x6b, 0x57, 0x61, 0x69, 0x74, 0x43, - 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x1a, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x72, - 0x65, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x73, 0x75, 0x6d, - 0x18, 0x2f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x52, - 0x65, 0x63, 0x4c, 0x6f, 0x63, 0x6b, 0x57, 0x61, 0x69, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x39, 0x0a, - 0x1a, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x63, 0x5f, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x30, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x15, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x63, 0x4c, 0x6f, 0x63, - 0x6b, 0x57, 0x61, 0x69, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x39, 0x0a, 0x1a, 0x6d, 0x5f, 0x69, 0x6e, - 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x77, 0x61, - 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x31, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x49, - 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x63, 0x4c, 0x6f, 0x63, 0x6b, 0x57, 0x61, 0x69, 0x74, - 0x4d, 0x61, 0x78, 0x12, 0x39, 0x0a, 0x1a, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, - 0x72, 0x65, 0x63, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x39, - 0x39, 0x18, 0x32, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, - 0x52, 0x65, 0x63, 0x4c, 0x6f, 0x63, 0x6b, 0x57, 0x61, 0x69, 0x74, 0x50, 0x39, 0x39, 0x12, 0x34, + 0x74, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x32, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x49, 0x6e, + 0x6e, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x63, 0x4c, 0x6f, 0x63, 0x6b, 0x57, 0x61, 0x69, 0x74, 0x50, + 0x39, 0x39, 0x12, 0x34, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x71, + 0x75, 0x65, 0x75, 0x65, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x33, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x51, 0x75, 0x65, 0x75, + 0x65, 0x57, 0x61, 0x69, 0x74, 0x43, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, + 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, + 0x73, 0x75, 0x6d, 0x18, 0x34, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, + 0x64, 0x62, 0x51, 0x75, 0x65, 0x75, 0x65, 0x57, 0x61, 0x69, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x34, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, - 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x33, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x35, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x51, 0x75, 0x65, 0x75, 0x65, 0x57, 0x61, 0x69, - 0x74, 0x43, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, - 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, - 0x34, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x51, 0x75, - 0x65, 0x75, 0x65, 0x57, 0x61, 0x69, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x34, 0x0a, 0x17, 0x6d, 0x5f, + 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x34, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, + 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, + 0x36, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x51, 0x75, + 0x65, 0x75, 0x65, 0x57, 0x61, 0x69, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x34, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x77, 0x61, 0x69, - 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x35, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x49, 0x6e, - 0x6e, 0x6f, 0x64, 0x62, 0x51, 0x75, 0x65, 0x75, 0x65, 0x57, 0x61, 0x69, 0x74, 0x4d, 0x69, 0x6e, - 0x12, 0x34, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, - 0x75, 0x65, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x36, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x13, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x51, 0x75, 0x65, 0x75, 0x65, 0x57, - 0x61, 0x69, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x34, 0x0a, 0x17, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, - 0x64, 0x62, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x70, 0x39, - 0x39, 0x18, 0x37, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, - 0x51, 0x75, 0x65, 0x75, 0x65, 0x57, 0x61, 0x69, 0x74, 0x50, 0x39, 0x39, 0x12, 0x3c, 0x0a, 0x1b, + 0x74, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x37, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x49, 0x6e, + 0x6e, 0x6f, 0x64, 0x62, 0x51, 0x75, 0x65, 0x75, 0x65, 0x57, 0x61, 0x69, 0x74, 0x50, 0x39, 0x39, + 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x61, 0x67, + 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, + 0x38, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x50, 0x61, + 0x67, 0x65, 0x73, 0x44, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x43, 0x6e, 0x74, 0x12, 0x3c, + 0x0a, 0x1b, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x73, + 0x5f, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x39, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x17, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x50, 0x61, 0x67, 0x65, + 0x73, 0x44, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x64, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x38, 0x20, 0x01, 0x28, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x50, 0x61, 0x67, 0x65, 0x73, 0x44, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x43, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x5f, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x63, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x39, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x74, 0x69, 0x6e, 0x63, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x50, 0x61, 0x67, 0x65, 0x73, 0x44, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x63, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x5f, 0x69, 0x6e, + 0x74, 0x69, 0x6e, 0x63, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x63, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x6d, + 0x6e, 0x63, 0x74, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, 0x64, 0x62, 0x50, 0x61, 0x67, 0x65, 0x73, 0x44, 0x69, 0x73, 0x74, 0x69, - 0x6e, 0x63, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, - 0x64, 0x62, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, - 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x6d, 0x49, 0x6e, - 0x6e, 0x6f, 0x64, 0x62, 0x50, 0x61, 0x67, 0x65, 0x73, 0x44, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, - 0x74, 0x4d, 0x61, 0x78, 0x12, 0x3c, 0x0a, 0x1b, 0x6d, 0x5f, 0x69, 0x6e, 0x6e, 0x6f, 0x64, 0x62, - 0x5f, 0x70, 0x61, 0x67, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x5f, - 0x70, 0x39, 0x39, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x6d, 0x49, 0x6e, 0x6e, 0x6f, - 0x64, 0x62, 0x50, 0x61, 0x67, 0x65, 0x73, 0x44, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x50, - 0x39, 0x39, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, - 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x43, 0x6e, 0x74, 0x12, - 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x53, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x12, - 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x6d, - 0x69, 0x6e, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x69, 0x6e, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x6d, 0x61, 0x78, 0x18, - 0x40, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x4d, 0x61, 0x78, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x41, 0x20, 0x01, + 0x6e, 0x63, 0x74, 0x50, 0x39, 0x39, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x50, 0x39, 0x39, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, - 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x42, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x43, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x10, - 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x75, 0x6d, - 0x18, 0x43, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x65, - 0x6e, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, - 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x44, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x0d, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x27, - 0x0a, 0x10, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x6d, - 0x61, 0x78, 0x18, 0x45, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x53, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x46, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x0d, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x50, 0x39, 0x39, - 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x47, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x54, 0x6d, 0x70, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x74, - 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x48, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x53, - 0x75, 0x6d, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x49, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x54, - 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x10, 0x6d, - 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, - 0x4a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, - 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x50, 0x39, 0x39, 0x12, 0x30, 0x0a, - 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x54, - 0x6d, 0x70, 0x44, 0x69, 0x73, 0x6b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6e, 0x74, 0x12, - 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, - 0x6d, 0x54, 0x6d, 0x70, 0x44, 0x69, 0x73, 0x6b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x53, 0x75, - 0x6d, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x02, + 0x43, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x0f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x53, 0x75, 0x6d, + 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x69, 0x6e, 0x12, 0x2b, 0x0a, + 0x12, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, + 0x6d, 0x61, 0x78, 0x18, 0x40, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x61, 0x78, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x70, 0x39, 0x39, + 0x18, 0x41, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x50, 0x39, 0x39, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x42, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x0d, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x43, 0x6e, 0x74, + 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x43, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x44, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x4d, + 0x69, 0x6e, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x65, + 0x6e, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x45, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x53, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x10, 0x6d, + 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x39, 0x39, 0x18, + 0x46, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x65, 0x6e, + 0x74, 0x50, 0x39, 0x39, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x47, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, + 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x43, 0x6e, 0x74, 0x12, 0x27, 0x0a, + 0x10, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x73, 0x75, + 0x6d, 0x18, 0x48, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x49, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x0d, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, + 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, + 0x6d, 0x61, 0x78, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x54, 0x6d, 0x70, 0x54, + 0x61, 0x62, 0x6c, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x74, 0x6d, + 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x4b, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x50, 0x39, + 0x39, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x54, 0x6d, 0x70, 0x44, 0x69, 0x73, 0x6b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, - 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x64, 0x69, 0x73, - 0x6b, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x4f, 0x20, 0x01, + 0x43, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x64, 0x69, 0x73, + 0x6b, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x54, 0x6d, 0x70, 0x44, 0x69, 0x73, 0x6b, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x73, 0x4d, 0x61, 0x78, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x64, - 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x50, + 0x65, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x64, + 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x54, 0x6d, 0x70, 0x44, 0x69, 0x73, 0x6b, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x73, 0x50, 0x39, 0x39, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, - 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x63, 0x6e, 0x74, - 0x18, 0x51, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x43, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, - 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x73, - 0x75, 0x6d, 0x18, 0x52, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x30, 0x0a, 0x15, 0x6d, + 0x62, 0x6c, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, + 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x6d, 0x61, 0x78, + 0x18, 0x4f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x54, 0x6d, 0x70, 0x44, 0x69, 0x73, 0x6b, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, + 0x6d, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x5f, 0x70, + 0x39, 0x39, 0x18, 0x50, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x54, 0x6d, 0x70, 0x44, 0x69, + 0x73, 0x6b, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x50, 0x39, 0x39, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, - 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x53, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x54, 0x6d, 0x70, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, + 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x51, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x54, 0x6d, 0x70, + 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x43, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x54, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x54, - 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x4d, 0x61, 0x78, 0x12, + 0x65, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x52, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x54, + 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x55, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, - 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x50, 0x39, - 0x39, 0x12, 0x1f, 0x0a, 0x0c, 0x6d, 0x5f, 0x71, 0x63, 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x63, 0x6e, - 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6d, 0x51, 0x63, 0x48, 0x69, 0x74, 0x43, - 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0c, 0x6d, 0x5f, 0x71, 0x63, 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x73, - 0x75, 0x6d, 0x18, 0x57, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6d, 0x51, 0x63, 0x48, 0x69, 0x74, - 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x73, 0x63, - 0x61, 0x6e, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x58, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x46, - 0x75, 0x6c, 0x6c, 0x53, 0x63, 0x61, 0x6e, 0x43, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, - 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x59, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x63, 0x61, 0x6e, 0x53, 0x75, - 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, - 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x46, 0x75, 0x6c, - 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x66, 0x75, - 0x6c, 0x6c, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x5b, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x0c, 0x6d, 0x46, 0x75, 0x6c, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x53, 0x75, 0x6d, 0x12, - 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, - 0x6e, 0x74, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x43, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x0c, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x33, 0x0a, - 0x17, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, - 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, - 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x6e, 0x44, 0x69, 0x73, 0x6b, 0x43, - 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x17, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x5f, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x6e, - 0x44, 0x69, 0x73, 0x6b, 0x53, 0x75, 0x6d, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x60, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x0c, 0x6d, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x6f, 0x72, 0x74, 0x43, 0x6e, 0x74, 0x12, 0x24, 0x0a, - 0x0e, 0x6d, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, - 0x61, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x6f, 0x72, 0x74, - 0x53, 0x75, 0x6d, 0x12, 0x32, 0x0a, 0x16, 0x6d, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x6f, 0x72, - 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x62, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x6e, - 0x44, 0x69, 0x73, 0x6b, 0x43, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x16, 0x6d, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x73, 0x75, - 0x6d, 0x18, 0x63, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x6f, - 0x72, 0x74, 0x4f, 0x6e, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x75, 0x6d, 0x12, 0x3d, 0x0a, 0x1c, 0x6d, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x17, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x1c, 0x6d, 0x5f, - 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x65, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x17, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x53, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x73, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, - 0x66, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x43, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x67, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, - 0x53, 0x75, 0x6d, 0x12, 0x36, 0x0a, 0x18, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6e, 0x74, 0x18, - 0x68, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x18, 0x6d, - 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x69, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, - 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x53, 0x75, 0x6d, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, - 0x53, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x10, - 0x6d, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, - 0x18, 0x6b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x5f, - 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, - 0x6d, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x77, 0x73, 0x43, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0f, - 0x6d, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, - 0x6d, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x77, 0x73, - 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x63, - 0x61, 0x6e, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x53, - 0x6f, 0x72, 0x74, 0x53, 0x63, 0x61, 0x6e, 0x43, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, - 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x6f, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x53, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x61, 0x6e, 0x53, 0x75, - 0x6d, 0x12, 0x2c, 0x0a, 0x13, 0x6d, 0x5f, 0x6e, 0x6f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, - 0x75, 0x73, 0x65, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x70, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, - 0x6d, 0x4e, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x55, 0x73, 0x65, 0x64, 0x43, 0x6e, 0x74, 0x12, - 0x2c, 0x0a, 0x13, 0x6d, 0x5f, 0x6e, 0x6f, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x75, 0x73, - 0x65, 0x64, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x71, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x4e, - 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x55, 0x73, 0x65, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x35, 0x0a, - 0x18, 0x6d, 0x5f, 0x6e, 0x6f, 0x5f, 0x67, 0x6f, 0x6f, 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x72, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x13, 0x6d, 0x4e, 0x6f, 0x47, 0x6f, 0x6f, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x55, 0x73, 0x65, - 0x64, 0x43, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x18, 0x6d, 0x5f, 0x6e, 0x6f, 0x5f, 0x67, 0x6f, 0x6f, - 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x6d, - 0x18, 0x73, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x4e, 0x6f, 0x47, 0x6f, 0x6f, 0x64, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x55, 0x73, 0x65, 0x64, 0x53, 0x75, 0x6d, 0x1a, 0xd4, 0x05, 0x0a, 0x07, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x64, 0x6f, 0x63, - 0x73, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x01, + 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x53, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, + 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, 0x4d, 0x69, + 0x6e, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x54, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x11, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x73, + 0x4d, 0x61, 0x78, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x73, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x55, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x11, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x73, 0x50, 0x39, 0x39, 0x12, 0x1f, 0x0a, 0x0c, 0x6d, 0x5f, 0x71, 0x63, 0x5f, 0x68, 0x69, + 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6d, 0x51, 0x63, + 0x48, 0x69, 0x74, 0x43, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0c, 0x6d, 0x5f, 0x71, 0x63, 0x5f, 0x68, + 0x69, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x57, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6d, 0x51, + 0x63, 0x48, 0x69, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x66, 0x75, 0x6c, + 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x58, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x0c, 0x6d, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x63, 0x61, 0x6e, 0x43, 0x6e, 0x74, 0x12, 0x25, + 0x0a, 0x0f, 0x6d, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x73, 0x75, + 0x6d, 0x18, 0x59, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x63, + 0x61, 0x6e, 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x5f, + 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, + 0x6d, 0x46, 0x75, 0x6c, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0f, + 0x6d, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x73, 0x75, 0x6d, 0x18, + 0x5b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x46, 0x75, 0x6c, 0x6c, 0x4a, 0x6f, 0x69, 0x6e, + 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x54, + 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, + 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x5d, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x75, + 0x6d, 0x12, 0x33, 0x0a, 0x17, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x5e, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x12, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4f, 0x6e, 0x44, + 0x69, 0x73, 0x6b, 0x43, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x17, 0x6d, 0x5f, 0x74, 0x6d, 0x70, 0x5f, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x73, 0x75, + 0x6d, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x54, 0x6d, 0x70, 0x54, 0x61, 0x62, + 0x6c, 0x65, 0x4f, 0x6e, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x75, 0x6d, 0x12, 0x24, 0x0a, 0x0e, 0x6d, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x60, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x6f, 0x72, 0x74, 0x43, 0x6e, + 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x6f, 0x72, 0x74, 0x5f, + 0x73, 0x75, 0x6d, 0x18, 0x61, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x6f, 0x72, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x32, 0x0a, 0x16, 0x6d, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x63, 0x6e, + 0x74, 0x18, 0x62, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x6f, + 0x72, 0x74, 0x4f, 0x6e, 0x44, 0x69, 0x73, 0x6b, 0x43, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x16, 0x6d, + 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73, + 0x6b, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x63, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x6f, 0x72, 0x74, 0x4f, 0x6e, 0x44, 0x69, 0x73, 0x6b, 0x53, 0x75, 0x6d, 0x12, + 0x3d, 0x0a, 0x1c, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x66, 0x75, 0x6c, 0x6c, + 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x63, 0x6e, 0x74, 0x18, + 0x64, 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x46, 0x75, + 0x6c, 0x6c, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x43, 0x6e, 0x74, 0x12, 0x3d, + 0x0a, 0x1c, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x5f, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x6a, 0x6f, 0x69, 0x6e, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x65, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x17, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x46, 0x75, 0x6c, + 0x6c, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x4a, 0x6f, 0x69, 0x6e, 0x53, 0x75, 0x6d, 0x12, 0x2b, 0x0a, + 0x12, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, + 0x63, 0x6e, 0x74, 0x18, 0x66, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x73, 0x75, 0x6d, + 0x18, 0x67, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x52, + 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x36, 0x0a, 0x18, 0x6d, 0x5f, 0x73, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, + 0x63, 0x6e, 0x74, 0x18, 0x68, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x53, 0x65, 0x6c, 0x65, + 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6e, 0x74, 0x12, + 0x36, 0x0a, 0x18, 0x6d, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x69, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x14, 0x6d, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x53, 0x75, 0x6d, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x73, 0x6f, 0x72, + 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x6a, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x0d, 0x6d, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6e, 0x74, + 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0d, 0x6d, 0x53, 0x6f, 0x72, + 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x73, + 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x6c, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x6f, 0x77, 0x73, 0x43, 0x6e, 0x74, + 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, + 0x73, 0x75, 0x6d, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x53, 0x6f, 0x72, 0x74, + 0x52, 0x6f, 0x77, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x73, 0x6f, 0x72, + 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x0c, 0x6d, 0x53, 0x6f, 0x72, 0x74, 0x53, 0x63, 0x61, 0x6e, 0x43, 0x6e, 0x74, 0x12, 0x25, + 0x0a, 0x0f, 0x6d, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x73, 0x75, + 0x6d, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x53, 0x6f, 0x72, 0x74, 0x53, 0x63, + 0x61, 0x6e, 0x53, 0x75, 0x6d, 0x12, 0x2c, 0x0a, 0x13, 0x6d, 0x5f, 0x6e, 0x6f, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x70, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x4e, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x55, 0x73, 0x65, 0x64, + 0x43, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x13, 0x6d, 0x5f, 0x6e, 0x6f, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x71, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x0f, 0x6d, 0x4e, 0x6f, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x55, 0x73, 0x65, 0x64, 0x53, 0x75, + 0x6d, 0x12, 0x35, 0x0a, 0x18, 0x6d, 0x5f, 0x6e, 0x6f, 0x5f, 0x67, 0x6f, 0x6f, 0x64, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x72, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x4e, 0x6f, 0x47, 0x6f, 0x6f, 0x64, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x55, 0x73, 0x65, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x18, 0x6d, 0x5f, 0x6e, 0x6f, + 0x5f, 0x67, 0x6f, 0x6f, 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x75, 0x73, 0x65, 0x64, + 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x73, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x4e, 0x6f, 0x47, + 0x6f, 0x6f, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x55, 0x73, 0x65, 0x64, 0x53, 0x75, 0x6d, 0x1a, + 0xd4, 0x05, 0x0a, 0x07, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x12, 0x2d, 0x0a, 0x13, 0x6d, + 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x63, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, + 0x64, 0x6f, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x75, + 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x65, + 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x64, + 0x6f, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x69, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x65, 0x64, 0x4d, 0x69, 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x64, 0x6f, + 0x63, 0x73, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x78, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x78, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x64, 0x6f, 0x63, + 0x73, 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x65, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x64, 0x6f, 0x63, 0x73, - 0x5f, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x65, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x5f, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x10, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, - 0x64, 0x4d, 0x69, 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x5f, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x10, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, - 0x4d, 0x61, 0x78, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x5f, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x10, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x50, - 0x39, 0x39, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x6e, 0x65, 0x64, 0x50, 0x39, 0x39, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x63, 0x6e, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x43, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x5f, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x73, + 0x75, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x53, 0x75, 0x6d, 0x12, 0x31, 0x0a, 0x15, + 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x69, 0x6e, 0x12, + 0x31, 0x0a, 0x15, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, + 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, + 0x61, 0x78, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x43, 0x6e, 0x74, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x53, 0x75, 0x6d, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x5f, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x5f, 0x6d, 0x69, - 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x69, 0x6e, 0x12, 0x31, 0x0a, 0x15, 0x6d, - 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x4d, 0x61, 0x78, 0x12, 0x31, - 0x0a, 0x15, 0x6d, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x50, 0x39, - 0x39, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, - 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, - 0x44, 0x6f, 0x63, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x2b, - 0x0a, 0x12, 0x6d, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, - 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x44, 0x6f, 0x63, - 0x73, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x2b, 0x0a, 0x12, 0x6d, - 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x69, - 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x53, 0x63, - 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x4d, 0x69, 0x6e, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x64, 0x6f, - 0x63, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x6e, - 0x65, 0x64, 0x4d, 0x61, 0x78, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x5f, - 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x39, 0x39, 0x18, 0x0f, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x0f, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x50, - 0x39, 0x39, 0x1a, 0xb2, 0x11, 0x0a, 0x0a, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, - 0x4c, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x43, 0x6e, 0x74, 0x12, - 0x1c, 0x0a, 0x0a, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x08, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x30, 0x0a, - 0x15, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x68, - 0x69, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x53, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x6c, 0x6b, 0x73, 0x48, 0x69, 0x74, 0x43, 0x6e, 0x74, 0x12, - 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6b, 0x73, - 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, - 0x6d, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x6c, 0x6b, 0x73, 0x48, 0x69, 0x74, 0x53, 0x75, - 0x6d, 0x12, 0x32, 0x0a, 0x16, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x6c, - 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x12, 0x6d, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x6c, 0x6b, 0x73, 0x52, 0x65, - 0x61, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x16, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, - 0x64, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x75, 0x6d, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x6c, - 0x6b, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x5f, 0x73, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x74, 0x69, - 0x65, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x53, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x6c, 0x6b, 0x73, 0x44, 0x69, 0x72, 0x74, 0x69, 0x65, 0x64, - 0x43, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, - 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x74, 0x69, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x6d, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, - 0x6c, 0x6b, 0x73, 0x44, 0x69, 0x72, 0x74, 0x69, 0x65, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x38, 0x0a, - 0x19, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x77, - 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x15, 0x6d, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x6c, 0x6b, 0x73, 0x57, 0x72, 0x69, - 0x74, 0x74, 0x65, 0x6e, 0x43, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x5f, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, - 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x53, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x42, 0x6c, 0x6b, 0x73, 0x57, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x53, 0x75, - 0x6d, 0x12, 0x2e, 0x0a, 0x14, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6b, - 0x73, 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x10, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x6c, 0x6b, 0x73, 0x48, 0x69, 0x74, 0x43, 0x6e, - 0x74, 0x12, 0x2e, 0x0a, 0x14, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6b, - 0x73, 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x10, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x6c, 0x6b, 0x73, 0x48, 0x69, 0x74, 0x53, 0x75, - 0x6d, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6b, - 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x11, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x6c, 0x6b, 0x73, 0x52, 0x65, 0x61, 0x64, - 0x43, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, - 0x6c, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x11, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x6c, 0x6b, 0x73, 0x52, 0x65, - 0x61, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x36, 0x0a, 0x18, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x74, 0x69, 0x65, 0x64, 0x5f, 0x63, 0x6e, - 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, - 0x6c, 0x6b, 0x73, 0x44, 0x69, 0x72, 0x74, 0x69, 0x65, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x36, 0x0a, - 0x18, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x64, 0x69, - 0x72, 0x74, 0x69, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x14, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x6c, 0x6b, 0x73, 0x44, 0x69, 0x72, 0x74, 0x69, - 0x65, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x36, 0x0a, 0x18, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, - 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x63, 0x6e, - 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, - 0x6c, 0x6b, 0x73, 0x57, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x43, 0x6e, 0x74, 0x12, 0x36, 0x0a, - 0x18, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x77, 0x72, - 0x69, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x12, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x14, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x6c, 0x6b, 0x73, 0x57, 0x72, 0x69, 0x74, 0x74, - 0x65, 0x6e, 0x53, 0x75, 0x6d, 0x12, 0x2e, 0x0a, 0x14, 0x6d, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x5f, - 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x13, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x42, 0x6c, 0x6b, 0x73, 0x52, 0x65, - 0x61, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x14, 0x6d, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x5f, - 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x14, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x42, 0x6c, 0x6b, 0x73, 0x52, 0x65, - 0x61, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x34, 0x0a, 0x17, 0x6d, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x5f, - 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x63, 0x6e, 0x74, - 0x18, 0x15, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x42, 0x6c, 0x6b, - 0x73, 0x57, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x43, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x17, 0x6d, - 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x74, - 0x65, 0x6e, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x16, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x54, - 0x65, 0x6d, 0x70, 0x42, 0x6c, 0x6b, 0x73, 0x57, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x53, 0x75, - 0x6d, 0x12, 0x2c, 0x0a, 0x13, 0x6d, 0x5f, 0x62, 0x6c, 0x6b, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, - 0x6d, 0x42, 0x6c, 0x6b, 0x52, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x43, 0x6e, 0x74, 0x12, - 0x2c, 0x0a, 0x13, 0x6d, 0x5f, 0x62, 0x6c, 0x6b, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x18, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x42, - 0x6c, 0x6b, 0x52, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x2e, 0x0a, - 0x14, 0x6d, 0x5f, 0x62, 0x6c, 0x6b, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x42, 0x6c, - 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x43, 0x6e, 0x74, 0x12, 0x2e, 0x0a, - 0x14, 0x6d, 0x5f, 0x62, 0x6c, 0x6b, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x42, 0x6c, - 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x2c, 0x0a, - 0x13, 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x43, 0x70, 0x75, - 0x55, 0x73, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x43, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x13, 0x6d, - 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, - 0x75, 0x6d, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x43, 0x70, 0x75, 0x55, 0x73, - 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x2a, 0x0a, 0x12, 0x6d, 0x5f, 0x63, - 0x70, 0x75, 0x5f, 0x73, 0x79, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, - 0x1d, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x6d, 0x43, 0x70, 0x75, 0x53, 0x79, 0x73, 0x54, 0x69, - 0x6d, 0x65, 0x43, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x12, 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, - 0x79, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x1e, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x0e, 0x6d, 0x43, 0x70, 0x75, 0x53, 0x79, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x75, - 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x6d, 0x64, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x2b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6d, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x29, 0x0a, 0x11, - 0x6d, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x5f, 0x73, 0x75, - 0x6d, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x6d, 0x50, 0x6c, 0x61, 0x6e, 0x73, 0x43, - 0x61, 0x6c, 0x6c, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x29, 0x0a, 0x11, 0x6d, 0x5f, 0x70, 0x6c, 0x61, - 0x6e, 0x73, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x20, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x0e, 0x6d, 0x50, 0x6c, 0x61, 0x6e, 0x73, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x43, - 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x11, 0x6d, 0x5f, 0x77, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x21, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x6d, - 0x57, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x29, 0x0a, - 0x11, 0x6d, 0x5f, 0x77, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x5f, 0x63, - 0x6e, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x6d, 0x57, 0x61, 0x6c, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x73, 0x43, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0d, 0x6d, 0x5f, 0x77, 0x61, - 0x6c, 0x5f, 0x66, 0x70, 0x69, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x23, 0x20, 0x01, 0x28, 0x02, 0x52, - 0x0a, 0x6d, 0x57, 0x61, 0x6c, 0x46, 0x70, 0x69, 0x53, 0x75, 0x6d, 0x12, 0x21, 0x0a, 0x0d, 0x6d, - 0x5f, 0x77, 0x61, 0x6c, 0x5f, 0x66, 0x70, 0x69, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x24, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x0a, 0x6d, 0x57, 0x61, 0x6c, 0x46, 0x70, 0x69, 0x43, 0x6e, 0x74, 0x12, 0x25, - 0x0a, 0x0f, 0x6d, 0x5f, 0x77, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x75, - 0x6d, 0x18, 0x25, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x57, 0x61, 0x6c, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x77, 0x61, 0x6c, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x26, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, - 0x6d, 0x57, 0x61, 0x6c, 0x42, 0x79, 0x74, 0x65, 0x73, 0x43, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0f, - 0x6d, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, - 0x27, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x50, 0x6c, 0x61, 0x6e, 0x54, 0x69, 0x6d, 0x65, - 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x28, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x50, - 0x6c, 0x61, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x43, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, - 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x29, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x50, 0x6c, 0x61, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x69, - 0x6e, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x50, 0x6c, 0x61, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x70, 0x5f, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x64, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x74, - 0x6f, 0x70, 0x51, 0x75, 0x65, 0x72, 0x79, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x70, - 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, - 0x70, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x61, 0x6e, 0x69, 0x64, 0x18, 0x2e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x70, 0x6c, 0x61, 0x6e, 0x69, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x30, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x3d, 0x0a, 0x0f, 0x68, 0x69, 0x73, 0x74, - 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x31, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x67, - 0x72, 0x61, 0x6d, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0e, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x43, 0x0a, 0x0d, 0x48, 0x69, 0x73, 0x74, 0x6f, - 0x67, 0x72, 0x61, 0x6d, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x2a, 0x55, 0x0a, 0x0d, - 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1e, 0x0a, - 0x16, 0x45, 0x58, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x0f, 0x0a, - 0x07, 0x45, 0x58, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x01, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x13, - 0x0a, 0x0b, 0x46, 0x49, 0x4e, 0x47, 0x45, 0x52, 0x50, 0x52, 0x49, 0x4e, 0x54, 0x10, 0x02, 0x1a, - 0x02, 0x08, 0x01, 0x2a, 0x5d, 0x0a, 0x0b, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x45, 0x58, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, - 0x52, 0x41, 0x4e, 0x44, 0x4f, 0x4d, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x4c, 0x4f, 0x57, - 0x45, 0x53, 0x54, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x41, 0x53, 0x54, 0x45, 0x53, 0x54, - 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0x04, 0x42, 0x73, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x42, - 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, - 0x01, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, - 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x05, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0xca, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x11, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x68, 0x50, 0x39, 0x39, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x5f, + 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x0f, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x43, + 0x6e, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x5f, 0x73, 0x63, 0x61, + 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, + 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x53, 0x75, 0x6d, 0x12, + 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, + 0x64, 0x5f, 0x6d, 0x69, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x44, 0x6f, + 0x63, 0x73, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x4d, 0x69, 0x6e, 0x12, 0x2b, 0x0a, 0x12, + 0x6d, 0x5f, 0x64, 0x6f, 0x63, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x6d, + 0x61, 0x78, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x53, + 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x4d, 0x61, 0x78, 0x12, 0x2b, 0x0a, 0x12, 0x6d, 0x5f, 0x64, + 0x6f, 0x63, 0x73, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x39, 0x39, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x53, 0x63, 0x61, 0x6e, + 0x6e, 0x65, 0x64, 0x50, 0x39, 0x39, 0x1a, 0xb2, 0x11, 0x0a, 0x0a, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x53, 0x51, 0x4c, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, + 0x63, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x6d, 0x52, 0x6f, 0x77, 0x73, + 0x43, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x0a, 0x6d, 0x5f, 0x72, 0x6f, 0x77, 0x73, 0x5f, 0x73, 0x75, + 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x6d, 0x52, 0x6f, 0x77, 0x73, 0x53, 0x75, + 0x6d, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x6c, + 0x6b, 0x73, 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x11, 0x6d, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x6c, 0x6b, 0x73, 0x48, 0x69, 0x74, + 0x43, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, + 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x11, 0x6d, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x6c, 0x6b, 0x73, 0x48, + 0x69, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x32, 0x0a, 0x16, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, + 0x64, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x6c, + 0x6b, 0x73, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x16, 0x6d, 0x5f, 0x73, + 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, + 0x73, 0x75, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x12, 0x6d, 0x53, 0x68, 0x61, 0x72, + 0x65, 0x64, 0x42, 0x6c, 0x6b, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x38, 0x0a, + 0x19, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x64, + 0x69, 0x72, 0x74, 0x69, 0x65, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x15, 0x6d, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x6c, 0x6b, 0x73, 0x44, 0x69, 0x72, + 0x74, 0x69, 0x65, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x5f, 0x73, 0x68, 0x61, + 0x72, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x74, 0x69, 0x65, 0x64, + 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x53, 0x68, 0x61, + 0x72, 0x65, 0x64, 0x42, 0x6c, 0x6b, 0x73, 0x44, 0x69, 0x72, 0x74, 0x69, 0x65, 0x64, 0x53, 0x75, + 0x6d, 0x12, 0x38, 0x0a, 0x19, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x6c, + 0x6b, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, 0x6d, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x6c, 0x6b, + 0x73, 0x57, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x43, 0x6e, 0x74, 0x12, 0x38, 0x0a, 0x19, 0x6d, + 0x5f, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x77, 0x72, 0x69, + 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x15, + 0x6d, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x42, 0x6c, 0x6b, 0x73, 0x57, 0x72, 0x69, 0x74, 0x74, + 0x65, 0x6e, 0x53, 0x75, 0x6d, 0x12, 0x2e, 0x0a, 0x14, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x6c, 0x6b, 0x73, 0x48, + 0x69, 0x74, 0x43, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x14, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x6c, 0x6b, 0x73, 0x48, + 0x69, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x6c, 0x6b, 0x73, + 0x52, 0x65, 0x61, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x15, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x75, 0x6d, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x11, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x6c, + 0x6b, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x36, 0x0a, 0x18, 0x6d, 0x5f, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x74, 0x69, 0x65, + 0x64, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x42, 0x6c, 0x6b, 0x73, 0x44, 0x69, 0x72, 0x74, 0x69, 0x65, 0x64, 0x43, 0x6e, + 0x74, 0x12, 0x36, 0x0a, 0x18, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6b, + 0x73, 0x5f, 0x64, 0x69, 0x72, 0x74, 0x69, 0x65, 0x64, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x6c, 0x6b, 0x73, 0x44, + 0x69, 0x72, 0x74, 0x69, 0x65, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x36, 0x0a, 0x18, 0x6d, 0x5f, 0x6c, + 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, + 0x6e, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x42, 0x6c, 0x6b, 0x73, 0x57, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x43, 0x6e, + 0x74, 0x12, 0x36, 0x0a, 0x18, 0x6d, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x5f, 0x62, 0x6c, 0x6b, + 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x14, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x42, 0x6c, 0x6b, 0x73, 0x57, + 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x53, 0x75, 0x6d, 0x12, 0x2e, 0x0a, 0x14, 0x6d, 0x5f, 0x74, + 0x65, 0x6d, 0x70, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x63, 0x6e, + 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x42, 0x6c, + 0x6b, 0x73, 0x52, 0x65, 0x61, 0x64, 0x43, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x14, 0x6d, 0x5f, 0x74, + 0x65, 0x6d, 0x70, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x75, + 0x6d, 0x18, 0x14, 0x20, 0x01, 0x28, 0x02, 0x52, 0x10, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x42, 0x6c, + 0x6b, 0x73, 0x52, 0x65, 0x61, 0x64, 0x53, 0x75, 0x6d, 0x12, 0x34, 0x0a, 0x17, 0x6d, 0x5f, 0x74, + 0x65, 0x6d, 0x70, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, + 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x02, 0x52, 0x13, 0x6d, 0x54, 0x65, 0x6d, + 0x70, 0x42, 0x6c, 0x6b, 0x73, 0x57, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x43, 0x6e, 0x74, 0x12, + 0x34, 0x0a, 0x17, 0x6d, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x62, 0x6c, 0x6b, 0x73, 0x5f, 0x77, + 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x16, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x13, 0x6d, 0x54, 0x65, 0x6d, 0x70, 0x42, 0x6c, 0x6b, 0x73, 0x57, 0x72, 0x69, 0x74, 0x74, + 0x65, 0x6e, 0x53, 0x75, 0x6d, 0x12, 0x2c, 0x0a, 0x13, 0x6d, 0x5f, 0x62, 0x6c, 0x6b, 0x5f, 0x72, + 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x17, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x42, 0x6c, 0x6b, 0x52, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, + 0x43, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x13, 0x6d, 0x5f, 0x62, 0x6c, 0x6b, 0x5f, 0x72, 0x65, 0x61, + 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x18, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x0f, 0x6d, 0x42, 0x6c, 0x6b, 0x52, 0x65, 0x61, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x75, + 0x6d, 0x12, 0x2e, 0x0a, 0x14, 0x6d, 0x5f, 0x62, 0x6c, 0x6b, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x10, 0x6d, 0x42, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x43, 0x6e, + 0x74, 0x12, 0x2e, 0x0a, 0x14, 0x6d, 0x5f, 0x62, 0x6c, 0x6b, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x10, 0x6d, 0x42, 0x6c, 0x6b, 0x57, 0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x75, + 0x6d, 0x12, 0x2c, 0x0a, 0x13, 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, + 0x6d, 0x43, 0x70, 0x75, 0x55, 0x73, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x43, 0x6e, 0x74, 0x12, + 0x2c, 0x0a, 0x13, 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0f, 0x6d, 0x43, + 0x70, 0x75, 0x55, 0x73, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x2a, 0x0a, + 0x12, 0x6d, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x73, 0x79, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x63, 0x6e, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x6d, 0x43, 0x70, 0x75, 0x53, + 0x79, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x43, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x12, 0x6d, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x73, 0x79, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x18, + 0x1e, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x6d, 0x43, 0x70, 0x75, 0x53, 0x79, 0x73, 0x54, 0x69, + 0x6d, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x6d, 0x64, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6d, 0x64, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x29, 0x0a, 0x11, 0x6d, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x5f, 0x63, 0x61, 0x6c, 0x6c, + 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x6d, 0x50, 0x6c, + 0x61, 0x6e, 0x73, 0x43, 0x61, 0x6c, 0x6c, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x29, 0x0a, 0x11, 0x6d, + 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x73, 0x5f, 0x63, 0x61, 0x6c, 0x6c, 0x73, 0x5f, 0x63, 0x6e, 0x74, + 0x18, 0x20, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x6d, 0x50, 0x6c, 0x61, 0x6e, 0x73, 0x43, 0x61, + 0x6c, 0x6c, 0x73, 0x43, 0x6e, 0x74, 0x12, 0x29, 0x0a, 0x11, 0x6d, 0x5f, 0x77, 0x61, 0x6c, 0x5f, + 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x21, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x0e, 0x6d, 0x57, 0x61, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x53, 0x75, + 0x6d, 0x12, 0x29, 0x0a, 0x11, 0x6d, 0x5f, 0x77, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x6d, 0x57, + 0x61, 0x6c, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x43, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0d, + 0x6d, 0x5f, 0x77, 0x61, 0x6c, 0x5f, 0x66, 0x70, 0x69, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x23, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x0a, 0x6d, 0x57, 0x61, 0x6c, 0x46, 0x70, 0x69, 0x53, 0x75, 0x6d, 0x12, + 0x21, 0x0a, 0x0d, 0x6d, 0x5f, 0x77, 0x61, 0x6c, 0x5f, 0x66, 0x70, 0x69, 0x5f, 0x63, 0x6e, 0x74, + 0x18, 0x24, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0a, 0x6d, 0x57, 0x61, 0x6c, 0x46, 0x70, 0x69, 0x43, + 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x77, 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x25, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x57, 0x61, + 0x6c, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x77, + 0x61, 0x6c, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x26, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x57, 0x61, 0x6c, 0x42, 0x79, 0x74, 0x65, 0x73, 0x43, 0x6e, 0x74, + 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, + 0x73, 0x75, 0x6d, 0x18, 0x27, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x50, 0x6c, 0x61, 0x6e, + 0x54, 0x69, 0x6d, 0x65, 0x53, 0x75, 0x6d, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x70, 0x6c, 0x61, + 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x6e, 0x74, 0x18, 0x28, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x0c, 0x6d, 0x50, 0x6c, 0x61, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x43, 0x6e, 0x74, 0x12, 0x25, + 0x0a, 0x0f, 0x6d, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x69, + 0x6e, 0x18, 0x29, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, 0x6d, 0x50, 0x6c, 0x61, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x4d, 0x69, 0x6e, 0x12, 0x25, 0x0a, 0x0f, 0x6d, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0c, + 0x6d, 0x50, 0x6c, 0x61, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x61, 0x78, 0x12, 0x1f, 0x0a, 0x0b, + 0x74, 0x6f, 0x70, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x69, 0x64, 0x18, 0x2c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x51, 0x75, 0x65, 0x72, 0x79, 0x69, 0x64, 0x12, 0x1b, 0x0a, + 0x09, 0x74, 0x6f, 0x70, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x74, 0x6f, 0x70, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x70, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x2d, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x61, 0x6e, 0x69, 0x64, 0x18, + 0x2e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x61, 0x6e, 0x69, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x70, 0x6c, 0x61, 0x6e, 0x18, 0x30, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6c, 0x61, 0x6e, 0x12, 0x3d, 0x0a, 0x0f, + 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x5f, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, + 0x31, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x48, 0x69, + 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x0e, 0x68, 0x69, 0x73, + 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x49, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x43, 0x0a, 0x0d, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x14, 0x0a, 0x05, + 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, + 0x2a, 0x55, 0x0a, 0x0d, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x1e, 0x0a, 0x16, 0x45, 0x58, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x5f, 0x46, 0x4f, 0x52, + 0x4d, 0x41, 0x54, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x1a, 0x02, 0x08, + 0x01, 0x12, 0x0f, 0x0a, 0x07, 0x45, 0x58, 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x10, 0x01, 0x1a, 0x02, + 0x08, 0x01, 0x12, 0x13, 0x0a, 0x0b, 0x46, 0x49, 0x4e, 0x47, 0x45, 0x52, 0x50, 0x52, 0x49, 0x4e, + 0x54, 0x10, 0x02, 0x1a, 0x02, 0x08, 0x01, 0x2a, 0x5d, 0x0a, 0x0b, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x45, 0x58, 0x41, 0x4d, 0x50, 0x4c, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x41, 0x4e, 0x44, 0x4f, 0x4d, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, + 0x53, 0x4c, 0x4f, 0x57, 0x45, 0x53, 0x54, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x41, 0x53, + 0x54, 0x45, 0x53, 0x54, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x45, + 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x42, 0x73, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x42, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x22, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, + 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0xe2, + 0x02, 0x11, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -2818,7 +2836,7 @@ func file_agentpb_collector_proto_rawDescGZIP() []byte { var ( file_agentpb_collector_proto_enumTypes = make([]protoimpl.EnumInfo, 2) - file_agentpb_collector_proto_msgTypes = make([]protoimpl.MessageInfo, 7) + file_agentpb_collector_proto_msgTypes = make([]protoimpl.MessageInfo, 8) file_agentpb_collector_proto_goTypes = []interface{}{ (ExampleFormat)(0), // 0: agent.ExampleFormat (ExampleType)(0), // 1: agent.ExampleType @@ -2828,26 +2846,28 @@ var ( (*MetricsBucket_MySQL)(nil), // 5: agent.MetricsBucket.MySQL (*MetricsBucket_MongoDB)(nil), // 6: agent.MetricsBucket.MongoDB (*MetricsBucket_PostgreSQL)(nil), // 7: agent.MetricsBucket.PostgreSQL - nil, // 8: agent.MetricsBucket.Common.ErrorsEntry - (inventorypb.AgentType)(0), // 9: inventory.AgentType + nil, // 8: agent.MetricsBucket.Common.CommentsEntry + nil, // 9: agent.MetricsBucket.Common.ErrorsEntry + (inventorypb.AgentType)(0), // 10: inventory.AgentType } ) var file_agentpb_collector_proto_depIdxs = []int32{ - 4, // 0: agent.MetricsBucket.common:type_name -> agent.MetricsBucket.Common - 5, // 1: agent.MetricsBucket.mysql:type_name -> agent.MetricsBucket.MySQL - 6, // 2: agent.MetricsBucket.mongodb:type_name -> agent.MetricsBucket.MongoDB - 7, // 3: agent.MetricsBucket.postgresql:type_name -> agent.MetricsBucket.PostgreSQL - 9, // 4: agent.MetricsBucket.Common.agent_type:type_name -> inventory.AgentType - 0, // 5: agent.MetricsBucket.Common.example_format:type_name -> agent.ExampleFormat - 1, // 6: agent.MetricsBucket.Common.example_type:type_name -> agent.ExampleType - 8, // 7: agent.MetricsBucket.Common.errors:type_name -> agent.MetricsBucket.Common.ErrorsEntry - 3, // 8: agent.MetricsBucket.PostgreSQL.histogram_items:type_name -> agent.HistogramItem - 9, // [9:9] is the sub-list for method output_type - 9, // [9:9] is the sub-list for method input_type - 9, // [9:9] is the sub-list for extension type_name - 9, // [9:9] is the sub-list for extension extendee - 0, // [0:9] is the sub-list for field type_name + 4, // 0: agent.MetricsBucket.common:type_name -> agent.MetricsBucket.Common + 5, // 1: agent.MetricsBucket.mysql:type_name -> agent.MetricsBucket.MySQL + 6, // 2: agent.MetricsBucket.mongodb:type_name -> agent.MetricsBucket.MongoDB + 7, // 3: agent.MetricsBucket.postgresql:type_name -> agent.MetricsBucket.PostgreSQL + 8, // 4: agent.MetricsBucket.Common.comments:type_name -> agent.MetricsBucket.Common.CommentsEntry + 10, // 5: agent.MetricsBucket.Common.agent_type:type_name -> inventory.AgentType + 0, // 6: agent.MetricsBucket.Common.example_format:type_name -> agent.ExampleFormat + 1, // 7: agent.MetricsBucket.Common.example_type:type_name -> agent.ExampleType + 9, // 8: agent.MetricsBucket.Common.errors:type_name -> agent.MetricsBucket.Common.ErrorsEntry + 3, // 9: agent.MetricsBucket.PostgreSQL.histogram_items:type_name -> agent.HistogramItem + 10, // [10:10] is the sub-list for method output_type + 10, // [10:10] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_agentpb_collector_proto_init() } @@ -2935,7 +2955,7 @@ func file_agentpb_collector_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_agentpb_collector_proto_rawDesc, NumEnums: 2, - NumMessages: 7, + NumMessages: 8, NumExtensions: 0, NumServices: 0, }, diff --git a/api/agentpb/collector.pb.validate.go b/api/agentpb/collector.pb.validate.go index 85c9229e7a..c7d33c5c44 100644 --- a/api/agentpb/collector.pb.validate.go +++ b/api/agentpb/collector.pb.validate.go @@ -387,6 +387,8 @@ func (m *MetricsBucket_Common) validate(all bool) error { // no validation rules for PlaceholdersCount + // no validation rules for Comments + // no validation rules for Fingerprint // no validation rules for Database diff --git a/api/agentpb/collector.proto b/api/agentpb/collector.proto index 77b2590595..49803abcbc 100644 --- a/api/agentpb/collector.proto +++ b/api/agentpb/collector.proto @@ -35,6 +35,8 @@ message MetricsBucket { string explain_fingerprint = 25; // ammount of variables in query. uint32 placeholders_count = 26; + // List of keys and values of comments. + map comments = 27; // digest_text - query signature. Query without values. string fingerprint = 2; // diff --git a/api/inventorypb/agent_status.pb.go b/api/inventorypb/agent_status.pb.go index fd02b8475b..58238ccfd7 100644 --- a/api/inventorypb/agent_status.pb.go +++ b/api/inventorypb/agent_status.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: inventorypb/agent_status.proto diff --git a/api/inventorypb/agents.go b/api/inventorypb/agents.go index fc3258194e..7d1f103dbb 100644 --- a/api/inventorypb/agents.go +++ b/api/inventorypb/agents.go @@ -22,7 +22,7 @@ type Agent interface { sealedAgent() } -// in order of AgentType enum +// Ordered the same as AgentType enum func (*PMMAgent) sealedAgent() {} func (*VMAgent) sealedAgent() {} diff --git a/api/inventorypb/agents.pb.go b/api/inventorypb/agents.pb.go index 1655706949..50afddd4c8 100644 --- a/api/inventorypb/agents.pb.go +++ b/api/inventorypb/agents.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: inventorypb/agents.proto @@ -1180,6 +1180,8 @@ type QANMySQLPerfSchemaAgent struct { TlsCert string `protobuf:"bytes,12,opt,name=tls_cert,json=tlsCert,proto3" json:"tls_cert,omitempty"` // Password for decrypting tls_cert. TlsKey string `protobuf:"bytes,13,opt,name=tls_key,json=tlsKey,proto3" json:"tls_key,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `protobuf:"varint,18,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `protobuf:"varint,16,opt,name=max_query_length,json=maxQueryLength,proto3" json:"max_query_length,omitempty"` // True if query examples are disabled. @@ -1296,6 +1298,13 @@ func (x *QANMySQLPerfSchemaAgent) GetTlsKey() string { return "" } +func (x *QANMySQLPerfSchemaAgent) GetDisableCommentsParsing() bool { + if x != nil { + return x.DisableCommentsParsing + } + return false +} + func (x *QANMySQLPerfSchemaAgent) GetMaxQueryLength() int32 { if x != nil { return x.MaxQueryLength @@ -1364,6 +1373,8 @@ type QANMySQLSlowlogAgent struct { TlsCert string `protobuf:"bytes,13,opt,name=tls_cert,json=tlsCert,proto3" json:"tls_cert,omitempty"` // Password for decrypting tls_cert. TlsKey string `protobuf:"bytes,14,opt,name=tls_key,json=tlsKey,proto3" json:"tls_key,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `protobuf:"varint,18,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` // Limit query length in QAN (default: server-defined; -1: no limit) MaxQueryLength int32 `protobuf:"varint,17,opt,name=max_query_length,json=maxQueryLength,proto3" json:"max_query_length,omitempty"` // True if query examples are disabled. @@ -1482,6 +1493,13 @@ func (x *QANMySQLSlowlogAgent) GetTlsKey() string { return "" } +func (x *QANMySQLSlowlogAgent) GetDisableCommentsParsing() bool { + if x != nil { + return x.DisableCommentsParsing + } + return false +} + func (x *QANMySQLSlowlogAgent) GetMaxQueryLength() int32 { if x != nil { return x.MaxQueryLength @@ -1695,6 +1713,8 @@ type QANPostgreSQLPgStatementsAgent struct { ServiceId string `protobuf:"bytes,4,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"` // PostgreSQL username for getting pg stat statements data. Username string `protobuf:"bytes,5,opt,name=username,proto3" json:"username,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `protobuf:"varint,13,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `protobuf:"varint,12,opt,name=max_query_length,json=maxQueryLength,proto3" json:"max_query_length,omitempty"` // Use TLS for database connections. @@ -1778,6 +1798,13 @@ func (x *QANPostgreSQLPgStatementsAgent) GetUsername() string { return "" } +func (x *QANPostgreSQLPgStatementsAgent) GetDisableCommentsParsing() bool { + if x != nil { + return x.DisableCommentsParsing + } + return false +} + func (x *QANPostgreSQLPgStatementsAgent) GetMaxQueryLength() int32 { if x != nil { return x.MaxQueryLength @@ -1847,6 +1874,8 @@ type QANPostgreSQLPgStatMonitorAgent struct { Tls bool `protobuf:"varint,6,opt,name=tls,proto3" json:"tls,omitempty"` // Skip TLS certificate and hostname validation. TlsSkipVerify bool `protobuf:"varint,7,opt,name=tls_skip_verify,json=tlsSkipVerify,proto3" json:"tls_skip_verify,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `protobuf:"varint,14,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `protobuf:"varint,13,opt,name=max_query_length,json=maxQueryLength,proto3" json:"max_query_length,omitempty"` // True if query examples are disabled. @@ -1942,6 +1971,13 @@ func (x *QANPostgreSQLPgStatMonitorAgent) GetTlsSkipVerify() bool { return false } +func (x *QANPostgreSQLPgStatMonitorAgent) GetDisableCommentsParsing() bool { + if x != nil { + return x.DisableCommentsParsing + } + return false +} + func (x *QANPostgreSQLPgStatMonitorAgent) GetMaxQueryLength() int32 { if x != nil { return x.MaxQueryLength @@ -4875,6 +4911,8 @@ type AddQANMySQLPerfSchemaAgentRequest struct { CustomLabels map[string]string `protobuf:"bytes,8,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Skip connection check. SkipConnectionCheck bool `protobuf:"varint,9,opt,name=skip_connection_check,json=skipConnectionCheck,proto3" json:"skip_connection_check,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `protobuf:"varint,15,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` // Log level for exporter. LogLevel LogLevel `protobuf:"varint,13,opt,name=log_level,json=logLevel,proto3,enum=inventory.LogLevel" json:"log_level,omitempty"` } @@ -5002,6 +5040,13 @@ func (x *AddQANMySQLPerfSchemaAgentRequest) GetSkipConnectionCheck() bool { return false } +func (x *AddQANMySQLPerfSchemaAgentRequest) GetDisableCommentsParsing() bool { + if x != nil { + return x.DisableCommentsParsing + } + return false +} + func (x *AddQANMySQLPerfSchemaAgentRequest) GetLogLevel() LogLevel { if x != nil { return x.LogLevel @@ -5192,6 +5237,8 @@ type AddQANMySQLSlowlogAgentRequest struct { CustomLabels map[string]string `protobuf:"bytes,9,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Skip connection check. SkipConnectionCheck bool `protobuf:"varint,10,opt,name=skip_connection_check,json=skipConnectionCheck,proto3" json:"skip_connection_check,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `protobuf:"varint,16,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` // Log level for exporter. LogLevel LogLevel `protobuf:"varint,14,opt,name=log_level,json=logLevel,proto3,enum=inventory.LogLevel" json:"log_level,omitempty"` } @@ -5326,6 +5373,13 @@ func (x *AddQANMySQLSlowlogAgentRequest) GetSkipConnectionCheck() bool { return false } +func (x *AddQANMySQLSlowlogAgentRequest) GetDisableCommentsParsing() bool { + if x != nil { + return x.DisableCommentsParsing + } + return false +} + func (x *AddQANMySQLSlowlogAgentRequest) GetLogLevel() LogLevel { if x != nil { return x.LogLevel @@ -5828,6 +5882,8 @@ type AddQANPostgreSQLPgStatementsAgentRequest struct { CustomLabels map[string]string `protobuf:"bytes,7,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Skip connection check. SkipConnectionCheck bool `protobuf:"varint,8,opt,name=skip_connection_check,json=skipConnectionCheck,proto3" json:"skip_connection_check,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `protobuf:"varint,14,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `protobuf:"varint,13,opt,name=max_query_length,json=maxQueryLength,proto3" json:"max_query_length,omitempty"` // TLS CA certificate. @@ -5928,6 +5984,13 @@ func (x *AddQANPostgreSQLPgStatementsAgentRequest) GetSkipConnectionCheck() bool return false } +func (x *AddQANPostgreSQLPgStatementsAgentRequest) GetDisableCommentsParsing() bool { + if x != nil { + return x.DisableCommentsParsing + } + return false +} + func (x *AddQANPostgreSQLPgStatementsAgentRequest) GetMaxQueryLength() int32 { if x != nil { return x.MaxQueryLength @@ -6137,6 +6200,8 @@ type AddQANPostgreSQLPgStatMonitorAgentRequest struct { CustomLabels map[string]string `protobuf:"bytes,8,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Skip connection check. SkipConnectionCheck bool `protobuf:"varint,9,opt,name=skip_connection_check,json=skipConnectionCheck,proto3" json:"skip_connection_check,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `protobuf:"varint,15,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` // TLS CA certificate. TlsCa string `protobuf:"bytes,10,opt,name=tls_ca,json=tlsCa,proto3" json:"tls_ca,omitempty"` // TLS Certifcate. @@ -6249,6 +6314,13 @@ func (x *AddQANPostgreSQLPgStatMonitorAgentRequest) GetSkipConnectionCheck() boo return false } +func (x *AddQANPostgreSQLPgStatMonitorAgentRequest) GetDisableCommentsParsing() bool { + if x != nil { + return x.DisableCommentsParsing + } + return false +} + func (x *AddQANPostgreSQLPgStatMonitorAgentRequest) GetTlsCa() string { if x != nil { return x.TlsCa @@ -7625,7 +7697,7 @@ var file_inventorypb_agents_proto_rawDesc = []byte{ 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbe, 0x05, 0x0a, 0x17, 0x51, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xf8, 0x05, 0x0a, 0x17, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, @@ -7645,79 +7717,163 @@ var file_inventorypb_agents_proto_rawDesc = []byte{ 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, - 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x12, 0x59, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, + 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x71, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x59, 0x0a, 0x0d, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, + 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa5, 0x06, 0x0a, 0x14, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, + 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, + 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, + 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, + 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, + 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, + 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, + 0x69, 0x6e, 0x67, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, + 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, + 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x46, 0x69, + 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, + 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, + 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, + 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, + 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbb, 0x04, + 0x0a, 0x17, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, + 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x12, 0x59, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, - 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, - 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xeb, 0x05, 0x0a, 0x14, - 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, - 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, - 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, - 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, - 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, - 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x71, 0x75, 0x65, 0x72, 0x79, 0x45, - 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x31, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x66, - 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, - 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x56, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, - 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, - 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, - 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbb, 0x04, 0x0a, 0x17, 0x51, 0x41, - 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x83, 0x05, 0x0a, 0x1e, + 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, + 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, + 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, + 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x12, 0x60, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, + 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, + 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, + 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, + 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xbd, 0x05, 0x0a, 0x1f, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, @@ -7731,698 +7887,689 @@ var file_inventorypb_agents_proto_rawDesc = []byte{ 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, - 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x59, 0x0a, - 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x69, 0x66, 0x79, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, + 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, + 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x36, 0x0a, 0x17, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x71, 0x75, 0x65, 0x72, 0x79, 0x45, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x61, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, + 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, + 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, + 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x88, 0x05, 0x0a, 0x0b, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, + 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, + 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, + 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x4d, 0x0a, 0x0d, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x44, 0x53, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, - 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, - 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x04, 0x0a, 0x1e, 0x51, 0x41, 0x4e, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, - 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, - 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x12, 0x60, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, - 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x83, 0x05, 0x0a, 0x1f, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, - 0x6c, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, - 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, - 0x36, 0x0a, 0x17, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x15, 0x71, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x61, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, - 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, - 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, - 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x62, 0x61, 0x73, + 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x62, 0x61, 0x73, 0x69, 0x63, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x3a, 0x0a, 0x19, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x17, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x70, + 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, + 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfa, 0x03, 0x0a, + 0x10, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0f, + 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, 0x4e, 0x6f, 0x64, + 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, + 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, + 0x68, 0x65, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, + 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x52, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x75, + 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, + 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x88, 0x05, 0x0a, 0x0b, 0x52, 0x44, - 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0e, 0x61, - 0x77, 0x73, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, - 0x79, 0x12, 0x4d, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x34, 0x0a, 0x16, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x14, 0x62, 0x61, 0x73, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x65, 0x6e, 0x68, 0x61, 0x6e, - 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x65, 0x6e, 0x68, 0x61, - 0x6e, 0x63, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, - 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x8a, 0x05, 0x0a, 0x15, 0x41, 0x7a, + 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, + 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, + 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x43, 0x0a, 0x1e, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x61, + 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x53, 0x75, 0x62, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x1c, 0x61, 0x7a, + 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x19, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x57, 0x0a, 0x0d, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, + 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, + 0x6f, 0x72, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfb, 0x02, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x59, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, + 0x30, 0x0a, 0x14, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, + 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, + 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfa, 0x03, 0x0a, 0x10, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x25, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, - 0x75, 0x6e, 0x73, 0x4f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x50, 0x61, 0x74, 0x68, 0x12, 0x52, 0x0a, - 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x12, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, - 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, - 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x8a, 0x05, 0x0a, 0x15, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, - 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x43, 0x0a, - 0x1e, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, - 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x1c, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x57, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, - 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x30, 0x0a, - 0x14, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x70, 0x75, 0x73, - 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x30, 0x0a, 0x09, 0x6c, - 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, - 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfb, - 0x02, 0x0a, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x59, 0x0a, 0x0d, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x72, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x5f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, 0x75, - 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x64, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa2, 0x01, 0x0a, - 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x0a, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x14, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x22, 0xba, 0x09, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x08, 0x76, 0x6d, - 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x56, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x07, 0x76, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x42, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x10, 0x6d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x12, 0x48, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x11, - 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5f, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, - 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, - 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, - 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x56, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, - 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, - 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, - 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, - 0x5f, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x12, 0x74, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, - 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x77, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, - 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, - 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1f, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa2, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, + 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, + 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, + 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x0a, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x22, 0xba, 0x09, 0x0a, 0x12, 0x4c, 0x69, + 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x30, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x12, 0x2d, 0x0a, 0x08, 0x76, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x56, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x76, 0x6d, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x12, 0x3c, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x42, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x11, 0x70, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5f, + 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, + 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, + 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, + 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, + 0x56, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, + 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, + 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x5f, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, + 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, + 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x74, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, + 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, - 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, - 0x39, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x72, - 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x11, 0x65, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x58, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x35, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xde, 0x09, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x09, 0x70, 0x6d, - 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x2e, - 0x0a, 0x07, 0x76, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x56, 0x4d, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x76, 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x3e, - 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, - 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x44, - 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, - 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x11, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x61, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, - 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, - 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x58, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, - 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, - 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, - 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x61, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, - 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x76, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x71, - 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, - 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, - 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, - 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, - 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x12, 0x5a, 0x0a, 0x17, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, - 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, - 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, - 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x4f, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, - 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0x6a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, - 0x6f, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x1c, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x18, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0xdb, 0x01, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x0f, 0x72, 0x75, - 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x72, 0x75, - 0x6e, 0x73, 0x4f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x54, 0x0a, 0x0d, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, - 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x47, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xe2, 0x02, 0x0a, 0x16, 0x41, - 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x77, + 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, + 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x12, 0x48, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x58, 0x0a, 0x17, + 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, + 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x35, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x58, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, - 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, - 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x09, - 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x57, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x7b, 0x0a, 0x19, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xde, 0x09, + 0x0a, 0x10, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x32, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x08, 0x70, 0x6d, + 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x07, 0x76, 0x6d, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x56, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x07, 0x76, + 0x6d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, + 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x10, + 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, + 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x12, 0x4a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x61, 0x0a, + 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, + 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, + 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x58, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, + 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, + 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, + 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x61, 0x0a, 0x1a, 0x71, 0x61, + 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x76, 0x0a, + 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, + 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, + 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x79, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, + 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, + 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x12, 0x3b, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, + 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4a, 0x0a, + 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x10, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x5a, 0x0a, 0x17, 0x61, 0x7a, 0x75, + 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x15, + 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x4f, + 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x5a, 0x0a, 0x1a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x22, 0xf0, 0x05, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, - 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, - 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, - 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, - 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, - 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, - 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x74, 0x61, 0x62, 0x6c, 0x65, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, - 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, - 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x80, 0x01, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7d, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x62, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, - 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, - 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0xbc, 0x07, 0x0a, 0x19, 0x41, - 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, - 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, - 0x13, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, - 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, - 0x21, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, - 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, - 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, - 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x5b, - 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, - 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, - 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, - 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2b, 0x0a, 0x11, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x12, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, - 0x76, 0x65, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, - 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, + 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, + 0x6a, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x1c, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x18, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x6f, + 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xdb, 0x01, 0x0a, 0x12, + 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, 0x4e, 0x6f, 0x64, 0x65, + 0x49, 0x64, 0x12, 0x54, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x63, 0x0a, 0x1a, 0x41, 0x64, 0x64, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, - 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, - 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0f, 0x6d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x7e, - 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x47, 0x0a, 0x13, 0x41, 0x64, 0x64, + 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x30, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x22, 0xe2, 0x02, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, + 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, + 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x58, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x33, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, + 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, + 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x57, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4e, 0x6f, + 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x22, 0x7b, 0x0a, 0x19, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, + 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x5a, 0x0a, + 0x1a, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0d, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0c, 0x6e, 0x6f, 0x64, + 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0xf0, 0x05, 0x0a, 0x18, 0x41, 0x64, + 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, + 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, + 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, + 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, + 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, + 0x3f, 0x0a, 0x1c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, + 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, + 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, + 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x80, 0x01, 0x0a, + 0x19, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0e, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x1f, + 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x7d, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x66, - 0x0a, 0x1d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x62, + 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, + 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x22, 0xbc, 0x07, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, + 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, + 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, + 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x5b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, + 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x18, 0x0d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, + 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, + 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x25, 0x0a, + 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x10, 0x73, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x30, + 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, + 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, + 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x63, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0xb3, 0x05, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, - 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, - 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, - 0x69, 0x66, 0x79, 0x12, 0x5c, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, - 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, - 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, - 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, - 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, - 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x67, 0x0a, 0x1b, - 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x11, 0x70, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x7f, 0x0a, 0x1d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x7e, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x1e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x22, 0xe8, 0x04, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, - 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x66, 0x0a, 0x1d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x10, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0f, 0x6d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0xb3, + 0x05, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, + 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, + 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, + 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, + 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, + 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, + 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x5c, 0x0a, 0x0d, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, + 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, + 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, + 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, + 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, + 0x72, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, + 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x67, 0x0a, 0x1b, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x7f, 0x0a, + 0x1d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, + 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x6a, + 0x0a, 0x1e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x48, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0xe8, 0x04, 0x0a, 0x1a, 0x41, + 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, + 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, + 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x5c, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, + 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, + 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, + 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x67, 0x0a, 0x1b, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x7f, + 0x0a, 0x1d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, + 0x6a, 0x0a, 0x1e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x48, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, + 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0xe2, 0x05, 0x0a, 0x21, + 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, @@ -8436,240 +8583,204 @@ var file_inventorypb_agents_proto_rawDesc = []byte{ 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, - 0x5c, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, + 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, + 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, + 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, + 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, + 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x63, 0x0a, 0x0d, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, + 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, + 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, + 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, + 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, + 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, + 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, + 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x85, 0x01, 0x0a, 0x22, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, + 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x86, 0x01, 0x0a, 0x24, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x22, 0x88, 0x01, 0x0a, 0x25, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, + 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x1a, 0x71, + 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, + 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, + 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, + 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x8f, 0x06, 0x0a, + 0x1e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, + 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, + 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, + 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, + 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, + 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, + 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, 0x77, + 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x60, 0x0a, 0x0d, 0x63, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, + 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, + 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, + 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, - 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x75, 0x73, 0x68, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, - 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, - 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, - 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x67, 0x0a, - 0x1b, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x11, - 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x7f, 0x0a, 0x1d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, - 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, - 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x6a, 0x0a, 0x1e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x11, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x52, 0x10, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x22, 0xa8, 0x05, 0x0a, 0x21, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, - 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, - 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, - 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, - 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, - 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, - 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, - 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, - 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, - 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, - 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x73, 0x12, 0x63, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x30, 0x0a, 0x09, 0x6c, - 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, + 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x09, 0x6c, + 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x85, - 0x01, 0x0a, 0x22, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, - 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, - 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, - 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x86, 0x01, 0x0a, 0x24, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x79, + 0x0a, 0x1f, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, + 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x56, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, + 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, + 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, + 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x83, 0x01, 0x0a, 0x21, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, + 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, - 0x88, 0x01, 0x0a, 0x25, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x1a, 0x71, 0x61, 0x6e, - 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xd5, 0x05, 0x0a, 0x1e, 0x41, - 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, - 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, - 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, - 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, - 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, - 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, - 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, - 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, - 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, - 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, - 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, - 0x67, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x60, 0x0a, 0x0d, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, - 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, - 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, - 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, - 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x79, 0x0a, 0x1f, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, + 0x7c, 0x0a, 0x22, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x17, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, - 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x83, 0x01, - 0x0a, 0x21, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, - 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x22, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x17, 0x71, 0x61, 0x6e, - 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, - 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x14, 0x71, 0x61, 0x6e, - 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x22, 0xa3, 0x06, 0x0a, 0x21, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, - 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, - 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, - 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, - 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, - 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, - 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, - 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, - 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x28, 0x0a, - 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x63, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, - 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, - 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, - 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, - 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, - 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x85, 0x01, 0x0a, 0x22, 0x41, 0x64, 0x64, 0x51, + 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xa3, 0x06, + 0x0a, 0x21, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, + 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, + 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x48, 0x0a, 0x21, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x1d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, + 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, + 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, + 0x67, 0x74, 0x68, 0x12, 0x63, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, + 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x39, 0x0a, 0x18, + 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, + 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, + 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, + 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x85, 0x01, 0x0a, 0x22, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x1a, 0x71, 0x61, + 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x86, 0x01, 0x0a, 0x24, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, + 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x88, 0x01, 0x0a, 0x25, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x70, 0x72, @@ -8678,125 +8789,115 @@ var file_inventorypb_agents_proto_rawDesc = []byte{ 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, - 0x86, 0x01, 0x0a, 0x24, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0x88, 0x01, 0x0a, 0x25, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x5f, 0x0a, 0x1a, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x17, 0x71, 0x61, 0x6e, 0x4d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x22, 0x80, 0x05, 0x0a, 0x28, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, + 0xba, 0x05, 0x0a, 0x28, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0c, + 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, + 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, + 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, + 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x6a, 0x0a, 0x0d, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x45, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, + 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, + 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, + 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, + 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x15, + 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, + 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, + 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, + 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x01, 0x0a, + 0x29, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, + 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x21, 0x71, 0x61, + 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, + 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, + 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x22, 0x8d, 0x01, 0x0a, 0x2b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, - 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, - 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x6a, - 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x28, - 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, - 0x63, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, - 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, - 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, - 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x01, 0x0a, 0x29, 0x41, 0x64, 0x64, 0x51, 0x41, - 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x2b, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, - 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x22, 0xa4, 0x01, 0x0a, 0x2c, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x21, 0x71, - 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, - 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, - 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x22, 0xb8, 0x05, 0x0a, 0x29, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, - 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, - 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, - 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x28, 0x0a, - 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, - 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x6b, 0x0a, - 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, - 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x15, + 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x07, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x22, 0xa4, 0x01, 0x0a, 0x2c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x74, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x22, 0xf2, 0x05, 0x0a, 0x29, 0x41, 0x64, 0x64, 0x51, + 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, + 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, + 0x02, 0x10, 0x01, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, + 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, + 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, + 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, + 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x73, 0x12, 0x6b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0c, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, diff --git a/api/inventorypb/agents.pb.validate.go b/api/inventorypb/agents.pb.validate.go index 53f4ef1faa..a451c1e5f6 100644 --- a/api/inventorypb/agents.pb.validate.go +++ b/api/inventorypb/agents.pb.validate.go @@ -929,6 +929,8 @@ func (m *QANMySQLPerfSchemaAgent) validate(all bool) error { // no validation rules for TlsKey + // no validation rules for DisableCommentsParsing + // no validation rules for MaxQueryLength // no validation rules for QueryExamplesDisabled @@ -1063,6 +1065,8 @@ func (m *QANMySQLSlowlogAgent) validate(all bool) error { // no validation rules for TlsKey + // no validation rules for DisableCommentsParsing + // no validation rules for MaxQueryLength // no validation rules for QueryExamplesDisabled @@ -1315,6 +1319,8 @@ func (m *QANPostgreSQLPgStatementsAgent) validate(all bool) error { // no validation rules for Username + // no validation rules for DisableCommentsParsing + // no validation rules for MaxQueryLength // no validation rules for Tls @@ -1446,6 +1452,8 @@ func (m *QANPostgreSQLPgStatMonitorAgent) validate(all bool) error { // no validation rules for TlsSkipVerify + // no validation rules for DisableCommentsParsing + // no validation rules for MaxQueryLength // no validation rules for QueryExamplesDisabled @@ -6892,6 +6900,8 @@ func (m *AddQANMySQLPerfSchemaAgentRequest) validate(all bool) error { // no validation rules for SkipConnectionCheck + // no validation rules for DisableCommentsParsing + // no validation rules for LogLevel if len(errors) > 0 { @@ -7466,6 +7476,8 @@ func (m *AddQANMySQLSlowlogAgentRequest) validate(all bool) error { // no validation rules for SkipConnectionCheck + // no validation rules for DisableCommentsParsing + // no validation rules for LogLevel if len(errors) > 0 { @@ -8593,6 +8605,8 @@ func (m *AddQANPostgreSQLPgStatementsAgentRequest) validate(all bool) error { // no validation rules for SkipConnectionCheck + // no validation rules for DisableCommentsParsing + // no validation rules for MaxQueryLength // no validation rules for TlsCa @@ -9173,6 +9187,8 @@ func (m *AddQANPostgreSQLPgStatMonitorAgentRequest) validate(all bool) error { // no validation rules for SkipConnectionCheck + // no validation rules for DisableCommentsParsing + // no validation rules for TlsCa // no validation rules for TlsCert diff --git a/api/inventorypb/agents.proto b/api/inventorypb/agents.proto index 134a50c964..683ee9e1de 100644 --- a/api/inventorypb/agents.proto +++ b/api/inventorypb/agents.proto @@ -277,6 +277,8 @@ message QANMySQLPerfSchemaAgent { string tls_cert = 12; // Password for decrypting tls_cert. string tls_key = 13; + // Disable parsing comments from queries and showing them in QAN. + bool disable_comments_parsing = 18; // Limit query length in QAN (default: server-defined; -1: no limit). int32 max_query_length = 16; // True if query examples are disabled. @@ -317,6 +319,8 @@ message QANMySQLSlowlogAgent { string tls_cert = 13; // Password for decrypting tls_cert. string tls_key = 14; + // Disable parsing comments from queries and showing them in QAN. + bool disable_comments_parsing = 18; // Limit query length in QAN (default: server-defined; -1: no limit) int32 max_query_length = 17; // True if query examples are disabled. @@ -384,6 +388,8 @@ message QANPostgreSQLPgStatementsAgent { string service_id = 4; // PostgreSQL username for getting pg stat statements data. string username = 5; + // Disable parsing comments from queries and showing them in QAN. + bool disable_comments_parsing = 13; // Limit query length in QAN (default: server-defined; -1: no limit). int32 max_query_length = 12; // Use TLS for database connections. @@ -420,6 +426,8 @@ message QANPostgreSQLPgStatMonitorAgent { bool tls = 6; // Skip TLS certificate and hostname validation. bool tls_skip_verify = 7; + // Disable parsing comments from queries and showing them in QAN. + bool disable_comments_parsing = 14; // Limit query length in QAN (default: server-defined; -1: no limit). int32 max_query_length = 13; // True if query examples are disabled. @@ -905,6 +913,8 @@ message AddQANMySQLPerfSchemaAgentRequest { map custom_labels = 8; // Skip connection check. bool skip_connection_check = 9; + // Disable parsing comments from queries and showing them in QAN. + bool disable_comments_parsing = 15; // Log level for exporter. LogLevel log_level = 13; } @@ -954,6 +964,8 @@ message AddQANMySQLSlowlogAgentRequest { map custom_labels = 9; // Skip connection check. bool skip_connection_check = 10; + // Disable parsing comments from queries and showing them in QAN. + bool disable_comments_parsing = 16; // Log level for exporter. LogLevel log_level = 14; } @@ -1040,6 +1052,8 @@ message AddQANPostgreSQLPgStatementsAgentRequest { map custom_labels = 7; // Skip connection check. bool skip_connection_check = 8; + // Disable parsing comments from queries and showing them in QAN. + bool disable_comments_parsing = 14; // Limit query length in QAN (default: server-defined; -1: no limit). int32 max_query_length = 13; // TLS CA certificate. @@ -1088,6 +1102,8 @@ message AddQANPostgreSQLPgStatMonitorAgentRequest { map custom_labels = 8; // Skip connection check. bool skip_connection_check = 9; + // Disable parsing comments from queries and showing them in QAN. + bool disable_comments_parsing = 15; // TLS CA certificate. string tls_ca = 10; // TLS Certifcate. diff --git a/api/inventorypb/json/client/agents/add_qan_my_sql_perf_schema_agent_responses.go b/api/inventorypb/json/client/agents/add_qan_my_sql_perf_schema_agent_responses.go index 24d2f077c3..616f0634cc 100644 --- a/api/inventorypb/json/client/agents/add_qan_my_sql_perf_schema_agent_responses.go +++ b/api/inventorypb/json/client/agents/add_qan_my_sql_perf_schema_agent_responses.go @@ -164,6 +164,9 @@ type AddQANMySQLPerfSchemaAgentBody struct { // Skip connection check. SkipConnectionCheck bool `json:"skip_connection_check,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Log level for exporters // Enum: [auto fatal error warn info debug] LogLevel *string `json:"log_level,omitempty"` @@ -525,6 +528,9 @@ type AddQANMySQLPerfSchemaAgentOKBodyQANMysqlPerfschemaAgent struct { // Password for decrypting tls_cert. TLSKey string `json:"tls_key,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` diff --git a/api/inventorypb/json/client/agents/add_qan_my_sql_slowlog_agent_responses.go b/api/inventorypb/json/client/agents/add_qan_my_sql_slowlog_agent_responses.go index 149ac0af4f..fa9cbc2800 100644 --- a/api/inventorypb/json/client/agents/add_qan_my_sql_slowlog_agent_responses.go +++ b/api/inventorypb/json/client/agents/add_qan_my_sql_slowlog_agent_responses.go @@ -168,6 +168,9 @@ type AddQANMySQLSlowlogAgentBody struct { // Skip connection check. SkipConnectionCheck bool `json:"skip_connection_check,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Log level for exporters // Enum: [auto fatal error warn info debug] LogLevel *string `json:"log_level,omitempty"` @@ -529,6 +532,9 @@ type AddQANMySQLSlowlogAgentOKBodyQANMysqlSlowlogAgent struct { // Password for decrypting tls_cert. TLSKey string `json:"tls_key,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit) MaxQueryLength int32 `json:"max_query_length,omitempty"` diff --git a/api/inventorypb/json/client/agents/add_qan_postgre_sql_pg_stat_monitor_agent_responses.go b/api/inventorypb/json/client/agents/add_qan_postgre_sql_pg_stat_monitor_agent_responses.go index 21347f98bb..8ccbf4e307 100644 --- a/api/inventorypb/json/client/agents/add_qan_postgre_sql_pg_stat_monitor_agent_responses.go +++ b/api/inventorypb/json/client/agents/add_qan_postgre_sql_pg_stat_monitor_agent_responses.go @@ -155,6 +155,9 @@ type AddQANPostgreSQLPgStatMonitorAgentBody struct { // Skip connection check. SkipConnectionCheck bool `json:"skip_connection_check,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // TLS CA certificate. TLSCa string `json:"tls_ca,omitempty"` @@ -516,6 +519,9 @@ type AddQANPostgreSQLPgStatMonitorAgentOKBodyQANPostgresqlPgstatmonitorAgent str // Skip TLS certificate and hostname validation. TLSSkipVerify bool `json:"tls_skip_verify,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` diff --git a/api/inventorypb/json/client/agents/add_qan_postgre_sql_pg_statements_agent_responses.go b/api/inventorypb/json/client/agents/add_qan_postgre_sql_pg_statements_agent_responses.go index 1becf32d48..6de82d98fe 100644 --- a/api/inventorypb/json/client/agents/add_qan_postgre_sql_pg_statements_agent_responses.go +++ b/api/inventorypb/json/client/agents/add_qan_postgre_sql_pg_statements_agent_responses.go @@ -149,6 +149,9 @@ type AddQANPostgreSQLPgStatementsAgentBody struct { // Skip connection check. SkipConnectionCheck bool `json:"skip_connection_check,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` @@ -507,6 +510,9 @@ type AddQANPostgreSQLPgStatementsAgentOKBodyQANPostgresqlPgstatementsAgent struc // PostgreSQL username for getting pg stat statements data. Username string `json:"username,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` diff --git a/api/inventorypb/json/client/agents/change_qan_my_sql_perf_schema_agent_responses.go b/api/inventorypb/json/client/agents/change_qan_my_sql_perf_schema_agent_responses.go index 7b9db78afd..f4d4b364d0 100644 --- a/api/inventorypb/json/client/agents/change_qan_my_sql_perf_schema_agent_responses.go +++ b/api/inventorypb/json/client/agents/change_qan_my_sql_perf_schema_agent_responses.go @@ -477,6 +477,9 @@ type ChangeQANMySQLPerfSchemaAgentOKBodyQANMysqlPerfschemaAgent struct { // Password for decrypting tls_cert. TLSKey string `json:"tls_key,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` diff --git a/api/inventorypb/json/client/agents/change_qan_my_sql_slowlog_agent_responses.go b/api/inventorypb/json/client/agents/change_qan_my_sql_slowlog_agent_responses.go index 8502354c73..8f33720634 100644 --- a/api/inventorypb/json/client/agents/change_qan_my_sql_slowlog_agent_responses.go +++ b/api/inventorypb/json/client/agents/change_qan_my_sql_slowlog_agent_responses.go @@ -477,6 +477,9 @@ type ChangeQANMySQLSlowlogAgentOKBodyQANMysqlSlowlogAgent struct { // Password for decrypting tls_cert. TLSKey string `json:"tls_key,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit) MaxQueryLength int32 `json:"max_query_length,omitempty"` diff --git a/api/inventorypb/json/client/agents/change_qan_postgre_sql_pg_stat_monitor_agent_responses.go b/api/inventorypb/json/client/agents/change_qan_postgre_sql_pg_stat_monitor_agent_responses.go index 80b54e5e10..5c9f510ed7 100644 --- a/api/inventorypb/json/client/agents/change_qan_postgre_sql_pg_stat_monitor_agent_responses.go +++ b/api/inventorypb/json/client/agents/change_qan_postgre_sql_pg_stat_monitor_agent_responses.go @@ -468,6 +468,9 @@ type ChangeQANPostgreSQLPgStatMonitorAgentOKBodyQANPostgresqlPgstatmonitorAgent // Skip TLS certificate and hostname validation. TLSSkipVerify bool `json:"tls_skip_verify,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` diff --git a/api/inventorypb/json/client/agents/change_qan_postgre_sql_pg_statements_agent_responses.go b/api/inventorypb/json/client/agents/change_qan_postgre_sql_pg_statements_agent_responses.go index 73acb90f3b..23398c5633 100644 --- a/api/inventorypb/json/client/agents/change_qan_postgre_sql_pg_statements_agent_responses.go +++ b/api/inventorypb/json/client/agents/change_qan_postgre_sql_pg_statements_agent_responses.go @@ -462,6 +462,9 @@ type ChangeQANPostgreSQLPgStatementsAgentOKBodyQANPostgresqlPgstatementsAgent st // PostgreSQL username for getting pg stat statements data. Username string `json:"username,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` diff --git a/api/inventorypb/json/client/agents/get_agent_responses.go b/api/inventorypb/json/client/agents/get_agent_responses.go index d3c101c5d3..95d06c09e3 100644 --- a/api/inventorypb/json/client/agents/get_agent_responses.go +++ b/api/inventorypb/json/client/agents/get_agent_responses.go @@ -2651,6 +2651,9 @@ type GetAgentOKBodyQANMysqlPerfschemaAgent struct { // Password for decrypting tls_cert. TLSKey string `json:"tls_key,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` @@ -2868,6 +2871,9 @@ type GetAgentOKBodyQANMysqlSlowlogAgent struct { // Password for decrypting tls_cert. TLSKey string `json:"tls_key,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit) MaxQueryLength int32 `json:"max_query_length,omitempty"` @@ -3073,6 +3079,9 @@ type GetAgentOKBodyQANPostgresqlPgstatementsAgent struct { // PostgreSQL username for getting pg stat statements data. Username string `json:"username,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` @@ -3284,6 +3293,9 @@ type GetAgentOKBodyQANPostgresqlPgstatmonitorAgent struct { // Skip TLS certificate and hostname validation. TLSSkipVerify bool `json:"tls_skip_verify,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` diff --git a/api/inventorypb/json/client/agents/list_agents_responses.go b/api/inventorypb/json/client/agents/list_agents_responses.go index a8775a3cd3..763fecc753 100644 --- a/api/inventorypb/json/client/agents/list_agents_responses.go +++ b/api/inventorypb/json/client/agents/list_agents_responses.go @@ -2892,6 +2892,9 @@ type ListAgentsOKBodyQANMysqlPerfschemaAgentItems0 struct { // Password for decrypting tls_cert. TLSKey string `json:"tls_key,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` @@ -3109,6 +3112,9 @@ type ListAgentsOKBodyQANMysqlSlowlogAgentItems0 struct { // Password for decrypting tls_cert. TLSKey string `json:"tls_key,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit) MaxQueryLength int32 `json:"max_query_length,omitempty"` @@ -3314,6 +3320,9 @@ type ListAgentsOKBodyQANPostgresqlPgstatementsAgentItems0 struct { // PostgreSQL username for getting pg stat statements data. Username string `json:"username,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` @@ -3525,6 +3534,9 @@ type ListAgentsOKBodyQANPostgresqlPgstatmonitorAgentItems0 struct { // Skip TLS certificate and hostname validation. TLSSkipVerify bool `json:"tls_skip_verify,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` diff --git a/api/inventorypb/json/inventorypb.json b/api/inventorypb/json/inventorypb.json index 89cf71e3d0..0ff9724ba6 100644 --- a/api/inventorypb/json/inventorypb.json +++ b/api/inventorypb/json/inventorypb.json @@ -2070,6 +2070,11 @@ }, "x-order": 11 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 13 + }, "disable_query_examples": { "description": "Disable query examples.", "type": "boolean", @@ -2087,7 +2092,7 @@ "info", "debug" ], - "x-order": 13 + "x-order": 14 }, "max_query_length": { "type": "integer", @@ -2170,7 +2175,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -2189,13 +2199,13 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -2205,12 +2215,12 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "service_id": { "description": "Service identifier.", @@ -2230,7 +2240,7 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "tls": { "description": "Use TLS for database connections.", @@ -2326,6 +2336,11 @@ }, "x-order": 12 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 14 + }, "disable_query_examples": { "description": "Disable query examples.", "type": "boolean", @@ -2343,7 +2358,7 @@ "info", "debug" ], - "x-order": 14 + "x-order": 15 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", @@ -2432,7 +2447,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -2451,19 +2471,19 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -2473,12 +2493,12 @@ "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "service_id": { "description": "Service identifier.", @@ -2498,7 +2518,7 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "tls": { "description": "Use TLS for database connections.", @@ -2594,6 +2614,11 @@ }, "x-order": 8 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "disable_query_examples": { "description": "Disable query examples.", "type": "boolean", @@ -2611,7 +2636,7 @@ "info", "debug" ], - "x-order": 13 + "x-order": 14 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", @@ -2647,17 +2672,17 @@ "tls_ca": { "description": "TLS CA certificate.", "type": "string", - "x-order": 10 + "x-order": 11 }, "tls_cert": { "description": "TLS Certifcate.", "type": "string", - "x-order": 11 + "x-order": 12 }, "tls_key": { "description": "TLS Certificate Key.", "type": "string", - "x-order": 12 + "x-order": 13 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", @@ -2694,7 +2719,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -2713,13 +2743,13 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -2729,12 +2759,12 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "service_id": { "description": "Service identifier.", @@ -2754,7 +2784,7 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "tls": { "description": "Use TLS for database connections.", @@ -2835,6 +2865,11 @@ }, "x-order": 6 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 8 + }, "log_level": { "type": "string", "title": "Log level for exporters", @@ -2847,13 +2882,13 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 8 + "x-order": 9 }, "password": { "description": "PostgreSQL password for getting pg stat statements data.", @@ -2883,17 +2918,17 @@ "tls_ca": { "description": "TLS CA certificate.", "type": "string", - "x-order": 9 + "x-order": 10 }, "tls_cert": { "description": "TLS Certifcate.", "type": "string", - "x-order": 10 + "x-order": 11 }, "tls_key": { "description": "TLS Certificate Key.", "type": "string", - "x-order": 11 + "x-order": 12 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", @@ -2930,7 +2965,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -2949,13 +2989,13 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -2965,7 +3005,7 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "service_id": { "description": "Service identifier.", @@ -2985,17 +3025,17 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "username": { "description": "PostgreSQL username for getting pg stat statements data.", @@ -4989,7 +5029,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -5008,13 +5053,13 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -5024,12 +5069,12 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "service_id": { "description": "Service identifier.", @@ -5049,7 +5094,7 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "tls": { "description": "Use TLS for database connections.", @@ -5206,7 +5251,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -5225,19 +5275,19 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -5247,12 +5297,12 @@ "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "service_id": { "description": "Service identifier.", @@ -5272,7 +5322,7 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "tls": { "description": "Use TLS for database connections.", @@ -5429,7 +5479,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -5448,13 +5503,13 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -5464,12 +5519,12 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "service_id": { "description": "Service identifier.", @@ -5489,7 +5544,7 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "tls": { "description": "Use TLS for database connections.", @@ -5631,7 +5686,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -5650,13 +5710,13 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -5666,7 +5726,7 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "service_id": { "description": "Service identifier.", @@ -5686,17 +5746,17 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "username": { "description": "PostgreSQL username for getting pg stat statements data.", @@ -6812,7 +6872,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -6831,13 +6896,13 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -6847,12 +6912,12 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "service_id": { "description": "Service identifier.", @@ -6872,7 +6937,7 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "tls": { "description": "Use TLS for database connections.", @@ -6922,7 +6987,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -6941,19 +7011,19 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -6963,12 +7033,12 @@ "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "service_id": { "description": "Service identifier.", @@ -6988,7 +7058,7 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "tls": { "description": "Use TLS for database connections.", @@ -7038,7 +7108,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -7057,13 +7132,13 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -7073,7 +7148,7 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "service_id": { "description": "Service identifier.", @@ -7093,17 +7168,17 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "username": { "description": "PostgreSQL username for getting pg stat statements data.", @@ -7128,7 +7203,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -7147,13 +7227,13 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -7163,12 +7243,12 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "service_id": { "description": "Service identifier.", @@ -7188,7 +7268,7 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "tls": { "description": "Use TLS for database connections.", @@ -8399,7 +8479,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -8418,13 +8503,13 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -8434,12 +8519,12 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "service_id": { "description": "Service identifier.", @@ -8459,7 +8544,7 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "tls": { "description": "Use TLS for database connections.", @@ -8512,7 +8597,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -8531,19 +8621,19 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -8553,12 +8643,12 @@ "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "service_id": { "description": "Service identifier.", @@ -8578,7 +8668,7 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "tls": { "description": "Use TLS for database connections.", @@ -8631,7 +8721,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -8650,13 +8745,13 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -8666,7 +8761,7 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "service_id": { "description": "Service identifier.", @@ -8686,17 +8781,17 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "username": { "description": "PostgreSQL username for getting pg stat statements data.", @@ -8724,7 +8819,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -8743,13 +8843,13 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -8759,12 +8859,12 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "service_id": { "description": "Service identifier.", @@ -8784,7 +8884,7 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "tls": { "description": "Use TLS for database connections.", diff --git a/api/inventorypb/log_level.pb.go b/api/inventorypb/log_level.pb.go index cf9793cf04..50a79d8c90 100644 --- a/api/inventorypb/log_level.pb.go +++ b/api/inventorypb/log_level.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: inventorypb/log_level.proto diff --git a/api/inventorypb/nodes.go b/api/inventorypb/nodes.go index 25e1f67d56..e92d7876ac 100644 --- a/api/inventorypb/nodes.go +++ b/api/inventorypb/nodes.go @@ -22,7 +22,7 @@ type Node interface { sealedNode() } -// in order of NodeType enum +// Ordered the same as NodeType enum func (*GenericNode) sealedNode() {} func (*ContainerNode) sealedNode() {} diff --git a/api/inventorypb/nodes.pb.go b/api/inventorypb/nodes.pb.go index a22598bf8c..afabb19136 100644 --- a/api/inventorypb/nodes.pb.go +++ b/api/inventorypb/nodes.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: inventorypb/nodes.proto diff --git a/api/inventorypb/services.go b/api/inventorypb/services.go index 8c88df4aae..2c2162b87c 100644 --- a/api/inventorypb/services.go +++ b/api/inventorypb/services.go @@ -22,7 +22,7 @@ type Service interface { sealedService() } -// in order of ServiceType enum +// Ordered the same as ServiceType enum func (*MySQLService) sealedService() {} func (*MongoDBService) sealedService() {} diff --git a/api/inventorypb/services.pb.go b/api/inventorypb/services.pb.go index 02b7183fe2..f187ecaec2 100644 --- a/api/inventorypb/services.pb.go +++ b/api/inventorypb/services.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: inventorypb/services.proto diff --git a/api/managementpb/actions.pb.go b/api/managementpb/actions.pb.go index 9ebcb3c7c4..bbfaffae1a 100644 --- a/api/managementpb/actions.pb.go +++ b/api/managementpb/actions.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/actions.proto diff --git a/api/managementpb/agent/agent.pb.go b/api/managementpb/agent/agent.pb.go index bd9abdc01b..319577f8b5 100644 --- a/api/managementpb/agent/agent.pb.go +++ b/api/managementpb/agent/agent.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/agent/agent.proto @@ -80,6 +80,8 @@ type UniversalAgent struct { PushMetrics bool `protobuf:"varint,24,opt,name=push_metrics,json=pushMetrics,proto3" json:"push_metrics,omitempty"` // True if query examples are disabled. QueryExamplesDisabled bool `protobuf:"varint,25,opt,name=query_examples_disabled,json=queryExamplesDisabled,proto3" json:"query_examples_disabled,omitempty"` + // True if query comments parsing is disabled. + CommentsParsingDisabled bool `protobuf:"varint,39,opt,name=comments_parsing_disabled,json=commentsParsingDisabled,proto3" json:"comments_parsing_disabled,omitempty"` // True if RDS basic metrics are disdabled. RdsBasicMetricsDisabled bool `protobuf:"varint,26,opt,name=rds_basic_metrics_disabled,json=rdsBasicMetricsDisabled,proto3" json:"rds_basic_metrics_disabled,omitempty"` // True if RDS enhanced metrics are disdabled. @@ -317,6 +319,13 @@ func (x *UniversalAgent) GetQueryExamplesDisabled() bool { return false } +func (x *UniversalAgent) GetCommentsParsingDisabled() bool { + if x != nil { + return x.CommentsParsingDisabled + } + return false +} + func (x *UniversalAgent) GetRdsBasicMetricsDisabled() bool { if x != nil { return x.RdsBasicMetricsDisabled @@ -854,7 +863,7 @@ var file_managementpb_agent_agent_proto_rawDesc = []byte{ 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8d, 0x15, 0x0a, 0x0e, 0x55, 0x6e, 0x69, 0x76, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc9, 0x15, 0x0a, 0x0e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x15, 0x69, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, @@ -932,130 +941,134 @@ var file_managementpb_agent_agent_proto_rawDesc = []byte{ 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x71, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x3b, 0x0a, 0x1a, 0x72, 0x64, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1a, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x72, 0x64, 0x73, 0x42, 0x61, 0x73, 0x69, 0x63, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x41, 0x0a, - 0x1d, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x1a, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, - 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x25, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, - 0x6e, 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1f, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x4a, 0x0a, 0x22, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x20, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, - 0x6c, 0x73, 0x18, 0x21, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, - 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, - 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x23, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x09, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x1a, 0x65, 0x0a, 0x0c, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, - 0x5f, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, - 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x23, 0x0a, 0x0e, 0x69, - 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x54, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, - 0x1a, 0xc9, 0x01, 0x0a, 0x0c, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2f, - 0x0a, 0x14, 0x69, 0x73, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x73, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x53, 0x65, 0x74, 0x12, - 0x25, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x1a, 0xbb, 0x03, 0x0a, - 0x0e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x3a, 0x0a, 0x1a, 0x69, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x16, 0x69, 0x73, 0x54, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, 0x12, 0x54, 0x0a, 0x28, 0x69, + 0x12, 0x3a, 0x0a, 0x19, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, + 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x27, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, + 0x73, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x1a, + 0x72, 0x64, 0x73, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x17, 0x72, 0x64, 0x73, 0x42, 0x61, 0x73, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x1d, 0x72, 0x64, 0x73, + 0x5f, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x1a, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0f, + 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x75, 0x6e, 0x73, 0x4f, 0x6e, 0x4e, 0x6f, 0x64, + 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x1e, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x22, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x20, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x21, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, + 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x22, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, + 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x23, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, + 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x25, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x1a, 0x65, 0x0a, 0x0c, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, + 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x23, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x74, 0x6c, + 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x69, 0x73, 0x54, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, 0x1a, 0xc9, 0x01, 0x0a, + 0x0c, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, + 0x09, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2f, 0x0a, 0x14, 0x69, 0x73, + 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x73, + 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x69, 0x73, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x53, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x75, 0x62, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x74, + 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x1a, 0xbb, 0x03, 0x0a, 0x0e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a, 0x1a, 0x69, 0x73, 0x5f, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x22, 0x69, - 0x73, 0x54, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x53, 0x65, - 0x74, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, - 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, - 0x6e, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, - 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, - 0x69, 0x73, 0x6d, 0x12, 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x11, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x6c, 0x6c, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x6a, 0x0a, 0x11, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x15, 0x0a, 0x06, 0x73, 0x73, 0x6c, 0x5f, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x73, 0x73, 0x6c, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x73, 0x6c, 0x5f, 0x63, 0x65, - 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x73, 0x6c, 0x43, 0x65, 0x72, - 0x74, 0x12, 0x23, 0x0a, 0x0e, 0x69, 0x73, 0x5f, 0x73, 0x73, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x5f, - 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x53, 0x73, 0x6c, - 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, - 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, - 0x65, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x61, 0x6c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x32, - 0xb3, 0x01, 0x0a, 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0xa9, 0x01, 0x0a, 0x0a, 0x4c, 0x69, - 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x58, 0x92, 0x41, 0x31, - 0x12, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x22, 0x52, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x42, 0xb0, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0a, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, - 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x3b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x0d, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x0d, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x19, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x3a, - 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x16, 0x69, 0x73, 0x54, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x53, 0x65, 0x74, 0x12, 0x54, 0x0a, 0x28, 0x69, 0x73, 0x5f, 0x74, 0x6c, + 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x5f, + 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x22, 0x69, 0x73, 0x54, 0x6c, 0x73, + 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x46, 0x69, + 0x6c, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x53, 0x65, 0x74, 0x12, 0x15, 0x0a, + 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, + 0x6c, 0x73, 0x43, 0x61, 0x12, 0x39, 0x0a, 0x18, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x63, 0x68, 0x61, 0x6e, 0x69, 0x73, 0x6d, 0x12, + 0x37, 0x0a, 0x17, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x10, 0x73, 0x74, 0x61, 0x74, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x6c, 0x6c, + 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x6c, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x6a, 0x0a, 0x11, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x53, 0x51, 0x4c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x73, + 0x73, 0x6c, 0x5f, 0x63, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x73, 0x6c, + 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x73, 0x6c, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x73, 0x6c, 0x43, 0x65, 0x72, 0x74, 0x12, 0x23, 0x0a, + 0x0e, 0x69, 0x73, 0x5f, 0x73, 0x73, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x69, 0x73, 0x53, 0x73, 0x6c, 0x4b, 0x65, 0x79, 0x53, + 0x65, 0x74, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x4a, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x22, + 0x4a, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x32, 0xb3, 0x01, 0x0a, 0x05, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0xa9, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x58, 0x92, 0x41, 0x31, 0x12, 0x0b, 0x4c, 0x69, + 0x73, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x22, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2f, 0x4c, 0x69, 0x73, + 0x74, 0x42, 0xb0, 0x01, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0a, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x3b, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x0d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x0d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x5c, + 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x19, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x5c, + 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x3a, 0x3a, 0x56, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/managementpb/agent/agent.pb.validate.go b/api/managementpb/agent/agent.pb.validate.go index 4edead30fc..9a136b93e7 100644 --- a/api/managementpb/agent/agent.pb.validate.go +++ b/api/managementpb/agent/agent.pb.validate.go @@ -240,6 +240,8 @@ func (m *UniversalAgent) validate(all bool) error { // no validation rules for QueryExamplesDisabled + // no validation rules for CommentsParsingDisabled + // no validation rules for RdsBasicMetricsDisabled // no validation rules for RdsEnhancedMetricsDisabled diff --git a/api/managementpb/agent/agent.proto b/api/managementpb/agent/agent.proto index 6a9ed9a487..87567a7ae8 100644 --- a/api/managementpb/agent/agent.proto +++ b/api/managementpb/agent/agent.proto @@ -110,6 +110,8 @@ message UniversalAgent { bool push_metrics = 24; // True if query examples are disabled. bool query_examples_disabled = 25; + // True if query comments parsing is disabled. + bool comments_parsing_disabled = 39; // True if RDS basic metrics are disdabled. bool rds_basic_metrics_disabled = 26; // True if RDS enhanced metrics are disdabled. diff --git a/api/managementpb/agent/json/agent.json b/api/managementpb/agent/json/agent.json index 571bb85d47..f4891a00d7 100644 --- a/api/managementpb/agent/json/agent.json +++ b/api/managementpb/agent/json/agent.json @@ -105,6 +105,11 @@ }, "x-order": 5 }, + "comments_parsing_disabled": { + "description": "True if query comments parsing is disabled.", + "type": "boolean", + "x-order": 25 + }, "created_at": { "description": "Creation timestamp.", "type": "string", @@ -145,7 +150,7 @@ "is_connected": { "description": "True if Agent is running and connected to pmm-managed.", "type": "boolean", - "x-order": 37 + "x-order": 38 }, "is_password_set": { "description": "True if password for connecting the agent to the database is set.", @@ -305,65 +310,65 @@ "rds_basic_metrics_disabled": { "description": "True if RDS basic metrics are disdabled.", "type": "boolean", - "x-order": 25 + "x-order": 26 }, "rds_enhanced_metrics_disabled": { "description": "True if RDS enhanced metrics are disdabled.", "type": "boolean", - "x-order": 26 + "x-order": 27 }, "runs_on_node_id": { "description": "Node identifier where this instance runs.", "type": "string", - "x-order": 27 + "x-order": 28 }, "service_id": { "description": "Service identifier.", "type": "string", - "x-order": 28 + "x-order": 29 }, "status": { "description": "Actual Agent status.", "type": "string", - "x-order": 29 + "x-order": 30 }, "table_count": { "description": "Last known table count.", "type": "integer", "format": "int32", - "x-order": 30 + "x-order": 31 }, "table_count_tablestats_group_limit": { "description": "Tablestats group collectors are disabled if there are more than that number of tables.\n0 means tablestats group collectors are always enabled (no limit).\nNegative value means tablestats group collectors are always disabled.", "type": "integer", "format": "int32", - "x-order": 31 + "x-order": 32 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 32 + "x-order": 33 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 33 + "x-order": 34 }, "updated_at": { "description": "Last update timestamp.", "type": "string", "format": "date-time", - "x-order": 35 + "x-order": 36 }, "username": { "description": "HTTP basic auth username for collecting metrics.", "type": "string", - "x-order": 34 + "x-order": 35 }, "version": { "description": "Agent version.", "type": "string", - "x-order": 36 + "x-order": 37 } } }, diff --git a/api/managementpb/agent/json/client/agent/list_agents_responses.go b/api/managementpb/agent/json/client/agent/list_agents_responses.go index a0b2abc3d1..6143803fa9 100644 --- a/api/managementpb/agent/json/client/agent/list_agents_responses.go +++ b/api/managementpb/agent/json/client/agent/list_agents_responses.go @@ -467,6 +467,9 @@ type ListAgentsOKBodyAgentsItems0 struct { // True if query examples are disabled. QueryExamplesDisabled bool `json:"query_examples_disabled,omitempty"` + // True if query comments parsing is disabled. + CommentsParsingDisabled bool `json:"comments_parsing_disabled,omitempty"` + // True if RDS basic metrics are disdabled. RDSBasicMetricsDisabled bool `json:"rds_basic_metrics_disabled,omitempty"` diff --git a/api/managementpb/alerting/alerting.pb.go b/api/managementpb/alerting/alerting.pb.go index 23ee1deb67..7d6f223563 100644 --- a/api/managementpb/alerting/alerting.pb.go +++ b/api/managementpb/alerting/alerting.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/alerting/alerting.proto diff --git a/api/managementpb/alerting/params.pb.go b/api/managementpb/alerting/params.pb.go index 4cfee619df..3d4682a0da 100644 --- a/api/managementpb/alerting/params.pb.go +++ b/api/managementpb/alerting/params.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/alerting/params.proto diff --git a/api/managementpb/annotation.pb.go b/api/managementpb/annotation.pb.go index 3aa235b49b..fa05f9da7c 100644 --- a/api/managementpb/annotation.pb.go +++ b/api/managementpb/annotation.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/annotation.proto diff --git a/api/managementpb/azure/azure.pb.go b/api/managementpb/azure/azure.pb.go index f41581f91f..6bbdd4e895 100644 --- a/api/managementpb/azure/azure.pb.go +++ b/api/managementpb/azure/azure.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/azure/azure.proto diff --git a/api/managementpb/backup/artifacts.pb.go b/api/managementpb/backup/artifacts.pb.go index 8a1619eb59..e45b927427 100644 --- a/api/managementpb/backup/artifacts.pb.go +++ b/api/managementpb/backup/artifacts.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/backup/artifacts.proto diff --git a/api/managementpb/backup/backups.pb.go b/api/managementpb/backup/backups.pb.go index aee644ed82..edeb0ee602 100644 --- a/api/managementpb/backup/backups.pb.go +++ b/api/managementpb/backup/backups.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/backup/backups.proto diff --git a/api/managementpb/backup/common.pb.go b/api/managementpb/backup/common.pb.go index 8af65718a2..ef4b58828d 100644 --- a/api/managementpb/backup/common.pb.go +++ b/api/managementpb/backup/common.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/backup/common.proto diff --git a/api/managementpb/backup/errors.pb.go b/api/managementpb/backup/errors.pb.go index b8f9b4148e..63b0b266bb 100644 --- a/api/managementpb/backup/errors.pb.go +++ b/api/managementpb/backup/errors.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/backup/errors.proto diff --git a/api/managementpb/backup/locations.pb.go b/api/managementpb/backup/locations.pb.go index 2ff53c5209..29c046325a 100644 --- a/api/managementpb/backup/locations.pb.go +++ b/api/managementpb/backup/locations.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/backup/locations.proto diff --git a/api/managementpb/backup/restores.pb.go b/api/managementpb/backup/restores.pb.go index b15918d810..3b01fa4b43 100644 --- a/api/managementpb/backup/restores.pb.go +++ b/api/managementpb/backup/restores.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/backup/restores.proto diff --git a/api/managementpb/boolean_flag.pb.go b/api/managementpb/boolean_flag.pb.go index 691369e446..5451b2e878 100644 --- a/api/managementpb/boolean_flag.pb.go +++ b/api/managementpb/boolean_flag.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/boolean_flag.proto diff --git a/api/managementpb/checks.pb.go b/api/managementpb/checks.pb.go index 40fb9ad41e..ead9da805a 100644 --- a/api/managementpb/checks.pb.go +++ b/api/managementpb/checks.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/checks.proto @@ -76,6 +76,58 @@ func (SecurityCheckInterval) EnumDescriptor() ([]byte, []int) { return file_managementpb_checks_proto_rawDescGZIP(), []int{0} } +type AdvisorCheckFamily int32 + +const ( + AdvisorCheckFamily_ADVISOR_CHECK_FAMILY_INVALID AdvisorCheckFamily = 0 + AdvisorCheckFamily_ADVISOR_CHECK_FAMILY_MYSQL AdvisorCheckFamily = 1 + AdvisorCheckFamily_ADVISOR_CHECK_FAMILY_POSTGRESQL AdvisorCheckFamily = 2 + AdvisorCheckFamily_ADVISOR_CHECK_FAMILY_MONGODB AdvisorCheckFamily = 3 +) + +// Enum value maps for AdvisorCheckFamily. +var ( + AdvisorCheckFamily_name = map[int32]string{ + 0: "ADVISOR_CHECK_FAMILY_INVALID", + 1: "ADVISOR_CHECK_FAMILY_MYSQL", + 2: "ADVISOR_CHECK_FAMILY_POSTGRESQL", + 3: "ADVISOR_CHECK_FAMILY_MONGODB", + } + AdvisorCheckFamily_value = map[string]int32{ + "ADVISOR_CHECK_FAMILY_INVALID": 0, + "ADVISOR_CHECK_FAMILY_MYSQL": 1, + "ADVISOR_CHECK_FAMILY_POSTGRESQL": 2, + "ADVISOR_CHECK_FAMILY_MONGODB": 3, + } +) + +func (x AdvisorCheckFamily) Enum() *AdvisorCheckFamily { + p := new(AdvisorCheckFamily) + *p = x + return p +} + +func (x AdvisorCheckFamily) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AdvisorCheckFamily) Descriptor() protoreflect.EnumDescriptor { + return file_managementpb_checks_proto_enumTypes[1].Descriptor() +} + +func (AdvisorCheckFamily) Type() protoreflect.EnumType { + return &file_managementpb_checks_proto_enumTypes[1] +} + +func (x AdvisorCheckFamily) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AdvisorCheckFamily.Descriptor instead. +func (AdvisorCheckFamily) EnumDescriptor() ([]byte, []int) { + return file_managementpb_checks_proto_rawDescGZIP(), []int{1} +} + // SecurityCheckResult represents the check result returned from pmm-managed after running the check. type SecurityCheckResult struct { state protoimpl.MessageState @@ -436,6 +488,8 @@ type SecurityCheck struct { Summary string `protobuf:"bytes,4,opt,name=summary,proto3" json:"summary,omitempty"` // Check execution interval. Interval SecurityCheckInterval `protobuf:"varint,5,opt,name=interval,proto3,enum=management.SecurityCheckInterval" json:"interval,omitempty"` + // DB family. + Family AdvisorCheckFamily `protobuf:"varint,6,opt,name=family,proto3,enum=management.AdvisorCheckFamily" json:"family,omitempty"` } func (x *SecurityCheck) Reset() { @@ -505,6 +559,13 @@ func (x *SecurityCheck) GetInterval() SecurityCheckInterval { return SecurityCheckInterval_SECURITY_CHECK_INTERVAL_INVALID } +func (x *SecurityCheck) GetFamily() AdvisorCheckFamily { + if x != nil { + return x.Family + } + return AdvisorCheckFamily_ADVISOR_CHECK_FAMILY_INVALID +} + type Advisor struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1475,7 +1536,7 @@ var file_managementpb_checks_proto_rawDesc = []byte{ 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xba, 0x01, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x02, 0x38, 0x01, 0x22, 0xf2, 0x01, 0x0a, 0x0d, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x64, 0x69, 0x73, @@ -1487,235 +1548,249 @@ var file_managementpb_checks_proto_rawDesc = []byte{ 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x22, 0xc2, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, - 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, - 0x72, 0x79, 0x12, 0x31, 0x0a, 0x06, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x06, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x19, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x3d, 0x0a, 0x08, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x08, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x24, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x53, - 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x60, - 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x39, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x02, 0x18, 0x01, - 0x22, 0x32, 0x0a, 0x1a, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, - 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, - 0x61, 0x6d, 0x65, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x63, - 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x4f, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, - 0x0a, 0x06, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, - 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x73, 0x22, 0x15, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x47, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, - 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x2f, 0x0a, 0x08, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x52, 0x08, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, - 0x73, 0x22, 0x5c, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, - 0x1e, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1b, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x54, 0x0a, 0x1a, - 0x4c, 0x69, 0x73, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x06, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x22, 0x70, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x0b, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x12, 0x36, 0x0a, 0x06, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1e, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, + 0x76, 0x69, 0x73, 0x6f, 0x72, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, + 0x52, 0x06, 0x66, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x22, 0xc2, 0x01, 0x0a, 0x07, 0x41, 0x64, 0x76, + 0x69, 0x73, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x63, 0x61, 0x74, 0x65, 0x67, 0x6f, 0x72, 0x79, 0x12, 0x31, 0x0a, 0x06, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x06, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, 0xa0, 0x01, + 0x0a, 0x19, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x3d, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x22, 0x24, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x60, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x73, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x32, 0x0a, 0x1a, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x1d, 0x0a, 0x1b, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x4c, + 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4f, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x52, 0x06, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x22, 0x15, 0x0a, 0x13, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x47, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x08, 0x61, 0x64, 0x76, 0x69, + 0x73, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x52, + 0x08, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x22, 0x5c, 0x0a, 0x1b, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3d, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, + 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x1e, 0x0a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x46, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x54, 0x0a, 0x1a, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x36, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x52, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x70, 0x0a, 0x16, 0x47, 0x65, + 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x0b, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x85, 0x01, 0x0a, + 0x17, 0x47, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x70, + 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x61, - 0x67, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x22, 0x85, 0x01, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, + 0x67, 0x65, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x73, 0x22, 0x4e, 0x0a, 0x17, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x19, 0x0a, 0x08, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, + 0x6c, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x69, 0x6c, + 0x65, 0x6e, 0x63, 0x65, 0x22, 0x1a, 0x0a, 0x18, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2a, 0x62, 0x0a, 0x15, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x45, 0x43, + 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, + 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0c, + 0x0a, 0x08, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x41, 0x52, 0x44, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, + 0x46, 0x52, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x41, + 0x52, 0x45, 0x10, 0x03, 0x2a, 0x9d, 0x01, 0x0a, 0x12, 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x46, 0x61, 0x6d, 0x69, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x1c, 0x41, + 0x44, 0x56, 0x49, 0x53, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x46, 0x41, 0x4d, + 0x49, 0x4c, 0x59, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x1e, 0x0a, + 0x1a, 0x41, 0x44, 0x56, 0x49, 0x53, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x46, + 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x10, 0x01, 0x12, 0x23, 0x0a, + 0x1f, 0x41, 0x44, 0x56, 0x49, 0x53, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x45, 0x43, 0x4b, 0x5f, 0x46, + 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, + 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x44, 0x56, 0x49, 0x53, 0x4f, 0x52, 0x5f, 0x43, 0x48, + 0x45, 0x43, 0x4b, 0x5f, 0x46, 0x41, 0x4d, 0x49, 0x4c, 0x59, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, + 0x44, 0x42, 0x10, 0x03, 0x32, 0xe8, 0x0f, 0x0a, 0x0e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, + 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x89, 0x02, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x25, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa3, 0x01, + 0x92, 0x41, 0x65, 0x12, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x4d, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x73, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, 0x01, + 0x2a, 0x22, 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x12, 0xdf, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, + 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x22, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x31, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x07, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x12, 0x37, 0x0a, 0x0b, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, - 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x73, 0x22, 0x4e, 0x0a, 0x17, - 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x6c, 0x65, 0x72, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x6c, 0x65, 0x72, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x6c, 0x65, 0x72, 0x74, - 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x69, 0x6c, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x69, 0x6c, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x1a, 0x0a, 0x18, - 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x6c, 0x65, 0x72, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x62, 0x0a, 0x15, 0x53, 0x65, 0x63, 0x75, - 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, - 0x6c, 0x12, 0x23, 0x0a, 0x1f, 0x53, 0x45, 0x43, 0x55, 0x52, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x48, - 0x45, 0x43, 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x5f, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x41, - 0x52, 0x44, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x52, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x54, - 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x41, 0x52, 0x45, 0x10, 0x03, 0x32, 0xe8, 0x0f, 0x0a, - 0x0e, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, - 0x89, 0x02, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x25, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, - 0x61, 0x69, 0x6c, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa3, 0x01, 0x92, 0x41, 0x65, 0x12, 0x14, 0x4c, 0x69, 0x73, - 0x74, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x1a, 0x4d, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, - 0x74, 0x20, 0x6f, 0x66, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x77, 0x69, - 0x74, 0x68, 0x20, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x6f, - 0x66, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, 0x01, 0x2a, 0x22, 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x6d, + 0x22, 0x82, 0x01, 0x92, 0x41, 0x4a, 0x12, 0x11, 0x47, 0x65, 0x74, 0x20, 0x46, 0x61, 0x69, 0x6c, + 0x65, 0x64, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x1a, 0x35, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, - 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x61, 0x69, - 0x6c, 0x65, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0xdf, 0x01, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, - 0x22, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, - 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x47, 0x65, 0x74, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x82, 0x01, 0x92, 0x41, 0x4a, 0x12, 0x11, - 0x47, 0x65, 0x74, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x73, 0x1a, 0x35, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, - 0x2a, 0x22, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, - 0x2f, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0xe7, 0x01, - 0x0a, 0x10, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x6c, 0x65, - 0x72, 0x74, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x6c, 0x65, 0x72, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x87, 0x01, - 0x92, 0x41, 0x4b, 0x12, 0x12, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x20, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x20, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x1a, 0x35, 0x53, 0x69, 0x6c, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x55, 0x6e, 0x73, 0x69, 0x6c, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x61, 0x6c, 0x65, 0x72, 0x74, - 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, - 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x01, 0x2a, 0x22, 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x2f, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x86, 0x02, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, - 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x73, 0x12, 0x2a, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2b, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, - 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x91, 0x01, 0x92, - 0x41, 0x53, 0x12, 0x1a, 0x47, 0x65, 0x74, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0x35, - 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x54, 0x6f, 0x6f, 0x6c, 0x27, 0x73, 0x20, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x3a, 0x01, 0x2a, 0x22, 0x2d, - 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x53, - 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x2f, 0x47, 0x65, - 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x88, 0x02, 0x01, - 0x12, 0xc9, 0x02, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, - 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x26, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, - 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xe0, 0x01, 0x92, 0x41, 0xae, 0x01, - 0x12, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x1a, 0x94, 0x01, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x73, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x54, 0x68, 0x72, 0x65, - 0x61, 0x64, 0x20, 0x54, 0x6f, 0x6f, 0x6c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x61, - 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, - 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x65, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x77, 0x69, - 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x20, 0x69, 0x66, - 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, - 0x6e, 0x27, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x28, 0x3a, 0x01, 0x2a, 0x22, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x2f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0xdb, 0x01, 0x0a, - 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x73, 0x12, 0x25, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x75, - 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x76, 0x92, 0x41, 0x46, 0x12, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x64, - 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x1a, 0x2f, 0x52, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, + 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x2f, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0xe7, 0x01, 0x0a, 0x10, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x23, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x87, 0x01, 0x92, 0x41, 0x4b, 0x12, 0x12, 0x54, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x1a, + 0x35, 0x53, 0x69, 0x6c, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x55, 0x6e, 0x73, 0x69, 0x6c, 0x65, 0x6e, + 0x63, 0x65, 0x20, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x72, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x3a, 0x01, 0x2a, 0x22, + 0x2e, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x2f, 0x54, + 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, + 0x86, 0x02, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x2a, 0x2e, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x75, + 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x91, 0x01, 0x92, 0x41, 0x53, 0x12, 0x1a, 0x47, 0x65, 0x74, 0x20, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0x35, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, + 0x54, 0x6f, 0x6f, 0x6c, 0x27, 0x73, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x73, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x32, 0x3a, 0x01, 0x2a, 0x22, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x12, 0xbf, 0x01, 0x0a, 0x0c, 0x4c, - 0x69, 0x73, 0x74, 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x1f, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x76, - 0x69, 0x73, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, - 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, - 0x92, 0x41, 0x42, 0x12, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, - 0x72, 0x73, 0x1a, 0x31, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, - 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x20, 0x61, + 0x68, 0x65, 0x63, 0x6b, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x73, 0x88, 0x02, 0x01, 0x12, 0xc9, 0x02, 0x0a, 0x13, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, + 0x12, 0x26, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0xe0, 0x01, 0x92, 0x41, 0xae, 0x01, 0x12, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x20, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x1a, + 0x94, 0x01, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x73, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x69, 0x74, 0x79, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x54, 0x6f, 0x6f, 0x6c, 0x20, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x2e, + 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x65, 0x64, 0x20, 0x69, 0x66, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x6e, + 0x61, 0x6d, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x6e, 0x27, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x3a, 0x01, 0x2a, 0x22, + 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, + 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x2f, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x12, 0xdb, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x25, 0x2e, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x76, 0x92, 0x41, 0x46, 0x12, + 0x13, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x73, 0x1a, 0x2f, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x75, 0x73, 0x65, 0x72, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, - 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x41, - 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x88, 0x02, 0x0a, - 0x14, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x27, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c, 0x01, 0x92, 0x41, 0x6a, 0x12, 0x16, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x1a, 0x50, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, - 0x79, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x20, 0x54, 0x6f, 0x6f, 0x6c, 0x20, 0x63, 0x68, - 0x65, 0x63, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, - 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x20, 0x62, - 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, - 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, - 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x8e, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x0b, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, - 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0xe2, 0x02, 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x73, 0x65, 0x72, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, + 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x2f, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0xbf, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x76, 0x69, 0x73, + 0x6f, 0x72, 0x73, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x92, 0x41, 0x42, 0x12, 0x0d, 0x4c, 0x69, 0x73, + 0x74, 0x20, 0x61, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x1a, 0x31, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x64, + 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, + 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x41, 0x64, 0x76, 0x69, 0x73, 0x6f, 0x72, 0x73, 0x2f, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x88, 0x02, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x27, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x9c, 0x01, 0x92, 0x41, 0x6a, 0x12, 0x16, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x53, + 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x1a, 0x50, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x2f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x73, + 0x20, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x20, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x20, 0x54, 0x6f, 0x6f, 0x6c, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x6f, 0x72, 0x20, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x74, 0x68, 0x65, 0x69, 0x72, 0x20, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x20, 0x62, 0x79, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x53, 0x65, 0x63, 0x75, 0x72, 0x69, + 0x74, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, + 0x8e, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x42, 0x0b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, + 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, + 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x0a, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x16, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1731,77 +1806,79 @@ func file_managementpb_checks_proto_rawDescGZIP() []byte { } var ( - file_managementpb_checks_proto_enumTypes = make([]protoimpl.EnumInfo, 1) + file_managementpb_checks_proto_enumTypes = make([]protoimpl.EnumInfo, 2) file_managementpb_checks_proto_msgTypes = make([]protoimpl.MessageInfo, 24) file_managementpb_checks_proto_goTypes = []interface{}{ (SecurityCheckInterval)(0), // 0: management.SecurityCheckInterval - (*SecurityCheckResult)(nil), // 1: management.SecurityCheckResult - (*CheckResultSummary)(nil), // 2: management.CheckResultSummary - (*CheckResult)(nil), // 3: management.CheckResult - (*SecurityCheck)(nil), // 4: management.SecurityCheck - (*Advisor)(nil), // 5: management.Advisor - (*ChangeSecurityCheckParams)(nil), // 6: management.ChangeSecurityCheckParams - (*GetSecurityCheckResultsRequest)(nil), // 7: management.GetSecurityCheckResultsRequest - (*GetSecurityCheckResultsResponse)(nil), // 8: management.GetSecurityCheckResultsResponse - (*StartSecurityChecksRequest)(nil), // 9: management.StartSecurityChecksRequest - (*StartSecurityChecksResponse)(nil), // 10: management.StartSecurityChecksResponse - (*ListSecurityChecksRequest)(nil), // 11: management.ListSecurityChecksRequest - (*ListSecurityChecksResponse)(nil), // 12: management.ListSecurityChecksResponse - (*ListAdvisorsRequest)(nil), // 13: management.ListAdvisorsRequest - (*ListAdvisorsResponse)(nil), // 14: management.ListAdvisorsResponse - (*ChangeSecurityChecksRequest)(nil), // 15: management.ChangeSecurityChecksRequest - (*ChangeSecurityChecksResponse)(nil), // 16: management.ChangeSecurityChecksResponse - (*ListFailedServicesRequest)(nil), // 17: management.ListFailedServicesRequest - (*ListFailedServicesResponse)(nil), // 18: management.ListFailedServicesResponse - (*GetFailedChecksRequest)(nil), // 19: management.GetFailedChecksRequest - (*GetFailedChecksResponse)(nil), // 20: management.GetFailedChecksResponse - (*ToggleCheckAlertRequest)(nil), // 21: management.ToggleCheckAlertRequest - (*ToggleCheckAlertResponse)(nil), // 22: management.ToggleCheckAlertResponse - nil, // 23: management.SecurityCheckResult.LabelsEntry - nil, // 24: management.CheckResult.LabelsEntry - (Severity)(0), // 25: management.Severity - (*PageParams)(nil), // 26: management.PageParams - (*PageTotals)(nil), // 27: management.PageTotals + (AdvisorCheckFamily)(0), // 1: management.AdvisorCheckFamily + (*SecurityCheckResult)(nil), // 2: management.SecurityCheckResult + (*CheckResultSummary)(nil), // 3: management.CheckResultSummary + (*CheckResult)(nil), // 4: management.CheckResult + (*SecurityCheck)(nil), // 5: management.SecurityCheck + (*Advisor)(nil), // 6: management.Advisor + (*ChangeSecurityCheckParams)(nil), // 7: management.ChangeSecurityCheckParams + (*GetSecurityCheckResultsRequest)(nil), // 8: management.GetSecurityCheckResultsRequest + (*GetSecurityCheckResultsResponse)(nil), // 9: management.GetSecurityCheckResultsResponse + (*StartSecurityChecksRequest)(nil), // 10: management.StartSecurityChecksRequest + (*StartSecurityChecksResponse)(nil), // 11: management.StartSecurityChecksResponse + (*ListSecurityChecksRequest)(nil), // 12: management.ListSecurityChecksRequest + (*ListSecurityChecksResponse)(nil), // 13: management.ListSecurityChecksResponse + (*ListAdvisorsRequest)(nil), // 14: management.ListAdvisorsRequest + (*ListAdvisorsResponse)(nil), // 15: management.ListAdvisorsResponse + (*ChangeSecurityChecksRequest)(nil), // 16: management.ChangeSecurityChecksRequest + (*ChangeSecurityChecksResponse)(nil), // 17: management.ChangeSecurityChecksResponse + (*ListFailedServicesRequest)(nil), // 18: management.ListFailedServicesRequest + (*ListFailedServicesResponse)(nil), // 19: management.ListFailedServicesResponse + (*GetFailedChecksRequest)(nil), // 20: management.GetFailedChecksRequest + (*GetFailedChecksResponse)(nil), // 21: management.GetFailedChecksResponse + (*ToggleCheckAlertRequest)(nil), // 22: management.ToggleCheckAlertRequest + (*ToggleCheckAlertResponse)(nil), // 23: management.ToggleCheckAlertResponse + nil, // 24: management.SecurityCheckResult.LabelsEntry + nil, // 25: management.CheckResult.LabelsEntry + (Severity)(0), // 26: management.Severity + (*PageParams)(nil), // 27: management.PageParams + (*PageTotals)(nil), // 28: management.PageTotals } ) var file_managementpb_checks_proto_depIdxs = []int32{ - 25, // 0: management.SecurityCheckResult.severity:type_name -> management.Severity - 23, // 1: management.SecurityCheckResult.labels:type_name -> management.SecurityCheckResult.LabelsEntry - 25, // 2: management.CheckResult.severity:type_name -> management.Severity - 24, // 3: management.CheckResult.labels:type_name -> management.CheckResult.LabelsEntry + 26, // 0: management.SecurityCheckResult.severity:type_name -> management.Severity + 24, // 1: management.SecurityCheckResult.labels:type_name -> management.SecurityCheckResult.LabelsEntry + 26, // 2: management.CheckResult.severity:type_name -> management.Severity + 25, // 3: management.CheckResult.labels:type_name -> management.CheckResult.LabelsEntry 0, // 4: management.SecurityCheck.interval:type_name -> management.SecurityCheckInterval - 4, // 5: management.Advisor.checks:type_name -> management.SecurityCheck - 0, // 6: management.ChangeSecurityCheckParams.interval:type_name -> management.SecurityCheckInterval - 1, // 7: management.GetSecurityCheckResultsResponse.results:type_name -> management.SecurityCheckResult - 4, // 8: management.ListSecurityChecksResponse.checks:type_name -> management.SecurityCheck - 5, // 9: management.ListAdvisorsResponse.advisors:type_name -> management.Advisor - 6, // 10: management.ChangeSecurityChecksRequest.params:type_name -> management.ChangeSecurityCheckParams - 2, // 11: management.ListFailedServicesResponse.result:type_name -> management.CheckResultSummary - 26, // 12: management.GetFailedChecksRequest.page_params:type_name -> management.PageParams - 3, // 13: management.GetFailedChecksResponse.results:type_name -> management.CheckResult - 27, // 14: management.GetFailedChecksResponse.page_totals:type_name -> management.PageTotals - 17, // 15: management.SecurityChecks.ListFailedServices:input_type -> management.ListFailedServicesRequest - 19, // 16: management.SecurityChecks.GetFailedChecks:input_type -> management.GetFailedChecksRequest - 21, // 17: management.SecurityChecks.ToggleCheckAlert:input_type -> management.ToggleCheckAlertRequest - 7, // 18: management.SecurityChecks.GetSecurityCheckResults:input_type -> management.GetSecurityCheckResultsRequest - 9, // 19: management.SecurityChecks.StartSecurityChecks:input_type -> management.StartSecurityChecksRequest - 11, // 20: management.SecurityChecks.ListSecurityChecks:input_type -> management.ListSecurityChecksRequest - 13, // 21: management.SecurityChecks.ListAdvisors:input_type -> management.ListAdvisorsRequest - 15, // 22: management.SecurityChecks.ChangeSecurityChecks:input_type -> management.ChangeSecurityChecksRequest - 18, // 23: management.SecurityChecks.ListFailedServices:output_type -> management.ListFailedServicesResponse - 20, // 24: management.SecurityChecks.GetFailedChecks:output_type -> management.GetFailedChecksResponse - 22, // 25: management.SecurityChecks.ToggleCheckAlert:output_type -> management.ToggleCheckAlertResponse - 8, // 26: management.SecurityChecks.GetSecurityCheckResults:output_type -> management.GetSecurityCheckResultsResponse - 10, // 27: management.SecurityChecks.StartSecurityChecks:output_type -> management.StartSecurityChecksResponse - 12, // 28: management.SecurityChecks.ListSecurityChecks:output_type -> management.ListSecurityChecksResponse - 14, // 29: management.SecurityChecks.ListAdvisors:output_type -> management.ListAdvisorsResponse - 16, // 30: management.SecurityChecks.ChangeSecurityChecks:output_type -> management.ChangeSecurityChecksResponse - 23, // [23:31] is the sub-list for method output_type - 15, // [15:23] is the sub-list for method input_type - 15, // [15:15] is the sub-list for extension type_name - 15, // [15:15] is the sub-list for extension extendee - 0, // [0:15] is the sub-list for field type_name + 1, // 5: management.SecurityCheck.family:type_name -> management.AdvisorCheckFamily + 5, // 6: management.Advisor.checks:type_name -> management.SecurityCheck + 0, // 7: management.ChangeSecurityCheckParams.interval:type_name -> management.SecurityCheckInterval + 2, // 8: management.GetSecurityCheckResultsResponse.results:type_name -> management.SecurityCheckResult + 5, // 9: management.ListSecurityChecksResponse.checks:type_name -> management.SecurityCheck + 6, // 10: management.ListAdvisorsResponse.advisors:type_name -> management.Advisor + 7, // 11: management.ChangeSecurityChecksRequest.params:type_name -> management.ChangeSecurityCheckParams + 3, // 12: management.ListFailedServicesResponse.result:type_name -> management.CheckResultSummary + 27, // 13: management.GetFailedChecksRequest.page_params:type_name -> management.PageParams + 4, // 14: management.GetFailedChecksResponse.results:type_name -> management.CheckResult + 28, // 15: management.GetFailedChecksResponse.page_totals:type_name -> management.PageTotals + 18, // 16: management.SecurityChecks.ListFailedServices:input_type -> management.ListFailedServicesRequest + 20, // 17: management.SecurityChecks.GetFailedChecks:input_type -> management.GetFailedChecksRequest + 22, // 18: management.SecurityChecks.ToggleCheckAlert:input_type -> management.ToggleCheckAlertRequest + 8, // 19: management.SecurityChecks.GetSecurityCheckResults:input_type -> management.GetSecurityCheckResultsRequest + 10, // 20: management.SecurityChecks.StartSecurityChecks:input_type -> management.StartSecurityChecksRequest + 12, // 21: management.SecurityChecks.ListSecurityChecks:input_type -> management.ListSecurityChecksRequest + 14, // 22: management.SecurityChecks.ListAdvisors:input_type -> management.ListAdvisorsRequest + 16, // 23: management.SecurityChecks.ChangeSecurityChecks:input_type -> management.ChangeSecurityChecksRequest + 19, // 24: management.SecurityChecks.ListFailedServices:output_type -> management.ListFailedServicesResponse + 21, // 25: management.SecurityChecks.GetFailedChecks:output_type -> management.GetFailedChecksResponse + 23, // 26: management.SecurityChecks.ToggleCheckAlert:output_type -> management.ToggleCheckAlertResponse + 9, // 27: management.SecurityChecks.GetSecurityCheckResults:output_type -> management.GetSecurityCheckResultsResponse + 11, // 28: management.SecurityChecks.StartSecurityChecks:output_type -> management.StartSecurityChecksResponse + 13, // 29: management.SecurityChecks.ListSecurityChecks:output_type -> management.ListSecurityChecksResponse + 15, // 30: management.SecurityChecks.ListAdvisors:output_type -> management.ListAdvisorsResponse + 17, // 31: management.SecurityChecks.ChangeSecurityChecks:output_type -> management.ChangeSecurityChecksResponse + 24, // [24:32] is the sub-list for method output_type + 16, // [16:24] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension type_name + 16, // [16:16] is the sub-list for extension extendee + 0, // [0:16] is the sub-list for field type_name } func init() { file_managementpb_checks_proto_init() } @@ -2082,7 +2159,7 @@ func file_managementpb_checks_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_managementpb_checks_proto_rawDesc, - NumEnums: 1, + NumEnums: 2, NumMessages: 24, NumExtensions: 0, NumServices: 1, diff --git a/api/managementpb/checks.pb.validate.go b/api/managementpb/checks.pb.validate.go index be831508d9..ee0a2df498 100644 --- a/api/managementpb/checks.pb.validate.go +++ b/api/managementpb/checks.pb.validate.go @@ -422,6 +422,8 @@ func (m *SecurityCheck) validate(all bool) error { // no validation rules for Interval + // no validation rules for Family + if len(errors) > 0 { return SecurityCheckMultiError(errors) } diff --git a/api/managementpb/checks.proto b/api/managementpb/checks.proto index db3158c476..91bf8e0743 100644 --- a/api/managementpb/checks.proto +++ b/api/managementpb/checks.proto @@ -17,6 +17,13 @@ enum SecurityCheckInterval { RARE = 3; } +enum AdvisorCheckFamily { + ADVISOR_CHECK_FAMILY_INVALID = 0; + ADVISOR_CHECK_FAMILY_MYSQL = 1; + ADVISOR_CHECK_FAMILY_POSTGRESQL = 2; + ADVISOR_CHECK_FAMILY_MONGODB = 3; +} + // SecurityCheckResult represents the check result returned from pmm-managed after running the check. message SecurityCheckResult { string summary = 1; @@ -83,6 +90,8 @@ message SecurityCheck { string summary = 4; // Check execution interval. SecurityCheckInterval interval = 5; + // DB family. + AdvisorCheckFamily family = 6; } message Advisor { diff --git a/api/managementpb/dbaas/components.pb.go b/api/managementpb/dbaas/components.pb.go index 6f1309820a..cbdfd6c57d 100644 --- a/api/managementpb/dbaas/components.pb.go +++ b/api/managementpb/dbaas/components.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/dbaas/components.proto diff --git a/api/managementpb/dbaas/db_clusters.pb.go b/api/managementpb/dbaas/db_clusters.pb.go index 9f0067ebf6..2b8a099e89 100644 --- a/api/managementpb/dbaas/db_clusters.pb.go +++ b/api/managementpb/dbaas/db_clusters.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/dbaas/db_clusters.proto diff --git a/api/managementpb/dbaas/dbaas.pb.go b/api/managementpb/dbaas/dbaas.pb.go index f8ef6dca72..52cb9f53ea 100644 --- a/api/managementpb/dbaas/dbaas.pb.go +++ b/api/managementpb/dbaas/dbaas.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/dbaas/dbaas.proto diff --git a/api/managementpb/dbaas/kubernetes.pb.go b/api/managementpb/dbaas/kubernetes.pb.go index 6a23ac4ed7..9151332ae2 100644 --- a/api/managementpb/dbaas/kubernetes.pb.go +++ b/api/managementpb/dbaas/kubernetes.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/dbaas/kubernetes.proto diff --git a/api/managementpb/dbaas/logs.pb.go b/api/managementpb/dbaas/logs.pb.go index f9e9e1bfcf..e24145f79e 100644 --- a/api/managementpb/dbaas/logs.pb.go +++ b/api/managementpb/dbaas/logs.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/dbaas/logs.proto diff --git a/api/managementpb/dbaas/psmdb_clusters.pb.go b/api/managementpb/dbaas/psmdb_clusters.pb.go index 6b956e8e91..4dda99c751 100644 --- a/api/managementpb/dbaas/psmdb_clusters.pb.go +++ b/api/managementpb/dbaas/psmdb_clusters.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/dbaas/psmdb_clusters.proto diff --git a/api/managementpb/dbaas/pxc_clusters.pb.go b/api/managementpb/dbaas/pxc_clusters.pb.go index 0dbbabc3bf..ec34b22c58 100644 --- a/api/managementpb/dbaas/pxc_clusters.pb.go +++ b/api/managementpb/dbaas/pxc_clusters.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/dbaas/pxc_clusters.proto diff --git a/api/managementpb/dbaas/templates.pb.go b/api/managementpb/dbaas/templates.pb.go index d1447fb035..9231f07326 100644 --- a/api/managementpb/dbaas/templates.pb.go +++ b/api/managementpb/dbaas/templates.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/dbaas/templates.proto diff --git a/api/managementpb/external.pb.go b/api/managementpb/external.pb.go index f93925844b..81ca2e7509 100644 --- a/api/managementpb/external.pb.go +++ b/api/managementpb/external.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/external.proto diff --git a/api/managementpb/haproxy.pb.go b/api/managementpb/haproxy.pb.go index c2cfef5020..ec9e677887 100644 --- a/api/managementpb/haproxy.pb.go +++ b/api/managementpb/haproxy.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/haproxy.proto diff --git a/api/managementpb/ia/alerts.pb.go b/api/managementpb/ia/alerts.pb.go index cf7470df9d..c8ac098177 100644 --- a/api/managementpb/ia/alerts.pb.go +++ b/api/managementpb/ia/alerts.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/ia/alerts.proto diff --git a/api/managementpb/ia/channels.pb.go b/api/managementpb/ia/channels.pb.go index 6f76b7c5ba..70636dd1af 100644 --- a/api/managementpb/ia/channels.pb.go +++ b/api/managementpb/ia/channels.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/ia/channels.proto diff --git a/api/managementpb/ia/rules.pb.go b/api/managementpb/ia/rules.pb.go index 4b3020312d..68a00efa00 100644 --- a/api/managementpb/ia/rules.pb.go +++ b/api/managementpb/ia/rules.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/ia/rules.proto diff --git a/api/managementpb/ia/status.pb.go b/api/managementpb/ia/status.pb.go index e9ddc8ffca..681fef5a4e 100644 --- a/api/managementpb/ia/status.pb.go +++ b/api/managementpb/ia/status.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/ia/status.proto diff --git a/api/managementpb/json/client/my_sql/add_my_sql_responses.go b/api/managementpb/json/client/my_sql/add_my_sql_responses.go index c5414127cf..97d0ea9998 100644 --- a/api/managementpb/json/client/my_sql/add_my_sql_responses.go +++ b/api/managementpb/json/client/my_sql/add_my_sql_responses.go @@ -178,6 +178,9 @@ type AddMySQLBody struct { // Skip connection check. SkipConnectionCheck bool `json:"skip_connection_check,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` @@ -1046,6 +1049,9 @@ type AddMySQLOKBodyQANMysqlPerfschema struct { // Password for decrypting tls_cert. TLSKey string `json:"tls_key,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` @@ -1263,6 +1269,9 @@ type AddMySQLOKBodyQANMysqlSlowlog struct { // Password for decrypting tls_cert. TLSKey string `json:"tls_key,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit) MaxQueryLength int32 `json:"max_query_length,omitempty"` diff --git a/api/managementpb/json/client/postgre_sql/add_postgre_sql_responses.go b/api/managementpb/json/client/postgre_sql/add_postgre_sql_responses.go index 2df4a540c8..ba2ec37478 100644 --- a/api/managementpb/json/client/postgre_sql/add_postgre_sql_responses.go +++ b/api/managementpb/json/client/postgre_sql/add_postgre_sql_responses.go @@ -187,6 +187,9 @@ type AddPostgreSQLBody struct { // Skip connection check. SkipConnectionCheck bool `json:"skip_connection_check,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Use TLS for database connections. TLS bool `json:"tls,omitempty"` @@ -1002,6 +1005,9 @@ type AddPostgreSQLOKBodyQANPostgresqlPgstatementsAgent struct { // PostgreSQL username for getting pg stat statements data. Username string `json:"username,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` @@ -1213,6 +1219,9 @@ type AddPostgreSQLOKBodyQANPostgresqlPgstatmonitorAgent struct { // Skip TLS certificate and hostname validation. TLSSkipVerify bool `json:"tls_skip_verify,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` diff --git a/api/managementpb/json/client/rds/add_rds_responses.go b/api/managementpb/json/client/rds/add_rds_responses.go index 8c430076fa..0c5c17da70 100644 --- a/api/managementpb/json/client/rds/add_rds_responses.go +++ b/api/managementpb/json/client/rds/add_rds_responses.go @@ -216,6 +216,9 @@ type AddRDSBody struct { // Custom password for exporter endpoint /metrics. AgentPassword string `json:"agent_password,omitempty"` + + // Database name. + Database string `json:"database,omitempty"` } // Validate validates this add RDS body @@ -1565,6 +1568,9 @@ type AddRDSOKBodyQANMysqlPerfschema struct { // Password for decrypting tls_cert. TLSKey string `json:"tls_key,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` @@ -1767,6 +1773,9 @@ type AddRDSOKBodyQANPostgresqlPgstatements struct { // PostgreSQL username for getting pg stat statements data. Username string `json:"username,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `json:"disable_comments_parsing,omitempty"` + // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `json:"max_query_length,omitempty"` diff --git a/api/managementpb/json/client/security_checks/list_advisors_responses.go b/api/managementpb/json/client/security_checks/list_advisors_responses.go index 61f04cc380..cc98f1942d 100644 --- a/api/managementpb/json/client/security_checks/list_advisors_responses.go +++ b/api/managementpb/json/client/security_checks/list_advisors_responses.go @@ -492,6 +492,10 @@ type ListAdvisorsOKBodyAdvisorsItems0ChecksItems0 struct { // SecurityCheckInterval represents possible execution interval values for checks. // Enum: [SECURITY_CHECK_INTERVAL_INVALID STANDARD FREQUENT RARE] Interval *string `json:"interval,omitempty"` + + // family + // Enum: [ADVISOR_CHECK_FAMILY_INVALID ADVISOR_CHECK_FAMILY_MYSQL ADVISOR_CHECK_FAMILY_POSTGRESQL ADVISOR_CHECK_FAMILY_MONGODB] + Family *string `json:"family,omitempty"` } // Validate validates this list advisors OK body advisors items0 checks items0 @@ -502,6 +506,10 @@ func (o *ListAdvisorsOKBodyAdvisorsItems0ChecksItems0) Validate(formats strfmt.R res = append(res, err) } + if err := o.validateFamily(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -556,6 +564,54 @@ func (o *ListAdvisorsOKBodyAdvisorsItems0ChecksItems0) validateInterval(formats return nil } +var listAdvisorsOkBodyAdvisorsItems0ChecksItems0TypeFamilyPropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["ADVISOR_CHECK_FAMILY_INVALID","ADVISOR_CHECK_FAMILY_MYSQL","ADVISOR_CHECK_FAMILY_POSTGRESQL","ADVISOR_CHECK_FAMILY_MONGODB"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + listAdvisorsOkBodyAdvisorsItems0ChecksItems0TypeFamilyPropEnum = append(listAdvisorsOkBodyAdvisorsItems0ChecksItems0TypeFamilyPropEnum, v) + } +} + +const ( + + // ListAdvisorsOKBodyAdvisorsItems0ChecksItems0FamilyADVISORCHECKFAMILYINVALID captures enum value "ADVISOR_CHECK_FAMILY_INVALID" + ListAdvisorsOKBodyAdvisorsItems0ChecksItems0FamilyADVISORCHECKFAMILYINVALID string = "ADVISOR_CHECK_FAMILY_INVALID" + + // ListAdvisorsOKBodyAdvisorsItems0ChecksItems0FamilyADVISORCHECKFAMILYMYSQL captures enum value "ADVISOR_CHECK_FAMILY_MYSQL" + ListAdvisorsOKBodyAdvisorsItems0ChecksItems0FamilyADVISORCHECKFAMILYMYSQL string = "ADVISOR_CHECK_FAMILY_MYSQL" + + // ListAdvisorsOKBodyAdvisorsItems0ChecksItems0FamilyADVISORCHECKFAMILYPOSTGRESQL captures enum value "ADVISOR_CHECK_FAMILY_POSTGRESQL" + ListAdvisorsOKBodyAdvisorsItems0ChecksItems0FamilyADVISORCHECKFAMILYPOSTGRESQL string = "ADVISOR_CHECK_FAMILY_POSTGRESQL" + + // ListAdvisorsOKBodyAdvisorsItems0ChecksItems0FamilyADVISORCHECKFAMILYMONGODB captures enum value "ADVISOR_CHECK_FAMILY_MONGODB" + ListAdvisorsOKBodyAdvisorsItems0ChecksItems0FamilyADVISORCHECKFAMILYMONGODB string = "ADVISOR_CHECK_FAMILY_MONGODB" +) + +// prop value enum +func (o *ListAdvisorsOKBodyAdvisorsItems0ChecksItems0) validateFamilyEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, listAdvisorsOkBodyAdvisorsItems0ChecksItems0TypeFamilyPropEnum, true); err != nil { + return err + } + return nil +} + +func (o *ListAdvisorsOKBodyAdvisorsItems0ChecksItems0) validateFamily(formats strfmt.Registry) error { + if swag.IsZero(o.Family) { // not required + return nil + } + + // value enum + if err := o.validateFamilyEnum("family", "body", *o.Family); err != nil { + return err + } + + return nil +} + // ContextValidate validates this list advisors OK body advisors items0 checks items0 based on context it is used func (o *ListAdvisorsOKBodyAdvisorsItems0ChecksItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil diff --git a/api/managementpb/json/client/security_checks/list_security_checks_responses.go b/api/managementpb/json/client/security_checks/list_security_checks_responses.go index c5702dda19..dd59c7333b 100644 --- a/api/managementpb/json/client/security_checks/list_security_checks_responses.go +++ b/api/managementpb/json/client/security_checks/list_security_checks_responses.go @@ -379,6 +379,10 @@ type ListSecurityChecksOKBodyChecksItems0 struct { // SecurityCheckInterval represents possible execution interval values for checks. // Enum: [SECURITY_CHECK_INTERVAL_INVALID STANDARD FREQUENT RARE] Interval *string `json:"interval,omitempty"` + + // family + // Enum: [ADVISOR_CHECK_FAMILY_INVALID ADVISOR_CHECK_FAMILY_MYSQL ADVISOR_CHECK_FAMILY_POSTGRESQL ADVISOR_CHECK_FAMILY_MONGODB] + Family *string `json:"family,omitempty"` } // Validate validates this list security checks OK body checks items0 @@ -389,6 +393,10 @@ func (o *ListSecurityChecksOKBodyChecksItems0) Validate(formats strfmt.Registry) res = append(res, err) } + if err := o.validateFamily(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -443,6 +451,54 @@ func (o *ListSecurityChecksOKBodyChecksItems0) validateInterval(formats strfmt.R return nil } +var listSecurityChecksOkBodyChecksItems0TypeFamilyPropEnum []interface{} + +func init() { + var res []string + if err := json.Unmarshal([]byte(`["ADVISOR_CHECK_FAMILY_INVALID","ADVISOR_CHECK_FAMILY_MYSQL","ADVISOR_CHECK_FAMILY_POSTGRESQL","ADVISOR_CHECK_FAMILY_MONGODB"]`), &res); err != nil { + panic(err) + } + for _, v := range res { + listSecurityChecksOkBodyChecksItems0TypeFamilyPropEnum = append(listSecurityChecksOkBodyChecksItems0TypeFamilyPropEnum, v) + } +} + +const ( + + // ListSecurityChecksOKBodyChecksItems0FamilyADVISORCHECKFAMILYINVALID captures enum value "ADVISOR_CHECK_FAMILY_INVALID" + ListSecurityChecksOKBodyChecksItems0FamilyADVISORCHECKFAMILYINVALID string = "ADVISOR_CHECK_FAMILY_INVALID" + + // ListSecurityChecksOKBodyChecksItems0FamilyADVISORCHECKFAMILYMYSQL captures enum value "ADVISOR_CHECK_FAMILY_MYSQL" + ListSecurityChecksOKBodyChecksItems0FamilyADVISORCHECKFAMILYMYSQL string = "ADVISOR_CHECK_FAMILY_MYSQL" + + // ListSecurityChecksOKBodyChecksItems0FamilyADVISORCHECKFAMILYPOSTGRESQL captures enum value "ADVISOR_CHECK_FAMILY_POSTGRESQL" + ListSecurityChecksOKBodyChecksItems0FamilyADVISORCHECKFAMILYPOSTGRESQL string = "ADVISOR_CHECK_FAMILY_POSTGRESQL" + + // ListSecurityChecksOKBodyChecksItems0FamilyADVISORCHECKFAMILYMONGODB captures enum value "ADVISOR_CHECK_FAMILY_MONGODB" + ListSecurityChecksOKBodyChecksItems0FamilyADVISORCHECKFAMILYMONGODB string = "ADVISOR_CHECK_FAMILY_MONGODB" +) + +// prop value enum +func (o *ListSecurityChecksOKBodyChecksItems0) validateFamilyEnum(path, location string, value string) error { + if err := validate.EnumCase(path, location, value, listSecurityChecksOkBodyChecksItems0TypeFamilyPropEnum, true); err != nil { + return err + } + return nil +} + +func (o *ListSecurityChecksOKBodyChecksItems0) validateFamily(formats strfmt.Registry) error { + if swag.IsZero(o.Family) { // not required + return nil + } + + // value enum + if err := o.validateFamilyEnum("family", "body", *o.Family); err != nil { + return err + } + + return nil +} + // ContextValidate validates this list security checks OK body checks items0 based on context it is used func (o *ListSecurityChecksOKBodyChecksItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { return nil diff --git a/api/managementpb/json/managementpb.json b/api/managementpb/json/managementpb.json index 768bf78bb7..906290de9f 100644 --- a/api/managementpb/json/managementpb.json +++ b/api/managementpb/json/managementpb.json @@ -1434,6 +1434,17 @@ "type": "boolean", "x-order": 1 }, + "family": { + "type": "string", + "default": "ADVISOR_CHECK_FAMILY_INVALID", + "enum": [ + "ADVISOR_CHECK_FAMILY_INVALID", + "ADVISOR_CHECK_FAMILY_MYSQL", + "ADVISOR_CHECK_FAMILY_POSTGRESQL", + "ADVISOR_CHECK_FAMILY_MONGODB" + ], + "x-order": 5 + }, "interval": { "description": "SecurityCheckInterval represents possible execution interval values for checks.", "type": "string", @@ -2956,7 +2967,7 @@ "agent_password": { "description": "Custom password for exporter endpoint /metrics.", "type": "string", - "x-order": 28 + "x-order": 29 }, "cluster": { "description": "Cluster name.", @@ -2977,12 +2988,17 @@ "items": { "type": "string" }, - "x-order": 27 + "x-order": 28 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 17 }, "disable_query_examples": { "description": "Disable query examples.", "type": "boolean", - "x-order": 18 + "x-order": 19 }, "environment": { "description": "Environment name.", @@ -3001,19 +3017,19 @@ "info", "debug" ], - "x-order": 29 + "x-order": 30 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 17 + "x-order": 18 }, "max_slowlog_file_size": { "description": "If qan-mysql-slowlog-agent is added, slowlog file is rotated at this size if \u003e 0.\nIf zero, server's default value is used.\nUse negative value to disable rotation.", "type": "string", "format": "int64", - "x-order": 19 + "x-order": 20 }, "metrics_mode": { "description": "MetricsMode defines desired metrics mode for agent,\nit can be pull, push or auto mode chosen by server.", @@ -3024,7 +3040,7 @@ "PULL", "PUSH" ], - "x-order": 26 + "x-order": 27 }, "node_id": { "description": "Node identifier on which a service is been running.\nExactly one of these parameters should be present: node_id, node_name, add_node.", @@ -3086,32 +3102,32 @@ "description": "Tablestats group collectors will be disabled if there are more than that number of tables.\nIf zero, server's default value is used.\nUse negative value to disable them.", "type": "integer", "format": "int32", - "x-order": 25 + "x-order": 26 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 20 + "x-order": 21 }, "tls_ca": { "description": "Certificate Authority certificate chain.", "type": "string", - "x-order": 22 + "x-order": 23 }, "tls_cert": { "description": "Client certificate.", "type": "string", - "x-order": 23 + "x-order": 24 }, "tls_key": { "description": "Password for decrypting tls_cert.", "type": "string", - "x-order": 24 + "x-order": 25 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 21 + "x-order": 22 }, "username": { "description": "MySQL username for scraping metrics.", @@ -3272,7 +3288,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -3291,13 +3312,13 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -3307,12 +3328,12 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "service_id": { "description": "Service identifier.", @@ -3332,7 +3353,7 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "tls": { "description": "Use TLS for database connections.", @@ -3382,7 +3403,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -3401,19 +3427,19 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -3423,12 +3449,12 @@ "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "service_id": { "description": "Service identifier.", @@ -3448,7 +3474,7 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "tls": { "description": "Use TLS for database connections.", @@ -3994,7 +4020,7 @@ "agent_password": { "description": "Custom password for exporter endpoint /metrics.", "type": "string", - "x-order": 27 + "x-order": 28 }, "cluster": { "description": "Cluster name.", @@ -4020,7 +4046,12 @@ "items": { "type": "string" }, - "x-order": 23 + "x-order": 24 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 20 }, "disable_query_examples": { "description": "Disable query examples.", @@ -4044,7 +4075,7 @@ "info", "debug" ], - "x-order": 28 + "x-order": 29 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", @@ -4061,7 +4092,7 @@ "PULL", "PUSH" ], - "x-order": 22 + "x-order": 23 }, "node_id": { "description": "Node identifier on which a service is been running.\nExactly one of these parameters should be present: node_id, node_name, add_node.", @@ -4122,27 +4153,27 @@ "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 20 + "x-order": 21 }, "tls_ca": { "description": "TLS CA certificate.", "type": "string", - "x-order": 24 + "x-order": 25 }, "tls_cert": { "description": "TLS Certifcate.", "type": "string", - "x-order": 25 + "x-order": 26 }, "tls_key": { "description": "TLS Certificate Key.", "type": "string", - "x-order": 26 + "x-order": 27 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation. Uses sslmode=required instead of verify-full.", "type": "boolean", - "x-order": 21 + "x-order": 22 }, "username": { "description": "PostgreSQL username for scraping metrics.", @@ -4277,7 +4308,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -4296,13 +4332,13 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -4312,7 +4348,7 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "service_id": { "description": "Service identifier.", @@ -4332,17 +4368,17 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "username": { "description": "PostgreSQL username for getting pg stat statements data.", @@ -4367,7 +4403,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -4386,13 +4427,13 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -4402,12 +4443,12 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "service_id": { "description": "Service identifier.", @@ -4427,7 +4468,7 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "tls": { "description": "Use TLS for database connections.", @@ -5022,6 +5063,11 @@ }, "x-order": 18 }, + "database": { + "description": "Database name.", + "type": "string", + "x-order": 29 + }, "disable_basic_metrics": { "description": "Disable basic metrics.", "type": "boolean", @@ -5575,7 +5621,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -5594,13 +5645,13 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -5610,12 +5661,12 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "service_id": { "description": "Service identifier.", @@ -5635,7 +5686,7 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "tls": { "description": "Use TLS for database connections.", @@ -5685,7 +5736,12 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 + }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 }, "disabled": { "description": "Desired Agent status: enabled (false) or disabled (true).", @@ -5704,13 +5760,13 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", @@ -5720,7 +5776,7 @@ "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "service_id": { "description": "Service identifier.", @@ -5740,17 +5796,17 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "username": { "description": "PostgreSQL username for getting pg stat statements data.", @@ -6454,6 +6510,17 @@ "type": "boolean", "x-order": 1 }, + "family": { + "type": "string", + "default": "ADVISOR_CHECK_FAMILY_INVALID", + "enum": [ + "ADVISOR_CHECK_FAMILY_INVALID", + "ADVISOR_CHECK_FAMILY_MYSQL", + "ADVISOR_CHECK_FAMILY_POSTGRESQL", + "ADVISOR_CHECK_FAMILY_MONGODB" + ], + "x-order": 5 + }, "interval": { "description": "SecurityCheckInterval represents possible execution interval values for checks.", "type": "string", diff --git a/api/managementpb/metrics.pb.go b/api/managementpb/metrics.pb.go index 960ba9c242..9587c1862a 100644 --- a/api/managementpb/metrics.pb.go +++ b/api/managementpb/metrics.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/metrics.proto diff --git a/api/managementpb/mongodb.pb.go b/api/managementpb/mongodb.pb.go index d3cab06428..cf351f3a90 100644 --- a/api/managementpb/mongodb.pb.go +++ b/api/managementpb/mongodb.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/mongodb.proto diff --git a/api/managementpb/mysql.pb.go b/api/managementpb/mysql.pb.go index facce735cd..773e63da5b 100644 --- a/api/managementpb/mysql.pb.go +++ b/api/managementpb/mysql.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/mysql.proto @@ -71,6 +71,8 @@ type AddMySQLRequest struct { CustomLabels map[string]string `protobuf:"bytes,15,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Skip connection check. SkipConnectionCheck bool `protobuf:"varint,16,opt,name=skip_connection_check,json=skipConnectionCheck,proto3" json:"skip_connection_check,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `protobuf:"varint,31,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` // Limit query length in QAN (default: server-defined; -1: no limit). MaxQueryLength int32 `protobuf:"varint,30,opt,name=max_query_length,json=maxQueryLength,proto3" json:"max_query_length,omitempty"` // Disable query examples. @@ -256,6 +258,13 @@ func (x *AddMySQLRequest) GetSkipConnectionCheck() bool { return false } +func (x *AddMySQLRequest) GetDisableCommentsParsing() bool { + if x != nil { + return x.DisableCommentsParsing + } + return false +} + func (x *AddMySQLRequest) GetMaxQueryLength() int32 { if x != nil { return x.MaxQueryLength @@ -447,7 +456,7 @@ var file_managementpb_mysql_proto_rawDesc = []byte{ 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x84, 0x0a, 0x0a, 0x0f, 0x41, 0x64, 0x64, + 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbe, 0x0a, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x6e, 0x61, @@ -490,99 +499,103 @@ var file_managementpb_mysql_proto_rawDesc = []byte{ 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, - 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, - 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, - 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x12, 0x6d, 0x61, 0x78, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, - 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, - 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, - 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x17, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x18, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x09, - 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xcd, 0x02, 0x0a, 0x10, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x54, 0x0a, 0x14, 0x71, - 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, - 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, - 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x12, 0x71, - 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x12, 0x4b, 0x0a, 0x11, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, - 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x71, - 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x12, 0x1f, - 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x32, - 0x84, 0x03, 0x0a, 0x05, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x12, 0xfa, 0x02, 0x0a, 0x08, 0x41, 0x64, - 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x12, 0x1b, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0xb2, 0x02, 0x92, 0x41, 0x8b, 0x02, 0x12, 0x09, 0x41, 0x64, 0x64, 0x20, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x1a, 0xfd, 0x01, 0x41, 0x64, 0x64, 0x73, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, - 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x73, 0x20, 0x73, 0x65, 0x76, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x73, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, - 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x64, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0x20, 0x74, 0x68, - 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x73, 0x20, 0x22, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, - 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x22, 0x20, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x22, - 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, - 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x4d, 0x79, 0x53, - 0x51, 0x4c, 0x2f, 0x41, 0x64, 0x64, 0x42, 0x8d, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x4d, 0x79, 0x73, 0x71, 0x6c, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0xca, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0xe2, 0x02, 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, - 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6d, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x6d, + 0x61, 0x78, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, + 0x1e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, + 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6d, + 0x61, 0x78, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x5f, + 0x73, 0x69, 0x7a, 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x53, + 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, + 0x69, 0x66, 0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, + 0x63, 0x61, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, + 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, + 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, + 0x4b, 0x65, 0x79, 0x12, 0x3f, 0x0a, 0x1c, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x3a, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, + 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4d, + 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x18, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, + 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, + 0x76, 0x65, 0x6c, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, + 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcd, 0x02, 0x0a, 0x10, 0x41, 0x64, + 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, + 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, + 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x54, 0x0a, 0x14, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, + 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, + 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x12, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, + 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x4b, 0x0a, 0x11, 0x71, + 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x73, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, + 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x0f, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, + 0x6c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x32, 0x84, 0x03, 0x0a, 0x05, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x12, 0xfa, 0x02, 0x0a, 0x08, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x12, 0x1b, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, + 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb2, 0x02, 0x92, 0x41, + 0x8b, 0x02, 0x12, 0x09, 0x41, 0x64, 0x64, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x1a, 0xfd, 0x01, + 0x41, 0x64, 0x64, 0x73, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x73, 0x65, + 0x76, 0x65, 0x72, 0x61, 0x6c, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x20, 0x49, 0x74, + 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, + 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x74, 0x6f, + 0x20, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, + 0x68, 0x20, 0x69, 0x73, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x22, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, + 0x73, 0x20, 0x22, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x22, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x22, 0x20, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x22, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65, + 0x72, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x2f, 0x41, 0x64, 0x64, + 0x42, 0x8d, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, + 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, + 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x0a, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x16, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/managementpb/mysql.pb.validate.go b/api/managementpb/mysql.pb.validate.go index b197b981fc..e5b6ae0288 100644 --- a/api/managementpb/mysql.pb.validate.go +++ b/api/managementpb/mysql.pb.validate.go @@ -149,6 +149,8 @@ func (m *AddMySQLRequest) validate(all bool) error { // no validation rules for SkipConnectionCheck + // no validation rules for DisableCommentsParsing + // no validation rules for MaxQueryLength // no validation rules for DisableQueryExamples diff --git a/api/managementpb/mysql.proto b/api/managementpb/mysql.proto index 667c52974d..7113058d18 100644 --- a/api/managementpb/mysql.proto +++ b/api/managementpb/mysql.proto @@ -56,6 +56,8 @@ message AddMySQLRequest { map custom_labels = 15; // Skip connection check. bool skip_connection_check = 16; + // Disable parsing comments from queries and showing them in QAN. + bool disable_comments_parsing = 31; // Limit query length in QAN (default: server-defined; -1: no limit). int32 max_query_length = 30; // Disable query examples. diff --git a/api/managementpb/node.pb.go b/api/managementpb/node.pb.go index d1c1e4744c..2f557c0dab 100644 --- a/api/managementpb/node.pb.go +++ b/api/managementpb/node.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/node.proto diff --git a/api/managementpb/node/node.pb.go b/api/managementpb/node/node.pb.go index 0bb7976ee1..6f1f081347 100644 --- a/api/managementpb/node/node.pb.go +++ b/api/managementpb/node/node.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/node/node.proto diff --git a/api/managementpb/pagination.pb.go b/api/managementpb/pagination.pb.go index 92d36cad1c..69716872ad 100644 --- a/api/managementpb/pagination.pb.go +++ b/api/managementpb/pagination.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/pagination.proto diff --git a/api/managementpb/postgresql.pb.go b/api/managementpb/postgresql.pb.go index 575c08580b..f9e679c139 100644 --- a/api/managementpb/postgresql.pb.go +++ b/api/managementpb/postgresql.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/postgresql.proto @@ -77,6 +77,8 @@ type AddPostgreSQLRequest struct { CustomLabels map[string]string `protobuf:"bytes,14,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Skip connection check. SkipConnectionCheck bool `protobuf:"varint,15,opt,name=skip_connection_check,json=skipConnectionCheck,proto3" json:"skip_connection_check,omitempty"` + // Disable parsing comments from queries and showing them in QAN. + DisableCommentsParsing bool `protobuf:"varint,30,opt,name=disable_comments_parsing,json=disableCommentsParsing,proto3" json:"disable_comments_parsing,omitempty"` // Use TLS for database connections. Tls bool `protobuf:"varint,16,opt,name=tls,proto3" json:"tls,omitempty"` // Skip TLS certificate and hostname validation. Uses sslmode=required instead of verify-full. @@ -271,6 +273,13 @@ func (x *AddPostgreSQLRequest) GetSkipConnectionCheck() bool { return false } +func (x *AddPostgreSQLRequest) GetDisableCommentsParsing() bool { + if x != nil { + return x.DisableCommentsParsing + } + return false +} + func (x *AddPostgreSQLRequest) GetTls() bool { if x != nil { return x.Tls @@ -425,7 +434,7 @@ var file_managementpb_postgresql_proto_rawDesc = []byte{ 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xf0, 0x09, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xaa, 0x0a, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, @@ -480,90 +489,94 @@ var file_managementpb_postgresql_proto_rawDesc = []byte{ 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x73, 0x6b, 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, - 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, - 0x12, 0x3a, 0x0a, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x52, - 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2d, 0x0a, 0x12, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x74, - 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, - 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x18, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, - 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x0a, - 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, - 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, - 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x88, 0x03, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x48, 0x0a, 0x11, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x74, 0x0a, 0x21, + 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x73, 0x69, + 0x6e, 0x67, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x61, 0x72, 0x73, 0x69, 0x6e, 0x67, + 0x12, 0x10, 0x0a, 0x03, 0x74, 0x6c, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x03, 0x74, + 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, + 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, + 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x3a, 0x0a, 0x0c, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x17, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x16, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x61, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, + 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6c, 0x73, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, + 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, + 0x72, 0x64, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, + 0x65, 0x76, 0x65, 0x6c, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, + 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x88, 0x03, 0x0a, 0x15, 0x41, + 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x11, + 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x52, 0x10, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x74, 0x0a, 0x21, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, + 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1e, 0x71, 0x61, + 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x77, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, - 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x5f, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, - 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x1e, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, - 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x77, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, - 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, - 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x32, 0x81, 0x03, 0x0a, 0x0a, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x12, 0xf2, 0x02, 0x0a, 0x0d, 0x41, - 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x12, 0x20, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x9b, 0x02, 0x92, 0x41, 0xef, 0x01, 0x12, 0x0e, 0x41, 0x64, 0x64, 0x20, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x1a, 0xdc, 0x01, 0x41, 0x64, 0x64, 0x73, 0x20, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, - 0x20, 0x49, 0x74, 0x20, 0x61, 0x75, 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, - 0x79, 0x20, 0x61, 0x64, 0x64, 0x73, 0x20, 0x61, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x77, - 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, - 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x22, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x69, 0x64, 0x22, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x73, - 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x22, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, - 0x65, 0x64, 0x20, 0x22, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, - 0x22, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2f, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x2f, 0x41, 0x64, 0x64, 0x42, - 0x92, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x42, 0x0f, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, - 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0xca, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, 0x02, - 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, + 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x1f, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x32, 0x81, 0x03, 0x0a, 0x0a, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x53, 0x51, 0x4c, 0x12, 0xf2, 0x02, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x12, 0x20, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, + 0x4c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9b, 0x02, 0x92, 0x41, + 0xef, 0x01, 0x12, 0x0e, 0x41, 0x64, 0x64, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, + 0x51, 0x4c, 0x1a, 0xdc, 0x01, 0x41, 0x64, 0x64, 0x73, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x20, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x61, 0x75, + 0x74, 0x6f, 0x6d, 0x61, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x6c, 0x79, 0x20, 0x61, 0x64, 0x64, 0x73, + 0x20, 0x61, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x74, 0x6f, 0x20, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, + 0x73, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x20, 0x70, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x2c, + 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x61, 0x64, 0x64, 0x73, 0x20, 0x22, 0x70, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x20, 0x77, + 0x69, 0x74, 0x68, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x22, 0x70, 0x6d, + 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x22, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x6f, 0x74, 0x68, 0x65, 0x72, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x76, 0x31, 0x2f, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x53, 0x51, 0x4c, 0x2f, 0x41, 0x64, 0x64, 0x42, 0x92, 0x01, 0x0a, 0x0e, 0x63, 0x6f, + 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x0f, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, + 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, + 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, + 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x0a, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/managementpb/postgresql.pb.validate.go b/api/managementpb/postgresql.pb.validate.go index f100455abd..181682d702 100644 --- a/api/managementpb/postgresql.pb.validate.go +++ b/api/managementpb/postgresql.pb.validate.go @@ -155,6 +155,8 @@ func (m *AddPostgreSQLRequest) validate(all bool) error { // no validation rules for SkipConnectionCheck + // no validation rules for DisableCommentsParsing + // no validation rules for Tls // no validation rules for TlsSkipVerify diff --git a/api/managementpb/postgresql.proto b/api/managementpb/postgresql.proto index 72fa2378ef..c48e497afa 100644 --- a/api/managementpb/postgresql.proto +++ b/api/managementpb/postgresql.proto @@ -62,6 +62,8 @@ message AddPostgreSQLRequest { map custom_labels = 14; // Skip connection check. bool skip_connection_check = 15; + // Disable parsing comments from queries and showing them in QAN. + bool disable_comments_parsing = 30; // Use TLS for database connections. bool tls = 16; // Skip TLS certificate and hostname validation. Uses sslmode=required instead of verify-full. diff --git a/api/managementpb/proxysql.pb.go b/api/managementpb/proxysql.pb.go index 5ae38784da..6a499d59c2 100644 --- a/api/managementpb/proxysql.pb.go +++ b/api/managementpb/proxysql.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/proxysql.proto diff --git a/api/managementpb/rds.pb.go b/api/managementpb/rds.pb.go index b84edf05ce..8214ca2777 100644 --- a/api/managementpb/rds.pb.go +++ b/api/managementpb/rds.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/rds.proto @@ -358,6 +358,8 @@ type AddRDSRequest struct { QanPostgresqlPgstatements bool `protobuf:"varint,28,opt,name=qan_postgresql_pgstatements,json=qanPostgresqlPgstatements,proto3" json:"qan_postgresql_pgstatements,omitempty"` // Custom password for exporter endpoint /metrics. AgentPassword string `protobuf:"bytes,29,opt,name=agent_password,json=agentPassword,proto3" json:"agent_password,omitempty"` + // Database name. + Database string `protobuf:"bytes,30,opt,name=database,proto3" json:"database,omitempty"` } func (x *AddRDSRequest) Reset() { @@ -595,6 +597,13 @@ func (x *AddRDSRequest) GetAgentPassword() string { return "" } +func (x *AddRDSRequest) GetDatabase() string { + if x != nil { + return x.Database + } + return "" +} + type AddRDSResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -754,7 +763,7 @@ var file_managementpb_rds_proto_rawDesc = []byte{ 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x44, 0x53, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0c, 0x72, 0x64, 0x73, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x22, 0x90, 0x0a, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x52, 0x65, 0x71, 0x75, + 0x73, 0x22, 0xac, 0x0a, 0x0a, 0x0d, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x61, 0x7a, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, @@ -831,84 +840,85 @@ var file_managementpb_rds_proto_rawDesc = []byte{ 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xda, 0x04, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x44, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x52, - 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x52, 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x12, 0x2d, 0x0a, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x12, - 0x42, 0x0a, 0x0f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x52, 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0x54, 0x0a, 0x14, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x5f, 0x70, 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, - 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x12, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, - 0x65, 0x72, 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x12, 0x4c, 0x0a, 0x13, 0x70, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x52, 0x12, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x69, 0x0a, 0x1b, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x53, 0x51, 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x19, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x2a, 0x69, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x44, 0x53, - 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, - 0x45, 0x52, 0x5f, 0x52, 0x44, 0x53, 0x5f, 0x45, 0x4e, 0x47, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x49, 0x53, 0x43, 0x4f, - 0x56, 0x45, 0x52, 0x5f, 0x52, 0x44, 0x53, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x10, 0x01, 0x12, - 0x1b, 0x0a, 0x17, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x44, 0x53, 0x5f, - 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x10, 0x02, 0x32, 0xae, 0x02, 0x0a, - 0x03, 0x52, 0x44, 0x53, 0x12, 0xa1, 0x01, 0x0a, 0x0b, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x52, 0x44, 0x53, 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x44, 0x53, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x44, 0x53, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x92, 0x41, 0x28, 0x12, 0x0c, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x20, 0x52, 0x44, 0x53, 0x1a, 0x18, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x73, 0x20, 0x52, 0x44, 0x53, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x31, - 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x52, 0x44, 0x53, 0x2f, - 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x82, 0x01, 0x0a, 0x06, 0x41, 0x64, 0x64, - 0x52, 0x44, 0x53, 0x12, 0x19, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x52, - 0x44, 0x53, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x92, 0x41, 0x1d, 0x12, - 0x07, 0x41, 0x64, 0x64, 0x20, 0x52, 0x44, 0x53, 0x1a, 0x12, 0x41, 0x64, 0x64, 0x73, 0x20, 0x52, - 0x44, 0x53, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1b, 0x3a, 0x01, 0x2a, 0x22, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x52, 0x44, 0x53, 0x2f, 0x41, 0x64, 0x64, 0x42, 0x8b, 0x01, - 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x42, 0x08, 0x52, 0x64, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, - 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, - 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x6f, 0x72, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x18, + 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x1a, + 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xda, 0x04, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x44, 0x53, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6e, 0x6f, 0x64, + 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, + 0x0b, 0x72, 0x64, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x2d, 0x0a, 0x05, + 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x12, 0x42, 0x0a, 0x0f, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, + 0x0e, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x54, 0x0a, 0x14, 0x71, 0x61, 0x6e, 0x5f, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x65, 0x72, + 0x66, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, + 0x51, 0x4c, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x12, 0x71, 0x61, 0x6e, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x50, 0x65, 0x72, 0x66, 0x73, + 0x63, 0x68, 0x65, 0x6d, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, + 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x71, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, + 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x71, 0x6c, 0x12, 0x4c, 0x0a, 0x13, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x12, + 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x12, 0x69, 0x0a, 0x1b, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x71, 0x6c, 0x5f, 0x70, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x51, 0x41, 0x4e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, + 0x4c, 0x50, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x19, 0x71, 0x61, 0x6e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, + 0x6c, 0x50, 0x67, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x2a, 0x69, 0x0a, + 0x11, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x44, 0x53, 0x45, 0x6e, 0x67, 0x69, + 0x6e, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, + 0x44, 0x53, 0x5f, 0x45, 0x4e, 0x47, 0x49, 0x4e, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, + 0x52, 0x44, 0x53, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x10, 0x01, 0x12, 0x1b, 0x0a, 0x17, 0x44, + 0x49, 0x53, 0x43, 0x4f, 0x56, 0x45, 0x52, 0x5f, 0x52, 0x44, 0x53, 0x5f, 0x50, 0x4f, 0x53, 0x54, + 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x10, 0x02, 0x32, 0xae, 0x02, 0x0a, 0x03, 0x52, 0x44, 0x53, + 0x12, 0xa1, 0x01, 0x0a, 0x0b, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x44, 0x53, + 0x12, 0x1e, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x44, 0x53, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x69, + 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x44, 0x53, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x51, 0x92, 0x41, 0x28, 0x12, 0x0c, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x20, 0x52, 0x44, 0x53, 0x1a, 0x18, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x73, 0x20, + 0x52, 0x44, 0x53, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x52, 0x44, 0x53, 0x2f, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x12, 0x82, 0x01, 0x0a, 0x06, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x12, + 0x19, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x64, + 0x52, 0x44, 0x53, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x92, 0x41, 0x1d, 0x12, 0x07, 0x41, 0x64, 0x64, + 0x20, 0x52, 0x44, 0x53, 0x1a, 0x12, 0x41, 0x64, 0x64, 0x73, 0x20, 0x52, 0x44, 0x53, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x3a, 0x01, + 0x2a, 0x22, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2f, 0x52, 0x44, 0x53, 0x2f, 0x41, 0x64, 0x64, 0x42, 0x8b, 0x01, 0x0a, 0x0e, 0x63, 0x6f, + 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x08, 0x52, 0x64, + 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0xe2, 0x02, 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/managementpb/rds.pb.validate.go b/api/managementpb/rds.pb.validate.go index 0954714d7d..b557aefb33 100644 --- a/api/managementpb/rds.pb.validate.go +++ b/api/managementpb/rds.pb.validate.go @@ -520,6 +520,8 @@ func (m *AddRDSRequest) validate(all bool) error { // no validation rules for AgentPassword + // no validation rules for Database + if len(errors) > 0 { return AddRDSRequestMultiError(errors) } diff --git a/api/managementpb/rds.proto b/api/managementpb/rds.proto index 9f7979559f..15c8218a5b 100644 --- a/api/managementpb/rds.proto +++ b/api/managementpb/rds.proto @@ -112,6 +112,8 @@ message AddRDSRequest { bool qan_postgresql_pgstatements = 28; // Custom password for exporter endpoint /metrics. string agent_password = 29; + // Database name. + string database = 30; } message AddRDSResponse { diff --git a/api/managementpb/role/role.pb.go b/api/managementpb/role/role.pb.go index 773ad8c570..96978fed8b 100644 --- a/api/managementpb/role/role.pb.go +++ b/api/managementpb/role/role.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/role/role.proto diff --git a/api/managementpb/service.pb.go b/api/managementpb/service.pb.go index d0613d9c3e..48647c2d68 100644 --- a/api/managementpb/service.pb.go +++ b/api/managementpb/service.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/service.proto diff --git a/api/managementpb/service/json/client/mgmt_service/list_services_responses.go b/api/managementpb/service/json/client/mgmt_service/list_services_responses.go index 14dc7e9404..fdc3b2c330 100644 --- a/api/managementpb/service/json/client/mgmt_service/list_services_responses.go +++ b/api/managementpb/service/json/client/mgmt_service/list_services_responses.go @@ -782,6 +782,9 @@ type ListServicesOKBodyServicesItems0AgentsItems0 struct { // True if query examples are disabled. QueryExamplesDisabled bool `json:"query_examples_disabled,omitempty"` + // True if query comments parsing is disabled. + CommentsParsingDisabled bool `json:"comments_parsing_disabled,omitempty"` + // True if RDS basic metrics are disdabled. RDSBasicMetricsDisabled bool `json:"rds_basic_metrics_disabled,omitempty"` diff --git a/api/managementpb/service/json/service.json b/api/managementpb/service/json/service.json index 6455fde1e3..56aff3ce16 100644 --- a/api/managementpb/service/json/service.json +++ b/api/managementpb/service/json/service.json @@ -129,6 +129,11 @@ }, "x-order": 5 }, + "comments_parsing_disabled": { + "description": "True if query comments parsing is disabled.", + "type": "boolean", + "x-order": 25 + }, "created_at": { "description": "Creation timestamp.", "type": "string", @@ -169,7 +174,7 @@ "is_connected": { "description": "True if Agent is running and connected to pmm-managed.", "type": "boolean", - "x-order": 37 + "x-order": 38 }, "is_password_set": { "description": "True if password for connecting the agent to the database is set.", @@ -329,65 +334,65 @@ "rds_basic_metrics_disabled": { "description": "True if RDS basic metrics are disdabled.", "type": "boolean", - "x-order": 25 + "x-order": 26 }, "rds_enhanced_metrics_disabled": { "description": "True if RDS enhanced metrics are disdabled.", "type": "boolean", - "x-order": 26 + "x-order": 27 }, "runs_on_node_id": { "description": "Node identifier where this instance runs.", "type": "string", - "x-order": 27 + "x-order": 28 }, "service_id": { "description": "Service identifier.", "type": "string", - "x-order": 28 + "x-order": 29 }, "status": { "description": "Actual Agent status.", "type": "string", - "x-order": 29 + "x-order": 30 }, "table_count": { "description": "Last known table count.", "type": "integer", "format": "int32", - "x-order": 30 + "x-order": 31 }, "table_count_tablestats_group_limit": { "description": "Tablestats group collectors are disabled if there are more than that number of tables.\n0 means tablestats group collectors are always enabled (no limit).\nNegative value means tablestats group collectors are always disabled.", "type": "integer", "format": "int32", - "x-order": 31 + "x-order": 32 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 32 + "x-order": 33 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 33 + "x-order": 34 }, "updated_at": { "description": "Last update timestamp.", "type": "string", "format": "date-time", - "x-order": 35 + "x-order": 36 }, "username": { "description": "HTTP basic auth username for collecting metrics.", "type": "string", - "x-order": 34 + "x-order": 35 }, "version": { "description": "Agent version.", "type": "string", - "x-order": 36 + "x-order": 37 } } }, diff --git a/api/managementpb/service/service.pb.go b/api/managementpb/service/service.pb.go index 7626c4440b..46248b0da4 100644 --- a/api/managementpb/service/service.pb.go +++ b/api/managementpb/service/service.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/service/service.proto diff --git a/api/managementpb/severity.pb.go b/api/managementpb/severity.pb.go index 03b448c7e4..d7fa52c9c5 100644 --- a/api/managementpb/severity.pb.go +++ b/api/managementpb/severity.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: managementpb/severity.proto diff --git a/api/platformpb/platform.pb.go b/api/platformpb/platform.pb.go index 6271b277f9..24e107c697 100644 --- a/api/platformpb/platform.pb.go +++ b/api/platformpb/platform.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: platformpb/platform.proto diff --git a/api/qanpb/collector.pb.go b/api/qanpb/collector.pb.go index e1a23bc22a..41552690e9 100644 --- a/api/qanpb/collector.pb.go +++ b/api/qanpb/collector.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: qanpb/collector.proto diff --git a/api/qanpb/filters.pb.go b/api/qanpb/filters.pb.go index e63a3a07cb..290ea68b52 100644 --- a/api/qanpb/filters.pb.go +++ b/api/qanpb/filters.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: qanpb/filters.proto diff --git a/api/qanpb/metrics_names.pb.go b/api/qanpb/metrics_names.pb.go index 5a5bdb8ef9..ed632783fe 100644 --- a/api/qanpb/metrics_names.pb.go +++ b/api/qanpb/metrics_names.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: qanpb/metrics_names.proto diff --git a/api/qanpb/object_details.pb.go b/api/qanpb/object_details.pb.go index e747337976..96f43d9a71 100644 --- a/api/qanpb/object_details.pb.go +++ b/api/qanpb/object_details.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: qanpb/object_details.proto diff --git a/api/qanpb/profile.pb.go b/api/qanpb/profile.pb.go index 6652f16bce..7dd2187f5d 100644 --- a/api/qanpb/profile.pb.go +++ b/api/qanpb/profile.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: qanpb/profile.proto diff --git a/api/qanpb/qan.pb.go b/api/qanpb/qan.pb.go index 759253b83e..6e1c222061 100644 --- a/api/qanpb/qan.pb.go +++ b/api/qanpb/qan.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: qanpb/qan.proto diff --git a/api/serverpb/httperror.pb.go b/api/serverpb/httperror.pb.go index b1b392d2fd..1493004782 100644 --- a/api/serverpb/httperror.pb.go +++ b/api/serverpb/httperror.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: serverpb/httperror.proto diff --git a/api/serverpb/server.pb.go b/api/serverpb/server.pb.go index f29abe64a9..3a3d7a99ec 100644 --- a/api/serverpb/server.pb.go +++ b/api/serverpb/server.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: serverpb/server.proto diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 3936460e7a..be8c3f4c7c 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -6205,6 +6205,11 @@ "type": "boolean", "x-order": 12 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 13 + }, "log_level": { "type": "string", "title": "Log level for exporters", @@ -6217,7 +6222,7 @@ "info", "debug" ], - "x-order": 13 + "x-order": 14 } } } @@ -6283,16 +6288,21 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -6300,7 +6310,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -6315,12 +6325,12 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "log_level": { "type": "string", @@ -6334,7 +6344,7 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 } }, "x-order": 0 @@ -6467,6 +6477,11 @@ "type": "boolean", "x-order": 13 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 14 + }, "log_level": { "type": "string", "title": "Log level for exporters", @@ -6479,7 +6494,7 @@ "info", "debug" ], - "x-order": 14 + "x-order": 15 } } } @@ -6545,22 +6560,27 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -6568,7 +6588,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -6583,12 +6603,12 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "log_level": { "type": "string", @@ -6602,7 +6622,7 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 } }, "x-order": 0 @@ -6714,20 +6734,25 @@ "type": "boolean", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "tls_ca": { "description": "TLS CA certificate.", "type": "string", - "x-order": 10 + "x-order": 11 }, "tls_cert": { "description": "TLS Certifcate.", "type": "string", - "x-order": 11 + "x-order": 12 }, "tls_key": { "description": "TLS Certificate Key.", "type": "string", - "x-order": 12 + "x-order": 13 }, "log_level": { "type": "string", @@ -6741,7 +6766,7 @@ "info", "debug" ], - "x-order": 13 + "x-order": 14 } } } @@ -6792,16 +6817,21 @@ "type": "boolean", "x-order": 6 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -6809,7 +6839,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -6824,12 +6854,12 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "log_level": { "type": "string", @@ -6843,7 +6873,7 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 } }, "x-order": 0 @@ -6944,26 +6974,31 @@ "type": "boolean", "x-order": 7 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 8 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 8 + "x-order": 9 }, "tls_ca": { "description": "TLS CA certificate.", "type": "string", - "x-order": 9 + "x-order": 10 }, "tls_cert": { "description": "TLS Certifcate.", "type": "string", - "x-order": 10 + "x-order": 11 }, "tls_key": { "description": "TLS Certificate Key.", "type": "string", - "x-order": 11 + "x-order": 12 }, "log_level": { "type": "string", @@ -6977,7 +7012,7 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 } } } @@ -7018,21 +7053,26 @@ "type": "string", "x-order": 4 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -7040,7 +7080,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -7055,12 +7095,12 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "log_level": { "type": "string", @@ -7074,7 +7114,7 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 } }, "x-order": 0 @@ -9102,16 +9142,21 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -9119,7 +9164,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -9134,12 +9179,12 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "log_level": { "type": "string", @@ -9153,7 +9198,7 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 } }, "x-order": 0 @@ -9319,22 +9364,27 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -9342,7 +9392,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -9357,12 +9407,12 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "log_level": { "type": "string", @@ -9376,7 +9426,7 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 } }, "x-order": 0 @@ -9527,16 +9577,21 @@ "type": "boolean", "x-order": 6 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -9544,7 +9599,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -9559,12 +9614,12 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "log_level": { "type": "string", @@ -9578,7 +9633,7 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 } }, "x-order": 0 @@ -9719,21 +9774,26 @@ "type": "string", "x-order": 4 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -9741,7 +9801,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -9756,12 +9816,12 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "log_level": { "type": "string", @@ -9775,7 +9835,7 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 } }, "x-order": 0 @@ -10722,16 +10782,21 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -10739,7 +10804,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -10754,12 +10819,12 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "log_level": { "type": "string", @@ -10773,7 +10838,7 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 } }, "x-order": 7 @@ -10832,22 +10897,27 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -10855,7 +10925,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -10870,12 +10940,12 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "log_level": { "type": "string", @@ -10889,7 +10959,7 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 } }, "x-order": 8 @@ -11013,21 +11083,26 @@ "type": "string", "x-order": 4 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -11035,7 +11110,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -11050,12 +11125,12 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "log_level": { "type": "string", @@ -11069,7 +11144,7 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 } }, "x-order": 10 @@ -11113,16 +11188,21 @@ "type": "boolean", "x-order": 6 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -11130,7 +11210,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -11145,12 +11225,12 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "log_level": { "type": "string", @@ -11164,7 +11244,7 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 } }, "x-order": 11 @@ -12303,16 +12383,21 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -12320,7 +12405,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -12335,12 +12420,12 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "log_level": { "type": "string", @@ -12354,7 +12439,7 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 } } }, @@ -12416,22 +12501,27 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -12439,7 +12529,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -12454,12 +12544,12 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "log_level": { "type": "string", @@ -12473,7 +12563,7 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 } } }, @@ -12603,21 +12693,26 @@ "type": "string", "x-order": 4 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -12625,7 +12720,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -12640,12 +12735,12 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "log_level": { "type": "string", @@ -12659,7 +12754,7 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 } } }, @@ -12706,16 +12801,21 @@ "type": "boolean", "x-order": 6 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -12723,7 +12823,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -12738,12 +12838,12 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "log_level": { "type": "string", @@ -12757,7 +12857,7 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 } } }, @@ -18225,6 +18325,17 @@ "RARE" ], "x-order": 4 + }, + "family": { + "type": "string", + "default": "ADVISOR_CHECK_FAMILY_INVALID", + "enum": [ + "ADVISOR_CHECK_FAMILY_INVALID", + "ADVISOR_CHECK_FAMILY_MYSQL", + "ADVISOR_CHECK_FAMILY_POSTGRESQL", + "ADVISOR_CHECK_FAMILY_MONGODB" + ], + "x-order": 5 } } }, @@ -18553,73 +18664,78 @@ "type": "boolean", "x-order": 24 }, + "comments_parsing_disabled": { + "description": "True if query comments parsing is disabled.", + "type": "boolean", + "x-order": 25 + }, "rds_basic_metrics_disabled": { "description": "True if RDS basic metrics are disdabled.", "type": "boolean", - "x-order": 25 + "x-order": 26 }, "rds_enhanced_metrics_disabled": { "description": "True if RDS enhanced metrics are disdabled.", "type": "boolean", - "x-order": 26 + "x-order": 27 }, "runs_on_node_id": { "description": "Node identifier where this instance runs.", "type": "string", - "x-order": 27 + "x-order": 28 }, "service_id": { "description": "Service identifier.", "type": "string", - "x-order": 28 + "x-order": 29 }, "status": { "description": "Actual Agent status.", "type": "string", - "x-order": 29 + "x-order": 30 }, "table_count": { "description": "Last known table count.", "type": "integer", "format": "int32", - "x-order": 30 + "x-order": 31 }, "table_count_tablestats_group_limit": { "description": "Tablestats group collectors are disabled if there are more than that number of tables.\n0 means tablestats group collectors are always enabled (no limit).\nNegative value means tablestats group collectors are always disabled.", "type": "integer", "format": "int32", - "x-order": 31 + "x-order": 32 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 32 + "x-order": 33 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 33 + "x-order": 34 }, "username": { "description": "HTTP basic auth username for collecting metrics.", "type": "string", - "x-order": 34 + "x-order": 35 }, "updated_at": { "description": "Last update timestamp.", "type": "string", "format": "date-time", - "x-order": 35 + "x-order": 36 }, "version": { "description": "Agent version.", "type": "string", - "x-order": 36 + "x-order": 37 }, "is_connected": { "description": "True if Agent is running and connected to pmm-managed.", "type": "boolean", - "x-order": 37 + "x-order": 38 } } }, @@ -25318,53 +25434,58 @@ "type": "boolean", "x-order": 16 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 17 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 17 + "x-order": 18 }, "disable_query_examples": { "description": "Disable query examples.", "type": "boolean", - "x-order": 18 + "x-order": 19 }, "max_slowlog_file_size": { "description": "If qan-mysql-slowlog-agent is added, slowlog file is rotated at this size if \u003e 0.\nIf zero, server's default value is used.\nUse negative value to disable rotation.", "type": "string", "format": "int64", - "x-order": 19 + "x-order": 20 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 20 + "x-order": 21 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 21 + "x-order": 22 }, "tls_ca": { "description": "Certificate Authority certificate chain.", "type": "string", - "x-order": 22 + "x-order": 23 }, "tls_cert": { "description": "Client certificate.", "type": "string", - "x-order": 23 + "x-order": 24 }, "tls_key": { "description": "Password for decrypting tls_cert.", "type": "string", - "x-order": 24 + "x-order": 25 }, "tablestats_group_table_limit": { "description": "Tablestats group collectors will be disabled if there are more than that number of tables.\nIf zero, server's default value is used.\nUse negative value to disable them.", "type": "integer", "format": "int32", - "x-order": 25 + "x-order": 26 }, "metrics_mode": { "description": "MetricsMode defines desired metrics mode for agent,\nit can be pull, push or auto mode chosen by server.", @@ -25375,7 +25496,7 @@ "PULL", "PUSH" ], - "x-order": 26 + "x-order": 27 }, "disable_collectors": { "description": "List of collector names to disable in this exporter.", @@ -25383,12 +25504,12 @@ "items": { "type": "string" }, - "x-order": 27 + "x-order": 28 }, "agent_password": { "description": "Custom password for exporter endpoint /metrics.", "type": "string", - "x-order": 28 + "x-order": 29 }, "log_level": { "type": "string", @@ -25402,7 +25523,7 @@ "info", "debug" ], - "x-order": 29 + "x-order": 30 } } } @@ -25658,16 +25779,21 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -25675,7 +25801,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -25690,12 +25816,12 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "log_level": { "type": "string", @@ -25709,7 +25835,7 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 } }, "x-order": 2 @@ -25768,22 +25894,27 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -25791,7 +25922,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -25806,12 +25937,12 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "log_level": { "type": "string", @@ -25825,7 +25956,7 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 } }, "x-order": 3 @@ -26818,15 +26949,20 @@ "type": "boolean", "x-order": 19 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 20 + }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 20 + "x-order": 21 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation. Uses sslmode=required instead of verify-full.", "type": "boolean", - "x-order": 21 + "x-order": 22 }, "metrics_mode": { "description": "MetricsMode defines desired metrics mode for agent,\nit can be pull, push or auto mode chosen by server.", @@ -26837,7 +26973,7 @@ "PULL", "PUSH" ], - "x-order": 22 + "x-order": 23 }, "disable_collectors": { "description": "List of collector names to disable in this exporter.", @@ -26845,27 +26981,27 @@ "items": { "type": "string" }, - "x-order": 23 + "x-order": 24 }, "tls_ca": { "description": "TLS CA certificate.", "type": "string", - "x-order": 24 + "x-order": 25 }, "tls_cert": { "description": "TLS Certifcate.", "type": "string", - "x-order": 25 + "x-order": 26 }, "tls_key": { "description": "TLS Certificate Key.", "type": "string", - "x-order": 26 + "x-order": 27 }, "agent_password": { "description": "Custom password for exporter endpoint /metrics.", "type": "string", - "x-order": 27 + "x-order": 28 }, "log_level": { "type": "string", @@ -26879,7 +27015,7 @@ "info", "debug" ], - "x-order": 28 + "x-order": 29 } } } @@ -27089,21 +27225,26 @@ "type": "string", "x-order": 4 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -27111,7 +27252,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -27126,12 +27267,12 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "log_level": { "type": "string", @@ -27145,7 +27286,7 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 } }, "x-order": 2 @@ -27189,16 +27330,21 @@ "type": "boolean", "x-order": 6 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -27206,7 +27352,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -27221,12 +27367,12 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "log_level": { "type": "string", @@ -27240,7 +27386,7 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 } }, "x-order": 3 @@ -27877,6 +28023,11 @@ "description": "Custom password for exporter endpoint /metrics.", "type": "string", "x-order": 28 + }, + "database": { + "description": "Database name.", + "type": "string", + "x-order": 29 } } } @@ -28272,16 +28423,21 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -28289,7 +28445,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -28304,12 +28460,12 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "log_level": { "type": "string", @@ -28323,7 +28479,7 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 } }, "x-order": 4 @@ -28532,21 +28688,26 @@ "type": "string", "x-order": 4 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -28554,7 +28715,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -28569,12 +28730,12 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "log_level": { "type": "string", @@ -28588,7 +28749,7 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 } }, "x-order": 8 @@ -29749,6 +29910,17 @@ "RARE" ], "x-order": 4 + }, + "family": { + "type": "string", + "default": "ADVISOR_CHECK_FAMILY_INVALID", + "enum": [ + "ADVISOR_CHECK_FAMILY_INVALID", + "ADVISOR_CHECK_FAMILY_MYSQL", + "ADVISOR_CHECK_FAMILY_POSTGRESQL", + "ADVISOR_CHECK_FAMILY_MONGODB" + ], + "x-order": 5 } } }, @@ -30445,73 +30617,78 @@ "type": "boolean", "x-order": 24 }, + "comments_parsing_disabled": { + "description": "True if query comments parsing is disabled.", + "type": "boolean", + "x-order": 25 + }, "rds_basic_metrics_disabled": { "description": "True if RDS basic metrics are disdabled.", "type": "boolean", - "x-order": 25 + "x-order": 26 }, "rds_enhanced_metrics_disabled": { "description": "True if RDS enhanced metrics are disdabled.", "type": "boolean", - "x-order": 26 + "x-order": 27 }, "runs_on_node_id": { "description": "Node identifier where this instance runs.", "type": "string", - "x-order": 27 + "x-order": 28 }, "service_id": { "description": "Service identifier.", "type": "string", - "x-order": 28 + "x-order": 29 }, "status": { "description": "Actual Agent status.", "type": "string", - "x-order": 29 + "x-order": 30 }, "table_count": { "description": "Last known table count.", "type": "integer", "format": "int32", - "x-order": 30 + "x-order": 31 }, "table_count_tablestats_group_limit": { "description": "Tablestats group collectors are disabled if there are more than that number of tables.\n0 means tablestats group collectors are always enabled (no limit).\nNegative value means tablestats group collectors are always disabled.", "type": "integer", "format": "int32", - "x-order": 31 + "x-order": 32 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 32 + "x-order": 33 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 33 + "x-order": 34 }, "username": { "description": "HTTP basic auth username for collecting metrics.", "type": "string", - "x-order": 34 + "x-order": 35 }, "updated_at": { "description": "Last update timestamp.", "type": "string", "format": "date-time", - "x-order": 35 + "x-order": 36 }, "version": { "description": "Agent version.", "type": "string", - "x-order": 36 + "x-order": 37 }, "is_connected": { "description": "True if Agent is running and connected to pmm-managed.", "type": "boolean", - "x-order": 37 + "x-order": 38 } } }, diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index 11c33ab93d..f91076ead0 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -3438,6 +3438,11 @@ "type": "boolean", "x-order": 12 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 13 + }, "log_level": { "type": "string", "title": "Log level for exporters", @@ -3450,7 +3455,7 @@ "info", "debug" ], - "x-order": 13 + "x-order": 14 } } } @@ -3516,16 +3521,21 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -3533,7 +3543,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -3548,12 +3558,12 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "log_level": { "type": "string", @@ -3567,7 +3577,7 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 } }, "x-order": 0 @@ -3700,6 +3710,11 @@ "type": "boolean", "x-order": 13 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 14 + }, "log_level": { "type": "string", "title": "Log level for exporters", @@ -3712,7 +3727,7 @@ "info", "debug" ], - "x-order": 14 + "x-order": 15 } } } @@ -3778,22 +3793,27 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -3801,7 +3821,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -3816,12 +3836,12 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "log_level": { "type": "string", @@ -3835,7 +3855,7 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 } }, "x-order": 0 @@ -3947,20 +3967,25 @@ "type": "boolean", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "tls_ca": { "description": "TLS CA certificate.", "type": "string", - "x-order": 10 + "x-order": 11 }, "tls_cert": { "description": "TLS Certifcate.", "type": "string", - "x-order": 11 + "x-order": 12 }, "tls_key": { "description": "TLS Certificate Key.", "type": "string", - "x-order": 12 + "x-order": 13 }, "log_level": { "type": "string", @@ -3974,7 +3999,7 @@ "info", "debug" ], - "x-order": 13 + "x-order": 14 } } } @@ -4025,16 +4050,21 @@ "type": "boolean", "x-order": 6 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -4042,7 +4072,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -4057,12 +4087,12 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "log_level": { "type": "string", @@ -4076,7 +4106,7 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 } }, "x-order": 0 @@ -4177,26 +4207,31 @@ "type": "boolean", "x-order": 7 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 8 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 8 + "x-order": 9 }, "tls_ca": { "description": "TLS CA certificate.", "type": "string", - "x-order": 9 + "x-order": 10 }, "tls_cert": { "description": "TLS Certifcate.", "type": "string", - "x-order": 10 + "x-order": 11 }, "tls_key": { "description": "TLS Certificate Key.", "type": "string", - "x-order": 11 + "x-order": 12 }, "log_level": { "type": "string", @@ -4210,7 +4245,7 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 } } } @@ -4251,21 +4286,26 @@ "type": "string", "x-order": 4 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -4273,7 +4313,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -4288,12 +4328,12 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "log_level": { "type": "string", @@ -4307,7 +4347,7 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 } }, "x-order": 0 @@ -6335,16 +6375,21 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -6352,7 +6397,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -6367,12 +6412,12 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "log_level": { "type": "string", @@ -6386,7 +6431,7 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 } }, "x-order": 0 @@ -6552,22 +6597,27 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -6575,7 +6625,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -6590,12 +6640,12 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "log_level": { "type": "string", @@ -6609,7 +6659,7 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 } }, "x-order": 0 @@ -6760,16 +6810,21 @@ "type": "boolean", "x-order": 6 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -6777,7 +6832,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -6792,12 +6847,12 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "log_level": { "type": "string", @@ -6811,7 +6866,7 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 } }, "x-order": 0 @@ -6952,21 +7007,26 @@ "type": "string", "x-order": 4 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -6974,7 +7034,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -6989,12 +7049,12 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "log_level": { "type": "string", @@ -7008,7 +7068,7 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 } }, "x-order": 0 @@ -7955,16 +8015,21 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -7972,7 +8037,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -7987,12 +8052,12 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "log_level": { "type": "string", @@ -8006,7 +8071,7 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 } }, "x-order": 7 @@ -8065,22 +8130,27 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -8088,7 +8158,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -8103,12 +8173,12 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "log_level": { "type": "string", @@ -8122,7 +8192,7 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 } }, "x-order": 8 @@ -8246,21 +8316,26 @@ "type": "string", "x-order": 4 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -8268,7 +8343,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -8283,12 +8358,12 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "log_level": { "type": "string", @@ -8302,7 +8377,7 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 } }, "x-order": 10 @@ -8346,16 +8421,21 @@ "type": "boolean", "x-order": 6 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -8363,7 +8443,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -8378,12 +8458,12 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "log_level": { "type": "string", @@ -8397,7 +8477,7 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 } }, "x-order": 11 @@ -9536,16 +9616,21 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -9553,7 +9638,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -9568,12 +9653,12 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "log_level": { "type": "string", @@ -9587,7 +9672,7 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 } } }, @@ -9649,22 +9734,27 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -9672,7 +9762,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -9687,12 +9777,12 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "log_level": { "type": "string", @@ -9706,7 +9796,7 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 } } }, @@ -9836,21 +9926,26 @@ "type": "string", "x-order": 4 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -9858,7 +9953,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -9873,12 +9968,12 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "log_level": { "type": "string", @@ -9892,7 +9987,7 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 } } }, @@ -9939,16 +10034,21 @@ "type": "boolean", "x-order": 6 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -9956,7 +10056,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -9971,12 +10071,12 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "log_level": { "type": "string", @@ -9990,7 +10090,7 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 } } }, @@ -15458,6 +15558,17 @@ "RARE" ], "x-order": 4 + }, + "family": { + "type": "string", + "default": "ADVISOR_CHECK_FAMILY_INVALID", + "enum": [ + "ADVISOR_CHECK_FAMILY_INVALID", + "ADVISOR_CHECK_FAMILY_MYSQL", + "ADVISOR_CHECK_FAMILY_POSTGRESQL", + "ADVISOR_CHECK_FAMILY_MONGODB" + ], + "x-order": 5 } } }, @@ -17015,53 +17126,58 @@ "type": "boolean", "x-order": 16 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 17 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 17 + "x-order": 18 }, "disable_query_examples": { "description": "Disable query examples.", "type": "boolean", - "x-order": 18 + "x-order": 19 }, "max_slowlog_file_size": { "description": "If qan-mysql-slowlog-agent is added, slowlog file is rotated at this size if \u003e 0.\nIf zero, server's default value is used.\nUse negative value to disable rotation.", "type": "string", "format": "int64", - "x-order": 19 + "x-order": 20 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 20 + "x-order": 21 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 21 + "x-order": 22 }, "tls_ca": { "description": "Certificate Authority certificate chain.", "type": "string", - "x-order": 22 + "x-order": 23 }, "tls_cert": { "description": "Client certificate.", "type": "string", - "x-order": 23 + "x-order": 24 }, "tls_key": { "description": "Password for decrypting tls_cert.", "type": "string", - "x-order": 24 + "x-order": 25 }, "tablestats_group_table_limit": { "description": "Tablestats group collectors will be disabled if there are more than that number of tables.\nIf zero, server's default value is used.\nUse negative value to disable them.", "type": "integer", "format": "int32", - "x-order": 25 + "x-order": 26 }, "metrics_mode": { "description": "MetricsMode defines desired metrics mode for agent,\nit can be pull, push or auto mode chosen by server.", @@ -17072,7 +17188,7 @@ "PULL", "PUSH" ], - "x-order": 26 + "x-order": 27 }, "disable_collectors": { "description": "List of collector names to disable in this exporter.", @@ -17080,12 +17196,12 @@ "items": { "type": "string" }, - "x-order": 27 + "x-order": 28 }, "agent_password": { "description": "Custom password for exporter endpoint /metrics.", "type": "string", - "x-order": 28 + "x-order": 29 }, "log_level": { "type": "string", @@ -17099,7 +17215,7 @@ "info", "debug" ], - "x-order": 29 + "x-order": 30 } } } @@ -17355,16 +17471,21 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -17372,7 +17493,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -17387,12 +17508,12 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "log_level": { "type": "string", @@ -17406,7 +17527,7 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 } }, "x-order": 2 @@ -17465,22 +17586,27 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "type": "integer", "format": "int32", "title": "Limit query length in QAN (default: server-defined; -1: no limit)", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "max_slowlog_file_size": { "description": "Slowlog file is rotated at this size if \u003e 0.", "type": "string", "format": "int64", - "x-order": 12 + "x-order": 13 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -17488,7 +17614,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 13 + "x-order": 14 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -17503,12 +17629,12 @@ "DONE", "UNKNOWN" ], - "x-order": 14 + "x-order": 15 }, "process_exec_path": { "type": "string", "title": "mod tidy", - "x-order": 15 + "x-order": 16 }, "log_level": { "type": "string", @@ -17522,7 +17648,7 @@ "info", "debug" ], - "x-order": 16 + "x-order": 17 } }, "x-order": 3 @@ -18069,15 +18195,20 @@ "type": "boolean", "x-order": 19 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 20 + }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 20 + "x-order": 21 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation. Uses sslmode=required instead of verify-full.", "type": "boolean", - "x-order": 21 + "x-order": 22 }, "metrics_mode": { "description": "MetricsMode defines desired metrics mode for agent,\nit can be pull, push or auto mode chosen by server.", @@ -18088,7 +18219,7 @@ "PULL", "PUSH" ], - "x-order": 22 + "x-order": 23 }, "disable_collectors": { "description": "List of collector names to disable in this exporter.", @@ -18096,27 +18227,27 @@ "items": { "type": "string" }, - "x-order": 23 + "x-order": 24 }, "tls_ca": { "description": "TLS CA certificate.", "type": "string", - "x-order": 24 + "x-order": 25 }, "tls_cert": { "description": "TLS Certifcate.", "type": "string", - "x-order": 25 + "x-order": 26 }, "tls_key": { "description": "TLS Certificate Key.", "type": "string", - "x-order": 26 + "x-order": 27 }, "agent_password": { "description": "Custom password for exporter endpoint /metrics.", "type": "string", - "x-order": 27 + "x-order": 28 }, "log_level": { "type": "string", @@ -18130,7 +18261,7 @@ "info", "debug" ], - "x-order": 28 + "x-order": 29 } } } @@ -18340,21 +18471,26 @@ "type": "string", "x-order": 4 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -18362,7 +18498,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -18377,12 +18513,12 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "log_level": { "type": "string", @@ -18396,7 +18532,7 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 } }, "x-order": 2 @@ -18440,16 +18576,21 @@ "type": "boolean", "x-order": 6 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 7 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 7 + "x-order": 8 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 8 + "x-order": 9 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -18457,7 +18598,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 9 + "x-order": 10 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -18472,12 +18613,12 @@ "DONE", "UNKNOWN" ], - "x-order": 10 + "x-order": 11 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 11 + "x-order": 12 }, "log_level": { "type": "string", @@ -18491,7 +18632,7 @@ "info", "debug" ], - "x-order": 12 + "x-order": 13 } }, "x-order": 3 @@ -19128,6 +19269,11 @@ "description": "Custom password for exporter endpoint /metrics.", "type": "string", "x-order": 28 + }, + "database": { + "description": "Database name.", + "type": "string", + "x-order": 29 } } } @@ -19523,16 +19669,21 @@ "type": "string", "x-order": 9 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 10 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 10 + "x-order": 11 }, "query_examples_disabled": { "description": "True if query examples are disabled.", "type": "boolean", - "x-order": 11 + "x-order": 12 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -19540,7 +19691,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 12 + "x-order": 13 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -19555,12 +19706,12 @@ "DONE", "UNKNOWN" ], - "x-order": 13 + "x-order": 14 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 14 + "x-order": 15 }, "log_level": { "type": "string", @@ -19574,7 +19725,7 @@ "info", "debug" ], - "x-order": 15 + "x-order": 16 } }, "x-order": 4 @@ -19783,21 +19934,26 @@ "type": "string", "x-order": 4 }, + "disable_comments_parsing": { + "description": "Disable parsing comments from queries and showing them in QAN.", + "type": "boolean", + "x-order": 5 + }, "max_query_length": { "description": "Limit query length in QAN (default: server-defined; -1: no limit).", "type": "integer", "format": "int32", - "x-order": 5 + "x-order": 6 }, "tls": { "description": "Use TLS for database connections.", "type": "boolean", - "x-order": 6 + "x-order": 7 }, "tls_skip_verify": { "description": "Skip TLS certificate and hostname validation.", "type": "boolean", - "x-order": 7 + "x-order": 8 }, "custom_labels": { "description": "Custom user-assigned labels.\n\nStatus fields below.", @@ -19805,7 +19961,7 @@ "additionalProperties": { "type": "string" }, - "x-order": 8 + "x-order": 9 }, "status": { "description": "AgentStatus represents actual Agent status.\n\n - STARTING: Agent is starting.\n - RUNNING: Agent is running.\n - WAITING: Agent encountered error and will be restarted automatically soon.\n - STOPPING: Agent is stopping.\n - DONE: Agent finished.\n - UNKNOWN: Agent is not connected, we don't know anything about it's state.", @@ -19820,12 +19976,12 @@ "DONE", "UNKNOWN" ], - "x-order": 9 + "x-order": 10 }, "process_exec_path": { "description": "Path to exec process.", "type": "string", - "x-order": 10 + "x-order": 11 }, "log_level": { "type": "string", @@ -19839,7 +19995,7 @@ "info", "debug" ], - "x-order": 11 + "x-order": 12 } }, "x-order": 8 @@ -20458,6 +20614,17 @@ "RARE" ], "x-order": 4 + }, + "family": { + "type": "string", + "default": "ADVISOR_CHECK_FAMILY_INVALID", + "enum": [ + "ADVISOR_CHECK_FAMILY_INVALID", + "ADVISOR_CHECK_FAMILY_MYSQL", + "ADVISOR_CHECK_FAMILY_POSTGRESQL", + "ADVISOR_CHECK_FAMILY_MONGODB" + ], + "x-order": 5 } } }, diff --git a/api/uieventspb/server.pb.go b/api/uieventspb/server.pb.go index 028b25744b..d8c2f13853 100644 --- a/api/uieventspb/server.pb.go +++ b/api/uieventspb/server.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: uieventspb/server.proto diff --git a/api/userpb/user.pb.go b/api/userpb/user.pb.go index a93dc802e8..6e8cfecf80 100644 --- a/api/userpb/user.pb.go +++ b/api/userpb/user.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.30.0 +// protoc-gen-go v1.31.0 // protoc (unknown) // source: userpb/user.proto diff --git a/build/Makefile b/build/Makefile index 8f46fb48e6..a975d94adb 100644 --- a/build/Makefile +++ b/build/Makefile @@ -1,7 +1,6 @@ export PACKER_CACHE_DIR := .cache export PACKER_VERSION := 1.8.2 export CENTOS_ISO := 2004.01 -export ORACLE_VERSION := 4.2.6 # if pulled from vagrant repository (see below) ## ----------------- PACKER ------------------ fetch: @@ -24,10 +23,6 @@ fetch-el9: chmod 600 ${PACKER_CACHE_DIR}/id_rsa_vagrant test -f ${PACKER_CACHE_DIR}/box/oracle9.ova \ || wget --progress=dot:giga https://vagrantcloud.com/bento/boxes/oracle-9.0/versions/202207.20.0/providers/virtualbox.box -O ${PACKER_CACHE_DIR}/box/oracle9.ova - #|| wget --progress=dot:giga https://yum.oracle.com/boxes/oraclelinux/ol9/OL9U1_x86_64-vagrant-virtualbox-b407.box -O ${PACKER_CACHE_DIR}/box/oracle9.ova - # https://app.vagrantup.com/generic/boxes/oracle9/versions/${ORACLE_VERSION}/providers/virtualbox.box - # https://yum.oracle.com/boxes/oraclelinux/ol9/OL9U1_x86_64-vagrant-virtualbox-b389.box - # https://yum.oracle.com/boxes/oraclelinux/ol8/OL8U7_x86_64-vagrant-virtualbox-b377.box # NOTE: image from vagrant registry is twice as large test -f ${PACKER_CACHE_DIR}/box/box.ovf \ @@ -51,6 +46,7 @@ pmm2-ovf-el9-rc: fetch-el9 | tee build.log pmm2-ovf-el9-dev-latest: fetch-el9 + sed -i 's|become_method: su|become_method: sudo|g' update/tasks/roles/postgres/tasks/main.yml && \ /usr/bin/packer build \ -var 'pmm_client_repos=original experimental' \ -var 'pmm_client_repo_name=percona-experimental-x86_64' \ @@ -81,18 +77,21 @@ pmm2-ami-rc: packer/pmm2.json pmm2-ami-el9: - docker run --rm -v ${HOME}/.aws:/root/.aws -v `pwd`:/build -w /build hashicorp/packer:${PACKER_VERSION} \ - build -var 'pmm_client_repos=original experimental' \ - -var 'pmm_client_repo_name=percona-experimental-x86_64' \ - -var 'pmm2_server_repo=experimental' \ - -only amazon-ebs -color=false \ - packer/pmm2.el9.json + mkdir -p update && \ + cp -r ../update/ansible/playbook/* update/ && \ + sed -i 's|become_method: su|become_method: sudo|g' update/tasks/roles/postgres/tasks/main.yml && \ + docker run --rm -v ${HOME}/.aws:/root/.aws -v `pwd`:/build -w /build hashicorp/packer:${PACKER_VERSION} \ + build -var 'pmm_client_repos=original experimental' \ + -var 'pmm_client_repo_name=percona-experimental-x86_64' \ + -var 'pmm2_server_repo=experimental' \ + -only amazon-ebs -color=false \ + packer/pmm2.el9.json pmm2-ami-el9-rc: mkdir -p update && \ - cp -r ../update/ansible/playbook/* update/ && \ - sed -i 's|become_method: su|become_method: sudo|g' update/tasks/roles/postgres/tasks/main.yml && \ - docker run --rm -v ${HOME}/.aws:/root/.aws -v `pwd`:/build -w /build hashicorp/packer:${PACKER_VERSION} \ + cp -r ../update/ansible/playbook/* update/ && \ + sed -i 's|become_method: su|become_method: sudo|g' update/tasks/roles/postgres/tasks/main.yml && \ + docker run --rm -v ${HOME}/.aws:/root/.aws -v `pwd`:/build -w /build hashicorp/packer:${PACKER_VERSION} \ build -var 'pmm_client_repos=original testing' \ -var 'pmm_client_repo_name=percona-testing-x86_64' \ -var 'pmm2_server_repo=testing' \ diff --git a/build/ansible/pmm2/post-build-actions.yml b/build/ansible/pmm2/post-build-actions.yml index 7268cb6f59..65d29b38e0 100644 --- a/build/ansible/pmm2/post-build-actions.yml +++ b/build/ansible/pmm2/post-build-actions.yml @@ -44,6 +44,23 @@ - name: Enable repo | Enable release repo for pmm2-client command: percona-release enable {{ pmm_client_repos_final }} + - name: Install glibc-langpack-en | EL9 + dnf: + name: glibc-langpack-en + state: present + update_cache: yes + when: + - ansible_virtualization_type != "docker" + - ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux' + - ansible_distribution_major_version == '9' + + - name: Set locale to en_US.utf8 | EL9 + command: localectl set-locale LANG=en_US.utf8 + when: + - ansible_virtualization_type != "docker" + - ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux' + - ansible_distribution_major_version == '9' + - name: pmm-agent | Setup pmm-agent command: > pmm-agent setup @@ -110,10 +127,20 @@ ignore_errors: yes when: ansible_virtualization_type != "docker" - - name: Remove pmm-managed database + - name: Remove pmm-managed database EL7 + when: ansible_distribution == 'CentOS' and ansible_distribution_major_version == '7' + postgresql_db: + login_user: postgres + name: pmm-managed + state: absent + register: db_check_result + + - name: Remove pmm-managed database EL9 + when: (ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux') and ansible_distribution_major_version == '9' postgresql_db: login_user: postgres name: pmm-managed + force: true state: absent register: db_check_result diff --git a/build/ansible/roles/ami-ovf/tasks/main.yml b/build/ansible/roles/ami-ovf/tasks/main.yml index c7affc1f58..6fdec5edd7 100644 --- a/build/ansible/roles/ami-ovf/tasks/main.yml +++ b/build/ansible/roles/ami-ovf/tasks/main.yml @@ -48,8 +48,28 @@ dest: /var/lib/cloud/scripts/per-boot/show-pmm-url mode: 0755 -- name: PMM | Delete centos +# PMM-12248 - Add /usr/local/bin to secure_path in /etc/sudoers so +# that we can use supervisorctl command without the absolute path +- name: PMM | Update secure_path in /etc/sudoers EL9 + replace: + dest: /etc/sudoers + regexp: "Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin" + replace: "Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin" + when: + - ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux' + - ansible_distribution_major_version == '9' + +- name: PMM | Delete centos EL7 shell: cd /tmp; nohup sh -c "trap 'userdel -r centos' EXIT; sleep 600" /dev/null 2>&1 & + when: + - ansible_distribution == 'CentOS' + - ansible_distribution_major_version == '7' + +- name: PMM | Delete ec2-user EL9 + shell: cd /tmp; nohup sh -c "trap 'userdel -r ec2-user' EXIT; sleep 600" /dev/null 2>&1 & + when: + - ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux' + - ansible_distribution_major_version == '9' - name: PMM | Delete vagrant shell: cd /tmp; nohup sh -c "trap 'userdel -r vagrant' EXIT; sleep 600" /dev/null 2>&1 & diff --git a/build/ansible/roles/cloud-node/tasks/main.yml b/build/ansible/roles/cloud-node/tasks/main.yml index 2a0305fc36..edcbe3104d 100644 --- a/build/ansible/roles/cloud-node/tasks/main.yml +++ b/build/ansible/roles/cloud-node/tasks/main.yml @@ -129,10 +129,25 @@ regexp: "name: centos" replace: "name: admin" -- name: change cloud user EL9 | Change cloud user - when: create_admin == "true" and (ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux') and ansible_distribution_major_version == '9' +- name: change cloud user for OVF EL9 | Change cloud user + when: + - create_admin == "true" + - ansible_virtualization_type == "virtualbox" + - ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux' + - ansible_distribution_major_version == '9' replace: dest: /etc/cloud/cloud.cfg + regexp: "name: cloud-user" + replace: "name: admin" + +- name: change cloud user for AMI EL9 | Change cloud user + when: + - create_admin == "true" + - ansible_virtualization_type != "virtualbox" + - ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux' + - ansible_distribution_major_version == '9' + replace: + dest: /etc/cloud/cloud.cfg.d/00_ol-default-user.cfg regexp: "name: ec2-user" replace: "name: admin" diff --git a/build/ansible/roles/lvm-init/tasks/main.yml b/build/ansible/roles/lvm-init/tasks/main.yml index 269e0b5f9d..d1b2c37572 100644 --- a/build/ansible/roles/lvm-init/tasks/main.yml +++ b/build/ansible/roles/lvm-init/tasks/main.yml @@ -1,7 +1,9 @@ --- - name: Packages | Install OS tools yum: - name: lvm2 + name: + - lvm2 + - cronie state: installed - block: diff --git a/build/ansible/roles/pmm2-images/tasks/main.yml b/build/ansible/roles/pmm2-images/tasks/main.yml index f7812a6328..9787ed845f 100644 --- a/build/ansible/roles/pmm2-images/tasks/main.yml +++ b/build/ansible/roles/pmm2-images/tasks/main.yml @@ -29,7 +29,7 @@ # local yum repo for building of pmm server docker image in autobuild jobs - name: PMM | Add local YUM repository - when: ansible_virtualization_type == "docker" + when: ansible_virtualization_type == "docker" yum_repository: name: local description: Local YUM repository - x86_64 @@ -104,11 +104,11 @@ group: "{{ item.group }}" non_unique: true loop: - - { name: pmm, uid: 1000, comment: "PMM Server", shell: "/bin/false", home: "/home/pmm", group: pmm, } - - { name: nginx, uid: 999, comment: "nginx user", shell: "/sbin/nologin", home: "/var/cache/nginx", group: nginx, } - - { name: grafana, uid: 998, comment: "Grafana Dashboard", shell: "/sbin/nologin", home: "/etc/grafana", group: grafana, } - - { name: clickhouse, uid: 997, comment: "Clickhouse server", shell: "/sbin/nologin", home: "/var/lib/clickhouse", group: clickhouse, } - - { name: pmm-agent, uid: 996, comment: "pmm-agent", shell: "/bin/false", home: "/usr/local/percona/", group: pmm-agent, } + - { name: pmm, uid: 1000, comment: "PMM Server", shell: "/bin/false", home: "/home/pmm", group: pmm } + - { name: nginx, uid: 999, comment: "nginx user", shell: "/sbin/nologin", home: "/var/cache/nginx", group: nginx } + - { name: grafana, uid: 998, comment: "Grafana Dashboard", shell: "/sbin/nologin", home: "/etc/grafana", group: grafana } + - { name: clickhouse, uid: 997, comment: "Clickhouse server", shell: "/sbin/nologin", home: "/var/lib/clickhouse", group: clickhouse } + - { name: pmm-agent, uid: 996, comment: "pmm-agent", shell: "/bin/false", home: "/usr/local/percona/", group: pmm-agent } when: ansible_virtualization_type == "docker" - name: Create directories | Create dirs @@ -149,7 +149,6 @@ - pmm-update - dbaas-controller - dbaas-tools - - grafana-db-migrator - pmm-dump - vmproxy state: installed diff --git a/build/docker/rpmbuild/Dockerfile b/build/docker/rpmbuild/Dockerfile index ce3e7cadaa..72520d0807 100644 --- a/build/docker/rpmbuild/Dockerfile +++ b/build/docker/rpmbuild/Dockerfile @@ -23,7 +23,7 @@ RUN yum update -y && \ yum clean all && rm -rf /var/cache/yum # keep that format for easier search -ENV GO_VERSION 1.20.1 +ENV GO_VERSION 1.20.5 ENV GO_RELEASER_VERSION 1.15.2 RUN if [ `uname -i` == "x86_64" ]; then ARCH=amd64; else ARCH=arm64; fi && \ diff --git a/build/docker/rpmbuild/Dockerfile.el9 b/build/docker/rpmbuild/Dockerfile.el9 index 1f0553d344..223ccb1af7 100644 --- a/build/docker/rpmbuild/Dockerfile.el9 +++ b/build/docker/rpmbuild/Dockerfile.el9 @@ -24,7 +24,7 @@ RUN yum update -y && \ yum clean all && rm -rf /var/cache/yum # keep that format for easier search -ENV GO_VERSION 1.20.1 +ENV GO_VERSION 1.20.5 ENV GO_RELEASER_VERSION 1.15.2 RUN if [ `uname -i` == "x86_64" ]; then ARCH=amd64; else ARCH=arm64; fi && \ diff --git a/build/docker/server/Dockerfile.el9 b/build/docker/server/Dockerfile.el9 index e860488e7d..603a341565 100644 --- a/build/docker/server/Dockerfile.el9 +++ b/build/docker/server/Dockerfile.el9 @@ -3,6 +3,10 @@ FROM oraclelinux:9-slim ARG VERSION ARG BUILD_DATE +ENV LANG=en_US.utf8 +ENV LC_ALL=en_US.utf8 +ENV GF_PLUGIN_DIR=/srv/grafana/plugins + LABEL org.opencontainers.image.created ${BUILD_DATE} LABEL org.opencontainers.image.licenses AGPL-3.0 LABEL org.opencontainers.image.title Percona Monitoring and Management @@ -15,11 +19,17 @@ WORKDIR /opt # NOTE: Ansible should NOT be installed via yum/dnf # Read more: https://docs.ansible.com/ansible/latest/installation_guide/intro_installation.html#pip-install +# RUN microdnf -y install yum && yum -y install python3-pip && \ +# yum -y install oracle-epel-release-el9 ansible-core && \ +# python3 -m pip install ansible && \ +# python3 -m pip install setuptools && \ +# yum -y install epel-release + RUN microdnf -y install yum && yum -y install python3-pip && \ yum -y install oracle-epel-release-el9 ansible-core && \ - python3 -m pip install ansible && \ - python3 -m pip install setuptools && \ - yum -y install epel-release + yum -y install epel-release && \ + yum -y install glibc-langpack-en && \ + yum -y install ansible vi COPY RPMS /tmp/RPMS COPY gitCommit /tmp/gitCommit diff --git a/build/packages/rpm/server/SPECS/dbaas-tools.spec b/build/packages/rpm/server/SPECS/dbaas-tools.spec index 8295a45ee6..a7c19d67f6 100644 --- a/build/packages/rpm/server/SPECS/dbaas-tools.spec +++ b/build/packages/rpm/server/SPECS/dbaas-tools.spec @@ -1,12 +1,12 @@ %undefine _missing_build_ids_terminate_build %define debug_package %{nil} -%global commit_aws 2a9ee95fecab59fab41a0b646a63227d66113434 +%global commit_aws ea9bcaeb5e62c110fe326d1db58b03a782d4bdd6 %global shortcommit_aws %(c=%{commit_aws}; echo ${c:0:7}) -%global commit_k8s ad3338546da947756e8a88aa6822e9c11e7eac22 +%global commit_k8s ef70d260f3d036fc22b30538576bbf6b36329995 %global shortcommit_k8s %(c=%{commit_k8s}; echo ${c:0:7}) -%global version_k8s v1.23.7 +%global version_k8s v1.24.12 %global install_golang 1 %global debug_package %{nil} @@ -16,7 +16,7 @@ %define rpm_release %{release}.%{build_timestamp}%{?dist} Name: dbaas-tools -Version: 0.5.7 +Version: 0.6.10 Release: %{rpm_release} Summary: A set of tools for Percona DBaaS License: ASL 2.0 @@ -71,6 +71,13 @@ install -D -p -m 0775 _output/local/go/bin/kubectl %{buildroot}/opt/dbaas-tools/ /opt/dbaas-tools/bin/kubectl-1.23 %changelog + +* Mon Jun 12 2023 Nurlan Moldomurov - 0.6.10-1 +- Update versions of aws-iam-authenticator + +* Mon Jun 05 2023 Andrew Minkin - 0.6.2-1 +- Update versions of kubectl and aws-iam-authenticator + * Mon Nov 21 2022 Alex Tymchuk - 0.5.7-2 - Fix the double description warning diff --git a/build/packages/rpm/server/SPECS/grafana-db-migrator.spec b/build/packages/rpm/server/SPECS/grafana-db-migrator.spec index 70de6bd075..303924aba5 100644 --- a/build/packages/rpm/server/SPECS/grafana-db-migrator.spec +++ b/build/packages/rpm/server/SPECS/grafana-db-migrator.spec @@ -46,4 +46,5 @@ install -m 755 dist/grafana-db-migrator %{buildroot}%{_sbindir}/ - Add fixes for CHAR fields * Tue Nov 02 2021 Nikita Beletskii - 1.0.1-1 -- Creating package for grafana-db-migrator \ No newline at end of file +- Creating package for grafana-db-migrator + diff --git a/build/packages/rpm/server/SPECS/grafana.spec b/build/packages/rpm/server/SPECS/grafana.spec index c69d5051d4..43f815c837 100644 --- a/build/packages/rpm/server/SPECS/grafana.spec +++ b/build/packages/rpm/server/SPECS/grafana.spec @@ -1,9 +1,9 @@ %global debug_package %{nil} -%global commit f84a7c35000e11a2f4684852fd657f814381558c +%global commit 7ff49f34a3998067fa1ea480c07e0c74939ea306 %global shortcommit %(c=%{commit}; echo ${c:0:7}) %define build_timestamp %(date -u +"%y%m%d%H%M") -%define release 99 -%define grafana_version 9.2.18 +%define release 100 +%define grafana_version 9.2.20 %define full_pmm_version 2.0.0 %define full_version v%{grafana_version}-%{full_pmm_version} %define rpm_release %{release}.%{build_timestamp}.%{shortcommit}%{?dist} @@ -84,6 +84,9 @@ getent passwd grafana >/dev/null || \ exit 0 %changelog +* Tue Jun 27 2023 Matej Kubinec - 9.2.20-1 +- PMM-12254 Grafana 9.2.20 + * Thu May 18 2023 Matej Kubinec - 9.2.18-1 - PMM-12114 Grafana 9.2.18 diff --git a/build/packages/rpm/server/SPECS/percona-dashboards.spec b/build/packages/rpm/server/SPECS/percona-dashboards.spec index 737465184c..d5b756cf24 100644 --- a/build/packages/rpm/server/SPECS/percona-dashboards.spec +++ b/build/packages/rpm/server/SPECS/percona-dashboards.spec @@ -7,7 +7,7 @@ %global commit ad4af6808bcd361284e8eb8cd1f36b1e98e32bce %global shortcommit %(c=%{commit}; echo ${c:0:7}) %define build_timestamp %(date -u +"%y%m%d%H%M") -%define release 19 +%define release 20 %define rpm_release %{release}.%{build_timestamp}.%{shortcommit}%{?dist} Name: percona-dashboards @@ -44,19 +44,22 @@ install -d %{buildroot}%{_datadir}/%{name} install -d %{buildroot}%{_datadir}/%{name}/panels/pmm-app install -d %{buildroot}%{_datadir}/%{name}/setup-page -cp -pa ./panels %{buildroot}%{_datadir}/%{name} -cp -pa ./pmm-app/dist %{buildroot}%{_datadir}/%{name}/panels/pmm-app -cp -rpa ./setup-page/build/* %{buildroot}%{_datadir}/%{name}/setup-page +cp -a ./panels %{buildroot}%{_datadir}/%{name} +cp -a ./pmm-app/dist %{buildroot}%{_datadir}/%{name}/panels/pmm-app +cp -ra ./setup-page/build/* %{buildroot}%{_datadir}/%{name}/setup-page echo %{version} > %{buildroot}%{_datadir}/%{name}/VERSION %files %license LICENSE %doc README.md LICENSE -%{_datadir}/%{name} +%attr(-,grafana,grafana) %{_datadir}/%{name} %changelog +* Wed Jul 12 2023 Alex Tymchuk - 2.39.0-20 +- PMM-12231 Set grafana user as owner of plugins directory + * Tue May 16 2023 Oleksii Kysil - 2.38.0-1 - PMM-12118 Skip stripping of plugin binaries diff --git a/build/packer/pmm2.el9.json b/build/packer/pmm2.el9.json index 016a5f1cae..51488569db 100644 --- a/build/packer/pmm2.el9.json +++ b/build/packer/pmm2.el9.json @@ -26,7 +26,7 @@ ], "region": "us-east-1", "security_group_id": "sg-688c2b1c", - "source_ami": "ami-0845395779540e3cb", + "source_ami": "ami-0da806cbfc9e67dbb", "ssh_pty": "true", "ena_support": "true", "ssh_username": "ec2-user", @@ -66,7 +66,7 @@ }, { "type": "virtualbox-ovf", - "vm_name": "PMM2-Server-{{isotime \"2006-01-02-1504\"}}", + "vm_name": "PMM2-Server-EL9-{{isotime \"2006-01-02-1504\"}}", "export_opts": [ "--ovf10", "--manifest", diff --git a/build/packer/pmm2.json b/build/packer/pmm2.json index 74aa89ae6c..cf609ff5a7 100644 --- a/build/packer/pmm2.json +++ b/build/packer/pmm2.json @@ -7,7 +7,7 @@ }, "builders": [{ "type": "amazon-ebs", - "ami_name": "PMM2 Server [{{isotime \"2006-01-02 1504\"}}]", + "ami_name": "PMM2 Server EL7 [{{isotime \"2006-01-02 1504\"}}]", "instance_type": "c4.xlarge", "launch_block_device_mappings": [{ "delete_on_termination": true, @@ -64,7 +64,7 @@ }, { "type": "virtualbox-ovf", - "vm_name": "PMM2-Server-{{isotime \"2006-01-02-1504\"}}", + "vm_name": "PMM2-Server-EL7-{{isotime \"2006-01-02-1504\"}}", "export_opts": [ "--ovf10", "--manifest", @@ -79,7 +79,7 @@ "format": "ovf", "guest_additions_mode": "disable", "headless": true, - "output_directory": "pmm2-virtualbox-ovf", + "output_directory": "pmm2-virtualbox-ovf-el7", "shutdown_command": "rm -rf ~/.ssh/authorized_keys; cat /dev/zero > zero.fill; sync; sleep 1; sync; rm -f zero.fill; sudo shutdown -P now", "source_path": ".cache/2004.01/box.ovf", "ssh_private_key_file": ".cache/id_rsa_vagrant", @@ -161,7 +161,7 @@ "inline": [ "set -o errexit", "set -o xtrace", - "pushd pmm2-virtualbox-ovf", + "pushd pmm2-virtualbox-ovf-el7", " NAME=$(ls *.ovf | sed -e 's/.ovf//')", " sed -i'' -e 's/virtualbox-2.2/vmx-10/' *.ovf", " sed -i'' -e 's/ovf:id=\"80\"/ovf:id=\"102\"/' *.ovf", diff --git a/build/scripts/build-server-rpm-all b/build/scripts/build-server-rpm-all index d9cb1a59a2..113937db22 100755 --- a/build/scripts/build-server-rpm-all +++ b/build/scripts/build-server-rpm-all @@ -12,13 +12,11 @@ ${bin_dir}/build-server-rpm pmm-update pmm ${bin_dir}/build-server-rpm dbaas-controller ${bin_dir}/build-server-rpm dbaas-tools ${bin_dir}/build-server-rpm pmm-dump -${bin_dir}/build-server-rpm grafana-db-migrator ${bin_dir}/build-server-rpm vmproxy pmm # 3rd-party ${bin_dir}/build-server-rpm victoriametrics ${bin_dir}/build-server-rpm alertmanager ${bin_dir}/build-server-rpm grafana -# ${bin_dir}/build-server-rpm grafana-db-migrator # vim: expandtab shiftwidth=4 tabstop=4 diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index c361b89c1d..115fcb5f9f 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -10,23 +10,32 @@ "dependencies": { "@playwright/test": "^1.34.2", "@types/luxon": "^3.3.0", - "dotenv": "^16.0.3", + "dotenv": "^16.3.1", "luxon": "^3.3.0", "playwright": "^1.33.0", "promise-retry": "^2.0.1", "shelljs": "^0.8.5", - "typescript": "^5.0.4" + "typescript": "^5.1.3" }, "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^5.59.7", - "@typescript-eslint/parser": "^5.59.7", - "eslint": "8.41", + "@typescript-eslint/eslint-plugin": "^5.61.0", + "@typescript-eslint/parser": "^5.62.0", + "eslint": "8.45", "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-airbnb-typescript": "^17.1.0", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-playwright": "^0.12.0" + "eslint-plugin-playwright": "^0.15.2" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@eslint-community/eslint-utils": { @@ -54,14 +63,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.2", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -77,18 +86,18 @@ } }, "node_modules/@eslint/js": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.41.0.tgz", - "integrity": "sha512-LxcyMGxwmTh2lY9FwHPGWOHmYFCZvbrFCBZL4FzSSsxsRPuhrYUg/49/0KDfW8tnIEaEHtfmn6+NPN+1DqaNmA==", + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -193,9 +202,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", "dev": true }, "node_modules/@types/json5": { @@ -252,17 +261,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.7.tgz", - "integrity": "sha512-BL+jYxUFIbuYwy+4fF86k5vdT9lT0CNJ6HtwrIvGh0PhH8s0yy5rjaKH2fDCrz5ITHy07WCzVGNvAmjJh4IJFA==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz", + "integrity": "sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/type-utils": "5.59.7", - "@typescript-eslint/utils": "5.59.7", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/type-utils": "5.61.0", + "@typescript-eslint/utils": "5.61.0", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", "natural-compare-lite": "^1.4.0", "semver": "^7.3.7", @@ -286,14 +295,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.7.tgz", - "integrity": "sha512-VhpsIEuq/8i5SF+mPg9jSdIwgMBBp0z9XqjiEay+81PYLJuroN+ET1hM5IhkiYMJd9MkTz8iJLt7aaGAgzWUbQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", + "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/typescript-estree": "5.59.7", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "debug": "^4.3.4" }, "engines": { @@ -312,14 +321,88 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.62.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.7.tgz", - "integrity": "sha512-FL6hkYWK9zBGdxT2wWEd2W8ocXMu3K94i3gvMrjXpx+koFYdYV7KprKfirpgY34vTGzEPPuKoERpP8kD5h7vZQ==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz", + "integrity": "sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7" + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -330,13 +413,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.7.tgz", - "integrity": "sha512-ozuz/GILuYG7osdY5O5yg0QxXUAEoI4Go3Do5xeu+ERH9PorHBPSdvD3Tjp2NN2bNLh1NJQSsQu2TPu/Ly+HaQ==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz", + "integrity": "sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.7", - "@typescript-eslint/utils": "5.59.7", + "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/utils": "5.61.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -357,9 +440,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.7.tgz", - "integrity": "sha512-UnVS2MRRg6p7xOSATscWkKjlf/NDKuqo5TdbWck6rIRZbmKpVNTLALzNvcjIfHBE7736kZOFc/4Z3VcZwuOM/A==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz", + "integrity": "sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -370,13 +453,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.7.tgz", - "integrity": "sha512-4A1NtZ1I3wMN2UGDkU9HMBL+TIQfbrh4uS0WDMMpf3xMRursDbqEf1ahh6vAAe3mObt8k3ZATnezwG4pdtWuUQ==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz", + "integrity": "sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/visitor-keys": "5.59.7", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -397,17 +480,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.7.tgz", - "integrity": "sha512-yCX9WpdQKaLufz5luG4aJbOpdXf/fjwGMcLFXZVPUz3QqLirG5QcwwnIHNf8cjLjxK4qtzTO8udUtMQSAToQnQ==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz", + "integrity": "sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.7", - "@typescript-eslint/types": "5.59.7", - "@typescript-eslint/typescript-estree": "5.59.7", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/typescript-estree": "5.61.0", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -423,12 +506,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.7", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.7.tgz", - "integrity": "sha512-tyN+X2jvMslUszIiYbF0ZleP+RqQsFVpGrKI6e0Eet1w8WmhsAtmzaqm8oM8WJQ1ysLwhnsK/4hYHJjOgJVfQQ==", + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", + "integrity": "sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.7", + "@typescript-eslint/types": "5.61.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -440,9 +523,9 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.9.0.tgz", + "integrity": "sha512-jaVNAFBHNLXspO543WnNNPZFRtavh3skAkITqD0/2aeMkKZTN+254PyhwxFYrk3vQ1xfY+2wbesJMs/JC8/PwQ==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -741,11 +824,14 @@ } }, "node_modules/dotenv": { - "version": "16.0.3", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz", - "integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz", + "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==", "engines": { "node": ">=12" + }, + "funding": { + "url": "https://github.com/motdotla/dotenv?sponsor=1" } }, "node_modules/err-code": { @@ -830,16 +916,16 @@ } }, "node_modules/eslint": { - "version": "8.41.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.41.0.tgz", - "integrity": "sha512-WQDQpzGBOP5IrXPo4Hc0814r4/v2rrIsB0rhT7jtunIalgg6gYXWhRMOejVO8yH21T/FGaxjmFjBMNqcIlmH1Q==", + "version": "8.45.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz", + "integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.41.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "ajv": "^6.10.0", @@ -850,7 +936,7 @@ "escape-string-regexp": "^4.0.0", "eslint-scope": "^7.2.0", "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", + "espree": "^9.6.0", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -860,7 +946,6 @@ "globals": "^13.19.0", "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", @@ -870,9 +955,8 @@ "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -914,16 +998,16 @@ } }, "node_modules/eslint-config-airbnb-typescript": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.0.0.tgz", - "integrity": "sha512-elNiuzD0kPAPTXjFWg+lE24nMdHMtuxgYoD30OyMD6yrW1AhFZPAg27VX7d3tzOErw+dgJTNWfRSDqEcXb4V0g==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-airbnb-typescript/-/eslint-config-airbnb-typescript-17.1.0.tgz", + "integrity": "sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==", "dev": true, "dependencies": { "eslint-config-airbnb-base": "^15.0.0" }, "peerDependencies": { - "@typescript-eslint/eslint-plugin": "^5.13.0", - "@typescript-eslint/parser": "^5.0.0", + "@typescript-eslint/eslint-plugin": "^5.13.0 || ^6.0.0", + "@typescript-eslint/parser": "^5.0.0 || ^6.0.0", "eslint": "^7.32.0 || ^8.2.0", "eslint-plugin-import": "^2.25.3" } @@ -1034,13 +1118,13 @@ } }, "node_modules/eslint-plugin-playwright": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.12.0.tgz", - "integrity": "sha512-KXuzQjVzca5irMT/7rvzJKsVDGbQr43oQPc8i+SLEBqmfrTxlwMwRqfv9vtZqh4hpU0jmrnA/EOfwtls+5QC1w==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.15.2.tgz", + "integrity": "sha512-Q2jQ7ORjZscvwxR6MEgITZy23vxlnYlJlMR7aICFczWVMijTCZPGvvMoZaLWkAzx5J6fciulwbg+JJeRjMkTig==", "dev": true, "peerDependencies": { "eslint": ">=7", - "eslint-plugin-jest": ">=24" + "eslint-plugin-jest": ">=25" }, "peerDependenciesMeta": { "eslint-plugin-jest": { @@ -1099,12 +1183,12 @@ } }, "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^3.4.1" }, @@ -1435,12 +1519,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -2019,17 +2097,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -2563,15 +2641,15 @@ } }, "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz", + "integrity": "sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw==", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/unbox-primitive": { @@ -2629,15 +2707,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index 092605ffc5..8b11bd842b 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -14,22 +14,22 @@ "dependencies": { "@playwright/test": "^1.34.2", "@types/luxon": "^3.3.0", - "dotenv": "^16.0.3", + "dotenv": "^16.3.1", "luxon": "^3.3.0", "playwright": "^1.33.0", "promise-retry": "^2.0.1", "shelljs": "^0.8.5", - "typescript": "^5.0.4" + "typescript": "^5.1.3" }, "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^5.59.7", - "@typescript-eslint/parser": "^5.59.7", - "eslint": "8.41", + "@typescript-eslint/eslint-plugin": "^5.61.0", + "@typescript-eslint/parser": "^5.62.0", + "eslint": "8.45", "eslint-config-airbnb-base": "^15.0.0", - "eslint-config-airbnb-typescript": "^17.0.0", + "eslint-config-airbnb-typescript": "^17.1.0", "eslint-plugin-import": "^2.27.5", - "eslint-plugin-playwright": "^0.12.0" + "eslint-plugin-playwright": "^0.15.2" } } diff --git a/dev/mongo-rs-backups/Dockerfile b/dev/mongo-rs-backups/Dockerfile new file mode 100644 index 0000000000..18981096ee --- /dev/null +++ b/dev/mongo-rs-backups/Dockerfile @@ -0,0 +1,10 @@ +FROM percona/percona-server-mongodb:4.2 + +USER root + +RUN yum install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm && \ + percona-release enable pbm release && \ + percona-release enable pmm2-client release + +RUN yum install -y percona-backup-mongodb pmm2-client + diff --git a/dev/mongo-rs-backups/Makefile b/dev/mongo-rs-backups/Makefile new file mode 100644 index 0000000000..ecb0ea36de --- /dev/null +++ b/dev/mongo-rs-backups/Makefile @@ -0,0 +1,62 @@ +PMM_SERVER_HOST?=pmm-server +PMM_NETWORK=?pmm_default + +.PHONY: default, bootstrap, build, up, setup-pbm-permissions, run-pbm-agents, setup-pmm-agents, run-pbm-agents, kill-pbm-agents, kill-pmm-agents, add-mongos, down +default: help + +help: ## Display this help message + @echo "Please use \`make \` where is one of:" + @grep '^[a-zA-Z]' $(MAKEFILE_LIST) | \ + awk -F ':.*?## ' 'NF==2 {printf " %-26s%s\n", $$1, $$2}' + +bootstrap: ## Full environment setup + make build + make up + make setup-pbm-permissions + make run-pbm-agents + make setup-pmm-agents + make run-pmm-agents + make add-mongos + +build: ## Docker image build + docker build . --tag mongo-backups + +up: ## Start required containers + docker compose up -d --wait + docker compose exec -T mongo1 mongo --nodb < rs-bootstrap.js + +setup-pbm-permissions: ## Setup PBM required permissions + docker compose exec -T mongo1 mongo --host=mongodb://localhost:27017/?replicaSet=rs0 < permissions.js + +run-pbm-agents: kill-pbm-agents ## Run PBM agents + docker compose exec -d mongo1 pbm-agent --mongodb-uri=mongodb://pbmuser:secretpwd@localhost:27017 + docker compose exec -d mongo2 pbm-agent --mongodb-uri=mongodb://pbmuser:secretpwd@localhost:27017 + docker compose exec -d mongo3 pbm-agent --mongodb-uri=mongodb://pbmuser:secretpwd@localhost:27017 + +setup-pmm-agents: ## Setup PMM agents + docker compose exec mongo1 pmm-agent setup --server-insecure-tls --server-address=$(PMM_SERVER_HOST) --server-username=admin --server-password=admin --force --config-file=/root/pmm-config + docker compose exec mongo2 pmm-agent setup --server-insecure-tls --server-address=$(PMM_SERVER_HOST) --server-username=admin --server-password=admin --force --config-file=/root/pmm-config + docker compose exec mongo3 pmm-agent setup --server-insecure-tls --server-address=$(PMM_SERVER_HOST) --server-username=admin --server-password=admin --force --config-file=/root/pmm-config + +run-pmm-agents: kill-pmm-agents ## Run PMM agents + docker compose exec -d mongo1 pmm-agent --config-file=/root/pmm-config + docker compose exec -d mongo2 pmm-agent --config-file=/root/pmm-config + docker compose exec -d mongo3 pmm-agent --config-file=/root/pmm-config + +kill-pbm-agents: ## Kill all PBM agents + docker compose exec -d mongo1 killall -9 pbm-agent + docker compose exec -d mongo2 killall -9 pbm-agent + docker compose exec -d mongo3 killall -9 pbm-agent + +kill-pmm-agents: ## Kill all PMM agents + docker compose exec -d mongo1 killall -9 pmm-agent + docker compose exec -d mongo2 killall -9 pmm-agent + docker compose exec -d mongo3 killall -9 pmm-agent + +add-mongos: ## Register MongoDB instances on PMM server + docker compose exec mongo1 pmm-admin add mongodb --cluster=test-cluster --service-name=mongo1 --host=mongo1 --port=27017 --server-url=http://admin:admin@$(PMM_SERVER_HOST)/ + docker compose exec mongo2 pmm-admin add mongodb --cluster=test-cluster --service-name=mongo2 --host=mongo2 --port=27017 --server-url=http://admin:admin@$(PMM_SERVER_HOST)/ + docker compose exec mongo3 pmm-admin add mongodb --cluster=test-cluster --service-name=mongo3 --host=mongo3 --port=27017 --server-url=http://admin:admin@$(PMM_SERVER_HOST)/ + +down: ## Shutdown environment + docker compose down diff --git a/dev/mongo-rs-backups/README.md b/dev/mongo-rs-backups/README.md new file mode 100644 index 0000000000..499bde2851 --- /dev/null +++ b/dev/mongo-rs-backups/README.md @@ -0,0 +1,25 @@ +## MongoDB replica set with PBM and PMM Agent + +This directory contains docker compose and scripts for Backups Dev environment bootstrap. This environment is based +on MongoDB replica set running in docker, as a result, it only supports logical backups/restores. + +### Usage + +Note: If your already have running PMM Server that wasn't started from this repo (devcontainer), then you +need to specify its container name and network with env variables `PMM_SERVER_HOST` and `PMM_NETWORK`. +You can check network name with this +command `docker inspect -f '{{range $k, $v := .NetworkSettings.Networks}}{{printf "%s\n" $k}}{{end}}'`. +Replace `` with your pmm server container name. + +```shell + # export PMM_SERVER_HOST=pmm-server + # export PMM_NETWORK=pmm_default + + make bootstrap +``` + +This command will build custom Docker image with MongoDB, PBM and PMM agents inside. All tools will be preconfigured, +PMM agents will be +registered on PMM server as well as MongoDB instances. + +To shutdown env just invoke `make down` \ No newline at end of file diff --git a/dev/mongo-rs-backups/docker-compose.yml b/dev/mongo-rs-backups/docker-compose.yml new file mode 100644 index 0000000000..458674b664 --- /dev/null +++ b/dev/mongo-rs-backups/docker-compose.yml @@ -0,0 +1,35 @@ +networks: + pmm_default: + name: pmm_default + +services: + mongo1: + hostname: mongo1 + container_name: mongo1 + image: mongo-backups + networks: + - ${PMM_NETWORK:-pmm_default} + expose: + - 27017 + restart: always + entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ] + mongo2: + hostname: mongo2 + container_name: mongo2 + image: mongo-backups + networks: + - ${PMM_NETWORK:-pmm_default} + expose: + - 27017 + restart: always + entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ] + mongo3: + hostname: mongo3 + container_name: mongo3 + image: mongo-backups + networks: + - ${PMM_NETWORK:-pmm_default} + expose: + - 27017 + restart: always + entrypoint: [ "/usr/bin/mongod", "--bind_ip_all", "--replSet", "rs0" ] diff --git a/dev/mongo-rs-backups/permissions.js b/dev/mongo-rs-backups/permissions.js new file mode 100644 index 0000000000..ff495226b8 --- /dev/null +++ b/dev/mongo-rs-backups/permissions.js @@ -0,0 +1,37 @@ +db.getSiblingDB("admin").createRole({ + "role": "pbmAnyAction", + "privileges": [{ + "resource": { + "anyResource": true + }, + "actions": ["anyAction"] + }], + "roles": [] +}); + +db.getSiblingDB("admin").createUser({ + user: "pbmuser", + "pwd": "secretpwd", + "roles": [{ + "db": "admin", + "role": "readWrite", + "collection": "" + }, + { + "db": "admin", + "role": "backup" + }, + { + "db": "admin", + "role": "clusterMonitor" + }, + { + "db": "admin", + "role": "restore" + }, + { + "db": "admin", + "role": "pbmAnyAction" + } + ] +}); diff --git a/dev/mongo-rs-backups/rs-bootstrap.js b/dev/mongo-rs-backups/rs-bootstrap.js new file mode 100644 index 0000000000..fe764493fe --- /dev/null +++ b/dev/mongo-rs-backups/rs-bootstrap.js @@ -0,0 +1,34 @@ +var conn, attempt; +while (conn === undefined) { + try { + conn = new Mongo("localhost:27017"); + } catch (Error) { + attempt++; + } + + if (attempt >= 50) { + print("Max connection attempts exceeded."); + break; + } + sleep(100); +} + +DB = conn.getDB("admin"); +DB.runCommand({ + replSetInitiate: { + _id: "rs0", + members: [{ + _id: 0, + host: "mongo1:27017" + }, + { + _id: 1, + host: "mongo2:27017" + }, + { + _id: 2, + host: "mongo3:27017" + } + ] + } +}); diff --git a/devcontainer.Dockerfile b/devcontainer.Dockerfile index 8c0addb822..03b258502e 100644 --- a/devcontainer.Dockerfile +++ b/devcontainer.Dockerfile @@ -4,9 +4,9 @@ FROM $PMM_SERVER_IMAGE ARG PMM_SERVER_IMAGE ARG GO_VERSION="1.20.x" -RUN echo "Building with: GO: ${GO_VERSION}, PMM: ${PMM_SERVER_IMAGE}" && \ - export GOPATH=$(go env GOPATH) && \ - export PATH="${GOPATH}/bin:${PATH}" +RUN echo "Building with: GO: $GO_VERSION, PMM: $PMM_SERVER_IMAGE" +ENV GOPATH=/root/go +ENV PATH="$PATH:$GOPATH/bin" RUN mkdir -p $GOPATH/src/github.com/percona/pmm WORKDIR $GOPATH/src/github.com/percona/pmm diff --git a/docker-compose.yml b/docker-compose.yml index a4242c5108..d516be2235 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,7 +1,7 @@ --- # version: '3.7' // Deprecated: see https://docs.docker.com/compose/compose-file/04-version-and-name/ services: - pmm-managed-server: + pmm-server: profiles: - pmm image: ${PMM_CONTAINER:-perconalab/pmm-server:dev-container} @@ -10,8 +10,8 @@ services: # args: # PMM_SERVER_IMAGE: ${PMM_SERVER_IMAGE:-perconalab/pmm-server:dev-latest} # dockerfile: devcontainer.Dockerfile - container_name: pmm-managed-server - hostname: pmm-managed-server + container_name: pmm-server + hostname: pmm-server networks: - ${NETWORK:-default} environment: @@ -109,14 +109,14 @@ services: hostname: ${CH_HOSTNAME:-ch} ports: - ${CH_PORT:-9000}:9000 - pmm-managed-server-ch: + pmm-server-ch: profiles: - pmm-ch depends_on: - ch image: ${PMM_CONTAINER:-perconalab/pmm-server:dev-container} - container_name: pmm-managed-server - hostname: pmm-managed-server + container_name: pmm-server + hostname: pmm-server networks: - ${NETWORK:-default} environment: @@ -208,8 +208,3 @@ services: volumes: go-modules: root-cache: - -networks: - minikube: - external: true - name: minikube diff --git a/go.mod b/go.mod index 71ae9392e5..b72f50d70e 100644 --- a/go.mod +++ b/go.mod @@ -20,12 +20,12 @@ require ( github.com/ClickHouse/clickhouse-go/151 v0.0.0-00010101000000-000000000000 github.com/ClickHouse/clickhouse-go/v2 v2.10.0 github.com/DATA-DOG/go-sqlmock v1.5.0 - github.com/alecthomas/kong v0.7.1 + github.com/alecthomas/kong v0.8.0 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 github.com/aws/aws-sdk-go v1.44.273 github.com/blang/semver v3.5.1+incompatible - github.com/brianvoe/gofakeit/v6 v6.21.0 + github.com/brianvoe/gofakeit/v6 v6.23.0 github.com/charmbracelet/bubbles v0.15.0 github.com/charmbracelet/bubbletea v0.24.0 github.com/charmbracelet/lipgloss v0.7.1 @@ -33,17 +33,17 @@ require ( github.com/docker/docker v23.0.4+incompatible github.com/docker/go-connections v0.4.0 github.com/envoyproxy/protoc-gen-validate v1.0.1 - github.com/go-co-op/gocron v1.28.2 + github.com/go-co-op/gocron v1.30.0 github.com/go-openapi/errors v0.20.3 github.com/go-openapi/runtime v0.26.0 github.com/go-openapi/strfmt v0.21.7 github.com/go-openapi/swag v0.22.3 github.com/go-openapi/validate v0.22.1 github.com/go-sql-driver/mysql v1.7.1 - github.com/golang-migrate/migrate/v4 v4.16.0 + github.com/golang-migrate/migrate/v4 v4.16.1 github.com/golang/protobuf v1.5.3 github.com/google/uuid v1.3.0 - github.com/grafana/grafana-api-golang-client v0.22.0 + github.com/grafana/grafana-api-golang-client v0.23.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 @@ -55,7 +55,7 @@ require ( github.com/operator-framework/api v0.17.6 github.com/operator-framework/operator-lifecycle-manager v0.24.0 github.com/percona-platform/dbaas-api v0.0.0-20230103182808-d79c449a9f4c - github.com/percona-platform/saas v0.0.0-20230306173543-c223f9a47342 + github.com/percona-platform/saas v0.0.0-20230713134421-bb403194c5f7 github.com/percona/dbaas-operator v0.1.6 github.com/percona/exporter_shared v0.7.4 github.com/percona/go-mysql v0.0.0-20210427141028-73d29c6da78c @@ -65,24 +65,24 @@ require ( github.com/pkg/errors v0.9.1 github.com/pmezard/go-difflib v1.0.0 github.com/prometheus/alertmanager v0.25.0 - github.com/prometheus/client_golang v1.15.1 + github.com/prometheus/client_golang v1.16.0 github.com/prometheus/common v0.44.0 github.com/ramr/go-reaper v0.2.1 github.com/robfig/cron/v3 v3.0.1 - github.com/sirupsen/logrus v1.9.2 + github.com/sirupsen/logrus v1.9.3 github.com/stretchr/objx v0.5.0 github.com/stretchr/testify v1.8.4 - go.mongodb.org/mongo-driver v1.11.6 - go.starlark.net v0.0.0-20220328144851-d1966c6b9fcd - golang.org/x/crypto v0.9.0 - golang.org/x/sync v0.2.0 - golang.org/x/sys v0.8.0 - golang.org/x/text v0.9.0 - golang.org/x/tools v0.9.3 + go.mongodb.org/mongo-driver v1.12.0 + go.starlark.net v0.0.0-20230717150657-8a3343210976 + golang.org/x/crypto v0.11.0 + golang.org/x/sync v0.3.0 + golang.org/x/sys v0.10.0 + golang.org/x/text v0.11.0 + golang.org/x/tools v0.11.0 google.golang.org/genproto/googleapis/api v0.0.0-20230530153820-e85fd2cbaebc google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc - google.golang.org/grpc v1.56.0-dev - google.golang.org/protobuf v1.30.0 + google.golang.org/grpc v1.57.0-dev + google.golang.org/protobuf v1.31.0 gopkg.in/alecthomas/kingpin.v2 v2.2.6 gopkg.in/reform.v1 v1.5.1 gopkg.in/yaml.v3 v3.0.1 @@ -92,7 +92,7 @@ require ( k8s.io/cli-runtime v0.27.2 k8s.io/client-go v0.27.2 k8s.io/kubectl v0.27.2 - modernc.org/sqlite v1.22.1 + modernc.org/sqlite v1.24.0 sigs.k8s.io/controller-runtime v0.14.6 ) @@ -131,9 +131,9 @@ require ( github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab // indirect github.com/sergi/go-diff v1.2.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/tidwall/pretty v1.2.0 // indirect github.com/xlab/treeprint v1.1.0 // indirect go.uber.org/atomic v1.10.0 // indirect + golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 // indirect golang.org/x/time v0.3.0 // indirect google.golang.org/genproto v0.0.0-20230526203410-71b5a4ffd15e // indirect gopkg.in/inf.v0 v0.9.1 // indirect @@ -158,10 +158,10 @@ require ( ) require ( - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0-beta.2 // indirect github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect - github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.7.1 + github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.8.0 github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect github.com/ClickHouse/ch-go v0.52.1 // indirect github.com/ClickHouse/clickhouse-go v1.5.4 // indirect @@ -237,7 +237,7 @@ require ( github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect github.com/prometheus/exporter-toolkit v0.8.2 // indirect - github.com/prometheus/procfs v0.9.0 // indirect + github.com/prometheus/procfs v0.10.1 // indirect github.com/rivo/uniseg v0.2.0 // indirect github.com/rs/xid v1.5.0 // indirect github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect @@ -246,15 +246,15 @@ require ( github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect - github.com/xdg-go/scram v1.1.1 // indirect - github.com/xdg-go/stringprep v1.0.3 // indirect + github.com/xdg-go/scram v1.1.2 // indirect + github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect go.opentelemetry.io/otel v1.14.0 // indirect go.opentelemetry.io/otel/trace v1.14.0 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.10.0 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.12.0 // indirect golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/term v0.8.0 // indirect + golang.org/x/term v0.10.0 // indirect google.golang.org/appengine v1.6.7 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gotest.tools/v3 v3.3.0 // indirect diff --git a/go.sum b/go.sum index 480835219b..26ee0f7b04 100644 --- a/go.sum +++ b/go.sum @@ -37,14 +37,14 @@ github.com/AlekSi/pointer v1.2.0 h1:glcy/gc4h8HnG2Z3ZECSzZ1IX1x2JxRVuDzaJwQE0+w= github.com/AlekSi/pointer v1.2.0/go.mod h1:gZGfd3dpW4vEc/UlyfKKi1roIqcCgwOIvb0tSNSBle0= github.com/Azure/azure-pipeline-go v0.2.3 h1:7U9HBg1JFK3jHl5qmo4CTZKFTVgMwdFHMVtCdfBE21U= github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl2bqk7S3ta6S6u4k= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0 h1:8kDqDngH+DmVBiCtIjCFTGa7MBnsIOkF9IccInFEbjk= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.6.0/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0-beta.2 h1:C3zKsGguxcLd8a2uEytB8+TFtBGd75bXRxEs0QBwsv0= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.7.0-beta.2/go.mod h1:bjGvMhVMb+EEm3VRNQawDMUyMMjo+S5ewNjflkep/0Q= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0 h1:vcYCAze6p19qBW7MhZybIsqD8sMV8js0NyQM8JDnVtg= github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.3.0/go.mod h1:OQeznEEkTZ9OrhHJoDD8ZDq51FHgXjqtP9z6bEwBq9U= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 h1:sXr+ck84g/ZlZUOZiNELInmMgOsuGwdjjVkEIde0OtY= github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0/go.mod h1:okt5dMMTOFjX/aovMlrjvvXoPMBVSPzk9185BT0+eZM= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.7.1 h1:eoQrCw9DMThzbJ32fHXZtISnURk6r0TozXiWuTsay5s= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.7.1/go.mod h1:21rlzm+SuYrS9ARS92XEGxcHQeLVDcaY2YV30rHjSd4= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.8.0 h1:+fxpya1I3WJEvl+qzET7NO2MkjtYkiZJxIcEN690W64= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.8.0/go.mod h1:1wZ2sD5NUZGEk/RVNxjBFPqVHC39ekUDtmNnWhKhrGY= github.com/Azure/azure-storage-blob-go v0.13.0/go.mod h1:pA9kNqtjUeQF2zOSu4s//nUdBD+e64lEuc4sVnuOfNs= github.com/Azure/azure-storage-blob-go v0.14.0 h1:1BCg74AmVdYwO3dlKwtFU1V0wU2PZdREkXvAmZJRUlM= github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= @@ -93,8 +93,8 @@ github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBK github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/assert/v2 v2.1.0 h1:tbredtNcQnoSd3QBhQWI7QZ3XHOVkw1Moklp2ojoH/0= github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= -github.com/alecthomas/kong v0.7.1 h1:azoTh0IOfwlAX3qN9sHWTxACE2oV8Bg2gAwBsMwDQY4= -github.com/alecthomas/kong v0.7.1/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U= +github.com/alecthomas/kong v0.8.0 h1:ryDCzutfIqJPnNn0omnrgHLbAggDQM2VWHikE1xqK7s= +github.com/alecthomas/kong v0.8.0/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U= github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= @@ -141,8 +141,8 @@ 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/brianvoe/gofakeit v3.18.0+incompatible h1:wDOmHc9DLG4nRjUVVaxA+CEglKOW72Y5+4WNxUIkjM8= github.com/brianvoe/gofakeit v3.18.0+incompatible/go.mod h1:kfwdRA90vvNhPutZWfH7WPaDzUjz+CZFqG+rPkOjGOc= -github.com/brianvoe/gofakeit/v6 v6.21.0 h1:tNkm9yxEbpuPK8Bx39tT4sSc5i9SUGiciLdNix+VDQY= -github.com/brianvoe/gofakeit/v6 v6.21.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8= +github.com/brianvoe/gofakeit/v6 v6.23.0 h1:pgVhyWpYq4e0GEVCh2gdZnS/nBX+8SnyTBliHg5xjks= +github.com/brianvoe/gofakeit/v6 v6.23.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8= github.com/buger/jsonparser v1.1.1/go.mod h1:6RYKKt7H4d4+iWqouImQ9R2FZql3VbhNgx27UK13J/0= github.com/cenkalti/backoff/v4 v4.2.0 h1:HN5dHm3WBOgndBH6E8V0q2jIYIR3s9yglV8k/+MN3u4= github.com/cenkalti/backoff/v4 v4.2.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= @@ -223,8 +223,8 @@ github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD github.com/frankban/quicktest v1.5.0/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/go-co-op/gocron v1.28.2 h1:H9oHUGH+9HZ5mAorbnzRjzXLf4poP+ctZdbtaKRYagc= -github.com/go-co-op/gocron v1.28.2/go.mod h1:39f6KNSGVOU1LO/ZOoZfcSxwlsJDQOKSu8erN0SH48Y= +github.com/go-co-op/gocron v1.30.0 h1:7nDCO++3HqQb+gSyd0NWRjsNbyPcK9cKVepBQWWaP6E= +github.com/go-co-op/gocron v1.30.0/go.mod h1:39f6KNSGVOU1LO/ZOoZfcSxwlsJDQOKSu8erN0SH48Y= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= @@ -329,8 +329,8 @@ github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= -github.com/golang-migrate/migrate/v4 v4.16.0 h1:FU2GR7EdAO0LmhNLcKthfDzuYCtMcWNR7rUbZjsgH3o= -github.com/golang-migrate/migrate/v4 v4.16.0/go.mod h1:qXiwa/3Zeqaltm1MxOCZDYysW/F6folYiBgBG03l9hc= +github.com/golang-migrate/migrate/v4 v4.16.1 h1:O+0C55RbMN66pWm5MjO6mw0px6usGpY0+bkSGW9zCo0= +github.com/golang-migrate/migrate/v4 v4.16.1/go.mod h1:qXiwa/3Zeqaltm1MxOCZDYysW/F6folYiBgBG03l9hc= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZkZR4hgp4KJVfY3nMkvmwbVkpv1rVY= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= @@ -414,8 +414,8 @@ github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+ github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gopherjs/gopherjs v0.0.0-20190430165422-3e4dfb77656c/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/grafana/grafana-api-golang-client v0.22.0 h1:igOpT90S9zxmNkDCHvfKQ39TBRtJJBjF9eSGjZ7pHeI= -github.com/grafana/grafana-api-golang-client v0.22.0/go.mod h1:24W29gPe9yl0/3A9X624TPkAOR8DpHno490cPwnkv8E= +github.com/grafana/grafana-api-golang-client v0.23.0 h1:Uta0dSkxWYf1D83/E7MRLCG69387FiUc+k9U/35nMhY= +github.com/grafana/grafana-api-golang-client v0.23.0/go.mod h1:24W29gPe9yl0/3A9X624TPkAOR8DpHno490cPwnkv8E= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= @@ -645,8 +645,8 @@ github.com/percona-lab/crypto v0.0.0-20220811043533-d164de3c7f08 h1:NprWeXddFZJS github.com/percona-lab/crypto v0.0.0-20220811043533-d164de3c7f08/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= github.com/percona-platform/dbaas-api v0.0.0-20230103182808-d79c449a9f4c h1:1JySfwdjVfc9ahl0466OX7nSQ7Z4SjQkLe3ZdLkMOJI= github.com/percona-platform/dbaas-api v0.0.0-20230103182808-d79c449a9f4c/go.mod h1:/jgle33awfHq1va/T6NnNS5wWAETSnl6wUZ1bew+CJ0= -github.com/percona-platform/saas v0.0.0-20230306173543-c223f9a47342 h1:ilguq4u7k08QxS3UDYINt8x6+AOgB0wZApd1o4IK8rQ= -github.com/percona-platform/saas v0.0.0-20230306173543-c223f9a47342/go.mod h1:gFUwaFp6Ugu5qsBwiOVJYbDlzgZ77tmXdXGO7tG5xVI= +github.com/percona-platform/saas v0.0.0-20230713134421-bb403194c5f7 h1:9XwfsWsQjWLWZpm9ouuAMZGZ3g4bT4pt0E/fr0Tc/Vo= +github.com/percona-platform/saas v0.0.0-20230713134421-bb403194c5f7/go.mod h1:lZuFcqj0EoQWx28SYkTcdhJOCQEbRcAyahYPfRMY7tc= github.com/percona/dbaas-operator v0.1.6 h1:NsZXDKcPXk38kET+X6r8Es+3Supyu5XJZMS0gqPejKs= github.com/percona/dbaas-operator v0.1.6/go.mod h1:52B/kh+Jmtfv0JiZgDcc34qgbwwEi9U4A3311JBxIZg= github.com/percona/exporter_shared v0.7.4 h1:S+xnfK/CySiYqr4XqLiLAfO3rxgEOUFK+m6lCBi3mgc= @@ -686,8 +686,8 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= -github.com/prometheus/client_golang v1.15.1 h1:8tXpTmJbyH5lydzFPoxSIJ0J46jdh3tylbvM1xCv0LI= -github.com/prometheus/client_golang v1.15.1/go.mod h1:e9yaBhRPU2pPNsZwE+JdQl0KEt1N9XgF6zxWmaC0xOk= +github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= +github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= 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= @@ -711,8 +711,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/procfs v0.9.0 h1:wzCHvIvM5SxWqYvwgVL7yJY8Lz3PKn49KQtpgMYJfhI= -github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= +github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= +github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/ramr/go-reaper v0.2.1 h1:zww+wlQOvTjBZuk1920R/e0GFEb6O7+B0WQLV6dM924= github.com/ramr/go-reaper v0.2.1/go.mod h1:AVypdzrcCXjSc/JYnlXl8TsB+z84WyFzxWE8Jh0MOJc= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -754,8 +754,8 @@ github.com/sirupsen/logrus v1.4.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPx github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= -github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -782,17 +782,17 @@ github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= -github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= -github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= -github.com/xdg-go/scram v1.1.1 h1:VOMT+81stJgXW3CpHyqHN3AXDYIMsx56mEFrB37Mb/E= github.com/xdg-go/scram v1.1.1/go.mod h1:RaEWvsqvNKKvBPvcKeFjrG2cJqOkHTiyTpzz23ni57g= +github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= +github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= -github.com/xdg-go/stringprep v1.0.3 h1:kdwGpVNwPFtjs98xCGkHjQtGKh86rDcRZN17QEMCOIs= github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8= +github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= +github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= @@ -813,8 +813,8 @@ go.mongodb.org/mongo-driver v1.7.3/go.mod h1:NqaYOwnXWr5Pm7AOpO5QFxKJ503nbMse/R7 go.mongodb.org/mongo-driver v1.7.5/go.mod h1:VXEWRZ6URJIkUq2SCAyapmhH0ZLRBP+FT4xhp5Zvxng= go.mongodb.org/mongo-driver v1.10.0/go.mod h1:wsihk0Kdgv8Kqu1Anit4sfK+22vSFbUrAVEYRhCXrA8= go.mongodb.org/mongo-driver v1.11.1/go.mod h1:s7p5vEtfbeR1gYi6pnj3c3/urpbLv2T5Sfd6Rp2HBB8= -go.mongodb.org/mongo-driver v1.11.6 h1:XM7G6PjiGAO5betLF13BIa5TlLUUE3uJ/2Ox3Lz1K+o= -go.mongodb.org/mongo-driver v1.11.6/go.mod h1:G9TgswdsWjX4tmDA5zfs2+6AEPpYJwqblyjsfuh8oXY= +go.mongodb.org/mongo-driver v1.12.0 h1:aPx33jmn/rQuJXPQLZQ8NtfPQG8CaqgLThFtqRb0PiE= +go.mongodb.org/mongo-driver v1.12.0/go.mod h1:AZkxhPnFJUoH7kZlFkVKucV20K387miPfm7oimrSmK0= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -826,8 +826,8 @@ go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvx go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.starlark.net v0.0.0-20220328144851-d1966c6b9fcd h1:Uo/x0Ir5vQJ+683GXB9Ug+4fcjsbp7z7Ul8UaZbhsRM= -go.starlark.net v0.0.0-20220328144851-d1966c6b9fcd/go.mod h1:t3mmBBPzAVvK0L0n1drDmrQsJ8FoIx4INCqVMTr/Zo0= +go.starlark.net v0.0.0-20230717150657-8a3343210976 h1:7ljYNcZU84T2N0tZdDgvL7U3M4iFmglAUUU1gRFE/2Q= +go.starlark.net v0.0.0-20230717150657-8a3343210976/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= @@ -850,7 +850,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0 h1:pVgRXcIictcr+lBQIFeiwuwtDIs4eL21OuM9nyAADmo= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -874,8 +875,8 @@ 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.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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= @@ -916,8 +917,8 @@ golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -939,8 +940,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1001,13 +1002,14 @@ golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1017,9 +1019,11 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1080,8 +1084,8 @@ golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= +golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= 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= @@ -1169,8 +1173,8 @@ google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.56.0-dev h1:3XdSkn+E4E0OxKEID50paHDwVA7cqZVolkHtMFaoQJA= -google.golang.org/grpc v1.56.0-dev/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= +google.golang.org/grpc v1.57.0-dev h1:XCvzqke2TBzQUs3a1MO1VsqVkWeAdJ/KmxHCAVtPpe8= +google.golang.org/grpc v1.57.0-dev/go.mod h1:ZPf89/axrdgRDfHqb7fa0GF5t4VUER0vWnqnPNuRP7k= 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= @@ -1184,8 +1188,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1259,8 +1263,8 @@ modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.22.1 h1:P2+Dhp5FR1RlVRkQ3dDfCiv3Ok8XPxqpe70IjYVA9oE= -modernc.org/sqlite v1.22.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= +modernc.org/sqlite v1.24.0 h1:EsClRIWHGhLTCX44p+Ri/JLD+vFGo0QGjasg2/F9TlI= +modernc.org/sqlite v1.24.0/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk= modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= diff --git a/managed/CONTRIBUTING.md b/managed/CONTRIBUTING.md index 81a37aa86e..710d9dca10 100644 --- a/managed/CONTRIBUTING.md +++ b/managed/CONTRIBUTING.md @@ -24,7 +24,7 @@ Please use `make ` where is one of: ``` $ make env TARGET=help -docker exec -it --workdir=/root/go/src/github.com/percona/pmm-managed pmm-managed-server make help +docker exec -it --workdir=/root/go/src/github.com/percona/pmm-managed pmm-server make help Please use `make ` where is one of: gen Generate files. install Install pmm-managed binary. @@ -39,9 +39,9 @@ Alternatively, it is possible to run `make env` to get inside the devcontainer a ``` $ make env -docker exec -it --workdir=/root/go/src/github.com/percona/pmm-managed pmm-managed-server make _bash +docker exec -it --workdir=/root/go/src/github.com/percona/pmm-managed pmm-server make _bash /bin/bash -[root@pmm-managed-server pmm-managed]# make test +[root@pmm-server pmm-managed]# make test make[1]: Entering directory `/root/go/src/github.com/percona/pmm-managed' go test -timeout=30s -p 1 ./... ... diff --git a/managed/Makefile b/managed/Makefile index 9412255408..5c3722002d 100644 --- a/managed/Makefile +++ b/managed/Makefile @@ -36,6 +36,10 @@ release: ## Build pmm-managed release binaries env CGO_ENABLED=0 go build -v $(PMM_LD_FLAGS) -o $(PMM_RELEASE_PATH)/ ./cmd/... $(PMM_RELEASE_PATH)/pmm-managed --version +release-starlark: + env CGO_ENABLED=0 go build -v $(PMM_LD_FLAGS) -o $(PMM_RELEASE_PATH)/ ./cmd/pmm-managed-starlark/... + $(PMM_RELEASE_PATH)/pmm-managed-starlark --version + ARCH=$(shell uname -m) release-dev: ## Build pmm-managed binaries for development if [ $(ARCH) = "aarch64" ]; then \ diff --git a/managed/cmd/pmm-managed-starlark/main.go b/managed/cmd/pmm-managed-starlark/main.go index 07c72fe9ed..5c23efab3e 100644 --- a/managed/cmd/pmm-managed-starlark/main.go +++ b/managed/cmd/pmm-managed-starlark/main.go @@ -41,10 +41,10 @@ const ( cpuLimit = 4 * time.Second memoryLimitBytes = 1024 * 1024 * 1024 - // only used for testing. + // Only used for testing. starlarkRecursionFlag = "PERCONA_TEST_STARLARK_ALLOW_RECURSION" - // warning messages. + // Warning messages. cpuUsageWarning = "Failed to limit CPU usage" memoryUsageWarning = "Failed to limit memory usage" ) diff --git a/managed/cmd/pmm-managed-starlark/main_test.go b/managed/cmd/pmm-managed-starlark/main_test.go index f53c75620f..1eaa23d17b 100644 --- a/managed/cmd/pmm-managed-starlark/main_test.go +++ b/managed/cmd/pmm-managed-starlark/main_test.go @@ -17,10 +17,12 @@ package main import ( "bytes" + "context" "encoding/json" "os" "os/exec" "testing" + "time" "github.com/percona-platform/saas/pkg/check" "github.com/stretchr/testify/assert" @@ -47,7 +49,7 @@ var validQueryActionResult = []map[string]interface{}{ {"Value": "-log", "Variable_name": "version_suffix"}, } -func TestStarlarkSandbox(t *testing.T) { +func TestStarlarkSandbox(t *testing.T) { //nolint:tparallel testCases := []struct { name string script string @@ -103,8 +105,13 @@ func TestStarlarkSandbox(t *testing.T) { }, } + ctx, cancel := context.WithTimeout(context.Background(), 120*time.Second) + t.Cleanup(cancel) // since we run the binary as a child process to test it we need to build it first. - err := exec.Command("make", "-C", "../..", "release").Run() + command := exec.CommandContext(ctx, "make", "-C", "../..", "release-starlark") + command.Stdout = os.Stdout + command.Stderr = os.Stderr + err := command.Run() require.NoError(t, err) for _, tc := range testCases { diff --git a/managed/cmd/pmm-managed/main.go b/managed/cmd/pmm-managed/main.go index fd9dd728ef..962cd55166 100644 --- a/managed/cmd/pmm-managed/main.go +++ b/managed/cmd/pmm-managed/main.go @@ -656,7 +656,7 @@ func newClickhouseDB(dsn string, maxIdleConns, maxOpenConns int) (*sql.DB, error return db, nil } -func main() { //nolint:cyclop +func main() { //nolint:cyclop,maintidx // empty version breaks much of pmm-managed logic if version.Version == "" { panic("pmm-managed version is not set during build.") @@ -827,6 +827,10 @@ func main() { //nolint:cyclop backupRetentionService := backup.NewRetentionService(db, backupRemovalService) prom.MustRegister(agentsRegistry) + inventoryMetrics := inventory.NewInventoryMetrics(db, agentsRegistry) + inventoryMetricsCollector := inventory.NewInventoryMetricsCollector(inventoryMetrics) + prom.MustRegister(inventoryMetricsCollector) + connectionCheck := agents.NewConnectionChecker(agentsRegistry) alertManager := alertmanager.New(db) diff --git a/managed/data/iatemplates/agent_down.yml b/managed/data/iatemplates/agent_down.yml new file mode 100644 index 0000000000..e913696f6e --- /dev/null +++ b/managed/data/iatemplates/agent_down.yml @@ -0,0 +1,13 @@ +--- +templates: + - name: pmm_agent_down + version: 1 + summary: PMM agent down + expr: 'pmm_managed_inventory_agents{agent_type="pmm-agent"} == bool 0 ' + for: 1m + severity: critical + annotations: + description: |- + PMM agent on node '{{ $labels.node_id }}' cannot be reached. Host may be down. + summary: PMM agent on node '{{ $labels.node_id }}' cannot be reached. Host may be down. + diff --git a/managed/data/iatemplates/mysql_replication_io_running.yml b/managed/data/iatemplates/mysql_replication_io_running.yml index a21f7c21f3..d9e895089c 100644 --- a/managed/data/iatemplates/mysql_replication_io_running.yml +++ b/managed/data/iatemplates/mysql_replication_io_running.yml @@ -11,5 +11,4 @@ templates: description: |- MySQL Replication Not Running on {{ $labels.instance }} VALUE = {{ $value }} - LABELS: {{ $labels }} summary: MySQL Replication Not Running on (instance {{ $labels.instance }}) diff --git a/managed/data/iatemplates/mysql_replication_sql_running.yml b/managed/data/iatemplates/mysql_replication_sql_running.yml index 194f5fd176..6b312deecf 100644 --- a/managed/data/iatemplates/mysql_replication_sql_running.yml +++ b/managed/data/iatemplates/mysql_replication_sql_running.yml @@ -11,5 +11,4 @@ templates: description: |- MySQL Replication Not Running on {{ $labels.instance }} VALUE = {{ $value }} - LABELS: {{ $labels }} summary: MySQL Replication Not Running on (instance {{ $labels.instance }}) diff --git a/managed/models/agent_helpers.go b/managed/models/agent_helpers.go index 59e1c93ac4..21df05d004 100644 --- a/managed/models/agent_helpers.go +++ b/managed/models/agent_helpers.go @@ -716,6 +716,7 @@ type CreateAgentParams struct { TableCountTablestatsGroupLimit int32 MaxQueryLength int32 QueryExamplesDisabled bool + CommentsParsingDisabled bool MaxQueryLogSize int64 AWSAccessKey string AWSSecretKey string @@ -864,6 +865,7 @@ func CreateAgent(q *reform.Querier, agentType AgentType, params *CreateAgentPara TableCountTablestatsGroupLimit: params.TableCountTablestatsGroupLimit, MaxQueryLength: params.MaxQueryLength, QueryExamplesDisabled: params.QueryExamplesDisabled, + CommentsParsingDisabled: params.CommentsParsingDisabled, MaxQueryLogSize: params.MaxQueryLogSize, AWSAccessKey: pointer.ToStringOrNil(params.AWSAccessKey), AWSSecretKey: pointer.ToStringOrNil(params.AWSSecretKey), diff --git a/managed/models/agent_model.go b/managed/models/agent_model.go index ffd7485b5e..1ae1cb2d22 100644 --- a/managed/models/agent_model.go +++ b/managed/models/agent_model.go @@ -180,11 +180,12 @@ type Agent struct { // See IsMySQLTablestatsGroupEnabled method. TableCountTablestatsGroupLimit int32 `reform:"table_count_tablestats_group_limit"` - MaxQueryLength int32 `reform:"max_query_length"` - QueryExamplesDisabled bool `reform:"query_examples_disabled"` - MaxQueryLogSize int64 `reform:"max_query_log_size"` - MetricsPath *string `reform:"metrics_path"` - MetricsScheme *string `reform:"metrics_scheme"` + MaxQueryLength int32 `reform:"max_query_length"` + QueryExamplesDisabled bool `reform:"query_examples_disabled"` + CommentsParsingDisabled bool `reform:"comments_parsing_disabled"` + MaxQueryLogSize int64 `reform:"max_query_log_size"` + MetricsPath *string `reform:"metrics_path"` + MetricsScheme *string `reform:"metrics_scheme"` RDSBasicMetricsDisabled bool `reform:"rds_basic_metrics_disabled"` RDSEnhancedMetricsDisabled bool `reform:"rds_enhanced_metrics_disabled"` @@ -297,7 +298,7 @@ func (s *Agent) DBConfig(service *Service) *DBConfig { } // DSN returns DSN string for accessing given Service with this Agent (and implicit driver). -func (s *Agent) DSN(service *Service, dialTimeout time.Duration, database string, tdp *DelimiterPair) string { //nolint:cyclop +func (s *Agent) DSN(service *Service, dialTimeout time.Duration, database string, tdp *DelimiterPair) string { //nolint:cyclop,maintidx host := pointer.GetString(service.Address) port := pointer.GetUint16(service.Port) socket := pointer.GetString(service.Socket) diff --git a/managed/models/agent_model_reform.go b/managed/models/agent_model_reform.go index 32071169c7..056057a5af 100644 --- a/managed/models/agent_model_reform.go +++ b/managed/models/agent_model_reform.go @@ -54,6 +54,7 @@ func (v *agentTableType) Columns() []string { "table_count_tablestats_group_limit", "max_query_length", "query_examples_disabled", + "comments_parsing_disabled", "max_query_log_size", "metrics_path", "metrics_scheme", @@ -115,6 +116,7 @@ var AgentTable = &agentTableType{ {Name: "TableCountTablestatsGroupLimit", Type: "int32", Column: "table_count_tablestats_group_limit"}, {Name: "MaxQueryLength", Type: "int32", Column: "max_query_length"}, {Name: "QueryExamplesDisabled", Type: "bool", Column: "query_examples_disabled"}, + {Name: "CommentsParsingDisabled", Type: "bool", Column: "comments_parsing_disabled"}, {Name: "MaxQueryLogSize", Type: "int64", Column: "max_query_log_size"}, {Name: "MetricsPath", Type: "*string", Column: "metrics_path"}, {Name: "MetricsScheme", Type: "*string", Column: "metrics_scheme"}, @@ -134,7 +136,7 @@ var AgentTable = &agentTableType{ // String returns a string representation of this struct or record. func (s Agent) String() string { - res := make([]string, 37) + res := make([]string, 38) res[0] = "AgentID: " + reform.Inspect(s.AgentID, true) res[1] = "AgentType: " + reform.Inspect(s.AgentType, true) res[2] = "RunsOnNodeID: " + reform.Inspect(s.RunsOnNodeID, true) @@ -161,17 +163,18 @@ func (s Agent) String() string { res[23] = "TableCountTablestatsGroupLimit: " + reform.Inspect(s.TableCountTablestatsGroupLimit, true) res[24] = "MaxQueryLength: " + reform.Inspect(s.MaxQueryLength, true) res[25] = "QueryExamplesDisabled: " + reform.Inspect(s.QueryExamplesDisabled, true) - res[26] = "MaxQueryLogSize: " + reform.Inspect(s.MaxQueryLogSize, true) - res[27] = "MetricsPath: " + reform.Inspect(s.MetricsPath, true) - res[28] = "MetricsScheme: " + reform.Inspect(s.MetricsScheme, true) - res[29] = "RDSBasicMetricsDisabled: " + reform.Inspect(s.RDSBasicMetricsDisabled, true) - res[30] = "RDSEnhancedMetricsDisabled: " + reform.Inspect(s.RDSEnhancedMetricsDisabled, true) - res[31] = "PushMetrics: " + reform.Inspect(s.PushMetrics, true) - res[32] = "DisabledCollectors: " + reform.Inspect(s.DisabledCollectors, true) - res[33] = "MySQLOptions: " + reform.Inspect(s.MySQLOptions, true) - res[34] = "MongoDBOptions: " + reform.Inspect(s.MongoDBOptions, true) - res[35] = "PostgreSQLOptions: " + reform.Inspect(s.PostgreSQLOptions, true) - res[36] = "LogLevel: " + reform.Inspect(s.LogLevel, true) + res[26] = "CommentsParsingDisabled: " + reform.Inspect(s.CommentsParsingDisabled, true) + res[27] = "MaxQueryLogSize: " + reform.Inspect(s.MaxQueryLogSize, true) + res[28] = "MetricsPath: " + reform.Inspect(s.MetricsPath, true) + res[29] = "MetricsScheme: " + reform.Inspect(s.MetricsScheme, true) + res[30] = "RDSBasicMetricsDisabled: " + reform.Inspect(s.RDSBasicMetricsDisabled, true) + res[31] = "RDSEnhancedMetricsDisabled: " + reform.Inspect(s.RDSEnhancedMetricsDisabled, true) + res[32] = "PushMetrics: " + reform.Inspect(s.PushMetrics, true) + res[33] = "DisabledCollectors: " + reform.Inspect(s.DisabledCollectors, true) + res[34] = "MySQLOptions: " + reform.Inspect(s.MySQLOptions, true) + res[35] = "MongoDBOptions: " + reform.Inspect(s.MongoDBOptions, true) + res[36] = "PostgreSQLOptions: " + reform.Inspect(s.PostgreSQLOptions, true) + res[37] = "LogLevel: " + reform.Inspect(s.LogLevel, true) return strings.Join(res, ", ") } @@ -205,6 +208,7 @@ func (s *Agent) Values() []interface{} { s.TableCountTablestatsGroupLimit, s.MaxQueryLength, s.QueryExamplesDisabled, + s.CommentsParsingDisabled, s.MaxQueryLogSize, s.MetricsPath, s.MetricsScheme, @@ -249,6 +253,7 @@ func (s *Agent) Pointers() []interface{} { &s.TableCountTablestatsGroupLimit, &s.MaxQueryLength, &s.QueryExamplesDisabled, + &s.CommentsParsingDisabled, &s.MaxQueryLogSize, &s.MetricsPath, &s.MetricsScheme, diff --git a/managed/models/artifact_helpers.go b/managed/models/artifact_helpers.go index 382d153bf0..e518845e61 100644 --- a/managed/models/artifact_helpers.go +++ b/managed/models/artifact_helpers.go @@ -36,6 +36,8 @@ type ArtifactFilters struct { ScheduleID string // Return only artifacts by specified status. Status BackupStatus + // Filters by folder. + Folder *string } // FindArtifacts returns artifact list sorted by creation time in DESCENDING order. @@ -67,6 +69,13 @@ func FindArtifacts(q *reform.Querier, filters ArtifactFilters) ([]*Artifact, err if filters.Status != "" { conditions = append(conditions, fmt.Sprintf("status = %s", q.Placeholder(idx))) args = append(args, filters.Status) + idx++ + } + + if filters.Folder != nil { + conditions = append(conditions, fmt.Sprintf("folder = %s", q.Placeholder(idx))) + args = append(args, *filters.Folder) + // idx++ } var whereClause string diff --git a/managed/models/artifact_helpers_test.go b/managed/models/artifact_helpers_test.go index e459e7c6a7..a7ba3b423f 100644 --- a/managed/models/artifact_helpers_test.go +++ b/managed/models/artifact_helpers_test.go @@ -167,10 +167,23 @@ func TestArtifacts(t *testing.T) { Mode: models.Snapshot, } + params3 := models.CreateArtifactParams{ + Name: "backup_name_3", + Vendor: "mongodb", + LocationID: locationID2, + ServiceID: serviceID2, + DataModel: models.LogicalDataModel, + Status: models.SuccessBackupStatus, + Mode: models.Snapshot, + Folder: "some_folder", + } + a1, err := models.CreateArtifact(q, params1) require.NoError(t, err) a2, err := models.CreateArtifact(q, params2) require.NoError(t, err) + a3, err := models.CreateArtifact(q, params3) + require.NoError(t, err) actual, err := models.FindArtifacts(q, models.ArtifactFilters{}) require.NoError(t, err) @@ -188,6 +201,19 @@ func TestArtifacts(t *testing.T) { assert.Condition(t, found(a1.ID), "The first artifact not found") assert.Condition(t, found(a2.ID), "The second artifact not found") + + // Check artifacts can be found by folder. + actual2, err := models.FindArtifacts(q, models.ArtifactFilters{Folder: &a3.Folder}) + require.NoError(t, err) + assert.Equal(t, []*models.Artifact{a3}, actual2) + + actual3, err := models.FindArtifacts(q, models.ArtifactFilters{}) + require.NoError(t, err) + require.Equal(t, 3, len(actual3)) + + for _, a := range actual3 { + assert.Contains(t, []models.Artifact{*a1, *a2, *a3}, *a) + } }) t.Run("remove", func(t *testing.T) { diff --git a/managed/models/check_settings_helper_test.go b/managed/models/check_settings_helper_test.go index 01bccac0ff..427de8750a 100644 --- a/managed/models/check_settings_helper_test.go +++ b/managed/models/check_settings_helper_test.go @@ -27,12 +27,12 @@ import ( "github.com/percona/pmm/managed/utils/testdb" ) -func TestChecksSettings(t *testing.T) { +func TestChecksSettings(t *testing.T) { //nolint:tparallel t.Parallel() sqlDB := testdb.Open(t, models.SkipFixtures, nil) - defer func() { + t.Cleanup(func() { require.NoError(t, sqlDB.Close()) - }() + }) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) t.Run("create", func(t *testing.T) { diff --git a/managed/models/database.go b/managed/models/database.go index 6fc92cbb34..4897a7d3cb 100644 --- a/managed/models/database.go +++ b/managed/models/database.go @@ -37,20 +37,20 @@ import ( const ( // PMMServerPostgreSQLServiceName is a special Service Name representing PMM Server's PostgreSQL Service. PMMServerPostgreSQLServiceName = "pmm-server-postgresql" - // minPGVersion stands for minimal required PostgreSQL server version for PMM Server. + // - minPGVersion stands for minimal required PostgreSQL server version for PMM Server. minPGVersion float64 = 14 // DefaultPostgreSQLAddr represent default local PostgreSQL database server address. DefaultPostgreSQLAddr = "127.0.0.1:5432" // PMMServerPostgreSQLNodeName is a special Node Name representing PMM Server's External PostgreSQL Node. PMMServerPostgreSQLNodeName = "pmm-server-db" - // DisableSSLMode represent disable PostgreSQL ssl mode + // DisableSSLMode represent disable PostgreSQL ssl mode. DisableSSLMode string = "disable" - // RequireSSLMode represent require PostgreSQL ssl mode + // RequireSSLMode represent require PostgreSQL ssl mode. RequireSSLMode string = "require" - // VerifyCaSSLMode represent verify-ca PostgreSQL ssl mode + // VerifyCaSSLMode represent verify-ca PostgreSQL ssl mode. VerifyCaSSLMode string = "verify-ca" - // VerifyFullSSLMode represent verify-full PostgreSQL ssl mode + // VerifyFullSSLMode represent verify-full PostgreSQL ssl mode. VerifyFullSSLMode string = "verify-full" ) @@ -908,6 +908,13 @@ var databaseSchema = [][]string{ `DROP TABLE IF EXISTS onboarding_system_tips`, `DROP TABLE IF EXISTS onboarding_user_tips`, }, + 84: { + `ALTER TABLE agents + ADD COLUMN comments_parsing_disabled BOOLEAN NOT NULL DEFAULT TRUE`, + + `ALTER TABLE agents + ALTER COLUMN comments_parsing_disabled DROP DEFAULT`, + }, } // ^^^ Avoid default values in schema definition. ^^^ @@ -1169,12 +1176,13 @@ func setupFixture1(q *reform.Querier, params SetupDBParams) error { } ap := &CreateAgentParams{ - PMMAgentID: PMMServerAgentID, - ServiceID: service.ServiceID, - TLS: params.SSLMode != DisableSSLMode, - TLSSkipVerify: params.SSLMode == DisableSSLMode || params.SSLMode == VerifyCaSSLMode, - Username: params.Username, - Password: params.Password, + PMMAgentID: PMMServerAgentID, + ServiceID: service.ServiceID, + TLS: params.SSLMode != DisableSSLMode, + TLSSkipVerify: params.SSLMode == DisableSSLMode || params.SSLMode == VerifyCaSSLMode, + CommentsParsingDisabled: true, + Username: params.Username, + Password: params.Password, } if ap.TLS { ap.PostgreSQLOptions = &PostgreSQLOptions{} diff --git a/managed/models/database_test.go b/managed/models/database_test.go index cb6a900ee7..083ab679a6 100644 --- a/managed/models/database_test.go +++ b/managed/models/database_test.go @@ -27,14 +27,12 @@ import ( "github.com/lib/pq" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - "gopkg.in/reform.v1" - "gopkg.in/reform.v1/dialects/postgresql" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/utils/testdb" ) -// see https://www.postgresql.org/docs/10/errcodes-appendix.html for error codes +// See https://www.postgresql.org/docs/10/errcodes-appendix.html for error codes func assertUniqueViolation(t *testing.T, err error, constraint string) { t.Helper() @@ -208,8 +206,8 @@ func TestDatabaseChecks(t *testing.T) { now, now) require.NoError(t, err) _, err = db.Exec( - "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ - "VALUES ('/agent_id/1', 'pmm-agent', '/node_id/1', NULL, false, '', $1, $2, false, false, 0, false, 0, 0, true, true, false)", + "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, comments_parsing_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ + "VALUES ('/agent_id/1', 'pmm-agent', '/node_id/1', NULL, false, '', $1, $2, false, false, 0, false, true, 0, 0, true, true, false)", now, now) require.NoError(t, err) @@ -219,13 +217,13 @@ func TestDatabaseChecks(t *testing.T) { defer rollback() _, err = tx.Exec( - "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ - "VALUES ('/agent_id/2', 'pmm-agent', '/node_id/1', NULL, false, '', $1, $2, false, false, 0, false, 0, 0, false, false, false)", + "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, comments_parsing_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ + "VALUES ('/agent_id/2', 'pmm-agent', '/node_id/1', NULL, false, '', $1, $2, false, false, 0, false, true, 0, 0, false, false, false)", now, now) require.NoError(t, err) _, err = tx.Exec( - "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ - "VALUES ('/agent_id/3', 'mysqld_exporter', NULL, '/agent_id/1', '/node_id/1', false, '', $1, $2, false, false, 0, false, 0, 0, false, false, false)", + "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, comments_parsing_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ + "VALUES ('/agent_id/3', 'mysqld_exporter', NULL, '/agent_id/1', '/node_id/1', false, '', $1, $2, false, false, 0, false, true, 0, 0, false, false, false)", now, now) require.NoError(t, err) }) @@ -235,8 +233,8 @@ func TestDatabaseChecks(t *testing.T) { defer rollback() _, err = tx.Exec( - "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ - "VALUES ('/agent_id/4', 'mysqld_exporter', NULL, NULL, '/node_id/1', false, '', $1, $2, false, false, 0, false, 0, 0, false, false, false)", + "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, comments_parsing_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ + "VALUES ('/agent_id/4', 'mysqld_exporter', NULL, NULL, '/node_id/1', false, '', $1, $2, false, false, 0, false, true, 0, 0, false, false, false)", now, now) assertCheckViolation(t, err, "agents", "runs_on_node_id_xor_pmm_agent_id") }) @@ -246,8 +244,8 @@ func TestDatabaseChecks(t *testing.T) { defer rollback() _, err = tx.Exec( - "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ - "VALUES ('/agent_id/5', 'pmm-agent', '/node_id/1', '/agent_id/1', '/node_id/1', false, '', $1, $2, false, false, 0, false, 0, 0, false, false, false)", + "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, comments_parsing_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ + "VALUES ('/agent_id/5', 'pmm-agent', '/node_id/1', '/agent_id/1', '/node_id/1', false, '', $1, $2, false, false, 0, false, true, 0, 0, false, false, false)", now, now) assertCheckViolation(t, err, "agents", "runs_on_node_id_xor_pmm_agent_id") }) @@ -258,8 +256,8 @@ func TestDatabaseChecks(t *testing.T) { defer rollback() _, err = tx.Exec( - "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ - "VALUES ('/agent_id/6', 'mysqld_exporter', '/node_id/1', NULL, '/node_id/1', false, '', $1, $2, false, false, 0, false, 0, 0, false, false, false)", + "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, comments_parsing_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ + "VALUES ('/agent_id/6', 'mysqld_exporter', '/node_id/1', NULL, '/node_id/1', false, '', $1, $2, false, false, 0, false, true, 0, 0, false, false, false)", now, now) assertCheckViolation(t, err, "agents", "runs_on_node_id_only_for_pmm_agent") }) @@ -269,8 +267,8 @@ func TestDatabaseChecks(t *testing.T) { defer rollback() _, err = tx.Exec( - "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ - "VALUES ('/agent_id/7', 'pmm-agent', NULL, '/agent_id/1', '/node_id/1', false, '', $1, $2, false, false, 0, false, 0, 0, false, false, false)", + "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, comments_parsing_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ + "VALUES ('/agent_id/7', 'pmm-agent', NULL, '/agent_id/1', '/node_id/1', false, '', $1, $2, false, false, 0, false, true, 0, 0, false, false, false)", now, now) assertCheckViolation(t, err, "agents", "runs_on_node_id_only_for_pmm_agent") }) @@ -283,8 +281,8 @@ func TestDatabaseChecks(t *testing.T) { defer rollback() _, err = tx.Exec( - "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, service_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ - "VALUES ('/agent_id/8', 'node_exporter', NULL, '/agent_id/1', '/node_id/1', NULL, false, '', $1, $2, false, false, 0, false, 0, 0, false, false, false)", + "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, service_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, comments_parsing_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ + "VALUES ('/agent_id/8', 'node_exporter', NULL, '/agent_id/1', '/node_id/1', NULL, false, '', $1, $2, false, false, 0, false, true, 0, 0, false, false, false)", now, now) assert.NoError(t, err) @@ -295,8 +293,8 @@ func TestDatabaseChecks(t *testing.T) { defer rollback() _, err = tx.Exec( - "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, service_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ - "VALUES ('/agent_id/8', 'mysqld_exporter', NULL, '/agent_id/1', NULL, '/service_id/1', false, '', $1, $2, false, false, 0, false, 0, 0, false, false, false)", + "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, service_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, comments_parsing_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ + "VALUES ('/agent_id/8', 'mysqld_exporter', NULL, '/agent_id/1', NULL, '/service_id/1', false, '', $1, $2, false, false, 0, false, true, 0, 0, false, false, false)", now, now) assert.NoError(t, err) @@ -307,8 +305,8 @@ func TestDatabaseChecks(t *testing.T) { defer rollback() _, err = tx.Exec( - "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, service_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ - "VALUES ('/agent_id/8', 'mysqld_exporter', NULL, '/agent_id/1', NULL, NULL, false, '', $1, $2, false, false, 0, false, 0, 0, false, false, false)", + "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, service_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, comments_parsing_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ + "VALUES ('/agent_id/8', 'mysqld_exporter', NULL, '/agent_id/1', NULL, NULL, false, '', $1, $2, false, false, 0, false, true, 0, 0, false, false, false)", now, now) assertCheckViolation(t, err, "agents", "node_id_or_service_id_for_non_pmm_agent") @@ -319,8 +317,8 @@ func TestDatabaseChecks(t *testing.T) { defer rollback() _, err = tx.Exec( - "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, service_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ - "VALUES ('/agent_id/8', 'mysqld_exporter', NULL, '/agent_id/1', '/node_id/1', '/service_id/1', false, '', $1, $2, false, false, 0, false, 0, 0, false, false, false)", + "INSERT INTO agents (agent_id, agent_type, runs_on_node_id, pmm_agent_id, node_id, service_id, disabled, status, created_at, updated_at, tls, tls_skip_verify, max_query_length, query_examples_disabled, comments_parsing_disabled, max_query_log_size, table_count_tablestats_group_limit, rds_basic_metrics_disabled, rds_enhanced_metrics_disabled, push_metrics) "+ + "VALUES ('/agent_id/8', 'mysqld_exporter', NULL, '/agent_id/1', '/node_id/1', '/service_id/1', false, '', $1, $2, false, false, 0, false, true, 0, 0, false, false, false)", now, now) assertCheckViolation(t, err, "agents", "node_id_or_service_id_for_non_pmm_agent") }) @@ -385,7 +383,6 @@ func TestDatabaseMigrations(t *testing.T) { }) t.Run("stats_collections field migration: string to string array", func(t *testing.T) { sqlDB := testdb.Open(t, models.SkipFixtures, pointer.ToInt(57)) - db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) defer sqlDB.Close() //nolint:errcheck // Insert dummy node in DB @@ -409,16 +406,17 @@ func TestDatabaseMigrations(t *testing.T) { // Apply migration testdb.SetupDB(t, sqlDB, models.SkipFixtures, pointer.ToInt(68)) - agent, err := models.FindAgentByID(db.Querier, "id") + var agentID string + var mongoDBOptions *models.MongoDBOptions + err = sqlDB.QueryRow(`SELECT agent_id, mongo_db_tls_options FROM agents WHERE agent_id = $1`, "id").Scan(&agentID, &mongoDBOptions) + require.NoError(t, err) - require.Equal(t, "id", agent.AgentID) - require.Equal(t, []string{"db.col1", "db.col2", "db.col3"}, agent.MongoDBOptions.StatsCollections) + require.Equal(t, "id", agentID) + require.Equal(t, []string{"db.col1", "db.col2", "db.col3"}, mongoDBOptions.StatsCollections) }) - // TODO https://jira.percona.com/browse/PMM-10872 t.Run("stats_collections field migration: string array to string array", func(t *testing.T) { sqlDB := testdb.Open(t, models.SkipFixtures, pointer.ToInt(58)) - db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) defer sqlDB.Close() //nolint:errcheck // Insert dummy node in DB @@ -442,9 +440,12 @@ func TestDatabaseMigrations(t *testing.T) { // Apply migration testdb.SetupDB(t, sqlDB, models.SkipFixtures, pointer.ToInt(68)) - agent, err := models.FindAgentByID(db.Querier, "id") + var agentID string + var mongoDBOptions *models.MongoDBOptions + err = sqlDB.QueryRow(`SELECT agent_id, mongo_db_tls_options FROM agents WHERE agent_id = $1`, "id").Scan(&agentID, &mongoDBOptions) + require.NoError(t, err) - require.Equal(t, "id", agent.AgentID) - require.Equal(t, []string{"db.col1", "db.col2", "db.col3"}, agent.MongoDBOptions.StatsCollections) + require.Equal(t, "id", agentID) + require.Equal(t, []string{"db.col1", "db.col2", "db.col3"}, mongoDBOptions.StatsCollections) }) } diff --git a/managed/models/models_json_test.go b/managed/models/models_json_test.go index f189521d9a..8baec878a5 100644 --- a/managed/models/models_json_test.go +++ b/managed/models/models_json_test.go @@ -27,7 +27,7 @@ import ( "github.com/percona/pmm/managed/utils/testdb" ) -func TestJSON(t *testing.T) { +func TestJSON(t *testing.T) { //nolint:tparallel sqlDB := testdb.Open(t, models.SkipFixtures, nil) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) diff --git a/managed/models/node_helpers_test.go b/managed/models/node_helpers_test.go index 2f858d40f6..e0873a93cf 100644 --- a/managed/models/node_helpers_test.go +++ b/managed/models/node_helpers_test.go @@ -132,7 +132,7 @@ func TestNodeHelpers(t *testing.T) { }) assert.NoError(t, err) - structs, err := q.SelectAllFrom(models.NodeTable, "WHERE machine_id = $1 ORDER BY node_id DESC", machineID) + structs, err := q.SelectAllFrom(models.NodeTable, "WHERE machine_id = $1 ORDER BY node_id", machineID) require.NoError(t, err) require.Len(t, structs, 2) expected := &models.Node{ diff --git a/managed/models/postgresql_version_test.go b/managed/models/postgresql_version_test.go index 8851004940..5a676118ca 100644 --- a/managed/models/postgresql_version_test.go +++ b/managed/models/postgresql_version_test.go @@ -30,7 +30,7 @@ func TestGetPostgreSQLVersion(t *testing.T) { t.Parallel() sqlDB, mock, err := sqlmock.New() require.NoError(t, err) - defer sqlDB.Close() //nolint:errcheck + t.Cleanup(func() { sqlDB.Close() }) //nolint:errcheck q := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)).WithTag("pmm-agent:postgresqlversion") ctx := context.Background() @@ -78,6 +78,7 @@ func TestGetPostgreSQLVersion(t *testing.T) { for _, tc := range testCases { tc := tc t.Run(tc.name, func(t *testing.T) { + t.Parallel() for _, version := range tc.mockedData { mock.ExpectQuery("SELECT"). WillReturnRows(sqlmock.NewRows(column).AddRow(version)) diff --git a/managed/models/restore_history_helpers_test.go b/managed/models/restore_history_helpers_test.go index 68efa7143f..db837c1644 100644 --- a/managed/models/restore_history_helpers_test.go +++ b/managed/models/restore_history_helpers_test.go @@ -238,6 +238,7 @@ func TestRestoreHistory(t *testing.T) { } func TestRestoreHistoryValidation(t *testing.T) { + t.Parallel() testCases := []struct { name string params models.CreateRestoreHistoryItemParams diff --git a/managed/models/scheduled_tasks_helpers.go b/managed/models/scheduled_tasks_helpers.go index f7c5f51bf0..d639387542 100644 --- a/managed/models/scheduled_tasks_helpers.go +++ b/managed/models/scheduled_tasks_helpers.go @@ -55,6 +55,7 @@ type ScheduledTasksFilter struct { LocationID string Mode BackupMode Name string + Folder *string } // FindScheduledTasks returns all scheduled tasks satisfying filter. @@ -110,6 +111,12 @@ func FindScheduledTasks(q *reform.Querier, filters ScheduledTasksFilter) ([]*Sch crossJoin = true andConds = append(andConds, "value ->> 'name' = "+q.Placeholder(idx)) args = append(args, filters.Name) + idx++ + } + if filters.Folder != nil { + crossJoin = true + andConds = append(andConds, "value ->> 'folder' = "+q.Placeholder(idx)) + args = append(args, *filters.Folder) // idx++ } @@ -367,6 +374,15 @@ func (s *ScheduledTask) LocationID() (string, error) { return data.LocationID, nil } +// ServiceID returns task service ID. +func (s *ScheduledTask) ServiceID() (string, error) { + data, err := s.CommonBackupData() + if err != nil { + return "", err + } + return data.ServiceID, nil +} + func (s *ScheduledTask) CommonBackupData() (*CommonBackupTaskData, error) { if s.Data != nil { switch s.Type { diff --git a/managed/models/settings_helpers.go b/managed/models/settings_helpers.go index 146c66bae4..8e73d73601 100644 --- a/managed/models/settings_helpers.go +++ b/managed/models/settings_helpers.go @@ -143,7 +143,7 @@ func SetPMMServerID(q reform.DBTX) error { } // UpdateSettings updates only non-zero, non-empty values. -func UpdateSettings(q reform.DBTX, params *ChangeSettingsParams) (*Settings, error) { //nolint:cyclop +func UpdateSettings(q reform.DBTX, params *ChangeSettingsParams) (*Settings, error) { //nolint:cyclop,maintidx err := ValidateSettings(params) if err != nil { return nil, NewInvalidArgumentError(err.Error()) diff --git a/managed/services/agents/agentversion_test.go b/managed/services/agents/agentversion_test.go index d079bfaca5..f6b22abb49 100644 --- a/managed/services/agents/agentversion_test.go +++ b/managed/services/agents/agentversion_test.go @@ -26,6 +26,7 @@ import ( ) func TestPMMAgentSupported(t *testing.T) { + t.Parallel() prefix := "testing prefix" minVersion := version.Must(version.NewVersion("2.30.5")) diff --git a/managed/services/agents/channel/channel.go b/managed/services/agents/channel/channel.go index 0c7ee09243..6fc8b8f9ed 100644 --- a/managed/services/agents/channel/channel.go +++ b/managed/services/agents/channel/channel.go @@ -156,7 +156,7 @@ func (c *Channel) Send(resp *ServerResponse) { // If error occurred - subscription got canceled - returned payload is nil and error contains reason for cancellation. // Response and error will be both nil if channel is closed. // It is no-op once channel is closed (see Wait). -func (c *Channel) SendAndWaitResponse(payload agentpb.ServerRequestPayload) (agentpb.AgentResponsePayload, error) { +func (c *Channel) SendAndWaitResponse(payload agentpb.ServerRequestPayload) (agentpb.AgentResponsePayload, error) { //nolint:ireturn id := atomic.AddUint32(&c.lastSentRequestID, 1) ch := c.subscribe(id) diff --git a/managed/services/agents/grpc/agent_server.go b/managed/services/agents/grpc/agent_server.go index a974524adc..42ef5b0d09 100644 --- a/managed/services/agents/grpc/agent_server.go +++ b/managed/services/agents/grpc/agent_server.go @@ -29,7 +29,7 @@ type agentServer struct { } // NewAgentServer creates new agent server. -func NewAgentServer(r *agents.Handler) agentpb.AgentServer { +func NewAgentServer(r *agents.Handler) agentpb.AgentServer { //nolint:ireturn return &agentServer{ handler: r, } diff --git a/managed/services/agents/handler.go b/managed/services/agents/handler.go index 9a841e7979..ff45391e11 100644 --- a/managed/services/agents/handler.go +++ b/managed/services/agents/handler.go @@ -186,10 +186,14 @@ func (h *Handler) updateAgentStatusForChildren(ctx context.Context, agentID stri } func (h *Handler) stateChanged(ctx context.Context, req *agentpb.StateChangedRequest) error { - e := h.db.InTransaction(func(tx *reform.TX) error { - agentIDs := h.r.roster.get(req.AgentId) - if agentIDs == nil { - agentIDs = []string{req.AgentId} + var PMMAgentID string + + errTX := h.db.InTransaction(func(tx *reform.TX) error { + var agentIDs []string + var err error + PMMAgentID, agentIDs, err = h.r.roster.get(req.AgentId) + if err != nil { + return err } for _, agentID := range agentIDs { @@ -207,17 +211,19 @@ func (h *Handler) stateChanged(ctx context.Context, req *agentpb.StateChangedReq } return nil }) - if e != nil { - return e + if errTX != nil { + return errTX } + h.vmdb.RequestConfigurationUpdate() - agent, err := models.FindAgentByID(h.db.Querier, req.AgentId) + agent, err := models.FindAgentByID(h.db.Querier, PMMAgentID) if err != nil { return err } if agent.PMMAgentID == nil { return nil } + h.state.RequestStateUpdate(ctx, *agent.PMMAgentID) return nil } diff --git a/managed/services/agents/jobs.go b/managed/services/agents/jobs.go index ec4a9a9ea3..a78fffd381 100644 --- a/managed/services/agents/jobs.go +++ b/managed/services/agents/jobs.go @@ -169,7 +169,7 @@ func (s *JobsService) RestartJob(ctx context.Context, jobID string) error { return nil } -func (s *JobsService) handleJobResult(_ context.Context, l *logrus.Entry, result *agentpb.JobResult) { +func (s *JobsService) handleJobResult(_ context.Context, l *logrus.Entry, result *agentpb.JobResult) { //nolint:cyclop var scheduleID string if errTx := s.db.InTransaction(func(t *reform.TX) error { job, err := models.FindJobByID(t.Querier, result.JobId) diff --git a/managed/services/agents/mysql.go b/managed/services/agents/mysql.go index 9ed04cb38f..56a67d7077 100644 --- a/managed/services/agents/mysql.go +++ b/managed/services/agents/mysql.go @@ -149,10 +149,11 @@ func mysqldExporterConfig(service *models.Service, exporter *models.Agent, redac func qanMySQLPerfSchemaAgentConfig(service *models.Service, agent *models.Agent) *agentpb.SetStateRequest_BuiltinAgent { tdp := agent.TemplateDelimiters(service) return &agentpb.SetStateRequest_BuiltinAgent{ - Type: inventorypb.AgentType_QAN_MYSQL_PERFSCHEMA_AGENT, - Dsn: agent.DSN(service, time.Second, "", nil), - MaxQueryLength: agent.MaxQueryLength, - DisableQueryExamples: agent.QueryExamplesDisabled, + Type: inventorypb.AgentType_QAN_MYSQL_PERFSCHEMA_AGENT, + Dsn: agent.DSN(service, time.Second, "", nil), + MaxQueryLength: agent.MaxQueryLength, + DisableQueryExamples: agent.QueryExamplesDisabled, + DisableCommentsParsing: agent.CommentsParsingDisabled, TextFiles: &agentpb.TextFiles{ Files: agent.Files(), TemplateLeftDelim: tdp.Left, @@ -166,11 +167,12 @@ func qanMySQLPerfSchemaAgentConfig(service *models.Service, agent *models.Agent) func qanMySQLSlowlogAgentConfig(service *models.Service, agent *models.Agent) *agentpb.SetStateRequest_BuiltinAgent { tdp := agent.TemplateDelimiters(service) return &agentpb.SetStateRequest_BuiltinAgent{ - Type: inventorypb.AgentType_QAN_MYSQL_SLOWLOG_AGENT, - Dsn: agent.DSN(service, time.Second, "", nil), - MaxQueryLength: agent.MaxQueryLength, - DisableQueryExamples: agent.QueryExamplesDisabled, - MaxQueryLogSize: agent.MaxQueryLogSize, + Type: inventorypb.AgentType_QAN_MYSQL_SLOWLOG_AGENT, + Dsn: agent.DSN(service, time.Second, "", nil), + MaxQueryLength: agent.MaxQueryLength, + DisableQueryExamples: agent.QueryExamplesDisabled, + DisableCommentsParsing: agent.CommentsParsingDisabled, + MaxQueryLogSize: agent.MaxQueryLogSize, TextFiles: &agentpb.TextFiles{ Files: agent.Files(), TemplateLeftDelim: tdp.Left, diff --git a/managed/services/agents/postgresql.go b/managed/services/agents/postgresql.go index 87c1e98a32..e3503ed638 100644 --- a/managed/services/agents/postgresql.go +++ b/managed/services/agents/postgresql.go @@ -103,13 +103,14 @@ func postgresExporterConfig(service *models.Service, exporter *models.Agent, red return res, nil } -// qanPostgreSQLPgStatementsAgentConfig returns desired configuration of qan-mongodb-profiler-agent built-in agent. +// qanPostgreSQLPgStatementsAgentConfig returns desired configuration of qan-postgresql-pgstatements-agent built-in agent. func qanPostgreSQLPgStatementsAgentConfig(service *models.Service, agent *models.Agent) *agentpb.SetStateRequest_BuiltinAgent { tdp := agent.TemplateDelimiters(service) return &agentpb.SetStateRequest_BuiltinAgent{ - Type: inventorypb.AgentType_QAN_POSTGRESQL_PGSTATEMENTS_AGENT, - Dsn: agent.DSN(service, 5*time.Second, service.DatabaseName, nil), - MaxQueryLength: agent.MaxQueryLength, + Type: inventorypb.AgentType_QAN_POSTGRESQL_PGSTATEMENTS_AGENT, + Dsn: agent.DSN(service, 5*time.Second, service.DatabaseName, nil), + MaxQueryLength: agent.MaxQueryLength, + DisableCommentsParsing: agent.CommentsParsingDisabled, TextFiles: &agentpb.TextFiles{ Files: agent.Files(), TemplateLeftDelim: tdp.Left, @@ -118,14 +119,15 @@ func qanPostgreSQLPgStatementsAgentConfig(service *models.Service, agent *models } } -// qanPostgreSQLPgStatMonitorAgentConfig returns desired configuration of qan-mongodb-profiler-agent built-in agent. +// qanPostgreSQLPgStatMonitorAgentConfig returns desired configuration of qan-postgresql-pgstatmonitor-agent built-in agent. func qanPostgreSQLPgStatMonitorAgentConfig(service *models.Service, agent *models.Agent) *agentpb.SetStateRequest_BuiltinAgent { tdp := agent.TemplateDelimiters(service) return &agentpb.SetStateRequest_BuiltinAgent{ - Type: inventorypb.AgentType_QAN_POSTGRESQL_PGSTATMONITOR_AGENT, - Dsn: agent.DSN(service, time.Second, service.DatabaseName, nil), - DisableQueryExamples: agent.QueryExamplesDisabled, - MaxQueryLength: agent.MaxQueryLength, + Type: inventorypb.AgentType_QAN_POSTGRESQL_PGSTATMONITOR_AGENT, + Dsn: agent.DSN(service, time.Second, service.DatabaseName, nil), + DisableQueryExamples: agent.QueryExamplesDisabled, + MaxQueryLength: agent.MaxQueryLength, + DisableCommentsParsing: agent.CommentsParsingDisabled, TextFiles: &agentpb.TextFiles{ Files: agent.Files(), TemplateLeftDelim: tdp.Left, diff --git a/managed/services/agents/proxysql_test.go b/managed/services/agents/proxysql_test.go index 1e6e836c13..ce4ee0ae0b 100644 --- a/managed/services/agents/proxysql_test.go +++ b/managed/services/agents/proxysql_test.go @@ -29,6 +29,7 @@ import ( ) func TestProxySQLExporterConfig(t *testing.T) { + t.Parallel() pmmAgentVersion := version.MustParse("2.18.0") proxysql := &models.Service{ Address: pointer.ToString("1.2.3.4"), diff --git a/managed/services/agents/registry.go b/managed/services/agents/registry.go index 5c8d874f8a..f7ee0c7f9c 100644 --- a/managed/services/agents/registry.go +++ b/managed/services/agents/registry.go @@ -95,7 +95,7 @@ func NewRegistry(db *reform.DB) *Registry { agents: agents, - roster: newRoster(), + roster: newRoster(db), mConnects: prom.NewCounter(prom.CounterOpts{ Namespace: prometheusNamespace, diff --git a/managed/services/agents/roster.go b/managed/services/agents/roster.go index c42a2fe89c..4eba720bf2 100644 --- a/managed/services/agents/roster.go +++ b/managed/services/agents/roster.go @@ -16,16 +16,21 @@ package agents import ( + "sort" "strings" "sync" "github.com/sirupsen/logrus" + "gopkg.in/reform.v1" + + "github.com/percona/pmm/managed/models" ) type agentGroup string const ( - rdsGroup = agentGroup("rds") + rdsGroup = agentGroup("rds") + rdsSuffix = string("/" + rdsGroup) ) // roster groups several Agent IDs from an Inventory model to a single Group ID, as seen by pmm-agent. @@ -35,36 +40,67 @@ const ( type roster struct { l *logrus.Entry + db *reform.DB rw sync.RWMutex m map[string][]string } -func newRoster() *roster { +// newRoster creates a new roster instance. +func newRoster(db *reform.DB) *roster { return &roster{ - l: logrus.WithField("component", "roster"), - m: make(map[string][]string), + db: db, + l: logrus.WithField("component", "roster"), + m: make(map[string][]string), } } -func (r *roster) add(pmmAgentID string, group agentGroup, agentIDs []string) (groupID string) { //nolint:nonamedreturns +// add adds a new group of exporter IDs to the roster. +func (r *roster) add(pmmAgentID string, group agentGroup, exporters map[*models.Node]*models.Agent) string { r.rw.Lock() defer r.rw.Unlock() - groupID = pmmAgentID + "/" + string(group) - r.m[groupID] = agentIDs - r.l.Debugf("add: %s = %v", groupID, agentIDs) - return + groupID := pmmAgentID + "/" + string(group) + exporterIDs := make([]string, 0, len(exporters)) + for _, exporter := range exporters { + exporterIDs = append(exporterIDs, exporter.AgentID) + } + + sort.Strings(exporterIDs) + + r.m[groupID] = exporterIDs + r.l.Debugf("add: %s = %v", groupID, exporterIDs) + return groupID } -func (r *roster) get(groupID string) (agentIDs []string) { //nolint:nonamedreturns +// get returns a PMMAgentID and a group of exporter IDs for a given Group ID. +func (r *roster) get(groupID string) (string, []string, error) { r.rw.RLock() defer r.rw.RUnlock() - agentIDs = r.m[groupID] + PMMAgentID, ok := strings.CutSuffix(groupID, rdsSuffix) + agentIDs := r.m[groupID] + + if agentIDs == nil { + if !ok { + agentIDs = []string{PMMAgentID} + } else { + rdsExporterType := models.RDSExporterType + agents, err := models.FindAgents(r.db.Querier, models.AgentFilters{PMMAgentID: PMMAgentID, AgentType: &rdsExporterType}) + if err != nil { + return "", nil, err + } + agentIDs = make([]string, 0, len(agents)) + for _, agent := range agents { + agentIDs = append(agentIDs, agent.AgentID) + } + } + } + r.l.Debugf("get: %s = %v", groupID, agentIDs) - return agentIDs + return PMMAgentID, agentIDs, nil } +// clear removes the group of exporter IDs for a given PMM Agent ID. func (r *roster) clear(pmmAgentID string) { r.rw.Lock() defer r.rw.Unlock() diff --git a/managed/services/agents/roster_test.go b/managed/services/agents/roster_test.go new file mode 100644 index 0000000000..fc6b339a8c --- /dev/null +++ b/managed/services/agents/roster_test.go @@ -0,0 +1,109 @@ +// Copyright (C) 2017 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package agents + +import ( + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gopkg.in/reform.v1" + "gopkg.in/reform.v1/dialects/postgresql" + + "github.com/percona/pmm/managed/models" + "github.com/percona/pmm/managed/utils/testdb" +) + +func TestRoster(t *testing.T) { + setup := func(t *testing.T) (*roster, func(t *testing.T)) { + t.Helper() + + sqlDB := testdb.Open(t, models.SetupFixtures, nil) + db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) + + teardown := func(t *testing.T) { + t.Helper() + require.NoError(t, sqlDB.Close()) + } + + r := newRoster(db) + + return r, teardown + } + + t.Run("Add", func(t *testing.T) { + r, teardown := setup(t) + defer teardown(t) + + exporters := make(map[*models.Node]*models.Agent, 1) + node := &models.Node{ + NodeID: "node1", + NodeType: models.GenericNodeType, + } + exporters[node] = &models.Agent{ + AgentID: "agent1", + AgentType: models.RDSExporterType, + } + + const expected = "pmm-server/rds" + groupID := r.add("pmm-server", rdsGroup, exporters) + assert.Equal(t, expected, groupID) + + PMMAgentID, agentIDs, err := r.get(groupID) + require.NoError(t, err) + assert.Equal(t, "pmm-server", PMMAgentID) + assert.Equal(t, []string{"agent1"}, agentIDs) + }) + + t.Run("Get", func(t *testing.T) { + r, teardown := setup(t) + defer teardown(t) + + const groupID = "pmm-server/rds" + + PMMAgentID, agentIDs, err := r.get(groupID) + require.NoError(t, err) + assert.Equal(t, "pmm-server", PMMAgentID) + assert.Equal(t, []string{}, agentIDs) + }) + + t.Run("Clear", func(t *testing.T) { + r, teardown := setup(t) + defer teardown(t) + + exporters := make(map[*models.Node]*models.Agent, 1) + node := &models.Node{ + NodeID: "node1", + NodeType: models.GenericNodeType, + } + exporters[node] = &models.Agent{ + AgentID: "agent1", + AgentType: models.RDSExporterType, + } + + const expectedGroupID = "pmm-server/rds" + PMMAgentID := "pmm-server" + groupID := r.add(PMMAgentID, rdsGroup, exporters) + assert.Equal(t, expectedGroupID, groupID) + + r.clear(PMMAgentID) + PMMAgentID, agentIDs, err := r.get(groupID) + + require.NoError(t, err) + assert.Equal(t, "pmm-server", PMMAgentID) + assert.Equal(t, []string{}, agentIDs) + }) +} diff --git a/managed/services/agents/state.go b/managed/services/agents/state.go index 9ffddde95a..c081af9d99 100644 --- a/managed/services/agents/state.go +++ b/managed/services/agents/state.go @@ -17,7 +17,6 @@ package agents import ( "context" - "sort" "sync" "time" @@ -34,7 +33,7 @@ import ( ) const ( - // constants for delayed batch updates + // Constants for delayed batch updates. updateBatchDelay = time.Second stateChangeTimeout = 5 * time.Second ) @@ -172,7 +171,7 @@ func (u *StateUpdater) sendSetStateRequest(ctx context.Context, agent *pmmAgentI continue } - // in order of AgentType consts + // Ordered the same as AgentType consts switch row.AgentType { case models.PMMAgentType: continue @@ -201,6 +200,7 @@ func (u *StateUpdater) sendSetStateRequest(ctx context.Context, agent *pmmAgentI return err } rdsExporters[node] = row + case models.ExternalExporterType: // ignore @@ -260,24 +260,20 @@ func (u *StateUpdater) sendSetStateRequest(ctx context.Context, agent *pmmAgentI } if len(rdsExporters) != 0 { - rdsExporterIDs := make([]string, 0, len(rdsExporters)) - for _, rdsExporter := range rdsExporters { - rdsExporterIDs = append(rdsExporterIDs, rdsExporter.AgentID) - } - sort.Strings(rdsExporterIDs) - - groupID := u.r.roster.add(agent.id, rdsGroup, rdsExporterIDs) + groupID := u.r.roster.add(agent.id, rdsGroup, rdsExporters) c, err := rdsExporterConfig(rdsExporters, redactMode, pmmAgentVersion) if err != nil { return err } agentProcesses[groupID] = c } + state := &agentpb.SetStateRequest{ AgentProcesses: agentProcesses, BuiltinAgents: builtinAgents, } l.Debugf("sendSetStateRequest:\n%s", proto.MarshalTextString(state)) + resp, err := agent.channel.SendAndWaitResponse(state) if err != nil { return err diff --git a/managed/services/agents/versioner_test.go b/managed/services/agents/versioner_test.go index 56b3e274aa..53e1cc0b53 100644 --- a/managed/services/agents/versioner_test.go +++ b/managed/services/agents/versioner_test.go @@ -40,7 +40,9 @@ func TestSoftwareName(t *testing.T) { } for _, tc := range tests { + tc := tc t.Run(string(tc.name), func(t *testing.T) { + t.Parallel() res := tc.sw.Name() assert.Equal(t, tc.name, res) }) @@ -64,7 +66,9 @@ func TestGetVersionRequest(t *testing.T) { } for _, tc := range tests { + tc := tc t.Run(tc.name, func(t *testing.T) { + t.Parallel() res := tc.sw.GetVersionRequest() assert.Equal(t, tc.request, res) }) diff --git a/managed/services/backup/backup_service.go b/managed/services/backup/backup_service.go index 07a59a37ae..9847b32173 100644 --- a/managed/services/backup/backup_service.go +++ b/managed/services/backup/backup_service.go @@ -93,6 +93,10 @@ func (s *Service) PerformBackup(ctx context.Context, params PerformBackupParams) errTX = s.db.InTransactionContext(ctx, &sql.TxOptions{Isolation: sql.LevelSerializable}, func(tx *reform.TX) error { var err error + if err = services.CheckArtifactOverlapping(tx.Querier, params.ServiceID, params.LocationID, params.Folder); err != nil { + return err + } + svc, err = models.FindServiceByID(tx.Querier, params.ServiceID) if err != nil { return err diff --git a/managed/services/backup/backup_service_test.go b/managed/services/backup/backup_service_test.go index 0afeff434e..e599b7c12b 100644 --- a/managed/services/backup/backup_service_test.go +++ b/managed/services/backup/backup_service_test.go @@ -81,8 +81,6 @@ func TestPerformBackup(t *testing.T) { mockedCompatibilityService := &mockCompatibilityService{} backupService := NewService(db, mockedJobsService, mockedAgentService, mockedCompatibilityService, nil) - artifactFolder := "artifact_folder" - s3Location, err := models.CreateBackupLocation(db.Querier, models.CreateBackupLocationParams{ Name: "Test s3 location", Description: "Test s3 description", @@ -164,7 +162,7 @@ func TestPerformBackup(t *testing.T) { S3Config: tc.locationModel.S3Config, } mockedJobsService.On("StartMySQLBackupJob", mock.Anything, pointer.GetString(agent.PMMAgentID), time.Duration(0), - mock.Anything, mock.Anything, locationConfig, artifactFolder).Return(nil).Once() + mock.Anything, mock.Anything, locationConfig, "artifact_folder").Return(nil).Once() } artifactID, err := backupService.PerformBackup(ctx, PerformBackupParams{ @@ -173,7 +171,7 @@ func TestPerformBackup(t *testing.T) { Name: tc.name + "_" + "test_backup", DataModel: tc.dataModel, Mode: models.Snapshot, - Folder: artifactFolder, + Folder: "artifact_folder", }) if tc.expectedError != nil { @@ -204,7 +202,7 @@ func TestPerformBackup(t *testing.T) { Name: "test_backup", DataModel: models.PhysicalDataModel, Mode: models.PITR, - Folder: artifactFolder, + Folder: "artifact_folder_2", }) assert.ErrorIs(t, err, ErrIncompatibleDataModel) assert.Empty(t, artifactID) @@ -218,7 +216,7 @@ func TestPerformBackup(t *testing.T) { Name: "test_backup", DataModel: models.PhysicalDataModel, Mode: models.PITR, - Folder: artifactFolder, + Folder: "artifact_folder_3", }) assert.ErrorContains(t, err, "Empty Service ID") assert.Empty(t, artifactID) @@ -233,7 +231,7 @@ func TestPerformBackup(t *testing.T) { Name: "test_backup", DataModel: models.PhysicalDataModel, Mode: models.Incremental, - Folder: artifactFolder, + Folder: "artifact_folder_4", }) assert.ErrorContains(t, err, "the only supported backups mode for mongoDB is snapshot and PITR") assert.Empty(t, artifactID) diff --git a/managed/services/backup/compatibility_helpers.go b/managed/services/backup/compatibility_helpers.go index 299a4c68e7..d82a2a2d46 100644 --- a/managed/services/backup/compatibility_helpers.go +++ b/managed/services/backup/compatibility_helpers.go @@ -221,10 +221,7 @@ func mongoDBBackupSoftwareInstalledAndCompatible(svm map[models.SoftwareName]str } // isOnlySameService checks if restore is only available to the same service. -func isOnlySameService(artifactDBVersion string, serviceType models.ServiceType) bool { - // allow restore to the same service if db version is unknown or service type is MongoDB. - if artifactDBVersion == "" || serviceType == models.MongoDBServiceType { - return true - } - return false +func isOnlySameService(artifactDBVersion string) bool { + // allow restore only to the same service if db version is unknown. + return artifactDBVersion == "" } diff --git a/managed/services/backup/compatibility_service.go b/managed/services/backup/compatibility_service.go index af2536634d..9d2372afdb 100644 --- a/managed/services/backup/compatibility_service.go +++ b/managed/services/backup/compatibility_service.go @@ -96,13 +96,29 @@ func (s *CompatibilityService) findCompatibleServiceIDs(artifactModel *models.Ar compatibleServiceIDs := make([]string, 0, len(svs)) for _, sv := range svs { svm := softwareVersionsToMap(sv.SoftwareVersions) + var ( + serviceDBVersion string + err error + ) - if err := mySQLBackupSoftwareInstalledAndCompatible(svm); err != nil { + switch artifactModel.Vendor { + case "mysql": + serviceDBVersion = svm[models.MysqldSoftwareName] + err = mySQLBackupSoftwareInstalledAndCompatible(svm) + + case "mongodb": + serviceDBVersion = svm[models.MongoDBSoftwareName] + err = mongoDBBackupSoftwareInstalledAndCompatible(svm) + + default: + return nil + } + + if err != nil { s.l.WithError(err).Debugf("skip incompatible service id %q", sv.ServiceID) continue } - serviceDBVersion := svm[models.MysqldSoftwareName] if artifactModel.DBVersion != serviceDBVersion { s.l.Debugf("skip incompatible service id %q: artifact version %q != db version %q\"", sv.ServiceID, artifactModel.DBVersion, serviceDBVersion) @@ -174,7 +190,7 @@ func (s *CompatibilityService) FindArtifactCompatibleServices( return err } - onlySameService := isOnlySameService(artifactModel.DBVersion, serviceType) + onlySameService := isOnlySameService(artifactModel.DBVersion) if onlySameService { service, err := models.FindServiceByID(tx.Querier, artifactModel.ServiceID) diff --git a/managed/services/backup/compatibility_service_test.go b/managed/services/backup/compatibility_service_test.go index 865888fb23..eaf777e5fe 100644 --- a/managed/services/backup/compatibility_service_test.go +++ b/managed/services/backup/compatibility_service_test.go @@ -183,7 +183,9 @@ func TestCheckCompatibility(t *testing.T) { expectedError: ErrIncompatibleService, }, } { + tc := tc t.Run(string(tc.serviceType)+"_"+tc.name, func(t *testing.T) { + t.Parallel() var sw []agents.Software switch tc.serviceType { case models.MySQLServiceType: @@ -210,100 +212,166 @@ func TestFindCompatibleServiceIDs(t *testing.T) { t.Parallel() cSvc := NewCompatibilityService(nil, nil) - testSet := []*models.ServiceSoftwareVersions{ - { - ServiceID: "1", - SoftwareVersions: models.SoftwareVersions{ - {Name: models.MysqldSoftwareName, Version: ""}, - {Name: models.XtrabackupSoftwareName, Version: "8.0.25"}, - {Name: models.XbcloudSoftwareName, Version: "8.0.25"}, - {Name: models.QpressSoftwareName, Version: "1.1"}, + t.Run("mysql", func(t *testing.T) { + testSet := []*models.ServiceSoftwareVersions{ + { + ServiceID: "1", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MysqldSoftwareName, Version: ""}, + {Name: models.XtrabackupSoftwareName, Version: "8.0.25"}, + {Name: models.XbcloudSoftwareName, Version: "8.0.25"}, + {Name: models.QpressSoftwareName, Version: "1.1"}, + }, }, - }, - { - ServiceID: "2", - SoftwareVersions: models.SoftwareVersions{ - {Name: models.MysqldSoftwareName, Version: "8.0.25"}, - {Name: models.XtrabackupSoftwareName, Version: "8.0.24"}, - {Name: models.XbcloudSoftwareName, Version: "8.0.25"}, - {Name: models.QpressSoftwareName, Version: "1.1"}, + { + ServiceID: "2", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MysqldSoftwareName, Version: "8.0.25"}, + {Name: models.XtrabackupSoftwareName, Version: "8.0.24"}, + {Name: models.XbcloudSoftwareName, Version: "8.0.25"}, + {Name: models.QpressSoftwareName, Version: "1.1"}, + }, }, - }, - { - ServiceID: "3", - SoftwareVersions: models.SoftwareVersions{ - {Name: models.MysqldSoftwareName, Version: "8.0.25"}, - {Name: models.XtrabackupSoftwareName, Version: "8.0.25"}, - {Name: models.XbcloudSoftwareName, Version: "8.0.24"}, - {Name: models.QpressSoftwareName, Version: "1.1"}, + { + ServiceID: "3", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MysqldSoftwareName, Version: "8.0.25"}, + {Name: models.XtrabackupSoftwareName, Version: "8.0.25"}, + {Name: models.XbcloudSoftwareName, Version: "8.0.24"}, + {Name: models.QpressSoftwareName, Version: "1.1"}, + }, }, - }, - { - ServiceID: "4", - SoftwareVersions: models.SoftwareVersions{ - {Name: models.MysqldSoftwareName, Version: "8.0.25"}, - {Name: models.XtrabackupSoftwareName, Version: "8.0.25"}, - {Name: models.XbcloudSoftwareName, Version: "8.0.25"}, - {Name: models.QpressSoftwareName, Version: ""}, + { + ServiceID: "4", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MysqldSoftwareName, Version: "8.0.25"}, + {Name: models.XtrabackupSoftwareName, Version: "8.0.25"}, + {Name: models.XbcloudSoftwareName, Version: "8.0.25"}, + {Name: models.QpressSoftwareName, Version: ""}, + }, }, - }, - { - ServiceID: "5", - SoftwareVersions: models.SoftwareVersions{ - {Name: models.MysqldSoftwareName, Version: "8.0.25"}, - {Name: models.XtrabackupSoftwareName, Version: "8.0.25"}, - {Name: models.XbcloudSoftwareName, Version: "8.0.25"}, - {Name: models.QpressSoftwareName, Version: "1.1"}, + { + ServiceID: "5", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MysqldSoftwareName, Version: "8.0.25"}, + {Name: models.XtrabackupSoftwareName, Version: "8.0.25"}, + {Name: models.XbcloudSoftwareName, Version: "8.0.25"}, + {Name: models.QpressSoftwareName, Version: "1.1"}, + }, }, - }, - { - ServiceID: "6", - SoftwareVersions: models.SoftwareVersions{ - {Name: models.MysqldSoftwareName, Version: "8.0.25"}, - {Name: models.XtrabackupSoftwareName, Version: ""}, - {Name: models.XbcloudSoftwareName, Version: "8.0.25"}, - {Name: models.QpressSoftwareName, Version: "1.1"}, + { + ServiceID: "6", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MysqldSoftwareName, Version: "8.0.25"}, + {Name: models.XtrabackupSoftwareName, Version: ""}, + {Name: models.XbcloudSoftwareName, Version: "8.0.25"}, + {Name: models.QpressSoftwareName, Version: "1.1"}, + }, }, - }, - { - ServiceID: "7", - SoftwareVersions: models.SoftwareVersions{ - {Name: models.MysqldSoftwareName, Version: "8.0.24"}, - {Name: models.XtrabackupSoftwareName, Version: "8.0.25"}, - {Name: models.XbcloudSoftwareName, Version: "8.0.25"}, - {Name: models.QpressSoftwareName, Version: "1.1"}, + { + ServiceID: "7", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MysqldSoftwareName, Version: "8.0.24"}, + {Name: models.XtrabackupSoftwareName, Version: "8.0.25"}, + {Name: models.XbcloudSoftwareName, Version: "8.0.25"}, + {Name: models.QpressSoftwareName, Version: "1.1"}, + }, }, - }, - { - ServiceID: "8", - SoftwareVersions: models.SoftwareVersions{ - {Name: models.MysqldSoftwareName, Version: "8.0.25"}, - {Name: models.XtrabackupSoftwareName, Version: "8.0.26"}, - {Name: models.XbcloudSoftwareName, Version: "8.0.26"}, - {Name: models.QpressSoftwareName, Version: "1.1"}, + { + ServiceID: "8", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MysqldSoftwareName, Version: "8.0.25"}, + {Name: models.XtrabackupSoftwareName, Version: "8.0.26"}, + {Name: models.XbcloudSoftwareName, Version: "8.0.26"}, + {Name: models.QpressSoftwareName, Version: "1.1"}, + }, }, - }, - } + } - t.Run("empty db version", func(t *testing.T) { - res := cSvc.findCompatibleServiceIDs(&models.Artifact{DBVersion: ""}, testSet) - assert.Equal(t, 0, len(res)) - }) - t.Run("matches several", func(t *testing.T) { - res := cSvc.findCompatibleServiceIDs(&models.Artifact{DBVersion: "8.0.25"}, testSet) - assert.ElementsMatch(t, []string{"5", "8"}, res) - }) - t.Run("matches one", func(t *testing.T) { - res := cSvc.findCompatibleServiceIDs(&models.Artifact{DBVersion: "8.0.24"}, testSet) - assert.ElementsMatch(t, []string{"7"}, res) + t.Run("empty db version", func(t *testing.T) { + t.Parallel() + res := cSvc.findCompatibleServiceIDs(&models.Artifact{Vendor: "mysql", DBVersion: ""}, testSet) + assert.Equal(t, 0, len(res)) + }) + t.Run("matches several", func(t *testing.T) { + t.Parallel() + res := cSvc.findCompatibleServiceIDs(&models.Artifact{Vendor: "mysql", DBVersion: "8.0.25"}, testSet) + assert.ElementsMatch(t, []string{"5", "8"}, res) + }) + t.Run("matches one", func(t *testing.T) { + t.Parallel() + res := cSvc.findCompatibleServiceIDs(&models.Artifact{Vendor: "mysql", DBVersion: "8.0.24"}, testSet) + assert.ElementsMatch(t, []string{"7"}, res) + }) + t.Run("artifact version greater then existing services", func(t *testing.T) { + t.Parallel() + res := cSvc.findCompatibleServiceIDs(&models.Artifact{Vendor: "mysql", DBVersion: "8.0.30"}, testSet) + assert.Equal(t, 0, len(res)) + }) }) - t.Run("artifact version greater then existing services", func(t *testing.T) { - res := cSvc.findCompatibleServiceIDs(&models.Artifact{DBVersion: "8.0.30"}, testSet) - assert.Equal(t, 0, len(res)) + + t.Run("mongo", func(t *testing.T) { + testSet := []*models.ServiceSoftwareVersions{ + { + ServiceID: "1", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MongoDBSoftwareName, Version: ""}, + {Name: models.PBMSoftwareName, Version: "2.0.1"}, + }, + }, + { + ServiceID: "2", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MongoDBSoftwareName, Version: "6.0.5"}, + {Name: models.PBMSoftwareName, Version: "2.0.0"}, + }, + }, + { + ServiceID: "3", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MongoDBSoftwareName, Version: "6.0.5"}, + {Name: models.PBMSoftwareName, Version: ""}, + }, + }, + { + ServiceID: "4", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MongoDBSoftwareName, Version: "6.0.5"}, + {Name: models.PBMSoftwareName, Version: "2.0.1"}, + }, + }, + { + ServiceID: "5", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MongoDBSoftwareName, Version: "5.0.5"}, + {Name: models.PBMSoftwareName, Version: "2.0.5"}, + }, + }, + { + ServiceID: "6", + SoftwareVersions: models.SoftwareVersions{ + {Name: models.MongoDBSoftwareName, Version: "5.0.5"}, + {Name: models.PBMSoftwareName, Version: "2.0.5"}, + }, + }, + } + + t.Run("empty db version", func(t *testing.T) { + res := cSvc.findCompatibleServiceIDs(&models.Artifact{Vendor: "mongodb", DBVersion: ""}, testSet) + assert.Equal(t, 0, len(res)) + }) + t.Run("matches several", func(t *testing.T) { + res := cSvc.findCompatibleServiceIDs(&models.Artifact{Vendor: "mongodb", DBVersion: "5.0.5"}, testSet) + assert.ElementsMatch(t, []string{"5", "6"}, res) + }) + t.Run("matches one", func(t *testing.T) { + res := cSvc.findCompatibleServiceIDs(&models.Artifact{Vendor: "mongodb", DBVersion: "6.0.5"}, testSet) + assert.ElementsMatch(t, []string{"4"}, res) + }) }) } -func TestFindArtifactCompatibleServices(t *testing.T) { //nolint:maintidx +func TestFindArtifactCompatibleServices(t *testing.T) { sqlDB := testdb.Open(t, models.SkipFixtures, nil) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) cSvc := NewCompatibilityService(db, nil) @@ -370,24 +438,6 @@ func TestFindArtifactCompatibleServices(t *testing.T) { //nolint:maintidx errString: "", expectEmptyResult: false, }, - { - name: "non-mysql db vendor", - artifactIDToSearch: "test_artifact_id", - artifact: models.Artifact{ - ID: "test_artifact_id", - Name: " ", - Vendor: "mongodb", - DBVersion: "8.0.25", - LocationID: "test_location_id", - ServiceID: "test_service_id", - DataModel: " ", - Mode: " ", - Status: " ", - Type: " ", - }, - errString: "", - expectEmptyResult: false, - }, { name: "no software versions data for mysql", artifactIDToSearch: "test_artifact_id", @@ -632,7 +682,9 @@ func TestArtifactCompatibility(t *testing.T) { } for _, tc := range tests { + tc := tc t.Run(tc.name, func(t *testing.T) { + t.Parallel() err := cSvc.artifactCompatibility(tc.artifact, tc.service, tc.targetDBVersion) if tc.expectedErr == nil { diff --git a/managed/services/backup/deps.go b/managed/services/backup/deps.go index 07c73cfe0d..86c0caf8a4 100644 --- a/managed/services/backup/deps.go +++ b/managed/services/backup/deps.go @@ -24,13 +24,13 @@ import ( "github.com/percona/pmm/managed/services/minio" ) -//go:generate ../../../bin/mockery -name=jobsService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=agentService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=versioner -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=compatibilityService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=pbmPITRService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=Storage -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=removalService -case=snake -inpkg -testonly +//go:generate ../../../bin/mockery --name=jobsService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=agentService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=versioner --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=compatibilityService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=pbmPITRService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=Storage --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=removalService --case=snake --inpackage --testonly // jobsService is a subset of methods of agents.JobsService used by this package. // We use it instead of real type for testing and to avoid dependency cycle. diff --git a/managed/services/backup/mock_agent_service_test.go b/managed/services/backup/mock_agent_service_test.go index 9c5b5f0505..751305bfde 100644 --- a/managed/services/backup/mock_agent_service_test.go +++ b/managed/services/backup/mock_agent_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package backup @@ -26,3 +26,18 @@ func (_m *mockAgentService) PBMSwitchPITR(pmmAgentID string, dsn string, files m return r0 } + +// newMockAgentService creates a new instance of mockAgentService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAgentService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAgentService { + mock := &mockAgentService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/backup/mock_compatibility_service_test.go b/managed/services/backup/mock_compatibility_service_test.go index c974271e2b..b49cf7d5af 100644 --- a/managed/services/backup/mock_compatibility_service_test.go +++ b/managed/services/backup/mock_compatibility_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package backup @@ -32,13 +32,16 @@ func (_m *mockCompatibilityService) CheckSoftwareCompatibilityForService(ctx con ret := _m.Called(ctx, serviceID) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (string, error)); ok { + return rf(ctx, serviceID) + } if rf, ok := ret.Get(0).(func(context.Context, string) string); ok { r0 = rf(ctx, serviceID) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, serviceID) } else { @@ -47,3 +50,18 @@ func (_m *mockCompatibilityService) CheckSoftwareCompatibilityForService(ctx con return r0, r1 } + +// newMockCompatibilityService creates a new instance of mockCompatibilityService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockCompatibilityService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockCompatibilityService { + mock := &mockCompatibilityService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/backup/mock_jobs_service_test.go b/managed/services/backup/mock_jobs_service_test.go index 34b0028815..8d146ba6f5 100644 --- a/managed/services/backup/mock_jobs_service_test.go +++ b/managed/services/backup/mock_jobs_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package backup @@ -84,3 +84,18 @@ func (_m *mockJobsService) StopJob(jobID string) error { return r0 } + +// newMockJobsService creates a new instance of mockJobsService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockJobsService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockJobsService { + mock := &mockJobsService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/backup/mock_pbm_pitr_service_test.go b/managed/services/backup/mock_pbm_pitr_service_test.go index 104259ebe8..2f406faeab 100644 --- a/managed/services/backup/mock_pbm_pitr_service_test.go +++ b/managed/services/backup/mock_pbm_pitr_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package backup @@ -21,6 +21,10 @@ func (_m *mockPbmPITRService) GetPITRFiles(ctx context.Context, locationClient S ret := _m.Called(ctx, locationClient, location, artifact, until) var r0 []*oplogChunk + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, Storage, *models.BackupLocation, *models.Artifact, *time.Time) ([]*oplogChunk, error)); ok { + return rf(ctx, locationClient, location, artifact, until) + } if rf, ok := ret.Get(0).(func(context.Context, Storage, *models.BackupLocation, *models.Artifact, *time.Time) []*oplogChunk); ok { r0 = rf(ctx, locationClient, location, artifact, until) } else { @@ -29,7 +33,6 @@ func (_m *mockPbmPITRService) GetPITRFiles(ctx context.Context, locationClient S } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, Storage, *models.BackupLocation, *models.Artifact, *time.Time) error); ok { r1 = rf(ctx, locationClient, location, artifact, until) } else { @@ -44,6 +47,10 @@ func (_m *mockPbmPITRService) ListPITRTimeranges(ctx context.Context, locationCl ret := _m.Called(ctx, locationClient, location, artifact) var r0 []Timeline + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, Storage, *models.BackupLocation, *models.Artifact) ([]Timeline, error)); ok { + return rf(ctx, locationClient, location, artifact) + } if rf, ok := ret.Get(0).(func(context.Context, Storage, *models.BackupLocation, *models.Artifact) []Timeline); ok { r0 = rf(ctx, locationClient, location, artifact) } else { @@ -52,7 +59,6 @@ func (_m *mockPbmPITRService) ListPITRTimeranges(ctx context.Context, locationCl } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, Storage, *models.BackupLocation, *models.Artifact) error); ok { r1 = rf(ctx, locationClient, location, artifact) } else { @@ -61,3 +67,18 @@ func (_m *mockPbmPITRService) ListPITRTimeranges(ctx context.Context, locationCl return r0, r1 } + +// newMockPbmPITRService creates a new instance of mockPbmPITRService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockPbmPITRService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockPbmPITRService { + mock := &mockPbmPITRService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/backup/mock_removal_service_test.go b/managed/services/backup/mock_removal_service_test.go index b7b7675a35..eee389c9c4 100644 --- a/managed/services/backup/mock_removal_service_test.go +++ b/managed/services/backup/mock_removal_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package backup @@ -36,3 +36,18 @@ func (_m *mockRemovalService) TrimPITRArtifact(storage Storage, artifactID strin return r0 } + +// newMockRemovalService creates a new instance of mockRemovalService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockRemovalService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockRemovalService { + mock := &mockRemovalService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/backup/mock_storage_test.go b/managed/services/backup/mock_storage_test.go index 5de2ba4101..e781536785 100644 --- a/managed/services/backup/mock_storage_test.go +++ b/managed/services/backup/mock_storage_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package backup @@ -20,13 +20,16 @@ func (_m *MockStorage) FileStat(ctx context.Context, endpoint string, accessKey ret := _m.Called(ctx, endpoint, accessKey, secretKey, bucketName, name) var r0 minio.FileInfo + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string, string) (minio.FileInfo, error)); ok { + return rf(ctx, endpoint, accessKey, secretKey, bucketName, name) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string, string) minio.FileInfo); ok { r0 = rf(ctx, endpoint, accessKey, secretKey, bucketName, name) } else { r0 = ret.Get(0).(minio.FileInfo) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string, string) error); ok { r1 = rf(ctx, endpoint, accessKey, secretKey, bucketName, name) } else { @@ -41,6 +44,10 @@ func (_m *MockStorage) List(ctx context.Context, endpoint string, accessKey stri ret := _m.Called(ctx, endpoint, accessKey, secretKey, bucketName, prefix, suffix) var r0 []minio.FileInfo + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string, string, string) ([]minio.FileInfo, error)); ok { + return rf(ctx, endpoint, accessKey, secretKey, bucketName, prefix, suffix) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string, string, string) []minio.FileInfo); ok { r0 = rf(ctx, endpoint, accessKey, secretKey, bucketName, prefix, suffix) } else { @@ -49,7 +56,6 @@ func (_m *MockStorage) List(ctx context.Context, endpoint string, accessKey stri } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string, string, string) error); ok { r1 = rf(ctx, endpoint, accessKey, secretKey, bucketName, prefix, suffix) } else { @@ -86,3 +92,18 @@ func (_m *MockStorage) RemoveRecursive(ctx context.Context, endpoint string, acc return r0 } + +// NewMockStorage creates a new instance of MockStorage. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockStorage(t interface { + mock.TestingT + Cleanup(func()) +}, +) *MockStorage { + mock := &MockStorage{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/backup/mock_versioner_test.go b/managed/services/backup/mock_versioner_test.go index b577a352fb..7af63a09d2 100644 --- a/managed/services/backup/mock_versioner_test.go +++ b/managed/services/backup/mock_versioner_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package backup @@ -18,6 +18,10 @@ func (_m *mockVersioner) GetVersions(pmmAgentID string, softwares []agents.Softw ret := _m.Called(pmmAgentID, softwares) var r0 []agents.Version + var r1 error + if rf, ok := ret.Get(0).(func(string, []agents.Software) ([]agents.Version, error)); ok { + return rf(pmmAgentID, softwares) + } if rf, ok := ret.Get(0).(func(string, []agents.Software) []agents.Version); ok { r0 = rf(pmmAgentID, softwares) } else { @@ -26,7 +30,6 @@ func (_m *mockVersioner) GetVersions(pmmAgentID string, softwares []agents.Softw } } - var r1 error if rf, ok := ret.Get(1).(func(string, []agents.Software) error); ok { r1 = rf(pmmAgentID, softwares) } else { @@ -35,3 +38,18 @@ func (_m *mockVersioner) GetVersions(pmmAgentID string, softwares []agents.Softw return r0, r1 } + +// newMockVersioner creates a new instance of mockVersioner. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockVersioner(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockVersioner { + mock := &mockVersioner{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/backup/pitr_timerange_service.go b/managed/services/backup/pitr_timerange_service.go index cc82678d6d..8f691a7777 100644 --- a/managed/services/backup/pitr_timerange_service.go +++ b/managed/services/backup/pitr_timerange_service.go @@ -31,7 +31,7 @@ import ( ) const ( - // pitrFSPrefix is the prefix (folder) for all PITR artifacts in the backup location. + // - pitrFSPrefix is the prefix (folder) for all PITR artifacts in the backup location. pitrFSPrefix = "pbmPitr" ) @@ -190,7 +190,7 @@ func trimTimelines(timelines []Timeline) { // current format is 20200715155939-0.20200715160029-1.oplog.snappy // (https://github.com/percona/percona-backup-mongodb/wiki/PITR:-storage-layout) // -// !!! should be agreed with pbm/pitr.chunkPath() +// !!! Should be agreed with pbm/pitr.chunkPath() func pitrMetaFromFileName(prefix, f string) *oplogChunk { ppath := strings.Split(f, "/") if len(ppath) < 2 { diff --git a/managed/services/backup/pitr_timerange_service_test.go b/managed/services/backup/pitr_timerange_service_test.go index 192b93d3e3..ed9765293b 100644 --- a/managed/services/backup/pitr_timerange_service_test.go +++ b/managed/services/backup/pitr_timerange_service_test.go @@ -104,10 +104,10 @@ func TestGetPITROplogs(t *testing.T) { }, } - //statFile := minio.FileInfo{ - // Name: pitrFSPrefix + "rs0/20220829/20220829115611-1.20220829120544-10.oplog.s2", - // Size: 1024, - //} + // statFile := minio.FileInfo{ + // Name: pitrFSPrefix + "rs0/20220829/20220829115611-1.20220829120544-10.oplog.s2", + // Size: 1024, + // } mockedStorage.On("List", ctx, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(listedFiles, nil).Once() service := NewPBMPITRService() diff --git a/managed/services/backup/removal_service.go b/managed/services/backup/removal_service.go index ae0733acdf..50e4e7ab01 100644 --- a/managed/services/backup/removal_service.go +++ b/managed/services/backup/removal_service.go @@ -91,18 +91,12 @@ func (s *RemovalService) DeleteArtifact(storage Storage, artifactID string, remo return } - service, err := models.FindServiceByID(s.db.Querier, artifact.ServiceID) - if err != nil { - s.l.WithError(err).Error("couldn't get service") - return - } - if err = s.deleteArtifactFiles(context.Background(), storage, location, artifact, len(artifact.MetadataList)); err != nil { s.l.WithError(err).Error("couldn't delete artifact files") return } - if service.ServiceType == models.MongoDBServiceType && artifact.Mode == models.PITR { + if artifact.Vendor == string(models.MongoDBServiceType) && artifact.Mode == models.PITR { if err = s.deleteArtifactPITRChunks(context.Background(), storage, location, artifact, nil); err != nil { s.l.WithError(err).Error("couldn't delete artifact PITR chunks") return diff --git a/managed/services/backup/removal_service_test.go b/managed/services/backup/removal_service_test.go index d88b35cb9e..5afb9691b9 100644 --- a/managed/services/backup/removal_service_test.go +++ b/managed/services/backup/removal_service_test.go @@ -185,7 +185,7 @@ func TestDeleteArtifact(t *testing.T) { artifact, err := models.CreateArtifact(db.Querier, models.CreateArtifactParams{ Name: "artifact_name", - Vendor: "MongoDB", + Vendor: "mongodb", LocationID: locationRes.ID, ServiceID: *agent.ServiceID, DataModel: models.LogicalDataModel, diff --git a/managed/services/backup/storage.go b/managed/services/backup/storage.go index afae1fd4a4..27ab35acec 100644 --- a/managed/services/backup/storage.go +++ b/managed/services/backup/storage.go @@ -21,7 +21,7 @@ import ( ) // GetStorageForLocation returns storage client depending on location type. -func GetStorageForLocation(location *models.BackupLocation) Storage { +func GetStorageForLocation(location *models.BackupLocation) Storage { //nolint:ireturn switch location.Type { case models.S3BackupLocationType: return minio.New() diff --git a/managed/services/checks/checks.go b/managed/services/checks/checks.go index 72c915ed30..1d14bedb8b 100644 --- a/managed/services/checks/checks.go +++ b/managed/services/checks/checks.go @@ -717,7 +717,7 @@ func (s *Service) executeChecks(ctx context.Context, intervalGroup check.Interva if err != nil { return errors.WithStack(err) } - mySQLChecks, postgreSQLChecks, mongoDBChecks := services.GroupChecksByDB(s.l, checks) + mySQLChecks, postgreSQLChecks, mongoDBChecks := groupChecksByDB(s.l, checks) mySQLChecks = s.filterChecks(mySQLChecks, intervalGroup, disabledChecks, checkNames) mySQLCheckResults := s.executeChecksForTargetType(ctx, models.MySQLServiceType, mySQLChecks) @@ -1689,7 +1689,7 @@ func (s *Service) refreshChecksInMemoryMetric() { return } s.mChecksAvailable.Reset() - mySQLChecks, postgreSQLChecks, mongoDBChecks := services.GroupChecksByDB(s.l, checks) + mySQLChecks, postgreSQLChecks, mongoDBChecks := groupChecksByDB(s.l, checks) s.incChecksInMemoryMetric(models.MySQLServiceType, mySQLChecks) s.incChecksInMemoryMetric(models.PostgreSQLServiceType, postgreSQLChecks) s.incChecksInMemoryMetric(models.MongoDBServiceType, mongoDBChecks) @@ -1701,6 +1701,27 @@ func (s *Service) incChecksInMemoryMetric(serviceType models.ServiceType, checks } } +// groupChecksByDB splits provided checks by database and returns three slices: for MySQL, for PostgreSQL and for MongoDB. +func groupChecksByDB(l *logrus.Entry, checks map[string]check.Check) (mySQLChecks, postgreSQLChecks, mongoDBChecks map[string]check.Check) { //nolint:nonamedreturns + mySQLChecks = make(map[string]check.Check) + postgreSQLChecks = make(map[string]check.Check) + mongoDBChecks = make(map[string]check.Check) + for _, c := range checks { + switch c.GetFamily() { + case check.MySQL: + mySQLChecks[c.Name] = c + case check.PostgreSQL: + postgreSQLChecks[c.Name] = c + case check.MongoDB: + mongoDBChecks[c.Name] = c + default: + l.Warnf("Unknown check family %s, will be skipped.", c.Family) + } + } + + return +} + // check interfaces. var ( _ prom.Collector = (*Service)(nil) diff --git a/managed/services/checks/checks_test.go b/managed/services/checks/checks_test.go index 9360df9f9f..1eba59211c 100644 --- a/managed/services/checks/checks_test.go +++ b/managed/services/checks/checks_test.go @@ -29,6 +29,7 @@ import ( metrics "github.com/prometheus/client_golang/api" v1 "github.com/prometheus/client_golang/api/prometheus/v1" "github.com/prometheus/common/model" + "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -534,11 +535,11 @@ func TestFilterChecks(t *testing.T) { }, } - checks := append(valid, invalid...) + checks := append(valid, invalid...) //nolint:gocritic partiallyValidAdvisor := invalid[1] partiallyValidAdvisor.Checks = partiallyValidAdvisor.Checks[0:1] // remove invalid check - expected := append(valid, partiallyValidAdvisor) + expected := append(valid, partiallyValidAdvisor) //nolint:gocritic s := New(nil, nil, nil, nil, vmClient, clickhouseDB) actual := s.filterSupportedChecks(checks) @@ -618,6 +619,7 @@ func setupClients(t *testing.T) { } func TestFindTargets(t *testing.T) { + t.Parallel() sqlDB := testdb.Open(t, models.SetupFixtures, nil) t.Cleanup(func() { require.NoError(t, sqlDB.Close()) @@ -703,8 +705,6 @@ func TestFilterChecksByInterval(t *testing.T) { } func TestGetFailedChecks(t *testing.T) { - t.Parallel() - sqlDB := testdb.Open(t, models.SkipFixtures, nil) t.Cleanup(func() { require.NoError(t, sqlDB.Close()) @@ -930,3 +930,50 @@ func TestFillQueryPlaceholders(t *testing.T) { }) } } + +func TestGroupChecksByDB(t *testing.T) { + t.Parallel() + + checks := map[string]check.Check{ + "MySQLShow": {Name: "MySQLShow", Version: 1, Type: check.MySQLShow}, + "MySQLSelect": {Name: "MySQLSelect", Version: 1, Type: check.MySQLSelect}, + "PostgreSQLShow": {Name: "PostgreSQLShow", Version: 1, Type: check.PostgreSQLShow}, + "PostgreSQLSelect": {Name: "PostgreSQLSelect", Version: 1, Type: check.PostgreSQLSelect}, + "MongoDBGetParameter": {Name: "MongoDBGetParameter", Version: 1, Type: check.MongoDBGetParameter}, + "MongoDBBuildInfo": {Name: "MongoDBBuildInfo", Version: 1, Type: check.MongoDBBuildInfo}, + "MongoDBGetCmdLineOpts": {Name: "MongoDBGetCmdLineOpts", Version: 1, Type: check.MongoDBGetCmdLineOpts}, + "MongoDBReplSetGetStatus": {Name: "MongoDBReplSetGetStatus", Version: 1, Type: check.MongoDBReplSetGetStatus}, + "MongoDBGetDiagnosticData": {Name: "MongoDBGetDiagnosticData", Version: 1, Type: check.MongoDBGetDiagnosticData}, + "unsupported type": {Name: "unsupported type", Version: 1, Type: check.Type("RedisInfo")}, + "missing type": {Name: "missing type", Version: 1}, + "MySQL family V2": {Name: "MySQL family V2", Version: 2, Family: check.MySQL}, + "PostgreSQL family V2": {Name: "PostgreSQL family V2", Version: 2, Family: check.PostgreSQL}, + "MongoDB family V2": {Name: "MongoDB family V2", Version: 2, Family: check.MongoDB}, + "missing family": {Name: "missing family", Version: 2}, + } + + l := logrus.WithField("component", "tests") + mySQLChecks, postgreSQLChecks, mongoDBChecks := groupChecksByDB(l, checks) + + require.Len(t, mySQLChecks, 3) + require.Len(t, postgreSQLChecks, 3) + require.Len(t, mongoDBChecks, 6) + + // V1 checks + assert.Equal(t, check.MySQLShow, mySQLChecks["MySQLShow"].Type) + assert.Equal(t, check.MySQLSelect, mySQLChecks["MySQLSelect"].Type) + + assert.Equal(t, check.PostgreSQLShow, postgreSQLChecks["PostgreSQLShow"].Type) + assert.Equal(t, check.PostgreSQLSelect, postgreSQLChecks["PostgreSQLSelect"].Type) + + assert.Equal(t, check.MongoDBGetParameter, mongoDBChecks["MongoDBGetParameter"].Type) + assert.Equal(t, check.MongoDBBuildInfo, mongoDBChecks["MongoDBBuildInfo"].Type) + assert.Equal(t, check.MongoDBGetCmdLineOpts, mongoDBChecks["MongoDBGetCmdLineOpts"].Type) + assert.Equal(t, check.MongoDBReplSetGetStatus, mongoDBChecks["MongoDBReplSetGetStatus"].Type) + assert.Equal(t, check.MongoDBGetDiagnosticData, mongoDBChecks["MongoDBGetDiagnosticData"].Type) + + // V2 checks + assert.Equal(t, check.MySQL, mySQLChecks["MySQL family V2"].Family) + assert.Equal(t, check.PostgreSQL, postgreSQLChecks["PostgreSQL family V2"].Family) + assert.Equal(t, check.MongoDB, mongoDBChecks["MongoDB family V2"].Family) +} diff --git a/managed/services/checks/deps.go b/managed/services/checks/deps.go index 66892e9450..d4b3feeccb 100644 --- a/managed/services/checks/deps.go +++ b/managed/services/checks/deps.go @@ -23,8 +23,8 @@ import ( "github.com/percona/pmm/managed/services" ) -//go:generate ../../../bin/mockery -name=agentsRegistry -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=alertmanagerService -case=snake -inpkg -testonly +//go:generate ../../../bin/mockery --name=agentsRegistry --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=alertmanagerService --case=snake --inpackage --testonly // agentsRegistry is a subset of methods of agents.Registry used by this package. // We use it instead of real type for testing and to avoid dependency cycle. diff --git a/managed/services/checks/funcs_test.go b/managed/services/checks/funcs_test.go index 3c9115fbb9..2212e34e6f 100644 --- a/managed/services/checks/funcs_test.go +++ b/managed/services/checks/funcs_test.go @@ -98,6 +98,7 @@ Traceback (most recent call last): } func TestAdditionalContext(t *testing.T) { + t.Parallel() predeclaredFuncs, err := GetFuncsForVersion(1) require.NoError(t, err) contextFuncs := GetAdditionalContext() diff --git a/managed/services/checks/mock_agents_registry_test.go b/managed/services/checks/mock_agents_registry_test.go index 5c0027ddc8..19f309ad3d 100644 --- a/managed/services/checks/mock_agents_registry_test.go +++ b/managed/services/checks/mock_agents_registry_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package checks @@ -140,3 +140,18 @@ func (_m *mockAgentsRegistry) StartPostgreSQLQueryShowAction(ctx context.Context return r0 } + +// newMockAgentsRegistry creates a new instance of mockAgentsRegistry. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAgentsRegistry(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAgentsRegistry { + mock := &mockAgentsRegistry{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/checks/mock_alertmanager_service_test.go b/managed/services/checks/mock_alertmanager_service_test.go index 305c5cd65b..5683226d54 100644 --- a/managed/services/checks/mock_alertmanager_service_test.go +++ b/managed/services/checks/mock_alertmanager_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package checks @@ -21,6 +21,10 @@ func (_m *mockAlertmanagerService) GetAlerts(ctx context.Context, params *servic ret := _m.Called(ctx, params) var r0 []*ammodels.GettableAlert + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *services.FilterParams) ([]*ammodels.GettableAlert, error)); ok { + return rf(ctx, params) + } if rf, ok := ret.Get(0).(func(context.Context, *services.FilterParams) []*ammodels.GettableAlert); ok { r0 = rf(ctx, params) } else { @@ -29,7 +33,6 @@ func (_m *mockAlertmanagerService) GetAlerts(ctx context.Context, params *servic } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *services.FilterParams) error); ok { r1 = rf(ctx, params) } else { @@ -71,3 +74,18 @@ func (_m *mockAlertmanagerService) UnsilenceAlerts(ctx context.Context, alerts [ return r0 } + +// newMockAlertmanagerService creates a new instance of mockAlertmanagerService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAlertmanagerService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAlertmanagerService { + mock := &mockAlertmanagerService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/config/config.go b/managed/services/config/config.go index 271a23881a..c8637bd278 100644 --- a/managed/services/config/config.go +++ b/managed/services/config/config.go @@ -14,6 +14,8 @@ // along with this program. If not, see . // Package config provides configuration facility. +// +// Deprecated: please don't extend this package, it will be removed soon https://jira.percona.com/browse/PMM-11155 package config import ( diff --git a/managed/services/config/pmm-managed.yaml b/managed/services/config/pmm-managed.yaml index 8068096020..af40bfc254 100644 --- a/managed/services/config/pmm-managed.yaml +++ b/managed/services/config/pmm-managed.yaml @@ -1,3 +1,4 @@ +# DEPRECATED! Please don't add anything there, this package is deprecated and will be removed soon https://jira.percona.com/browse/PMM-11155 services: telemetry: enabled: true diff --git a/managed/services/converters.go b/managed/services/converters.go index 7cf584d9d7..edfcf3f4e9 100644 --- a/managed/services/converters.go +++ b/managed/services/converters.go @@ -28,7 +28,7 @@ import ( ) // ToAPINode converts Node database model to API model. -func ToAPINode(node *models.Node) (inventorypb.Node, error) { +func ToAPINode(node *models.Node) (inventorypb.Node, error) { //nolint:ireturn labels, err := node.GetCustomLabels() if err != nil { return nil, err @@ -101,7 +101,7 @@ func ToAPINode(node *models.Node) (inventorypb.Node, error) { } // ToAPIService converts Service database model to API model. -func ToAPIService(service *models.Service) (inventorypb.Service, error) { +func ToAPIService(service *models.Service) (inventorypb.Service, error) { //nolint:ireturn labels, err := service.GetCustomLabels() if err != nil { return nil, err @@ -194,7 +194,7 @@ func ToAPIService(service *models.Service) (inventorypb.Service, error) { } // ToAPIAgent converts Agent database model to API model. -func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventorypb.Agent, error) { +func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventorypb.Agent, error) { //nolint:ireturn,maintidx labels, err := agent.GetCustomLabels() if err != nil { return nil, err @@ -303,36 +303,38 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventorypb.Agent, erro case models.QANMySQLPerfSchemaAgentType: return &inventorypb.QANMySQLPerfSchemaAgent{ - AgentId: agent.AgentID, - PmmAgentId: pointer.GetString(agent.PMMAgentID), - ServiceId: serviceID, - Username: pointer.GetString(agent.Username), - Disabled: agent.Disabled, - Status: inventorypb.AgentStatus(inventorypb.AgentStatus_value[agent.Status]), - CustomLabels: labels, - Tls: agent.TLS, - TlsSkipVerify: agent.TLSSkipVerify, - MaxQueryLength: agent.MaxQueryLength, - QueryExamplesDisabled: agent.QueryExamplesDisabled, - ProcessExecPath: processExecPath, - LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), + AgentId: agent.AgentID, + PmmAgentId: pointer.GetString(agent.PMMAgentID), + ServiceId: serviceID, + Username: pointer.GetString(agent.Username), + Disabled: agent.Disabled, + Status: inventorypb.AgentStatus(inventorypb.AgentStatus_value[agent.Status]), + CustomLabels: labels, + Tls: agent.TLS, + TlsSkipVerify: agent.TLSSkipVerify, + MaxQueryLength: agent.MaxQueryLength, + QueryExamplesDisabled: agent.QueryExamplesDisabled, + DisableCommentsParsing: agent.CommentsParsingDisabled, + ProcessExecPath: processExecPath, + LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), }, nil case models.QANMySQLSlowlogAgentType: return &inventorypb.QANMySQLSlowlogAgent{ - AgentId: agent.AgentID, - PmmAgentId: pointer.GetString(agent.PMMAgentID), - ServiceId: serviceID, - Username: pointer.GetString(agent.Username), - Disabled: agent.Disabled, - Status: inventorypb.AgentStatus(inventorypb.AgentStatus_value[agent.Status]), - CustomLabels: labels, - Tls: agent.TLS, - TlsSkipVerify: agent.TLSSkipVerify, - QueryExamplesDisabled: agent.QueryExamplesDisabled, - MaxSlowlogFileSize: agent.MaxQueryLogSize, - ProcessExecPath: processExecPath, - LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), + AgentId: agent.AgentID, + PmmAgentId: pointer.GetString(agent.PMMAgentID), + ServiceId: serviceID, + Username: pointer.GetString(agent.Username), + Disabled: agent.Disabled, + Status: inventorypb.AgentStatus(inventorypb.AgentStatus_value[agent.Status]), + CustomLabels: labels, + Tls: agent.TLS, + TlsSkipVerify: agent.TLSSkipVerify, + QueryExamplesDisabled: agent.QueryExamplesDisabled, + DisableCommentsParsing: agent.CommentsParsingDisabled, + MaxSlowlogFileSize: agent.MaxQueryLogSize, + ProcessExecPath: processExecPath, + LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), }, nil case models.QANMongoDBProfilerAgentType: @@ -372,35 +374,37 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventorypb.Agent, erro case models.QANPostgreSQLPgStatementsAgentType: return &inventorypb.QANPostgreSQLPgStatementsAgent{ - AgentId: agent.AgentID, - PmmAgentId: pointer.GetString(agent.PMMAgentID), - ServiceId: serviceID, - Username: pointer.GetString(agent.Username), - Disabled: agent.Disabled, - Status: inventorypb.AgentStatus(inventorypb.AgentStatus_value[agent.Status]), - CustomLabels: labels, - MaxQueryLength: agent.MaxQueryLength, - Tls: agent.TLS, - TlsSkipVerify: agent.TLSSkipVerify, - ProcessExecPath: processExecPath, - LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), + AgentId: agent.AgentID, + PmmAgentId: pointer.GetString(agent.PMMAgentID), + ServiceId: serviceID, + Username: pointer.GetString(agent.Username), + Disabled: agent.Disabled, + Status: inventorypb.AgentStatus(inventorypb.AgentStatus_value[agent.Status]), + CustomLabels: labels, + MaxQueryLength: agent.MaxQueryLength, + DisableCommentsParsing: agent.CommentsParsingDisabled, + Tls: agent.TLS, + TlsSkipVerify: agent.TLSSkipVerify, + ProcessExecPath: processExecPath, + LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), }, nil case models.QANPostgreSQLPgStatMonitorAgentType: return &inventorypb.QANPostgreSQLPgStatMonitorAgent{ - AgentId: agent.AgentID, - PmmAgentId: pointer.GetString(agent.PMMAgentID), - ServiceId: serviceID, - Username: pointer.GetString(agent.Username), - Disabled: agent.Disabled, - Status: inventorypb.AgentStatus(inventorypb.AgentStatus_value[agent.Status]), - CustomLabels: labels, - MaxQueryLength: agent.MaxQueryLength, - Tls: agent.TLS, - TlsSkipVerify: agent.TLSSkipVerify, - QueryExamplesDisabled: agent.QueryExamplesDisabled, - ProcessExecPath: processExecPath, - LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), + AgentId: agent.AgentID, + PmmAgentId: pointer.GetString(agent.PMMAgentID), + ServiceId: serviceID, + Username: pointer.GetString(agent.Username), + Disabled: agent.Disabled, + Status: inventorypb.AgentStatus(inventorypb.AgentStatus_value[agent.Status]), + CustomLabels: labels, + MaxQueryLength: agent.MaxQueryLength, + Tls: agent.TLS, + TlsSkipVerify: agent.TLSSkipVerify, + QueryExamplesDisabled: agent.QueryExamplesDisabled, + DisableCommentsParsing: agent.CommentsParsingDisabled, + ProcessExecPath: processExecPath, + LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), }, nil case models.RDSExporterType: diff --git a/managed/services/dbaas/kubernetes/client/client.go b/managed/services/dbaas/kubernetes/client/client.go index 4256a92f61..309887ee9f 100644 --- a/managed/services/dbaas/kubernetes/client/client.go +++ b/managed/services/dbaas/kubernetes/client/client.go @@ -432,7 +432,7 @@ func (c *Client) retrieveMetaFromObject(obj runtime.Object) (namespace, name str return } -func (c *Client) resourceClient(gv schema.GroupVersion) (rest.Interface, error) { +func (c *Client) resourceClient(gv schema.GroupVersion) (*rest.RESTClient, error) { cfg := c.restConfig cfg.ContentConfig = resource.UnstructuredPlusDefaultContentConfig() cfg.GroupVersion = &gv @@ -539,7 +539,7 @@ func (c *Client) GetEvents(ctx context.Context, name string) (string, error) { var events *corev1.EventList if ref, err := reference.GetReference(scheme.Scheme, pod); err != nil { - fmt.Printf("Unable to construct reference to '%#v': %v", pod, err) + fmt.Printf("Unable to construct reference to '%#v': %v", pod, err) //nolint:forbidigo } else { ref.Kind = "" if _, isMirrorPod := pod.Annotations[corev1.MirrorPodAnnotationKey]; isMirrorPod { @@ -589,11 +589,12 @@ func DescribeEvents(el *corev1.EventList, w PrefixWriter) { firstTimestampSince = translateTimestampSince(e.FirstTimestamp) } - if e.Series != nil { + switch { + case e.Series != nil: interval = fmt.Sprintf("%s (x%d over %s)", translateMicroTimestampSince(e.Series.LastObservedTime), e.Series.Count, firstTimestampSince) - } else if e.Count > 1 { + case e.Count > 1: interval = fmt.Sprintf("%s (x%d over %s)", translateTimestampSince(e.LastTimestamp), e.Count, firstTimestampSince) - } else { + default: interval = firstTimestampSince } @@ -786,7 +787,7 @@ func (c Client) GetSubscriptionCSV(ctx context.Context, subKey types.NamespacedN return csvKey, wait.PollImmediateUntil(time.Second, subscriptionInstalledCSV, ctx.Done()) } -func (c *Client) getKubeclient() (client.Client, error) { +func (c *Client) getKubeclient() (client.Client, error) { //nolint:ireturn rm, err := apiutil.NewDynamicRESTMapper(c.restConfig) if err != nil { return nil, errors.Wrap(err, "failed to create dynamic rest mapper") diff --git a/managed/services/dbaas/kubernetes/client/database/database.go b/managed/services/dbaas/kubernetes/client/database/database.go index ee69257606..f803a10e72 100644 --- a/managed/services/dbaas/kubernetes/client/database/database.go +++ b/managed/services/dbaas/kubernetes/client/database/database.go @@ -62,7 +62,7 @@ func NewForConfig(c *rest.Config) (*DatabaseClusterClient, error) { return &DatabaseClusterClient{restClient: client}, nil } -func (c *DatabaseClusterClient) DBClusters(namespace string) DatabaseClusterInterface { +func (c *DatabaseClusterClient) DBClusters(namespace string) DatabaseClusterInterface { //nolint:ireturn return &dbClusterClient{ restClient: c.restClient, namespace: namespace, @@ -105,7 +105,7 @@ func (c *dbClusterClient) Get(ctx context.Context, name string, opts metav1.GetO return result, err } -func (c *dbClusterClient) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { +func (c *dbClusterClient) Watch(ctx context.Context, opts metav1.ListOptions) (watch.Interface, error) { //nolint:ireturn opts.Watch = true return c.restClient. Get(). diff --git a/managed/services/dbaas/kubernetes/client/gen.go b/managed/services/dbaas/kubernetes/client/gen.go index e2c6ee6c7a..fe733886cf 100644 --- a/managed/services/dbaas/kubernetes/client/gen.go +++ b/managed/services/dbaas/kubernetes/client/gen.go @@ -16,4 +16,4 @@ package client //go:generate ../../../../../bin/ifacemaker -f client.go -s Client -i KubeClientConnector -p client -o kubeclient_interface.go -//go:generate ../../../../../bin/mockery -name=KubeClientConnector -case=snake -inpkg +//go:generate ../../../../../bin/mockery --name=KubeClientConnector --case=snake --inpackage diff --git a/managed/services/dbaas/kubernetes/client/mock_kube_client_connector.go b/managed/services/dbaas/kubernetes/client/mock_kube_client_connector.go index 5f5c876978..694db0862d 100644 --- a/managed/services/dbaas/kubernetes/client/mock_kube_client_connector.go +++ b/managed/services/dbaas/kubernetes/client/mock_kube_client_connector.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package client @@ -59,6 +59,10 @@ func (_m *MockKubeClientConnector) CreateOperatorGroup(ctx context.Context, name ret := _m.Called(ctx, namespace, name) var r0 *v1.OperatorGroup + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (*v1.OperatorGroup, error)); ok { + return rf(ctx, namespace, name) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) *v1.OperatorGroup); ok { r0 = rf(ctx, namespace, name) } else { @@ -67,7 +71,6 @@ func (_m *MockKubeClientConnector) CreateOperatorGroup(ctx context.Context, name } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, namespace, name) } else { @@ -82,6 +85,10 @@ func (_m *MockKubeClientConnector) CreateSubscriptionForCatalog(ctx context.Cont ret := _m.Called(ctx, namespace, name, catalogNamespace, catalog, packageName, channel, startingCSV, approval) var r0 *v1alpha1.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string, string, string, string, v1alpha1.Approval) (*v1alpha1.Subscription, error)); ok { + return rf(ctx, namespace, name, catalogNamespace, catalog, packageName, channel, startingCSV, approval) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string, string, string, string, v1alpha1.Approval) *v1alpha1.Subscription); ok { r0 = rf(ctx, namespace, name, catalogNamespace, catalog, packageName, channel, startingCSV, approval) } else { @@ -90,7 +97,6 @@ func (_m *MockKubeClientConnector) CreateSubscriptionForCatalog(ctx context.Cont } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string, string, string, string, v1alpha1.Approval) error); ok { r1 = rf(ctx, namespace, name, catalogNamespace, catalog, packageName, channel, startingCSV, approval) } else { @@ -147,6 +153,10 @@ func (_m *MockKubeClientConnector) GenerateKubeConfig(secret *corev1.Secret) ([] ret := _m.Called(secret) var r0 []byte + var r1 error + if rf, ok := ret.Get(0).(func(*corev1.Secret) ([]byte, error)); ok { + return rf(secret) + } if rf, ok := ret.Get(0).(func(*corev1.Secret) []byte); ok { r0 = rf(secret) } else { @@ -155,7 +165,6 @@ func (_m *MockKubeClientConnector) GenerateKubeConfig(secret *corev1.Secret) ([] } } - var r1 error if rf, ok := ret.Get(1).(func(*corev1.Secret) error); ok { r1 = rf(secret) } else { @@ -170,6 +179,10 @@ func (_m *MockKubeClientConnector) GetDatabaseCluster(ctx context.Context, name ret := _m.Called(ctx, name) var r0 *apiv1.DatabaseCluster + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*apiv1.DatabaseCluster, error)); ok { + return rf(ctx, name) + } if rf, ok := ret.Get(0).(func(context.Context, string) *apiv1.DatabaseCluster); ok { r0 = rf(ctx, name) } else { @@ -178,7 +191,6 @@ func (_m *MockKubeClientConnector) GetDatabaseCluster(ctx context.Context, name } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, name) } else { @@ -193,6 +205,10 @@ func (_m *MockKubeClientConnector) GetDeployment(ctx context.Context, name strin ret := _m.Called(ctx, name) var r0 *appsv1.Deployment + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*appsv1.Deployment, error)); ok { + return rf(ctx, name) + } if rf, ok := ret.Get(0).(func(context.Context, string) *appsv1.Deployment); ok { r0 = rf(ctx, name) } else { @@ -201,7 +217,6 @@ func (_m *MockKubeClientConnector) GetDeployment(ctx context.Context, name strin } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, name) } else { @@ -216,13 +231,16 @@ func (_m *MockKubeClientConnector) GetEvents(ctx context.Context, name string) ( ret := _m.Called(ctx, name) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (string, error)); ok { + return rf(ctx, name) + } if rf, ok := ret.Get(0).(func(context.Context, string) string); ok { r0 = rf(ctx, name) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, name) } else { @@ -237,6 +255,10 @@ func (_m *MockKubeClientConnector) GetInstallPlan(ctx context.Context, namespace ret := _m.Called(ctx, namespace, name) var r0 *v1alpha1.InstallPlan + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (*v1alpha1.InstallPlan, error)); ok { + return rf(ctx, namespace, name) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) *v1alpha1.InstallPlan); ok { r0 = rf(ctx, namespace, name) } else { @@ -245,7 +267,6 @@ func (_m *MockKubeClientConnector) GetInstallPlan(ctx context.Context, namespace } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, namespace, name) } else { @@ -260,13 +281,16 @@ func (_m *MockKubeClientConnector) GetLogs(ctx context.Context, pod string, cont ret := _m.Called(ctx, pod, container) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (string, error)); ok { + return rf(ctx, pod, container) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) string); ok { r0 = rf(ctx, pod, container) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, pod, container) } else { @@ -281,6 +305,10 @@ func (_m *MockKubeClientConnector) GetNodes(ctx context.Context) (*corev1.NodeLi ret := _m.Called(ctx) var r0 *corev1.NodeList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*corev1.NodeList, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) *corev1.NodeList); ok { r0 = rf(ctx) } else { @@ -289,7 +317,6 @@ func (_m *MockKubeClientConnector) GetNodes(ctx context.Context) (*corev1.NodeLi } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -304,6 +331,10 @@ func (_m *MockKubeClientConnector) GetOperatorGroup(ctx context.Context, namespa ret := _m.Called(ctx, namespace, name) var r0 *v1.OperatorGroup + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (*v1.OperatorGroup, error)); ok { + return rf(ctx, namespace, name) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) *v1.OperatorGroup); ok { r0 = rf(ctx, namespace, name) } else { @@ -312,7 +343,6 @@ func (_m *MockKubeClientConnector) GetOperatorGroup(ctx context.Context, namespa } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, namespace, name) } else { @@ -327,6 +357,10 @@ func (_m *MockKubeClientConnector) GetPersistentVolumes(ctx context.Context) (*c ret := _m.Called(ctx) var r0 *corev1.PersistentVolumeList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*corev1.PersistentVolumeList, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) *corev1.PersistentVolumeList); ok { r0 = rf(ctx) } else { @@ -335,7 +369,6 @@ func (_m *MockKubeClientConnector) GetPersistentVolumes(ctx context.Context) (*c } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -350,6 +383,10 @@ func (_m *MockKubeClientConnector) GetPods(ctx context.Context, namespace string ret := _m.Called(ctx, namespace, labelSelector) var r0 *corev1.PodList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, *metav1.LabelSelector) (*corev1.PodList, error)); ok { + return rf(ctx, namespace, labelSelector) + } if rf, ok := ret.Get(0).(func(context.Context, string, *metav1.LabelSelector) *corev1.PodList); ok { r0 = rf(ctx, namespace, labelSelector) } else { @@ -358,7 +395,6 @@ func (_m *MockKubeClientConnector) GetPods(ctx context.Context, namespace string } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, *metav1.LabelSelector) error); ok { r1 = rf(ctx, namespace, labelSelector) } else { @@ -373,6 +409,10 @@ func (_m *MockKubeClientConnector) GetSecret(ctx context.Context, name string) ( ret := _m.Called(ctx, name) var r0 *corev1.Secret + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*corev1.Secret, error)); ok { + return rf(ctx, name) + } if rf, ok := ret.Get(0).(func(context.Context, string) *corev1.Secret); ok { r0 = rf(ctx, name) } else { @@ -381,7 +421,6 @@ func (_m *MockKubeClientConnector) GetSecret(ctx context.Context, name string) ( } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, name) } else { @@ -396,6 +435,10 @@ func (_m *MockKubeClientConnector) GetSecretsForServiceAccount(ctx context.Conte ret := _m.Called(ctx, accountName) var r0 *corev1.Secret + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*corev1.Secret, error)); ok { + return rf(ctx, accountName) + } if rf, ok := ret.Get(0).(func(context.Context, string) *corev1.Secret); ok { r0 = rf(ctx, accountName) } else { @@ -404,7 +447,6 @@ func (_m *MockKubeClientConnector) GetSecretsForServiceAccount(ctx context.Conte } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, accountName) } else { @@ -419,6 +461,10 @@ func (_m *MockKubeClientConnector) GetServerVersion() (*version.Info, error) { ret := _m.Called() var r0 *version.Info + var r1 error + if rf, ok := ret.Get(0).(func() (*version.Info, error)); ok { + return rf() + } if rf, ok := ret.Get(0).(func() *version.Info); ok { r0 = rf() } else { @@ -427,7 +473,6 @@ func (_m *MockKubeClientConnector) GetServerVersion() (*version.Info, error) { } } - var r1 error if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { @@ -442,6 +487,10 @@ func (_m *MockKubeClientConnector) GetStorageClasses(ctx context.Context) (*stor ret := _m.Called(ctx) var r0 *storagev1.StorageClassList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*storagev1.StorageClassList, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) *storagev1.StorageClassList); ok { r0 = rf(ctx) } else { @@ -450,7 +499,6 @@ func (_m *MockKubeClientConnector) GetStorageClasses(ctx context.Context) (*stor } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -465,6 +513,10 @@ func (_m *MockKubeClientConnector) GetSubscription(ctx context.Context, namespac ret := _m.Called(ctx, namespace, name) var r0 *v1alpha1.Subscription + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (*v1alpha1.Subscription, error)); ok { + return rf(ctx, namespace, name) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) *v1alpha1.Subscription); ok { r0 = rf(ctx, namespace, name) } else { @@ -473,7 +525,6 @@ func (_m *MockKubeClientConnector) GetSubscription(ctx context.Context, namespac } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, namespace, name) } else { @@ -488,13 +539,16 @@ func (_m *MockKubeClientConnector) GetSubscriptionCSV(ctx context.Context, subKe ret := _m.Called(ctx, subKey) var r0 types.NamespacedName + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.NamespacedName) (types.NamespacedName, error)); ok { + return rf(ctx, subKey) + } if rf, ok := ret.Get(0).(func(context.Context, types.NamespacedName) types.NamespacedName); ok { r0 = rf(ctx, subKey) } else { r0 = ret.Get(0).(types.NamespacedName) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.NamespacedName) error); ok { r1 = rf(ctx, subKey) } else { @@ -509,6 +563,10 @@ func (_m *MockKubeClientConnector) ListCRDs(ctx context.Context, labelSelector * ret := _m.Called(ctx, labelSelector) var r0 *apiextensionsv1.CustomResourceDefinitionList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *metav1.LabelSelector) (*apiextensionsv1.CustomResourceDefinitionList, error)); ok { + return rf(ctx, labelSelector) + } if rf, ok := ret.Get(0).(func(context.Context, *metav1.LabelSelector) *apiextensionsv1.CustomResourceDefinitionList); ok { r0 = rf(ctx, labelSelector) } else { @@ -517,7 +575,6 @@ func (_m *MockKubeClientConnector) ListCRDs(ctx context.Context, labelSelector * } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *metav1.LabelSelector) error); ok { r1 = rf(ctx, labelSelector) } else { @@ -532,6 +589,10 @@ func (_m *MockKubeClientConnector) ListCRs(ctx context.Context, namespace string ret := _m.Called(ctx, namespace, gvr, labelSelector) var r0 *unstructured.UnstructuredList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, schema.GroupVersionResource, *metav1.LabelSelector) (*unstructured.UnstructuredList, error)); ok { + return rf(ctx, namespace, gvr, labelSelector) + } if rf, ok := ret.Get(0).(func(context.Context, string, schema.GroupVersionResource, *metav1.LabelSelector) *unstructured.UnstructuredList); ok { r0 = rf(ctx, namespace, gvr, labelSelector) } else { @@ -540,7 +601,6 @@ func (_m *MockKubeClientConnector) ListCRs(ctx context.Context, namespace string } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, schema.GroupVersionResource, *metav1.LabelSelector) error); ok { r1 = rf(ctx, namespace, gvr, labelSelector) } else { @@ -555,6 +615,10 @@ func (_m *MockKubeClientConnector) ListDatabaseClusters(ctx context.Context) (*a ret := _m.Called(ctx) var r0 *apiv1.DatabaseClusterList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*apiv1.DatabaseClusterList, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) *apiv1.DatabaseClusterList); ok { r0 = rf(ctx) } else { @@ -563,7 +627,6 @@ func (_m *MockKubeClientConnector) ListDatabaseClusters(ctx context.Context) (*a } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -578,6 +641,10 @@ func (_m *MockKubeClientConnector) ListSecrets(ctx context.Context) (*corev1.Sec ret := _m.Called(ctx) var r0 *corev1.SecretList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*corev1.SecretList, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) *corev1.SecretList); ok { r0 = rf(ctx) } else { @@ -586,7 +653,6 @@ func (_m *MockKubeClientConnector) ListSecrets(ctx context.Context) (*corev1.Sec } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -601,6 +667,10 @@ func (_m *MockKubeClientConnector) ListSubscriptions(ctx context.Context, namesp ret := _m.Called(ctx, namespace) var r0 *v1alpha1.SubscriptionList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*v1alpha1.SubscriptionList, error)); ok { + return rf(ctx, namespace) + } if rf, ok := ret.Get(0).(func(context.Context, string) *v1alpha1.SubscriptionList); ok { r0 = rf(ctx, namespace) } else { @@ -609,7 +679,6 @@ func (_m *MockKubeClientConnector) ListSubscriptions(ctx context.Context, namesp } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, namespace) } else { @@ -624,6 +693,10 @@ func (_m *MockKubeClientConnector) UpdateInstallPlan(ctx context.Context, namesp ret := _m.Called(ctx, namespace, installPlan) var r0 *v1alpha1.InstallPlan + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, *v1alpha1.InstallPlan) (*v1alpha1.InstallPlan, error)); ok { + return rf(ctx, namespace, installPlan) + } if rf, ok := ret.Get(0).(func(context.Context, string, *v1alpha1.InstallPlan) *v1alpha1.InstallPlan); ok { r0 = rf(ctx, namespace, installPlan) } else { @@ -632,7 +705,6 @@ func (_m *MockKubeClientConnector) UpdateInstallPlan(ctx context.Context, namesp } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, *v1alpha1.InstallPlan) error); ok { r1 = rf(ctx, namespace, installPlan) } else { @@ -641,3 +713,18 @@ func (_m *MockKubeClientConnector) UpdateInstallPlan(ctx context.Context, namesp return r0, r1 } + +// NewMockKubeClientConnector creates a new instance of MockKubeClientConnector. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockKubeClientConnector(t interface { + mock.TestingT + Cleanup(func()) +}, +) *MockKubeClientConnector { + mock := &MockKubeClientConnector{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/dbaas/kubernetes/client/writer.go b/managed/services/dbaas/kubernetes/client/writer.go index 7f28ece66c..a058cc0531 100644 --- a/managed/services/dbaas/kubernetes/client/writer.go +++ b/managed/services/dbaas/kubernetes/client/writer.go @@ -38,7 +38,7 @@ type prefixWriter struct { var _ PrefixWriter = &prefixWriter{} // NewPrefixWriter creates a new PrefixWriter. -func NewPrefixWriter(out io.Writer) PrefixWriter { +func NewPrefixWriter(out io.Writer) PrefixWriter { //nolint:ireturn return &prefixWriter{out: out} } diff --git a/managed/services/dbaas/kubernetes/kubernetes.go b/managed/services/dbaas/kubernetes/kubernetes.go index c120ea5aee..5fe45368a7 100644 --- a/managed/services/dbaas/kubernetes/kubernetes.go +++ b/managed/services/dbaas/kubernetes/kubernetes.go @@ -742,7 +742,7 @@ func (k *Kubernetes) InstallOLMOperator(ctx context.Context) error { return errors.Wrap(err, "cannot decode olm resources") } - resources := append(crdResources, olmResources...) + resources := append(crdResources, olmResources...) //nolint:gocritic subscriptions := filterResources(resources, func(r unstructured.Unstructured) bool { return r.GroupVersionKind() == schema.GroupVersionKind{ @@ -901,7 +901,7 @@ func (k *Kubernetes) UpgradeOperator(ctx context.Context, namespace, name string return errors.Wrapf(err, "cannot get install plan to upgrade %q", name) } - if ip.Spec.Approved == true { + if ip.Spec.Approved { return nil // There are no upgrades. } diff --git a/managed/services/dbaas/kubernetes/olm_operator_test.go b/managed/services/dbaas/kubernetes/olm_operator_test.go index 3bf11d0a06..b9cb55d414 100644 --- a/managed/services/dbaas/kubernetes/olm_operator_test.go +++ b/managed/services/dbaas/kubernetes/olm_operator_test.go @@ -1,4 +1,3 @@ -// dbaas-controller // Copyright (C) 2020 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/managed/services/errors.go b/managed/services/errors.go index ce8573b631..a58d0eff19 100644 --- a/managed/services/errors.go +++ b/managed/services/errors.go @@ -17,8 +17,12 @@ package services import "github.com/pkg/errors" -// ErrAdvisorsDisabled means that advisors checks are disabled and can't be executed. -var ErrAdvisorsDisabled = errors.New("Advisor checks are disabled") +var ( + // ErrAdvisorsDisabled means that advisors checks are disabled and can't be executed. + ErrAdvisorsDisabled = errors.New("Advisor checks are disabled") + // ErrLocationFolderPairAlreadyUsed returned when location-folder pair already in use and cannot be used for backup. + ErrLocationFolderPairAlreadyUsed = errors.New("location-folder pair already used") -// ErrAlertingDisabled means Integrated Alerting is disabled and IA APIs can't be executed. -var ErrAlertingDisabled = errors.New("Alerting is disabled") + // ErrAlertingDisabled means Integrated Alerting is disabled and IA APIs can't be executed. + ErrAlertingDisabled = errors.New("Alerting is disabled") // TODO Looks like this error is unused. +) diff --git a/managed/services/grafana/auth_server.go b/managed/services/grafana/auth_server.go index e413f12731..5f39ba3d8c 100644 --- a/managed/services/grafana/auth_server.go +++ b/managed/services/grafana/auth_server.go @@ -298,7 +298,7 @@ func (s *AuthServer) maybeAddVMProxyFilters(ctx context.Context, rw http.Respons return err } - if filters == nil || len(filters) == 0 { + if len(filters) == 0 { return nil } diff --git a/managed/services/grafana/auth_server_test.go b/managed/services/grafana/auth_server_test.go index 7ef2246e4e..7c4d44865a 100644 --- a/managed/services/grafana/auth_server_test.go +++ b/managed/services/grafana/auth_server_test.go @@ -160,11 +160,12 @@ func TestAuthServerMustSetup(t *testing.T) { } func TestAuthServerAuthenticate(t *testing.T) { + t.Parallel() // logrus.SetLevel(logrus.TraceLevel) checker := &mockAwsInstanceChecker{} checker.Test(t) - defer checker.AssertExpectations(t) + t.Cleanup(func() { checker.AssertExpectations(t) }) ctx := context.Background() c := NewClient("127.0.0.1:3000") @@ -242,8 +243,8 @@ func TestAuthServerAuthenticate(t *testing.T) { role := role t.Run(fmt.Sprintf("uri=%s,minRole=%s,role=%s", uri, minRole, role), func(t *testing.T) { - // do not run this test in parallel - they lock Grafana's sqlite3 database - // t.Parallel() + // This test couldn't run in parallel on sqlite3 - they locked Grafana's sqlite3 database + t.Parallel() login := fmt.Sprintf("%s-%s-%d", minRole, role, time.Now().Nanosecond()) userID, err := c.testCreateUser(ctx, login, role, authHeaders) diff --git a/managed/services/grafana/deps.go b/managed/services/grafana/deps.go index 80174df7fa..e58ce85e8b 100644 --- a/managed/services/grafana/deps.go +++ b/managed/services/grafana/deps.go @@ -15,7 +15,7 @@ package grafana -//go:generate ../../../bin/mockery -name=awsInstanceChecker -case=snake -inpkg -testonly +//go:generate ../../../bin/mockery --name=awsInstanceChecker --case=snake --inpackage --testonly // checker is a subset of methods of server.AWSInstanceChecker used by this package. // We use it instead of real type for testing and to avoid dependency cycle. diff --git a/managed/services/grafana/mock_aws_instance_checker_test.go b/managed/services/grafana/mock_aws_instance_checker_test.go index a639c9b3f6..4ed8f36ea9 100644 --- a/managed/services/grafana/mock_aws_instance_checker_test.go +++ b/managed/services/grafana/mock_aws_instance_checker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package grafana @@ -22,3 +22,18 @@ func (_m *mockAwsInstanceChecker) MustCheck() bool { return r0 } + +// newMockAwsInstanceChecker creates a new instance of mockAwsInstanceChecker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAwsInstanceChecker(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAwsInstanceChecker { + mock := &mockAwsInstanceChecker{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 82b566549e..deae73a93b 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -52,7 +52,7 @@ func NewAgentsService(db *reform.DB, r agentsRegistry, state agentsStateUpdater, } } -func toInventoryAgent(q *reform.Querier, row *models.Agent, registry agentsRegistry) (inventorypb.Agent, error) { +func toInventoryAgent(q *reform.Querier, row *models.Agent, registry agentsRegistry) (inventorypb.Agent, error) { //nolint:ireturn agent, err := services.ToAPIAgent(q, row) if err != nil { return nil, err @@ -65,7 +65,7 @@ func toInventoryAgent(q *reform.Querier, row *models.Agent, registry agentsRegis } // changeAgent changes common parameters for given Agent. -func (as *AgentsService) changeAgent(agentID string, common *inventorypb.ChangeCommonAgentParams) (inventorypb.Agent, error) { +func (as *AgentsService) changeAgent(agentID string, common *inventorypb.ChangeCommonAgentParams) (inventorypb.Agent, error) { //nolint:ireturn var agent inventorypb.Agent e := as.db.InTransaction(func(tx *reform.TX) error { params := &models.ChangeCommonAgentParams{ @@ -147,9 +147,7 @@ func (as *AgentsService) List(ctx context.Context, filters models.AgentFilters) } // Get selects a single Agent by ID. -// -//nolint:unparam -func (as *AgentsService) Get(ctx context.Context, id string) (inventorypb.Agent, error) { +func (as *AgentsService) Get(ctx context.Context, id string) (inventorypb.Agent, error) { //nolint:ireturn,unparam var res inventorypb.Agent e := as.db.InTransaction(func(tx *reform.TX) error { row, err := models.FindAgentByID(tx.Querier, id) @@ -366,17 +364,18 @@ func (as *AgentsService) AddQANMySQLPerfSchemaAgent(ctx context.Context, req *in var res *inventorypb.QANMySQLPerfSchemaAgent e := as.db.InTransaction(func(tx *reform.TX) error { params := &models.CreateAgentParams{ - PMMAgentID: req.PmmAgentId, - ServiceID: req.ServiceId, - Username: req.Username, - Password: req.Password, - CustomLabels: req.CustomLabels, - TLS: req.Tls, - TLSSkipVerify: req.TlsSkipVerify, - MySQLOptions: models.MySQLOptionsFromRequest(req), - MaxQueryLength: req.MaxQueryLength, - QueryExamplesDisabled: req.DisableQueryExamples, - LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), + PMMAgentID: req.PmmAgentId, + ServiceID: req.ServiceId, + Username: req.Username, + Password: req.Password, + CustomLabels: req.CustomLabels, + TLS: req.Tls, + TLSSkipVerify: req.TlsSkipVerify, + MySQLOptions: models.MySQLOptionsFromRequest(req), + MaxQueryLength: req.MaxQueryLength, + QueryExamplesDisabled: req.DisableQueryExamples, + CommentsParsingDisabled: req.DisableCommentsParsing, + LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), } row, err := models.CreateAgent(tx.Querier, models.QANMySQLPerfSchemaAgentType, params) if err != nil { @@ -431,18 +430,19 @@ func (as *AgentsService) AddQANMySQLSlowlogAgent(ctx context.Context, req *inven } params := &models.CreateAgentParams{ - PMMAgentID: req.PmmAgentId, - ServiceID: req.ServiceId, - Username: req.Username, - Password: req.Password, - CustomLabels: req.CustomLabels, - TLS: req.Tls, - TLSSkipVerify: req.TlsSkipVerify, - MySQLOptions: models.MySQLOptionsFromRequest(req), - MaxQueryLength: req.MaxQueryLength, - QueryExamplesDisabled: req.DisableQueryExamples, - MaxQueryLogSize: maxSlowlogFileSize, - LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), + PMMAgentID: req.PmmAgentId, + ServiceID: req.ServiceId, + Username: req.Username, + Password: req.Password, + CustomLabels: req.CustomLabels, + TLS: req.Tls, + TLSSkipVerify: req.TlsSkipVerify, + MySQLOptions: models.MySQLOptionsFromRequest(req), + MaxQueryLength: req.MaxQueryLength, + QueryExamplesDisabled: req.DisableQueryExamples, + CommentsParsingDisabled: req.DisableCommentsParsing, + MaxQueryLogSize: maxSlowlogFileSize, + LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), } row, err := models.CreateAgent(tx.Querier, models.QANMySQLSlowlogAgentType, params) if err != nil { @@ -676,16 +676,17 @@ func (as *AgentsService) AddQANPostgreSQLPgStatementsAgent(ctx context.Context, var res *inventorypb.QANPostgreSQLPgStatementsAgent e := as.db.InTransaction(func(tx *reform.TX) error { params := &models.CreateAgentParams{ - PMMAgentID: req.PmmAgentId, - ServiceID: req.ServiceId, - Username: req.Username, - Password: req.Password, - CustomLabels: req.CustomLabels, - MaxQueryLength: req.MaxQueryLength, - TLS: req.Tls, - TLSSkipVerify: req.TlsSkipVerify, - PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(req), - LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), + PMMAgentID: req.PmmAgentId, + ServiceID: req.ServiceId, + Username: req.Username, + Password: req.Password, + CustomLabels: req.CustomLabels, + MaxQueryLength: req.MaxQueryLength, + CommentsParsingDisabled: req.DisableCommentsParsing, + TLS: req.Tls, + TLSSkipVerify: req.TlsSkipVerify, + PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(req), + LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), } row, err := models.CreateAgent(tx.Querier, models.QANPostgreSQLPgStatementsAgentType, params) if err != nil { @@ -736,17 +737,18 @@ func (as *AgentsService) AddQANPostgreSQLPgStatMonitorAgent(ctx context.Context, var res *inventorypb.QANPostgreSQLPgStatMonitorAgent e := as.db.InTransaction(func(tx *reform.TX) error { params := &models.CreateAgentParams{ - PMMAgentID: req.PmmAgentId, - ServiceID: req.ServiceId, - Username: req.Username, - Password: req.Password, - MaxQueryLength: req.MaxQueryLength, - QueryExamplesDisabled: req.DisableQueryExamples, - CustomLabels: req.CustomLabels, - TLS: req.Tls, - TLSSkipVerify: req.TlsSkipVerify, - PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(req), - LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), + PMMAgentID: req.PmmAgentId, + ServiceID: req.ServiceId, + Username: req.Username, + Password: req.Password, + MaxQueryLength: req.MaxQueryLength, + QueryExamplesDisabled: req.DisableQueryExamples, + CommentsParsingDisabled: req.DisableCommentsParsing, + CustomLabels: req.CustomLabels, + TLS: req.Tls, + TLSSkipVerify: req.TlsSkipVerify, + PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(req), + LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), } row, err := models.CreateAgent(tx.Querier, models.QANPostgreSQLPgStatMonitorAgentType, params) if err != nil { diff --git a/managed/services/inventory/deps.go b/managed/services/inventory/deps.go index 900fb69e3c..a1471ea79c 100644 --- a/managed/services/inventory/deps.go +++ b/managed/services/inventory/deps.go @@ -23,12 +23,13 @@ import ( "github.com/percona/pmm/managed/models" ) -//go:generate ../../../bin/mockery -name=agentsRegistry -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=agentService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=agentsStateUpdater -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=prometheusService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=connectionChecker -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=versionCache -case=snake -inpkg -testonly +//go:generate ../../../bin/mockery --name=agentsRegistry --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=agentService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=agentsStateUpdater --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=prometheusService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=connectionChecker --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=versionCache --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=inventoryMetrics --case=snake --inpackage --testonly // agentsRegistry is a subset of methods of agents.Registry used by this package. // We use it instead of real type for testing and to avoid dependency cycle. @@ -68,3 +69,9 @@ type connectionChecker interface { type versionCache interface { RequestSoftwareVersionsUpdate() } + +type inventoryMetrics interface { + GetAgentMetrics(ctx context.Context) (metrics []Metric, err error) + GetNodeMetrics(ctx context.Context) (metrics []Metric, err error) + GetServiceMetrics(ctx context.Context) (metrics []Metric, err error) +} diff --git a/managed/services/inventory/grpc/agents_server.go b/managed/services/inventory/grpc/agents_server.go index 84a71782f4..b7d1a73eb5 100644 --- a/managed/services/inventory/grpc/agents_server.go +++ b/managed/services/inventory/grpc/agents_server.go @@ -32,7 +32,7 @@ type agentsServer struct { } // NewAgentsServer returns Inventory API handler for managing Agents. -func NewAgentsServer(s *inventory.AgentsService) inventorypb.AgentsServer { +func NewAgentsServer(s *inventory.AgentsService) inventorypb.AgentsServer { //nolint:ireturn return &agentsServer{s: s} } diff --git a/managed/services/inventory/grpc/nodes_server.go b/managed/services/inventory/grpc/nodes_server.go index 1e6b9b997a..ba08800ad8 100644 --- a/managed/services/inventory/grpc/nodes_server.go +++ b/managed/services/inventory/grpc/nodes_server.go @@ -31,7 +31,7 @@ type nodesServer struct { } // NewNodesServer returns Inventory API handler for managing Nodes. -func NewNodesServer(svc *inventory.NodesService) inventorypb.NodesServer { +func NewNodesServer(svc *inventory.NodesService) inventorypb.NodesServer { //nolint:ireturn return &nodesServer{svc: svc} } diff --git a/managed/services/inventory/grpc/services_server.go b/managed/services/inventory/grpc/services_server.go index 70b67efac5..72d0798124 100644 --- a/managed/services/inventory/grpc/services_server.go +++ b/managed/services/inventory/grpc/services_server.go @@ -33,7 +33,7 @@ type servicesServer struct { } // NewServicesServer returns Inventory API handler for managing Services. -func NewServicesServer(s *inventory.ServicesService) inventorypb.ServicesServer { +func NewServicesServer(s *inventory.ServicesService) inventorypb.ServicesServer { //nolint:ireturn return &servicesServer{s: s} } diff --git a/managed/services/inventory/inventory_metrics.go b/managed/services/inventory/inventory_metrics.go new file mode 100644 index 0000000000..7b45b92ca4 --- /dev/null +++ b/managed/services/inventory/inventory_metrics.go @@ -0,0 +1,249 @@ +// Copyright (C) 2023 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package inventory + +import ( + "context" + "time" + + "github.com/AlekSi/pointer" + "github.com/pkg/errors" + prom "github.com/prometheus/client_golang/prometheus" + "gopkg.in/reform.v1" + + "github.com/percona/pmm/api/inventorypb" + "github.com/percona/pmm/managed/models" + "github.com/percona/pmm/managed/utils/logger" +) + +const ( + requestTimeout = 3 * time.Second + serviceEnabled float64 = 1 + prometheusNamespace = "pmm_managed" + prometheusSubsystem = "inventory" +) + +type Metric struct { + labels []string + value float64 +} + +//goland:noinspection GoNameStartsWithPackageName +type InventoryMetrics struct { + db *reform.DB + registry agentsRegistry +} + +//goland:noinspection GoNameStartsWithPackageName +type InventoryMetricsCollector struct { + mAgentsDesc *prom.Desc + mNodesDesc *prom.Desc + mServicesDesc *prom.Desc + + metrics inventoryMetrics +} + +func NewInventoryMetrics(db *reform.DB, registry agentsRegistry) *InventoryMetrics { + return &InventoryMetrics{ + db: db, + registry: registry, + } +} + +func NewInventoryMetricsCollector(metrics inventoryMetrics) *InventoryMetricsCollector { + return &InventoryMetricsCollector{ + mAgentsDesc: prom.NewDesc( + prom.BuildFQName(prometheusNamespace, prometheusSubsystem, "agents"), + "Inventory Agent", + []string{"agent_id", "agent_type", "service_id", "node_id", "pmm_agent_id", "disabled", "version"}, + nil), + mNodesDesc: prom.NewDesc( + prom.BuildFQName(prometheusNamespace, prometheusSubsystem, "nodes"), + "Inventory Node", + []string{"node_id", "node_type", "node_name", "container_name"}, + nil), + mServicesDesc: prom.NewDesc( + prom.BuildFQName(prometheusNamespace, prometheusSubsystem, "services"), + "Inventory Service", + []string{"service_id", "service_type", "node_id"}, + nil), + + metrics: metrics, + } +} + +func GetRunsOnNodeIDByPMMAgentID(agents []*models.Agent, pmmAgentID string) string { + for _, agent := range agents { + if agent.AgentID == pmmAgentID { + return pointer.GetString(agent.RunsOnNodeID) + } + } + return "" +} + +func (i *InventoryMetrics) GetAgentMetrics(ctx context.Context) ([]Metric, error) { + metrics := []Metric{} + + errTx := i.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { + dbAgents, err := models.FindAgents(tx.Querier, models.AgentFilters{}) + if err != nil { + return err + } + + for _, agent := range dbAgents { + runsOnNodeID := "" + disabled := "0" + metricValue := float64(0) + + pmmAgentID := pointer.GetString(agent.PMMAgentID) + + if agent.Disabled { + disabled = "1" + } + + if agent.AgentType == models.PMMAgentType { + if i.registry.IsConnected(agent.AgentID) { + metricValue = 1 + } + runsOnNodeID = pointer.GetString(agent.RunsOnNodeID) + } else { + metricValue = float64(inventorypb.AgentStatus_value[agent.Status]) + runsOnNodeID = GetRunsOnNodeIDByPMMAgentID(dbAgents, pmmAgentID) + } + + agentMetricLabels := []string{ + agent.AgentID, + string(agent.AgentType), + pointer.GetString(agent.ServiceID), + runsOnNodeID, + pmmAgentID, + disabled, + pointer.GetString(agent.Version), + } + + metrics = append(metrics, Metric{labels: agentMetricLabels, value: metricValue}) + } + return nil + }) + + if errTx != nil { + return nil, errors.WithStack(errTx) + } + return metrics, nil +} + +func (i *InventoryMetrics) GetNodeMetrics(ctx context.Context) ([]Metric, error) { + var metrics []Metric + + errTx := i.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { + dbNodes, err := models.FindNodes(tx.Querier, models.NodeFilters{}) + if err != nil { + return err + } + + for _, node := range dbNodes { + nodeMetricLabels := []string{ + node.NodeID, + string(node.NodeType), + node.NodeName, + pointer.GetString(node.ContainerName), + } + + metrics = append(metrics, Metric{labels: nodeMetricLabels, value: serviceEnabled}) + } + + return nil + }) + + if errTx != nil { + return nil, errors.WithStack(errTx) + } + return metrics, nil +} + +func (i *InventoryMetrics) GetServiceMetrics(ctx context.Context) ([]Metric, error) { + var metrics []Metric + + errTx := i.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { + dbServices, err := models.FindServices(tx.Querier, models.ServiceFilters{}) + if err != nil { + return err + } + + for _, service := range dbServices { + serviceMetricLabels := []string{ + service.ServiceID, + string(service.ServiceType), + service.NodeID, + } + + metrics = append(metrics, Metric{labels: serviceMetricLabels, value: serviceEnabled}) + } + + return nil + }) + + if errTx != nil { + return nil, errors.WithStack(errTx) + } + return metrics, nil +} + +func (i *InventoryMetricsCollector) Describe(ch chan<- *prom.Desc) { + prom.DescribeByCollect(i, ch) +} + +func (i *InventoryMetricsCollector) Collect(ch chan<- prom.Metric) { + ctx, cancelCtx := context.WithTimeout(context.Background(), requestTimeout) + defer cancelCtx() + + ctx = logger.Set(ctx, "inventoryMetrics") + l := logger.Get(ctx) + + agentMetrics, err := i.metrics.GetAgentMetrics(ctx) + if err != nil { + l.Error(err) + return + } + + for _, agentMetric := range agentMetrics { + ch <- prom.MustNewConstMetric(i.mAgentsDesc, prom.GaugeValue, agentMetric.value, agentMetric.labels...) + } + + nodeMetrics, nodeError := i.metrics.GetNodeMetrics(ctx) + + if nodeError != nil { + l.Error(nodeError) + return + } + + for _, nodeMetric := range nodeMetrics { + ch <- prom.MustNewConstMetric(i.mNodesDesc, prom.GaugeValue, nodeMetric.value, nodeMetric.labels...) + } + + serviceMetrics, serviceError := i.metrics.GetServiceMetrics(ctx) + + if serviceError != nil { + l.Error(serviceError) + return + } + + for _, serviceMetric := range serviceMetrics { + ch <- prom.MustNewConstMetric(i.mServicesDesc, prom.GaugeValue, serviceMetric.value, serviceMetric.labels...) + } +} + +var _ prom.Collector = (*InventoryMetricsCollector)(nil) diff --git a/managed/services/inventory/inventory_metrics_test.go b/managed/services/inventory/inventory_metrics_test.go new file mode 100644 index 0000000000..c65631588f --- /dev/null +++ b/managed/services/inventory/inventory_metrics_test.go @@ -0,0 +1,128 @@ +// Copyright (C) 2023 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package inventory + +import ( + "context" + "io" + "net/http" + "strconv" + "strings" + "testing" + "time" + + "github.com/prometheus/client_golang/prometheus/testutil" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" + "github.com/stretchr/testify/require" + + "github.com/percona/pmm/managed/models" +) + +func TestNewInventoryMetricsCollector(t *testing.T) { + metricsMock := &mockInventoryMetrics{} + inventoryCollector := NewInventoryMetricsCollector(metricsMock) + + agentMetrics := []Metric{ + { + labels: []string{"A1", string(models.PMMAgentType), "S1", "N1", "PA1", strconv.Itoa(1), "V1"}, + value: float64(1), + }, + } + + nodeMetrics := []Metric{ + { + labels: []string{"N1", string(models.GenericNodeType), "N1", "C1"}, + value: float64(1), + }, + } + + serviceMetrics := []Metric{ + { + labels: []string{"C1", string(models.ProxySQLServiceType), "N1"}, + value: float64(1), + }, + } + + t.Run("Metrics returns inventory metrics", func(t *testing.T) { + client := http.Client{} + + ctx, cancelCtx := context.WithTimeout(context.Background(), 3*time.Second) + defer cancelCtx() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, "http://localhost:7773/debug/metrics", nil) + require.NoError(t, err) + resp, err := client.Do(req) + require.NoError(t, err) + defer resp.Body.Close() //nolint:gosec + + body, err := io.ReadAll(resp.Body) + require.NoError(t, err) + assert.Equal(t, http.StatusOK, resp.StatusCode) + assert.NotEmpty(t, body) + + assert.Contains(t, string(body), "TYPE pmm_managed_inventory_agents gauge") + assert.Contains(t, string(body), "TYPE pmm_managed_inventory_nodes gauge") + assert.Contains(t, string(body), "TYPE pmm_managed_inventory_services gauge") + }) + + t.Run("Collector", func(t *testing.T) { + metricsMock.On("GetAgentMetrics", mock.Anything).Return(agentMetrics, nil) + metricsMock.On("GetNodeMetrics", mock.Anything).Return(nodeMetrics, nil) + metricsMock.On("GetServiceMetrics", mock.Anything).Return(serviceMetrics, nil) + + const expectedAgentMetrics = ` + # HELP pmm_managed_inventory_agents Inventory Agent + # TYPE pmm_managed_inventory_agents gauge + pmm_managed_inventory_agents{agent_id="A1",agent_type="pmm-agent",disabled="1",node_id="N1",pmm_agent_id="PA1",service_id="S1",version="V1"} 1 + ` + + const expectedNodeMetrics = ` + # HELP pmm_managed_inventory_nodes Inventory Node + # TYPE pmm_managed_inventory_nodes gauge + pmm_managed_inventory_nodes{container_name="C1",node_id="N1",node_name="N1",node_type="generic"} 1 + ` + + const expectedServiceMetrics = ` + # HELP pmm_managed_inventory_services Inventory Service + # TYPE pmm_managed_inventory_services gauge + pmm_managed_inventory_services{node_id="N1",service_id="C1",service_type="proxysql"} 1 + ` + + if err := testutil.CollectAndCompare( + inventoryCollector, + strings.NewReader(expectedAgentMetrics), + "pmm_managed_inventory_agents"); err != nil { + t.Errorf("Unexpected collecting result:\n%s", err) + } + + if err := testutil.CollectAndCompare( + inventoryCollector, + strings.NewReader(expectedNodeMetrics), + "pmm_managed_inventory_nodes"); err != nil { + t.Errorf("Unexpected collecting result:\n%s", err) + } + + if err := testutil.CollectAndCompare( + inventoryCollector, + strings.NewReader(expectedServiceMetrics), + "pmm_managed_inventory_services"); err != nil { + t.Errorf("Unexpected collecting result:\n%s", err) + } + + metricsMock.AssertExpectations(t) + }) +} diff --git a/managed/services/inventory/mock_agent_service_test.go b/managed/services/inventory/mock_agent_service_test.go index 6b6fe42fcd..472d1e70d4 100644 --- a/managed/services/inventory/mock_agent_service_test.go +++ b/managed/services/inventory/mock_agent_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package inventory @@ -18,6 +18,11 @@ func (_m *mockAgentService) Logs(ctx context.Context, pmmAgentID string, agentID ret := _m.Called(ctx, pmmAgentID, agentID, limit) var r0 []string + var r1 uint32 + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, uint32) ([]string, uint32, error)); ok { + return rf(ctx, pmmAgentID, agentID, limit) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, uint32) []string); ok { r0 = rf(ctx, pmmAgentID, agentID, limit) } else { @@ -26,14 +31,12 @@ func (_m *mockAgentService) Logs(ctx context.Context, pmmAgentID string, agentID } } - var r1 uint32 if rf, ok := ret.Get(1).(func(context.Context, string, string, uint32) uint32); ok { r1 = rf(ctx, pmmAgentID, agentID, limit) } else { r1 = ret.Get(1).(uint32) } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string, string, uint32) error); ok { r2 = rf(ctx, pmmAgentID, agentID, limit) } else { @@ -42,3 +45,18 @@ func (_m *mockAgentService) Logs(ctx context.Context, pmmAgentID string, agentID return r0, r1, r2 } + +// newMockAgentService creates a new instance of mockAgentService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAgentService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAgentService { + mock := &mockAgentService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/inventory/mock_agents_registry_test.go b/managed/services/inventory/mock_agents_registry_test.go index 2f3f6d6962..a59644d96a 100644 --- a/managed/services/inventory/mock_agents_registry_test.go +++ b/managed/services/inventory/mock_agents_registry_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package inventory @@ -31,3 +31,18 @@ func (_m *mockAgentsRegistry) IsConnected(pmmAgentID string) bool { func (_m *mockAgentsRegistry) Kick(ctx context.Context, pmmAgentID string) { _m.Called(ctx, pmmAgentID) } + +// newMockAgentsRegistry creates a new instance of mockAgentsRegistry. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAgentsRegistry(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAgentsRegistry { + mock := &mockAgentsRegistry{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/inventory/mock_agents_state_updater_test.go b/managed/services/inventory/mock_agents_state_updater_test.go index e24e2ecbf7..2d57da0521 100644 --- a/managed/services/inventory/mock_agents_state_updater_test.go +++ b/managed/services/inventory/mock_agents_state_updater_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package inventory @@ -17,3 +17,18 @@ type mockAgentsStateUpdater struct { func (_m *mockAgentsStateUpdater) RequestStateUpdate(ctx context.Context, pmmAgentID string) { _m.Called(ctx, pmmAgentID) } + +// newMockAgentsStateUpdater creates a new instance of mockAgentsStateUpdater. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAgentsStateUpdater(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAgentsStateUpdater { + mock := &mockAgentsStateUpdater{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/inventory/mock_connection_checker_test.go b/managed/services/inventory/mock_connection_checker_test.go index 566658670e..abd94dfdbd 100644 --- a/managed/services/inventory/mock_connection_checker_test.go +++ b/managed/services/inventory/mock_connection_checker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package inventory @@ -29,3 +29,18 @@ func (_m *mockConnectionChecker) CheckConnectionToService(ctx context.Context, q return r0 } + +// newMockConnectionChecker creates a new instance of mockConnectionChecker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockConnectionChecker(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockConnectionChecker { + mock := &mockConnectionChecker{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/inventory/mock_inventory_metrics_test.go b/managed/services/inventory/mock_inventory_metrics_test.go new file mode 100644 index 0000000000..3e13562622 --- /dev/null +++ b/managed/services/inventory/mock_inventory_metrics_test.go @@ -0,0 +1,107 @@ +// Code generated by mockery v2.32.0. DO NOT EDIT. + +package inventory + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" +) + +// mockInventoryMetrics is an autogenerated mock type for the inventoryMetrics type +type mockInventoryMetrics struct { + mock.Mock +} + +// GetAgentMetrics provides a mock function with given fields: ctx +func (_m *mockInventoryMetrics) GetAgentMetrics(ctx context.Context) ([]Metric, error) { + ret := _m.Called(ctx) + + var r0 []Metric + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) ([]Metric, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) []Metric); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]Metric) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetNodeMetrics provides a mock function with given fields: ctx +func (_m *mockInventoryMetrics) GetNodeMetrics(ctx context.Context) ([]Metric, error) { + ret := _m.Called(ctx) + + var r0 []Metric + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) ([]Metric, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) []Metric); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]Metric) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetServiceMetrics provides a mock function with given fields: ctx +func (_m *mockInventoryMetrics) GetServiceMetrics(ctx context.Context) ([]Metric, error) { + ret := _m.Called(ctx) + + var r0 []Metric + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) ([]Metric, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) []Metric); ok { + r0 = rf(ctx) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]Metric) + } + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// newMockInventoryMetrics creates a new instance of mockInventoryMetrics. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockInventoryMetrics(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockInventoryMetrics { + mock := &mockInventoryMetrics{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/inventory/mock_prometheus_service_test.go b/managed/services/inventory/mock_prometheus_service_test.go index 5e66ff6898..6eb2fa2419 100644 --- a/managed/services/inventory/mock_prometheus_service_test.go +++ b/managed/services/inventory/mock_prometheus_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package inventory @@ -13,3 +13,18 @@ type mockPrometheusService struct { func (_m *mockPrometheusService) RequestConfigurationUpdate() { _m.Called() } + +// newMockPrometheusService creates a new instance of mockPrometheusService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockPrometheusService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockPrometheusService { + mock := &mockPrometheusService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/inventory/mock_version_cache_test.go b/managed/services/inventory/mock_version_cache_test.go index 4c34901cad..f0c5b53dbe 100644 --- a/managed/services/inventory/mock_version_cache_test.go +++ b/managed/services/inventory/mock_version_cache_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package inventory @@ -13,3 +13,18 @@ type mockVersionCache struct { func (_m *mockVersionCache) RequestSoftwareVersionsUpdate() { _m.Called() } + +// newMockVersionCache creates a new instance of mockVersionCache. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockVersionCache(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockVersionCache { + mock := &mockVersionCache{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/inventory/nodes.go b/managed/services/inventory/nodes.go index c6a2f7eb69..10516dfd2d 100644 --- a/managed/services/inventory/nodes.go +++ b/managed/services/inventory/nodes.go @@ -70,9 +70,7 @@ func (s *NodesService) List(ctx context.Context, filters models.NodeFilters) ([] } // Get returns a single Node by ID. -// -//nolint:unparam -func (s *NodesService) Get(ctx context.Context, req *inventorypb.GetNodeRequest) (inventorypb.Node, error) { +func (s *NodesService) Get(ctx context.Context, req *inventorypb.GetNodeRequest) (inventorypb.Node, error) { //nolint:unparam,ireturn modelNode := &models.Node{} e := s.db.InTransaction(func(tx *reform.TX) error { var err error diff --git a/managed/services/inventory/services.go b/managed/services/inventory/services.go index d9d1c65aa4..a742b24c92 100644 --- a/managed/services/inventory/services.go +++ b/managed/services/inventory/services.go @@ -111,9 +111,7 @@ func (ss *ServicesService) ListActiveServiceTypes(ctx context.Context) ([]invent } // Get selects a single Service by ID. -// -//nolint:unparam -func (ss *ServicesService) Get(ctx context.Context, id string) (inventorypb.Service, error) { +func (ss *ServicesService) Get(ctx context.Context, id string) (inventorypb.Service, error) { //nolint:unparam,ireturn service := &models.Service{} e := ss.db.InTransaction(func(tx *reform.TX) error { var err error diff --git a/managed/services/management/agent.go b/managed/services/management/agent.go index 79111cd64b..645c31c7f9 100644 --- a/managed/services/management/agent.go +++ b/managed/services/management/agent.go @@ -157,6 +157,7 @@ func (s *AgentService) agentToAPI(agent *models.Agent) (*agentv1beta1.UniversalA ProcessExecPath: pointer.GetString(agent.ProcessExecPath), PushMetrics: agent.PushMetrics, QueryExamplesDisabled: agent.QueryExamplesDisabled, + CommentsParsingDisabled: agent.CommentsParsingDisabled, RdsBasicMetricsDisabled: agent.RDSBasicMetricsDisabled, RdsEnhancedMetricsDisabled: agent.RDSEnhancedMetricsDisabled, RunsOnNodeId: pointer.GetString(agent.RunsOnNodeID), diff --git a/managed/services/management/agent_test.go b/managed/services/management/agent_test.go index 297a9486f6..b79b6f1a14 100644 --- a/managed/services/management/agent_test.go +++ b/managed/services/management/agent_test.go @@ -133,9 +133,10 @@ func TestAgentService(t *testing.T) { SslCert: "", IsSslKeySet: false, }, - ServiceId: "/service_id/00000000-0000-4000-8000-000000000002", - Status: "UNKNOWN", - Tls: true, + ServiceId: "/service_id/00000000-0000-4000-8000-000000000002", + Status: "UNKNOWN", + Tls: true, + CommentsParsingDisabled: true, }, { AgentId: pgStatStatementID, @@ -150,9 +151,10 @@ func TestAgentService(t *testing.T) { SslCert: "", IsSslKeySet: false, }, - ServiceId: "/service_id/00000000-0000-4000-8000-000000000002", - Status: "UNKNOWN", - Tls: true, + ServiceId: "/service_id/00000000-0000-4000-8000-000000000002", + Status: "UNKNOWN", + Tls: true, + CommentsParsingDisabled: true, }, { AgentId: models.PMMServerAgentID, diff --git a/managed/services/management/alerting/deps.go b/managed/services/management/alerting/deps.go index df8fbdd553..6b21b5387c 100644 --- a/managed/services/management/alerting/deps.go +++ b/managed/services/management/alerting/deps.go @@ -23,7 +23,7 @@ import ( "github.com/percona/pmm/managed/services" ) -//go:generate ../../../../bin/mockery -name=grafanaClient -case=snake -inpkg -testonly +//go:generate ../../../../bin/mockery --name=grafanaClient --case=snake --inpackage --testonly type grafanaClient interface { CreateAlertRule(ctx context.Context, folderName, groupName string, rule *services.Rule) error diff --git a/managed/services/management/alerting/mock_grafana_client_test.go b/managed/services/management/alerting/mock_grafana_client_test.go index 79a714c9ec..8e672c7b40 100644 --- a/managed/services/management/alerting/mock_grafana_client_test.go +++ b/managed/services/management/alerting/mock_grafana_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package alerting @@ -35,13 +35,16 @@ func (_m *mockGrafanaClient) GetDatasourceUIDByID(ctx context.Context, id int64) ret := _m.Called(ctx, id) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, int64) (string, error)); ok { + return rf(ctx, id) + } if rf, ok := ret.Get(0).(func(context.Context, int64) string); ok { r0 = rf(ctx, id) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, int64) error); ok { r1 = rf(ctx, id) } else { @@ -56,6 +59,10 @@ func (_m *mockGrafanaClient) GetFolderByUID(ctx context.Context, uid string) (*g ret := _m.Called(ctx, uid) var r0 *gapi.Folder + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*gapi.Folder, error)); ok { + return rf(ctx, uid) + } if rf, ok := ret.Get(0).(func(context.Context, string) *gapi.Folder); ok { r0 = rf(ctx, uid) } else { @@ -64,7 +71,6 @@ func (_m *mockGrafanaClient) GetFolderByUID(ctx context.Context, uid string) (*g } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, uid) } else { @@ -73,3 +79,18 @@ func (_m *mockGrafanaClient) GetFolderByUID(ctx context.Context, uid string) (*g return r0, r1 } + +// newMockGrafanaClient creates a new instance of mockGrafanaClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockGrafanaClient(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockGrafanaClient { + mock := &mockGrafanaClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/alerting/service.go b/managed/services/management/alerting/service.go index 138374fb1f..040e5188bf 100644 --- a/managed/services/management/alerting/service.go +++ b/managed/services/management/alerting/service.go @@ -139,8 +139,8 @@ func (s *Service) GetTemplates() map[string]TemplateInfo { // CollectTemplates collects IA rule templates from various sources like: // builtin templates: read from the generated variable of type embed.FS // SaaS templates: templates downloaded from checks service. -// user file templates: read from yaml files created by the user in `/srv/alerting/templates` -// user API templates: in the DB created using the API. +// User file templates: read from yaml files created by the user in `/srv/alerting/templates`. +// User API templates: in the DB created using the API. func (s *Service) CollectTemplates(ctx context.Context) { builtInTemplates, err := s.loadTemplatesFromAssets(ctx) if err != nil { @@ -334,8 +334,7 @@ func (s *Service) loadTemplatesFromDB() ([]TemplateInfo, error) { Type: alert.Type(param.Type), } - switch alert.Type(param.Type) { //nolint:exhaustive - case alert.Float: + if alert.Type(param.Type) == alert.Float { f := param.FloatParam if f.Default != nil { diff --git a/managed/services/management/alerting/service_test.go b/managed/services/management/alerting/service_test.go index 81458b321c..37de5b37a2 100644 --- a/managed/services/management/alerting/service_test.go +++ b/managed/services/management/alerting/service_test.go @@ -42,6 +42,7 @@ const ( ) func TestCollect(t *testing.T) { + t.Parallel() clientID, clientSecret := os.Getenv("OAUTH_PMM_CLIENT_ID"), os.Getenv("OAUTH_PMM_CLIENT_SECRET") if clientID == "" || clientSecret == "" { t.Skip("Environment variables OAUTH_PMM_CLIENT_ID / OAUTH_PMM_CLIENT_SECRET are not defined, skipping test") @@ -160,6 +161,7 @@ func TestDownloadTemplates(t *testing.T) { } func TestTemplateValidation(t *testing.T) { + t.Parallel() ctx := context.Background() sqlDB := testdb.Open(t, models.SkipFixtures, nil) db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) diff --git a/managed/services/management/backup/backups_service.go b/managed/services/management/backup/backups_service.go index 5242962155..7d7d02d02d 100644 --- a/managed/services/management/backup/backups_service.go +++ b/managed/services/management/backup/backups_service.go @@ -124,7 +124,7 @@ func (s *BackupsService) StartBackup(ctx context.Context, req *backuppb.StartBac Folder: req.Folder, }) if err != nil { - return nil, convertBackupError(err) + return nil, convertError(err) } return &backuppb.StartBackupResponse{ @@ -154,7 +154,7 @@ func (s *BackupsService) RestoreBackup( id, err := s.backupService.RestoreBackup(ctx, req.ServiceId, req.ArtifactId, req.PitrTimestamp.AsTime()) if err != nil { - return nil, convertRestoreBackupError(err) + return nil, convertError(err) } return &backuppb.RestoreBackupResponse{ @@ -253,7 +253,7 @@ func (s *BackupsService) ScheduleBackup(ctx context.Context, req *backuppb.Sched StartAt: t, }) if err != nil { - return convertModelError(err) + return convertError(err) } id = scheduledTask.ID @@ -328,7 +328,7 @@ func (s *BackupsService) ChangeScheduledBackup(ctx context.Context, req *backupp errTx := s.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { scheduledTask, err := models.FindScheduledTaskByID(tx.Querier, req.ScheduledBackupId) if err != nil { - return convertModelError(err) + return convertError(err) } var data *models.CommonBackupTaskData @@ -381,7 +381,7 @@ func (s *BackupsService) ChangeScheduledBackup(ctx context.Context, req *backupp err = s.scheduleService.Update(req.ScheduledBackupId, params) - return convertModelError(err) + return convertError(err) }) if errTx != nil { return nil, errTx @@ -459,11 +459,12 @@ func (s *BackupsService) GetLogs(ctx context.Context, req *backuppb.GetLogsReque return nil, status.Error(codes.InvalidArgument, "Only one of artifact ID or restore ID is required") } - if req.ArtifactId != "" { + switch { + case req.ArtifactId != "": jobsFilter.ArtifactID = req.ArtifactId - } else if req.RestoreId != "" { + case req.RestoreId != "": jobsFilter.RestoreID = req.RestoreId - } else { + default: return nil, status.Error(codes.InvalidArgument, "One of artifact ID or restore ID is required") } @@ -646,112 +647,59 @@ func convertModelToBackupModel(dataModel backuppb.DataModel) (models.DataModel, } } -func convertBackupError(backupErr error) error { - if backupErr == nil { +// convertError converts error from Go to API. +func convertError(e error) error { + if e == nil { return nil } var unsupportedAgentErr *agents.AgentNotSupportedError - if errors.As(backupErr, &unsupportedAgentErr) { - return status.Error(codes.FailedPrecondition, backupErr.Error()) + if errors.As(e, &unsupportedAgentErr) { + return status.Error(codes.FailedPrecondition, e.Error()) } var code backuppb.ErrorCode switch { - case errors.Is(backupErr, backup.ErrIncompatibleService): - return status.Error(codes.FailedPrecondition, backupErr.Error()) - case errors.Is(backupErr, backup.ErrXtrabackupNotInstalled): - code = backuppb.ErrorCode_ERROR_CODE_XTRABACKUP_NOT_INSTALLED - case errors.Is(backupErr, backup.ErrInvalidXtrabackup): - code = backuppb.ErrorCode_ERROR_CODE_INVALID_XTRABACKUP - case errors.Is(backupErr, backup.ErrIncompatibleXtrabackup): - code = backuppb.ErrorCode_ERROR_CODE_INCOMPATIBLE_XTRABACKUP - case errors.Is(backupErr, backup.ErrIncompatibleLocationType): - return status.Error(codes.FailedPrecondition, backupErr.Error()) - case errors.Is(backupErr, backup.ErrIncompatiblePBM): - return status.Error(codes.FailedPrecondition, backupErr.Error()) - default: - return backupErr - } - - st, err := status.New(codes.FailedPrecondition, backupErr.Error()).WithDetails(&backuppb.Error{ - Code: code, - }) - if err != nil { - return fmt.Errorf("failed to construct status error: %w, restore error: %w", err, backupErr) - } - - return st.Err() -} - -func convertRestoreBackupError(restoreError error) error { - if restoreError == nil { - return nil - } - - var unsupportedAgentErr *agents.AgentNotSupportedError - if errors.As(restoreError, &unsupportedAgentErr) { - return status.Error(codes.FailedPrecondition, restoreError.Error()) - } - - var code backuppb.ErrorCode - switch { - case errors.Is(restoreError, backup.ErrIncompatibleService): - return status.Error(codes.FailedPrecondition, restoreError.Error()) - case errors.Is(restoreError, backup.ErrXtrabackupNotInstalled): + case errors.Is(e, backup.ErrXtrabackupNotInstalled): code = backuppb.ErrorCode_ERROR_CODE_XTRABACKUP_NOT_INSTALLED - case errors.Is(restoreError, backup.ErrInvalidXtrabackup): + case errors.Is(e, backup.ErrInvalidXtrabackup): code = backuppb.ErrorCode_ERROR_CODE_INVALID_XTRABACKUP - case errors.Is(restoreError, backup.ErrIncompatibleXtrabackup): + case errors.Is(e, backup.ErrIncompatibleXtrabackup): code = backuppb.ErrorCode_ERROR_CODE_INCOMPATIBLE_XTRABACKUP - case errors.Is(restoreError, backup.ErrIncompatibleTargetMySQL): + case errors.Is(e, backup.ErrIncompatibleTargetMySQL): code = backuppb.ErrorCode_ERROR_CODE_INCOMPATIBLE_TARGET_MYSQL - case errors.Is(restoreError, backup.ErrIncompatibleTargetMongoDB): + case errors.Is(e, backup.ErrIncompatibleTargetMongoDB): code = backuppb.ErrorCode_ERROR_CODE_INCOMPATIBLE_TARGET_MONGODB - case errors.Is(restoreError, backup.ErrTimestampOutOfRange): - return status.Error(codes.OutOfRange, restoreError.Error()) - case errors.Is(restoreError, backup.ErrIncompatibleArtifactMode): - return status.Error(codes.FailedPrecondition, restoreError.Error()) - case errors.Is(restoreError, models.ErrNotFound): - return status.Error(codes.NotFound, restoreError.Error()) - case errors.Is(restoreError, backup.ErrAnotherOperationInProgress): - return status.Error(codes.FailedPrecondition, restoreError.Error()) - case errors.Is(restoreError, backup.ErrArtifactNotReady): - return status.Error(codes.FailedPrecondition, restoreError.Error()) - case errors.Is(restoreError, backup.ErrIncompatiblePBM): - return status.Error(codes.FailedPrecondition, restoreError.Error()) + case errors.Is(e, backup.ErrTimestampOutOfRange): + return status.Error(codes.OutOfRange, e.Error()) + case errors.Is(e, models.ErrNotFound): + return status.Error(codes.NotFound, e.Error()) + case errors.Is(e, models.ErrAlreadyExists): + return status.Error(codes.AlreadyExists, e.Error()) + case errors.Is(e, backup.ErrAnotherOperationInProgress), + errors.Is(e, backup.ErrArtifactNotReady), + errors.Is(e, backup.ErrIncompatiblePBM), + errors.Is(e, backup.ErrIncompatibleLocationType), + errors.Is(e, backup.ErrIncompatibleService), + errors.Is(e, backup.ErrIncompatibleArtifactMode), + errors.Is(e, services.ErrLocationFolderPairAlreadyUsed): + return status.Error(codes.FailedPrecondition, e.Error()) default: - return restoreError + return e } - st, err := status.New(codes.FailedPrecondition, restoreError.Error()).WithDetails(&backuppb.Error{ + st, err := status.New(codes.FailedPrecondition, e.Error()).WithDetails(&backuppb.Error{ Code: code, }) if err != nil { - return fmt.Errorf("failed to construct status error: %w, restore error: %w", err, restoreError) + return fmt.Errorf("failed to construct status error: %w, original error: %w", err, e) } return st.Err() } -func convertModelError(modelError error) error { - if modelError == nil { - return nil - } - - switch { - case errors.Is(modelError, models.ErrNotFound): - return status.Error(codes.NotFound, modelError.Error()) - case errors.Is(modelError, models.ErrAlreadyExists): - return status.Error(codes.AlreadyExists, modelError.Error()) - - default: - return modelError - } -} - // isFolderSafe checks if specified path is safe against traversal attacks. func isFolderSafe(path string) error { if path == "" { diff --git a/managed/services/management/backup/deps.go b/managed/services/management/backup/deps.go index a7b660c6ba..5b8b794122 100644 --- a/managed/services/management/backup/deps.go +++ b/managed/services/management/backup/deps.go @@ -24,11 +24,11 @@ import ( "github.com/percona/pmm/managed/services/scheduler" ) -//go:generate ../../../../bin/mockery -name=awsS3 -case=snake -inpkg -testonly -//go:generate ../../../../bin/mockery -name=backupService -case=snake -inpkg -testonly -//go:generate ../../../../bin/mockery -name=scheduleService -case=snake -inpkg -testonly -//go:generate ../../../../bin/mockery -name=removalService -case=snake -inpkg -testonly -//go:generate ../../../../bin/mockery -name=pbmPITRService -case=snake -inpkg -testonly +//go:generate ../../../../bin/mockery --name=awsS3 --case=snake --inpackage --testonly +//go:generate ../../../../bin/mockery --name=backupService --case=snake --inpackage --testonly +//go:generate ../../../../bin/mockery --name=scheduleService --case=snake --inpackage --testonly +//go:generate ../../../../bin/mockery --name=removalService --case=snake --inpackage --testonly +//go:generate ../../../../bin/mockery --name=pbmPITRService --case=snake --inpackage --testonly type awsS3 interface { GetBucketLocation(ctx context.Context, host string, accessKey, secretKey, name string) (string, error) diff --git a/managed/services/management/backup/mock_aws_s3_test.go b/managed/services/management/backup/mock_aws_s3_test.go index a148e76abd..5935392e61 100644 --- a/managed/services/management/backup/mock_aws_s3_test.go +++ b/managed/services/management/backup/mock_aws_s3_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package backup @@ -18,13 +18,16 @@ func (_m *mockAwsS3) BucketExists(ctx context.Context, host string, accessKey st ret := _m.Called(ctx, host, accessKey, secretKey, name) var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) (bool, error)); ok { + return rf(ctx, host, accessKey, secretKey, name) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) bool); ok { r0 = rf(ctx, host, accessKey, secretKey, name) } else { r0 = ret.Get(0).(bool) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { r1 = rf(ctx, host, accessKey, secretKey, name) } else { @@ -39,13 +42,16 @@ func (_m *mockAwsS3) GetBucketLocation(ctx context.Context, host string, accessK ret := _m.Called(ctx, host, accessKey, secretKey, name) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) (string, error)); ok { + return rf(ctx, host, accessKey, secretKey, name) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) string); ok { r0 = rf(ctx, host, accessKey, secretKey, name) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { r1 = rf(ctx, host, accessKey, secretKey, name) } else { @@ -68,3 +74,18 @@ func (_m *mockAwsS3) RemoveRecursive(ctx context.Context, endpoint string, acces return r0 } + +// newMockAwsS3 creates a new instance of mockAwsS3. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAwsS3(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAwsS3 { + mock := &mockAwsS3{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/backup/mock_backup_service_test.go b/managed/services/management/backup/mock_backup_service_test.go index a7df318ba1..5c7f5287ac 100644 --- a/managed/services/management/backup/mock_backup_service_test.go +++ b/managed/services/management/backup/mock_backup_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package backup @@ -8,7 +8,7 @@ import ( mock "github.com/stretchr/testify/mock" - "github.com/percona/pmm/managed/services/backup" + servicesbackup "github.com/percona/pmm/managed/services/backup" ) // mockBackupService is an autogenerated mock type for the backupService type @@ -17,18 +17,21 @@ type mockBackupService struct { } // PerformBackup provides a mock function with given fields: ctx, params -func (_m *mockBackupService) PerformBackup(ctx context.Context, params backup.PerformBackupParams) (string, error) { +func (_m *mockBackupService) PerformBackup(ctx context.Context, params servicesbackup.PerformBackupParams) (string, error) { ret := _m.Called(ctx, params) var r0 string - if rf, ok := ret.Get(0).(func(context.Context, backup.PerformBackupParams) string); ok { + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, servicesbackup.PerformBackupParams) (string, error)); ok { + return rf(ctx, params) + } + if rf, ok := ret.Get(0).(func(context.Context, servicesbackup.PerformBackupParams) string); ok { r0 = rf(ctx, params) } else { r0 = ret.Get(0).(string) } - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, backup.PerformBackupParams) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, servicesbackup.PerformBackupParams) error); ok { r1 = rf(ctx, params) } else { r1 = ret.Error(1) @@ -42,13 +45,16 @@ func (_m *mockBackupService) RestoreBackup(ctx context.Context, serviceID string ret := _m.Called(ctx, serviceID, artifactID, pitrTimestamp) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, time.Time) (string, error)); ok { + return rf(ctx, serviceID, artifactID, pitrTimestamp) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, time.Time) string); ok { r0 = rf(ctx, serviceID, artifactID, pitrTimestamp) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, time.Time) error); ok { r1 = rf(ctx, serviceID, artifactID, pitrTimestamp) } else { @@ -71,3 +77,18 @@ func (_m *mockBackupService) SwitchMongoPITR(ctx context.Context, serviceID stri return r0 } + +// newMockBackupService creates a new instance of mockBackupService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockBackupService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockBackupService { + mock := &mockBackupService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/backup/mock_pbm_pitr_service_test.go b/managed/services/management/backup/mock_pbm_pitr_service_test.go index 93592d44b3..90d6433efc 100644 --- a/managed/services/management/backup/mock_pbm_pitr_service_test.go +++ b/managed/services/management/backup/mock_pbm_pitr_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package backup @@ -8,7 +8,7 @@ import ( mock "github.com/stretchr/testify/mock" models "github.com/percona/pmm/managed/models" - "github.com/percona/pmm/managed/services/backup" + servicesbackup "github.com/percona/pmm/managed/services/backup" ) // mockPbmPITRService is an autogenerated mock type for the pbmPITRService type @@ -17,20 +17,23 @@ type mockPbmPITRService struct { } // ListPITRTimeranges provides a mock function with given fields: ctx, locationClient, location, artifact -func (_m *mockPbmPITRService) ListPITRTimeranges(ctx context.Context, locationClient backup.Storage, location *models.BackupLocation, artifact *models.Artifact) ([]backup.Timeline, error) { +func (_m *mockPbmPITRService) ListPITRTimeranges(ctx context.Context, locationClient servicesbackup.Storage, location *models.BackupLocation, artifact *models.Artifact) ([]servicesbackup.Timeline, error) { ret := _m.Called(ctx, locationClient, location, artifact) - var r0 []backup.Timeline - if rf, ok := ret.Get(0).(func(context.Context, backup.Storage, *models.BackupLocation, *models.Artifact) []backup.Timeline); ok { + var r0 []servicesbackup.Timeline + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, servicesbackup.Storage, *models.BackupLocation, *models.Artifact) ([]servicesbackup.Timeline, error)); ok { + return rf(ctx, locationClient, location, artifact) + } + if rf, ok := ret.Get(0).(func(context.Context, servicesbackup.Storage, *models.BackupLocation, *models.Artifact) []servicesbackup.Timeline); ok { r0 = rf(ctx, locationClient, location, artifact) } else { if ret.Get(0) != nil { - r0 = ret.Get(0).([]backup.Timeline) + r0 = ret.Get(0).([]servicesbackup.Timeline) } } - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, backup.Storage, *models.BackupLocation, *models.Artifact) error); ok { + if rf, ok := ret.Get(1).(func(context.Context, servicesbackup.Storage, *models.BackupLocation, *models.Artifact) error); ok { r1 = rf(ctx, locationClient, location, artifact) } else { r1 = ret.Error(1) @@ -38,3 +41,18 @@ func (_m *mockPbmPITRService) ListPITRTimeranges(ctx context.Context, locationCl return r0, r1 } + +// newMockPbmPITRService creates a new instance of mockPbmPITRService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockPbmPITRService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockPbmPITRService { + mock := &mockPbmPITRService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/backup/mock_removal_service_test.go b/managed/services/management/backup/mock_removal_service_test.go index 75fc429d12..e437479ba5 100644 --- a/managed/services/management/backup/mock_removal_service_test.go +++ b/managed/services/management/backup/mock_removal_service_test.go @@ -1,11 +1,11 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package backup import ( mock "github.com/stretchr/testify/mock" - "github.com/percona/pmm/managed/services/backup" + servicesbackup "github.com/percona/pmm/managed/services/backup" ) // mockRemovalService is an autogenerated mock type for the removalService type @@ -14,11 +14,11 @@ type mockRemovalService struct { } // DeleteArtifact provides a mock function with given fields: storage, artifactID, removeFiles -func (_m *mockRemovalService) DeleteArtifact(storage backup.Storage, artifactID string, removeFiles bool) error { +func (_m *mockRemovalService) DeleteArtifact(storage servicesbackup.Storage, artifactID string, removeFiles bool) error { ret := _m.Called(storage, artifactID, removeFiles) var r0 error - if rf, ok := ret.Get(0).(func(backup.Storage, string, bool) error); ok { + if rf, ok := ret.Get(0).(func(servicesbackup.Storage, string, bool) error); ok { r0 = rf(storage, artifactID, removeFiles) } else { r0 = ret.Error(0) @@ -26,3 +26,18 @@ func (_m *mockRemovalService) DeleteArtifact(storage backup.Storage, artifactID return r0 } + +// newMockRemovalService creates a new instance of mockRemovalService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockRemovalService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockRemovalService { + mock := &mockRemovalService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/backup/mock_schedule_service_test.go b/managed/services/management/backup/mock_schedule_service_test.go index 748208bdef..0f62f0c8db 100644 --- a/managed/services/management/backup/mock_schedule_service_test.go +++ b/managed/services/management/backup/mock_schedule_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package backup @@ -21,6 +21,10 @@ func (_m *mockScheduleService) Add(task scheduler.Task, params scheduler.AddPara ret := _m.Called(task, params) var r0 *models.ScheduledTask + var r1 error + if rf, ok := ret.Get(0).(func(scheduler.Task, scheduler.AddParams) (*models.ScheduledTask, error)); ok { + return rf(task, params) + } if rf, ok := ret.Get(0).(func(scheduler.Task, scheduler.AddParams) *models.ScheduledTask); ok { r0 = rf(task, params) } else { @@ -29,7 +33,6 @@ func (_m *mockScheduleService) Add(task scheduler.Task, params scheduler.AddPara } } - var r1 error if rf, ok := ret.Get(1).(func(scheduler.Task, scheduler.AddParams) error); ok { r1 = rf(task, params) } else { @@ -71,3 +74,18 @@ func (_m *mockScheduleService) Update(id string, params models.ChangeScheduledTa return r0 } + +// newMockScheduleService creates a new instance of mockScheduleService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockScheduleService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockScheduleService { + mock := &mockScheduleService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/checks.go b/managed/services/management/checks.go index 4589c6ee14..705448cd0e 100644 --- a/managed/services/management/checks.go +++ b/managed/services/management/checks.go @@ -240,6 +240,7 @@ func (s *ChecksAPIService) ListSecurityChecks(_ context.Context, _ *managementpb Name: c.Name, Disabled: disabled, Summary: c.Summary, + Family: convertFamily(c.GetFamily()), Description: c.Description, Interval: convertInterval(c.Interval), }) @@ -273,6 +274,7 @@ func (s *ChecksAPIService) ListAdvisors(_ context.Context, _ *managementpb.ListA Name: c.Name, Disabled: disabled, Summary: c.Summary, + Family: convertFamily(c.GetFamily()), Description: c.Description, Interval: convertInterval(c.Interval), }) @@ -282,7 +284,7 @@ func (s *ChecksAPIService) ListAdvisors(_ context.Context, _ *managementpb.ListA Name: a.Name, Description: a.Description, Summary: a.Summary, - Comment: createComment(s.l, a.Checks), + Comment: createComment(a.Checks), Category: a.Category, Checks: checks, }) @@ -291,22 +293,27 @@ func (s *ChecksAPIService) ListAdvisors(_ context.Context, _ *managementpb.ListA return &managementpb.ListAdvisorsResponse{Advisors: res}, nil } -func createComment(l *logrus.Entry, checks []check.Check) string { - checksM := make(map[string]check.Check, len(checks)) +func createComment(checks []check.Check) string { + var mySQL, postgreSQL, mongoDB bool for _, c := range checks { - checksM[c.Name] = c + switch c.GetFamily() { + case check.MySQL: + mySQL = true + case check.PostgreSQL: + postgreSQL = true + case check.MongoDB: + mongoDB = true + } } - mysqlChecks, portgreSQLChecks, mongoDBChecks := services.GroupChecksByDB(l, checksM) - b := make([]string, 0, 3) - if len(mysqlChecks) != 0 { + if mySQL { b = append(b, "MySQL") } - if len(portgreSQLChecks) != 0 { + if postgreSQL { b = append(b, "PostgreSQL") } - if len(mongoDBChecks) != 0 { + if mongoDB { b = append(b, "MongoDB") } @@ -377,6 +384,20 @@ func convertInterval(interval check.Interval) managementpb.SecurityCheckInterval } } +// convertFamily converts check.Family type to managementpb.AdvisorCheckFamily. +func convertFamily(family check.Family) managementpb.AdvisorCheckFamily { + switch family { + case check.MySQL: + return managementpb.AdvisorCheckFamily_ADVISOR_CHECK_FAMILY_MYSQL + case check.PostgreSQL: + return managementpb.AdvisorCheckFamily_ADVISOR_CHECK_FAMILY_POSTGRESQL + case check.MongoDB: + return managementpb.AdvisorCheckFamily_ADVISOR_CHECK_FAMILY_MONGODB + default: + return managementpb.AdvisorCheckFamily_ADVISOR_CHECK_FAMILY_INVALID + } +} + // convertAPIInterval converts managementpb.SecurityCheckInterval type to check.Interval. func convertAPIInterval(interval managementpb.SecurityCheckInterval) (check.Interval, error) { switch interval { diff --git a/managed/services/management/checks_test.go b/managed/services/management/checks_test.go index d630910ffc..27fca1950b 100644 --- a/managed/services/management/checks_test.go +++ b/managed/services/management/checks_test.go @@ -23,7 +23,6 @@ import ( "github.com/percona-platform/saas/pkg/check" "github.com/percona-platform/saas/pkg/common" "github.com/pkg/errors" - "github.com/sirupsen/logrus" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" @@ -465,8 +464,6 @@ func TestUpdateSecurityChecks(t *testing.T) { func TestCreateComment(t *testing.T) { t.Parallel() - l := logrus.WithField("component", "tests") - testCases := []struct { Name string Comment string @@ -502,7 +499,7 @@ func TestCreateComment(t *testing.T) { t.Run(tc.Name, func(t *testing.T) { t.Parallel() - assert.Equal(t, tc.Comment, createComment(l, tc.Checks)) + assert.Equal(t, tc.Comment, createComment(tc.Checks)) }) } } diff --git a/managed/services/management/dbaas/components_service_test.go b/managed/services/management/dbaas/components_service_test.go index fdb361630c..5680fe59bd 100644 --- a/managed/services/management/dbaas/components_service_test.go +++ b/managed/services/management/dbaas/components_service_test.go @@ -670,7 +670,6 @@ func TestInstallOperator(t *testing.T) { } func TestCheckForOperatorUpdate(t *testing.T) { - t.Parallel() response := &VersionServiceResponse{ Versions: []Version{ { diff --git a/managed/services/management/dbaas/db_cluster_service.go b/managed/services/management/dbaas/db_cluster_service.go index 7d382e8552..3746727b5c 100644 --- a/managed/services/management/dbaas/db_cluster_service.go +++ b/managed/services/management/dbaas/db_cluster_service.go @@ -55,7 +55,11 @@ type DBClusterService struct { } // NewDBClusterService creates DB Clusters Service. -func NewDBClusterService(db *reform.DB, grafanaClient grafanaClient, versionServiceClient *VersionServiceClient) dbaasv1beta1.DBClustersServer { +func NewDBClusterService( //nolint:ireturn + db *reform.DB, + grafanaClient grafanaClient, + versionServiceClient *VersionServiceClient, +) dbaasv1beta1.DBClustersServer { l := logrus.WithField("component", "dbaas_db_cluster") return &DBClusterService{ db: db, diff --git a/managed/services/management/dbaas/dbaas_initializer.go b/managed/services/management/dbaas/dbaas_initializer.go index 677acb6a71..f8b10b6529 100644 --- a/managed/services/management/dbaas/dbaas_initializer.go +++ b/managed/services/management/dbaas/dbaas_initializer.go @@ -101,8 +101,8 @@ func (in *Initializer) Enable(ctx context.Context) error { // registerIncluster automatically adds k8s cluster to dbaas when PMM is running inside k8s cluster func (in *Initializer) registerInCluster(ctx context.Context) error { kubeConfig, err := in.dbaasClient.GetKubeConfig(ctx, &dbaascontrollerv1beta1.GetKubeconfigRequest{}) - //nolint:nestif - if err == nil { + switch { + case err == nil: // If err is not equal to nil, dont' register cluster and fail silently err := in.db.InTransaction(func(t *reform.TX) error { cluster, err := models.FindKubernetesClusterByName(t.Querier, defaultClusterName) @@ -134,9 +134,9 @@ func (in *Initializer) registerInCluster(ctx context.Context) error { } in.l.Info("Cluster is successfully initialized") } - } else if errors.Is(err, rest.ErrNotInCluster) { + case errors.Is(err, rest.ErrNotInCluster): in.l.Info("PMM is running outside a kubernetes cluster") - } else { + default: in.l.Errorf("failed getting kubeconfig inside cluster: %v", err) } return nil diff --git a/managed/services/management/dbaas/deps.go b/managed/services/management/dbaas/deps.go index 6779827751..84509c0236 100644 --- a/managed/services/management/dbaas/deps.go +++ b/managed/services/management/dbaas/deps.go @@ -34,12 +34,12 @@ import ( "github.com/percona/pmm/managed/services/dbaas/kubernetes" ) -//go:generate ../../../../bin/mockery -name=dbaasClient -case=snake -inpkg -testonly -//go:generate ../../../../bin/mockery -name=versionService -case=snake -inpkg -testonly -//go:generate ../../../../bin/mockery -name=grafanaClient -case=snake -inpkg -testonly -//go:generate ../../../../bin/mockery -name=componentsService -case=snake -inpkg -testonly -//go:generate ../../../../bin/mockery -name=kubernetesClient -case=snake -inpkg -testonly -//go:generate ../../../../bin/mockery -name=kubeStorageManager -case=snake -inpkg -testonly +//go:generate ../../../../bin/mockery --name=dbaasClient --case=snake --inpackage --testonly +//go:generate ../../../../bin/mockery --name=versionService --case=snake --inpackage --testonly +//go:generate ../../../../bin/mockery --name=grafanaClient --case=snake --inpackage --testonly +//go:generate ../../../../bin/mockery --name=componentsService --case=snake --inpackage --testonly +//go:generate ../../../../bin/mockery --name=kubernetesClient --case=snake --inpackage --testonly +//go:generate ../../../../bin/mockery --name=kubeStorageManager --case=snake --inpackage --testonly type dbaasClient interface { // Connect connects the client to dbaas-controller API. @@ -97,7 +97,7 @@ type componentsService interface { InstallOperator(context.Context, *dbaasv1beta1.InstallOperatorRequest) (*dbaasv1beta1.InstallOperatorResponse, error) } -type kubernetesClient interface { +type kubernetesClient interface { //nolint:interfacebloat SetKubeconfig(string) error ListDatabaseClusters(context.Context) (*dbaasv1.DatabaseClusterList, error) GetDatabaseCluster(context.Context, string) (*dbaasv1.DatabaseCluster, error) diff --git a/managed/services/management/dbaas/kube_clients.go b/managed/services/management/dbaas/kube_clients.go index 07351958c4..c6328b4f06 100644 --- a/managed/services/management/dbaas/kube_clients.go +++ b/managed/services/management/dbaas/kube_clients.go @@ -43,7 +43,7 @@ func NewKubeStorage(db *reform.DB) *KubeStorage { } // GetOrSetClient gets client from map or sets a new client to the map -func (k *KubeStorage) GetOrSetClient(name string) (kubernetesClient, error) { +func (k *KubeStorage) GetOrSetClient(name string) (kubernetesClient, error) { //nolint:ireturn k.mu.Lock() defer k.mu.Unlock() kubeClient, ok := k.clients[name] diff --git a/managed/services/management/dbaas/kubernetes_server.go b/managed/services/management/dbaas/kubernetes_server.go index aacd44b00f..fcb9ed9aa6 100644 --- a/managed/services/management/dbaas/kubernetes_server.go +++ b/managed/services/management/dbaas/kubernetes_server.go @@ -67,7 +67,7 @@ type kubernetesServer struct { } // NewKubernetesServer creates Kubernetes Server. -func NewKubernetesServer(db *reform.DB, dbaasClient dbaasClient, versionService versionService, +func NewKubernetesServer(db *reform.DB, dbaasClient dbaasClient, versionService versionService, //nolint:ireturn grafanaClient grafanaClient, ) dbaasv1beta1.KubernetesServer { l := logrus.WithField("component", "kubernetes_server") @@ -91,8 +91,8 @@ func (k *kubernetesServer) Enabled() bool { return settings.DBaaS.Enabled } -// getOperatorStatus exists mainly to assign appropriate status when installed operator is unsupported. -// dbaas-controller does not have a clue what's supported, so we have to do it here. +// convertToOperatorStatus exists mainly to provide an appropriate status when installed operator is unsupported. +// Dbaas-controller does not have a clue what's supported, so we have to do it here. func (k kubernetesServer) convertToOperatorStatus(versionsList []string, operatorVersion string) dbaasv1beta1.OperatorsStatus { if operatorVersion == "" { return dbaasv1beta1.OperatorsStatus_OPERATORS_STATUS_NOT_INSTALLED @@ -172,10 +172,10 @@ func (k kubernetesServer) ListKubernetesClusters(ctx context.Context, _ *dbaasv1 // if err != nil { // return // } - //version, err := kubeClient.GetDBaaSOperatorVersion(ctx) - //if err != nil { - // return - //} + // version, err := kubeClient.GetDBaaSOperatorVersion(ctx) + // if err != nil { + // return + // } // clusters[i].Operators.Dbaas.Version = version // clusters[i].Operators.Dbaas.Status = dbaasv1beta1.OperatorsStatus_OPERATORS_STATUS_OK }(cluster) diff --git a/managed/services/management/dbaas/kubernetes_server_test.go b/managed/services/management/dbaas/kubernetes_server_test.go index d04471bb04..7a2ea1640b 100644 --- a/managed/services/management/dbaas/kubernetes_server_test.go +++ b/managed/services/management/dbaas/kubernetes_server_test.go @@ -689,7 +689,7 @@ users: provideClusterInfo: false ` -func TestUseIAMAuthenticator(t *testing.T) { +func TestUseIAMAuthenticator(t *testing.T) { //nolint:tparallel t.Parallel() testCases := []struct { name string diff --git a/managed/services/management/dbaas/logs_service.go b/managed/services/management/dbaas/logs_service.go index 459cc83942..6cef57780c 100644 --- a/managed/services/management/dbaas/logs_service.go +++ b/managed/services/management/dbaas/logs_service.go @@ -46,7 +46,7 @@ type tuple struct { } // NewLogsService creates new LogsService. -func NewLogsService(db *reform.DB) dbaasv1beta1.LogsAPIServer { +func NewLogsService(db *reform.DB) dbaasv1beta1.LogsAPIServer { //nolint:ireturn l := logrus.WithField("component", "logs_api") return &LogsService{db: db, l: l} } diff --git a/managed/services/management/dbaas/mock_components_service_test.go b/managed/services/management/dbaas/mock_components_service_test.go index 1baf299e3b..a20e4ba5f5 100644 --- a/managed/services/management/dbaas/mock_components_service_test.go +++ b/managed/services/management/dbaas/mock_components_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package dbaas @@ -20,6 +20,10 @@ func (_m *mockComponentsService) ChangePSMDBComponents(_a0 context.Context, _a1 ret := _m.Called(_a0, _a1) var r0 *dbaasv1beta1.ChangePSMDBComponentsResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *dbaasv1beta1.ChangePSMDBComponentsRequest) (*dbaasv1beta1.ChangePSMDBComponentsResponse, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, *dbaasv1beta1.ChangePSMDBComponentsRequest) *dbaasv1beta1.ChangePSMDBComponentsResponse); ok { r0 = rf(_a0, _a1) } else { @@ -28,7 +32,6 @@ func (_m *mockComponentsService) ChangePSMDBComponents(_a0 context.Context, _a1 } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *dbaasv1beta1.ChangePSMDBComponentsRequest) error); ok { r1 = rf(_a0, _a1) } else { @@ -43,6 +46,10 @@ func (_m *mockComponentsService) ChangePXCComponents(_a0 context.Context, _a1 *d ret := _m.Called(_a0, _a1) var r0 *dbaasv1beta1.ChangePXCComponentsResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *dbaasv1beta1.ChangePXCComponentsRequest) (*dbaasv1beta1.ChangePXCComponentsResponse, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, *dbaasv1beta1.ChangePXCComponentsRequest) *dbaasv1beta1.ChangePXCComponentsResponse); ok { r0 = rf(_a0, _a1) } else { @@ -51,7 +58,6 @@ func (_m *mockComponentsService) ChangePXCComponents(_a0 context.Context, _a1 *d } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *dbaasv1beta1.ChangePXCComponentsRequest) error); ok { r1 = rf(_a0, _a1) } else { @@ -66,6 +72,10 @@ func (_m *mockComponentsService) CheckForOperatorUpdate(_a0 context.Context, _a1 ret := _m.Called(_a0, _a1) var r0 *dbaasv1beta1.CheckForOperatorUpdateResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *dbaasv1beta1.CheckForOperatorUpdateRequest) (*dbaasv1beta1.CheckForOperatorUpdateResponse, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, *dbaasv1beta1.CheckForOperatorUpdateRequest) *dbaasv1beta1.CheckForOperatorUpdateResponse); ok { r0 = rf(_a0, _a1) } else { @@ -74,7 +84,6 @@ func (_m *mockComponentsService) CheckForOperatorUpdate(_a0 context.Context, _a1 } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *dbaasv1beta1.CheckForOperatorUpdateRequest) error); ok { r1 = rf(_a0, _a1) } else { @@ -89,6 +98,10 @@ func (_m *mockComponentsService) GetPSMDBComponents(_a0 context.Context, _a1 *db ret := _m.Called(_a0, _a1) var r0 *dbaasv1beta1.GetPSMDBComponentsResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *dbaasv1beta1.GetPSMDBComponentsRequest) (*dbaasv1beta1.GetPSMDBComponentsResponse, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, *dbaasv1beta1.GetPSMDBComponentsRequest) *dbaasv1beta1.GetPSMDBComponentsResponse); ok { r0 = rf(_a0, _a1) } else { @@ -97,7 +110,6 @@ func (_m *mockComponentsService) GetPSMDBComponents(_a0 context.Context, _a1 *db } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *dbaasv1beta1.GetPSMDBComponentsRequest) error); ok { r1 = rf(_a0, _a1) } else { @@ -112,6 +124,10 @@ func (_m *mockComponentsService) GetPXCComponents(_a0 context.Context, _a1 *dbaa ret := _m.Called(_a0, _a1) var r0 *dbaasv1beta1.GetPXCComponentsResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *dbaasv1beta1.GetPXCComponentsRequest) (*dbaasv1beta1.GetPXCComponentsResponse, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, *dbaasv1beta1.GetPXCComponentsRequest) *dbaasv1beta1.GetPXCComponentsResponse); ok { r0 = rf(_a0, _a1) } else { @@ -120,7 +136,6 @@ func (_m *mockComponentsService) GetPXCComponents(_a0 context.Context, _a1 *dbaa } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *dbaasv1beta1.GetPXCComponentsRequest) error); ok { r1 = rf(_a0, _a1) } else { @@ -135,6 +150,10 @@ func (_m *mockComponentsService) InstallOperator(_a0 context.Context, _a1 *dbaas ret := _m.Called(_a0, _a1) var r0 *dbaasv1beta1.InstallOperatorResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *dbaasv1beta1.InstallOperatorRequest) (*dbaasv1beta1.InstallOperatorResponse, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, *dbaasv1beta1.InstallOperatorRequest) *dbaasv1beta1.InstallOperatorResponse); ok { r0 = rf(_a0, _a1) } else { @@ -143,7 +162,6 @@ func (_m *mockComponentsService) InstallOperator(_a0 context.Context, _a1 *dbaas } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *dbaasv1beta1.InstallOperatorRequest) error); ok { r1 = rf(_a0, _a1) } else { @@ -152,3 +170,18 @@ func (_m *mockComponentsService) InstallOperator(_a0 context.Context, _a1 *dbaas return r0, r1 } + +// newMockComponentsService creates a new instance of mockComponentsService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockComponentsService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockComponentsService { + mock := &mockComponentsService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/dbaas/mock_dbaas_client_test.go b/managed/services/management/dbaas/mock_dbaas_client_test.go index 6d7ba8c3d6..7fdada79d6 100644 --- a/managed/services/management/dbaas/mock_dbaas_client_test.go +++ b/managed/services/management/dbaas/mock_dbaas_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package dbaas @@ -55,6 +55,10 @@ func (_m *mockDbaasClient) GetKubeConfig(ctx context.Context, in *controllerv1be ret := _m.Called(_ca...) var r0 *controllerv1beta1.GetKubeconfigResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.GetKubeconfigRequest, ...grpc.CallOption) (*controllerv1beta1.GetKubeconfigResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.GetKubeconfigRequest, ...grpc.CallOption) *controllerv1beta1.GetKubeconfigResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -63,7 +67,6 @@ func (_m *mockDbaasClient) GetKubeConfig(ctx context.Context, in *controllerv1be } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *controllerv1beta1.GetKubeconfigRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -85,6 +88,10 @@ func (_m *mockDbaasClient) GetLogs(ctx context.Context, in *controllerv1beta1.Ge ret := _m.Called(_ca...) var r0 *controllerv1beta1.GetLogsResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.GetLogsRequest, ...grpc.CallOption) (*controllerv1beta1.GetLogsResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.GetLogsRequest, ...grpc.CallOption) *controllerv1beta1.GetLogsResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -93,7 +100,6 @@ func (_m *mockDbaasClient) GetLogs(ctx context.Context, in *controllerv1beta1.Ge } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *controllerv1beta1.GetLogsRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -115,6 +121,10 @@ func (_m *mockDbaasClient) GetResources(ctx context.Context, in *controllerv1bet ret := _m.Called(_ca...) var r0 *controllerv1beta1.GetResourcesResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.GetResourcesRequest, ...grpc.CallOption) (*controllerv1beta1.GetResourcesResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.GetResourcesRequest, ...grpc.CallOption) *controllerv1beta1.GetResourcesResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -123,7 +133,6 @@ func (_m *mockDbaasClient) GetResources(ctx context.Context, in *controllerv1bet } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *controllerv1beta1.GetResourcesRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -145,6 +154,10 @@ func (_m *mockDbaasClient) InstallPSMDBOperator(ctx context.Context, in *control ret := _m.Called(_ca...) var r0 *controllerv1beta1.InstallPSMDBOperatorResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.InstallPSMDBOperatorRequest, ...grpc.CallOption) (*controllerv1beta1.InstallPSMDBOperatorResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.InstallPSMDBOperatorRequest, ...grpc.CallOption) *controllerv1beta1.InstallPSMDBOperatorResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -153,7 +166,6 @@ func (_m *mockDbaasClient) InstallPSMDBOperator(ctx context.Context, in *control } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *controllerv1beta1.InstallPSMDBOperatorRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -175,6 +187,10 @@ func (_m *mockDbaasClient) InstallPXCOperator(ctx context.Context, in *controlle ret := _m.Called(_ca...) var r0 *controllerv1beta1.InstallPXCOperatorResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.InstallPXCOperatorRequest, ...grpc.CallOption) (*controllerv1beta1.InstallPXCOperatorResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.InstallPXCOperatorRequest, ...grpc.CallOption) *controllerv1beta1.InstallPXCOperatorResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -183,7 +199,6 @@ func (_m *mockDbaasClient) InstallPXCOperator(ctx context.Context, in *controlle } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *controllerv1beta1.InstallPXCOperatorRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -205,6 +220,10 @@ func (_m *mockDbaasClient) StartMonitoring(ctx context.Context, in *controllerv1 ret := _m.Called(_ca...) var r0 *controllerv1beta1.StartMonitoringResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.StartMonitoringRequest, ...grpc.CallOption) (*controllerv1beta1.StartMonitoringResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.StartMonitoringRequest, ...grpc.CallOption) *controllerv1beta1.StartMonitoringResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -213,7 +232,6 @@ func (_m *mockDbaasClient) StartMonitoring(ctx context.Context, in *controllerv1 } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *controllerv1beta1.StartMonitoringRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -235,6 +253,10 @@ func (_m *mockDbaasClient) StopMonitoring(ctx context.Context, in *controllerv1b ret := _m.Called(_ca...) var r0 *controllerv1beta1.StopMonitoringResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.StopMonitoringRequest, ...grpc.CallOption) (*controllerv1beta1.StopMonitoringResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *controllerv1beta1.StopMonitoringRequest, ...grpc.CallOption) *controllerv1beta1.StopMonitoringResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -243,7 +265,6 @@ func (_m *mockDbaasClient) StopMonitoring(ctx context.Context, in *controllerv1b } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *controllerv1beta1.StopMonitoringRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -252,3 +273,18 @@ func (_m *mockDbaasClient) StopMonitoring(ctx context.Context, in *controllerv1b return r0, r1 } + +// newMockDbaasClient creates a new instance of mockDbaasClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockDbaasClient(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockDbaasClient { + mock := &mockDbaasClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/dbaas/mock_grafana_client_test.go b/managed/services/management/dbaas/mock_grafana_client_test.go index d73e8c7574..965fe4d243 100644 --- a/managed/services/management/dbaas/mock_grafana_client_test.go +++ b/managed/services/management/dbaas/mock_grafana_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package dbaas @@ -18,20 +18,23 @@ func (_m *mockGrafanaClient) CreateAdminAPIKey(ctx context.Context, name string) ret := _m.Called(ctx, name) var r0 int64 + var r1 string + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string) (int64, string, error)); ok { + return rf(ctx, name) + } if rf, ok := ret.Get(0).(func(context.Context, string) int64); ok { r0 = rf(ctx, name) } else { r0 = ret.Get(0).(int64) } - var r1 string if rf, ok := ret.Get(1).(func(context.Context, string) string); ok { r1 = rf(ctx, name) } else { r1 = ret.Get(1).(string) } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { r2 = rf(ctx, name) } else { @@ -68,3 +71,18 @@ func (_m *mockGrafanaClient) DeleteAPIKeysWithPrefix(ctx context.Context, name s return r0 } + +// newMockGrafanaClient creates a new instance of mockGrafanaClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockGrafanaClient(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockGrafanaClient { + mock := &mockGrafanaClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/dbaas/mock_kube_storage_manager_test.go b/managed/services/management/dbaas/mock_kube_storage_manager_test.go index 2ed20dba85..34e485e121 100644 --- a/managed/services/management/dbaas/mock_kube_storage_manager_test.go +++ b/managed/services/management/dbaas/mock_kube_storage_manager_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package dbaas @@ -28,6 +28,10 @@ func (_m *mockKubeStorageManager) GetOrSetClient(name string) (kubernetesClient, ret := _m.Called(name) var r0 kubernetesClient + var r1 error + if rf, ok := ret.Get(0).(func(string) (kubernetesClient, error)); ok { + return rf(name) + } if rf, ok := ret.Get(0).(func(string) kubernetesClient); ok { r0 = rf(name) } else { @@ -36,7 +40,6 @@ func (_m *mockKubeStorageManager) GetOrSetClient(name string) (kubernetesClient, } } - var r1 error if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(name) } else { @@ -45,3 +48,18 @@ func (_m *mockKubeStorageManager) GetOrSetClient(name string) (kubernetesClient, return r0, r1 } + +// newMockKubeStorageManager creates a new instance of mockKubeStorageManager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockKubeStorageManager(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockKubeStorageManager { + mock := &mockKubeStorageManager{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/dbaas/mock_kubernetes_client_test.go b/managed/services/management/dbaas/mock_kubernetes_client_test.go index 0bbe76bfd9..0e50992466 100644 --- a/managed/services/management/dbaas/mock_kubernetes_client_test.go +++ b/managed/services/management/dbaas/mock_kubernetes_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package dbaas @@ -82,27 +82,30 @@ func (_m *mockKubernetesClient) GetAllClusterResources(_a0 context.Context, _a1 ret := _m.Called(_a0, _a1, _a2) var r0 uint64 + var r1 uint64 + var r2 uint64 + var r3 error + if rf, ok := ret.Get(0).(func(context.Context, kubernetes.ClusterType, *corev1.PersistentVolumeList) (uint64, uint64, uint64, error)); ok { + return rf(_a0, _a1, _a2) + } if rf, ok := ret.Get(0).(func(context.Context, kubernetes.ClusterType, *corev1.PersistentVolumeList) uint64); ok { r0 = rf(_a0, _a1, _a2) } else { r0 = ret.Get(0).(uint64) } - var r1 uint64 if rf, ok := ret.Get(1).(func(context.Context, kubernetes.ClusterType, *corev1.PersistentVolumeList) uint64); ok { r1 = rf(_a0, _a1, _a2) } else { r1 = ret.Get(1).(uint64) } - var r2 uint64 if rf, ok := ret.Get(2).(func(context.Context, kubernetes.ClusterType, *corev1.PersistentVolumeList) uint64); ok { r2 = rf(_a0, _a1, _a2) } else { r2 = ret.Get(2).(uint64) } - var r3 error if rf, ok := ret.Get(3).(func(context.Context, kubernetes.ClusterType, *corev1.PersistentVolumeList) error); ok { r3 = rf(_a0, _a1, _a2) } else { @@ -117,13 +120,16 @@ func (_m *mockKubernetesClient) GetClusterType(_a0 context.Context) (kubernetes. ret := _m.Called(_a0) var r0 kubernetes.ClusterType + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (kubernetes.ClusterType, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) kubernetes.ClusterType); ok { r0 = rf(_a0) } else { r0 = ret.Get(0).(kubernetes.ClusterType) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -138,20 +144,23 @@ func (_m *mockKubernetesClient) GetConsumedCPUAndMemory(_a0 context.Context, _a1 ret := _m.Called(_a0, _a1) var r0 uint64 + var r1 uint64 + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string) (uint64, uint64, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, string) uint64); ok { r0 = rf(_a0, _a1) } else { r0 = ret.Get(0).(uint64) } - var r1 uint64 if rf, ok := ret.Get(1).(func(context.Context, string) uint64); ok { r1 = rf(_a0, _a1) } else { r1 = ret.Get(1).(uint64) } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { r2 = rf(_a0, _a1) } else { @@ -166,13 +175,16 @@ func (_m *mockKubernetesClient) GetConsumedDiskBytes(_a0 context.Context, _a1 ku ret := _m.Called(_a0, _a1, _a2) var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, kubernetes.ClusterType, *corev1.PersistentVolumeList) (uint64, error)); ok { + return rf(_a0, _a1, _a2) + } if rf, ok := ret.Get(0).(func(context.Context, kubernetes.ClusterType, *corev1.PersistentVolumeList) uint64); ok { r0 = rf(_a0, _a1, _a2) } else { r0 = ret.Get(0).(uint64) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, kubernetes.ClusterType, *corev1.PersistentVolumeList) error); ok { r1 = rf(_a0, _a1, _a2) } else { @@ -187,6 +199,10 @@ func (_m *mockKubernetesClient) GetDatabaseCluster(_a0 context.Context, _a1 stri ret := _m.Called(_a0, _a1) var r0 *v1.DatabaseCluster + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*v1.DatabaseCluster, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, string) *v1.DatabaseCluster); ok { r0 = rf(_a0, _a1) } else { @@ -195,7 +211,6 @@ func (_m *mockKubernetesClient) GetDatabaseCluster(_a0 context.Context, _a1 stri } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(_a0, _a1) } else { @@ -210,13 +225,16 @@ func (_m *mockKubernetesClient) GetDefaultStorageClassName(_a0 context.Context) ret := _m.Called(_a0) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (string, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) string); ok { r0 = rf(_a0) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -231,13 +249,16 @@ func (_m *mockKubernetesClient) GetPSMDBOperatorVersion(_a0 context.Context) (st ret := _m.Called(_a0) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (string, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) string); ok { r0 = rf(_a0) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -252,13 +273,16 @@ func (_m *mockKubernetesClient) GetPXCOperatorVersion(_a0 context.Context) (stri ret := _m.Called(_a0) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (string, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) string); ok { r0 = rf(_a0) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -273,6 +297,10 @@ func (_m *mockKubernetesClient) GetPersistentVolumes(ctx context.Context) (*core ret := _m.Called(ctx) var r0 *corev1.PersistentVolumeList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*corev1.PersistentVolumeList, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) *corev1.PersistentVolumeList); ok { r0 = rf(ctx) } else { @@ -281,7 +309,6 @@ func (_m *mockKubernetesClient) GetPersistentVolumes(ctx context.Context) (*core } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -296,6 +323,10 @@ func (_m *mockKubernetesClient) GetSecret(_a0 context.Context, _a1 string) (*cor ret := _m.Called(_a0, _a1) var r0 *corev1.Secret + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*corev1.Secret, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, string) *corev1.Secret); ok { r0 = rf(_a0, _a1) } else { @@ -304,7 +335,6 @@ func (_m *mockKubernetesClient) GetSecret(_a0 context.Context, _a1 string) (*cor } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(_a0, _a1) } else { @@ -319,6 +349,10 @@ func (_m *mockKubernetesClient) GetServerVersion() (*version.Info, error) { ret := _m.Called() var r0 *version.Info + var r1 error + if rf, ok := ret.Get(0).(func() (*version.Info, error)); ok { + return rf() + } if rf, ok := ret.Get(0).(func() *version.Info); ok { r0 = rf() } else { @@ -327,7 +361,6 @@ func (_m *mockKubernetesClient) GetServerVersion() (*version.Info, error) { } } - var r1 error if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { @@ -342,6 +375,10 @@ func (_m *mockKubernetesClient) GetStorageClasses(ctx context.Context) (*storage ret := _m.Called(ctx) var r0 *storagev1.StorageClassList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*storagev1.StorageClassList, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) *storagev1.StorageClassList); ok { r0 = rf(ctx) } else { @@ -350,7 +387,6 @@ func (_m *mockKubernetesClient) GetStorageClasses(ctx context.Context) (*storage } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -393,6 +429,10 @@ func (_m *mockKubernetesClient) ListDatabaseClusters(_a0 context.Context) (*v1.D ret := _m.Called(_a0) var r0 *v1.DatabaseClusterList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*v1.DatabaseClusterList, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) *v1.DatabaseClusterList); ok { r0 = rf(_a0) } else { @@ -401,7 +441,6 @@ func (_m *mockKubernetesClient) ListDatabaseClusters(_a0 context.Context) (*v1.D } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -416,6 +455,10 @@ func (_m *mockKubernetesClient) ListSecrets(_a0 context.Context) (*corev1.Secret ret := _m.Called(_a0) var r0 *corev1.SecretList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*corev1.SecretList, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) *corev1.SecretList); ok { r0 = rf(_a0) } else { @@ -424,7 +467,6 @@ func (_m *mockKubernetesClient) ListSecrets(_a0 context.Context) (*corev1.Secret } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -439,6 +481,10 @@ func (_m *mockKubernetesClient) ListSubscriptions(ctx context.Context, namespace ret := _m.Called(ctx, namespace) var r0 *v1alpha1.SubscriptionList + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*v1alpha1.SubscriptionList, error)); ok { + return rf(ctx, namespace) + } if rf, ok := ret.Get(0).(func(context.Context, string) *v1alpha1.SubscriptionList); ok { r0 = rf(ctx, namespace) } else { @@ -447,7 +493,6 @@ func (_m *mockKubernetesClient) ListSubscriptions(ctx context.Context, namespace } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, namespace) } else { @@ -462,6 +507,10 @@ func (_m *mockKubernetesClient) ListTemplates(ctx context.Context, engine string ret := _m.Called(ctx, engine, namespace) var r0 []*dbaasv1beta1.Template + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) ([]*dbaasv1beta1.Template, error)); ok { + return rf(ctx, engine, namespace) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) []*dbaasv1beta1.Template); ok { r0 = rf(ctx, engine, namespace) } else { @@ -470,7 +519,6 @@ func (_m *mockKubernetesClient) ListTemplates(ctx context.Context, engine string } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, engine, namespace) } else { @@ -535,3 +583,18 @@ func (_m *mockKubernetesClient) UpgradeOperator(ctx context.Context, namespace s return r0 } + +// newMockKubernetesClient creates a new instance of mockKubernetesClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockKubernetesClient(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockKubernetesClient { + mock := &mockKubernetesClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/dbaas/mock_version_service_test.go b/managed/services/management/dbaas/mock_version_service_test.go index edd67d1c45..e94bbe15db 100644 --- a/managed/services/management/dbaas/mock_version_service_test.go +++ b/managed/services/management/dbaas/mock_version_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package dbaas @@ -19,13 +19,16 @@ func (_m *mockVersionService) GetNextDatabaseImage(ctx context.Context, operator ret := _m.Called(ctx, operatorType, operatorVersion, installedDBVersion) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) (string, error)); ok { + return rf(ctx, operatorType, operatorVersion, installedDBVersion) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, string) string); ok { r0 = rf(ctx, operatorType, operatorVersion, installedDBVersion) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { r1 = rf(ctx, operatorType, operatorVersion, installedDBVersion) } else { @@ -54,13 +57,16 @@ func (_m *mockVersionService) IsDatabaseVersionSupportedByOperator(ctx context.C ret := _m.Called(ctx, operatorType, operatorVersion, databaseVersion) var r0 bool + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string) (bool, error)); ok { + return rf(ctx, operatorType, operatorVersion, databaseVersion) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, string) bool); ok { r0 = rf(ctx, operatorType, operatorVersion, databaseVersion) } else { r0 = ret.Get(0).(bool) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, string) error); ok { r1 = rf(ctx, operatorType, operatorVersion, databaseVersion) } else { @@ -75,6 +81,11 @@ func (_m *mockVersionService) LatestOperatorVersion(ctx context.Context, pmmVers ret := _m.Called(ctx, pmmVersion) var r0 *version.Version + var r1 *version.Version + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*version.Version, *version.Version, error)); ok { + return rf(ctx, pmmVersion) + } if rf, ok := ret.Get(0).(func(context.Context, string) *version.Version); ok { r0 = rf(ctx, pmmVersion) } else { @@ -83,7 +94,6 @@ func (_m *mockVersionService) LatestOperatorVersion(ctx context.Context, pmmVers } } - var r1 *version.Version if rf, ok := ret.Get(1).(func(context.Context, string) *version.Version); ok { r1 = rf(ctx, pmmVersion) } else { @@ -92,7 +102,6 @@ func (_m *mockVersionService) LatestOperatorVersion(ctx context.Context, pmmVers } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { r2 = rf(ctx, pmmVersion) } else { @@ -107,6 +116,10 @@ func (_m *mockVersionService) Matrix(ctx context.Context, params componentsParam ret := _m.Called(ctx, params) var r0 *VersionServiceResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, componentsParams) (*VersionServiceResponse, error)); ok { + return rf(ctx, params) + } if rf, ok := ret.Get(0).(func(context.Context, componentsParams) *VersionServiceResponse); ok { r0 = rf(ctx, params) } else { @@ -115,7 +128,6 @@ func (_m *mockVersionService) Matrix(ctx context.Context, params componentsParam } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, componentsParams) error); ok { r1 = rf(ctx, params) } else { @@ -130,6 +142,10 @@ func (_m *mockVersionService) NextOperatorVersion(ctx context.Context, operatorT ret := _m.Called(ctx, operatorType, installedVersion) var r0 *version.Version + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (*version.Version, error)); ok { + return rf(ctx, operatorType, installedVersion) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) *version.Version); ok { r0 = rf(ctx, operatorType, installedVersion) } else { @@ -138,7 +154,6 @@ func (_m *mockVersionService) NextOperatorVersion(ctx context.Context, operatorT } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, operatorType, installedVersion) } else { @@ -153,6 +168,10 @@ func (_m *mockVersionService) SupportedOperatorVersionsList(ctx context.Context, ret := _m.Called(ctx, pmmVersion) var r0 map[string][]string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (map[string][]string, error)); ok { + return rf(ctx, pmmVersion) + } if rf, ok := ret.Get(0).(func(context.Context, string) map[string][]string); ok { r0 = rf(ctx, pmmVersion) } else { @@ -161,7 +180,6 @@ func (_m *mockVersionService) SupportedOperatorVersionsList(ctx context.Context, } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, pmmVersion) } else { @@ -170,3 +188,18 @@ func (_m *mockVersionService) SupportedOperatorVersionsList(ctx context.Context, return r0, r1 } + +// newMockVersionService creates a new instance of mockVersionService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockVersionService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockVersionService { + mock := &mockVersionService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/dbaas/psmdb_cluster_service.go b/managed/services/management/dbaas/psmdb_cluster_service.go index 083e296d8f..66365ae9b9 100644 --- a/managed/services/management/dbaas/psmdb_cluster_service.go +++ b/managed/services/management/dbaas/psmdb_cluster_service.go @@ -54,7 +54,7 @@ type PSMDBClusterService struct { } // NewPSMDBClusterService creates PSMDB Service. -func NewPSMDBClusterService(db *reform.DB, grafanaClient grafanaClient, +func NewPSMDBClusterService(db *reform.DB, grafanaClient grafanaClient, //nolint:ireturn componentsService componentsService, versionServiceURL string, ) dbaasv1beta1.PSMDBClustersServer { l := logrus.WithField("component", "psmdb_cluster") diff --git a/managed/services/management/dbaas/pxc_cluster_service.go b/managed/services/management/dbaas/pxc_cluster_service.go index d37447aea5..e9b007a197 100644 --- a/managed/services/management/dbaas/pxc_cluster_service.go +++ b/managed/services/management/dbaas/pxc_cluster_service.go @@ -58,7 +58,7 @@ type PXCClustersService struct { } // NewPXCClusterService creates PXC Service. -func NewPXCClusterService(db *reform.DB, grafanaClient grafanaClient, componentsService componentsService, +func NewPXCClusterService(db *reform.DB, grafanaClient grafanaClient, componentsService componentsService, //nolint:ireturn versionServiceURL string, ) dbaasv1beta1.PXCClustersServer { l := logrus.WithField("component", "pxc_cluster") diff --git a/managed/services/management/dbaas/pxc_cluster_service_test.go b/managed/services/management/dbaas/pxc_cluster_service_test.go index 651f635194..ed2e747f19 100644 --- a/managed/services/management/dbaas/pxc_cluster_service_test.go +++ b/managed/services/management/dbaas/pxc_cluster_service_test.go @@ -80,7 +80,7 @@ const pxcKubeconfigTest = ` ` const pxcKubernetesClusterNameTest = "test-k8s-cluster-name" -func TestPXCClusterService(t *testing.T) { +func TestPXCClusterService(t *testing.T) { //nolint:tparallel // This is for local testing. When running local tests, if pmmversion.PMMVersion is empty // these lines in kubernetes_server.go will throw an error and tests won't finish. // @@ -117,7 +117,7 @@ func TestPXCClusterService(t *testing.T) { } ctx, db, dbaasClient, grafanaClient, componentsClient, kubeClient, teardown := setup(t) - defer teardown(t) + t.Cleanup(func() { teardown(t) }) versionService := &mockVersionService{} v1120, _ := goversion.NewVersion("1.12.0") diff --git a/managed/services/management/dbaas/template_service.go b/managed/services/management/dbaas/template_service.go index 237717fee3..527e667857 100644 --- a/managed/services/management/dbaas/template_service.go +++ b/managed/services/management/dbaas/template_service.go @@ -37,7 +37,7 @@ type TemplateService struct { } // NewTemplateService creates DB Clusters Service. -func NewTemplateService(db *reform.DB) dbaasv1beta1.TemplatesServer { +func NewTemplateService(db *reform.DB) dbaasv1beta1.TemplatesServer { //nolint:ireturn l := logrus.WithField("component", "dbaas_db_cluster") return &TemplateService{ db: db, diff --git a/managed/services/management/dbaas/version_service_client_test.go b/managed/services/management/dbaas/version_service_client_test.go index a25dfb4fdf..3eb41bff61 100644 --- a/managed/services/management/dbaas/version_service_client_test.go +++ b/managed/services/management/dbaas/version_service_client_test.go @@ -78,8 +78,9 @@ func (f fakeLatestVersionServer) ServeHTTP(w http.ResponseWriter, r *http.Reques break } } - //nolint:nestif - if certainVersionRequested { + + switch { + case certainVersionRequested: segments := strings.Split(r.URL.Path, "/") version := segments[len(segments)-2] var dbVersion string @@ -112,16 +113,17 @@ func (f fakeLatestVersionServer) ServeHTTP(w http.ResponseWriter, r *http.Reques break } } - } else if component != "" { + case component != "": response = &VersionServiceResponse{} for _, v := range f.response.Versions { if v.Product == component { response.Versions = append(response.Versions, v) } } - } else { + default: panic("path " + r.URL.Path + " not expected") } + err := encoder.Encode(response) if err != nil { log.Fatal(err) @@ -261,7 +263,7 @@ const ( psmdbImage = "percona/percona-server-mongodb" ) -func TestGetNextDatabaseVersion(t *testing.T) { +func TestGetNextDatabaseVersion(t *testing.T) { //nolint:tparallel ctx, cancel := context.WithTimeout(context.Background(), time.Millisecond*100) response := &VersionServiceResponse{ Versions: []Version{ diff --git a/managed/services/management/deps.go b/managed/services/management/deps.go index 1572d32c5a..1a873f89a4 100644 --- a/managed/services/management/deps.go +++ b/managed/services/management/deps.go @@ -28,15 +28,15 @@ import ( "github.com/percona/pmm/managed/services" ) -//go:generate ../../../bin/mockery -name=agentsRegistry -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=agentsStateUpdater -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=prometheusService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=checksService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=grafanaClient -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=jobsService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=connectionChecker -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=versionCache -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=victoriaMetricsClient -case=snake -inpkg -testonly +//go:generate ../../../bin/mockery --name=agentsRegistry --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=agentsStateUpdater --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=prometheusService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=checksService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=grafanaClient --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=jobsService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=connectionChecker --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=versionCache --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=victoriaMetricsClient --case=snake --inpackage --testonly // agentsRegistry is a subset of methods of agents.Registry used by this package. // We use it instead of real type for testing and to avoid dependency cycle. diff --git a/managed/services/management/grpc/actions_server.go b/managed/services/management/grpc/actions_server.go index 9beb7316be..64b59b0b70 100644 --- a/managed/services/management/grpc/actions_server.go +++ b/managed/services/management/grpc/actions_server.go @@ -45,7 +45,7 @@ var ( ) // NewActionsServer creates Management Actions Server. -func NewActionsServer(a *agents.ActionsService, db *reform.DB) managementpb.ActionsServer { +func NewActionsServer(a *agents.ActionsService, db *reform.DB) managementpb.ActionsServer { //nolint:ireturn l := logrus.WithField("component", "actions.go") return &actionsServer{a: a, db: db, l: l} } diff --git a/managed/services/management/grpc/mongodb_server.go b/managed/services/management/grpc/mongodb_server.go index 3a9299ae5d..c6c3a41091 100644 --- a/managed/services/management/grpc/mongodb_server.go +++ b/managed/services/management/grpc/mongodb_server.go @@ -30,7 +30,7 @@ type mongoDBServer struct { } // NewManagementMongoDBServer creates Management MongoDB Server. -func NewManagementMongoDBServer(s *management.MongoDBService) managementpb.MongoDBServer { +func NewManagementMongoDBServer(s *management.MongoDBService) managementpb.MongoDBServer { //nolint:ireturn return &mongoDBServer{svc: s} } diff --git a/managed/services/management/grpc/mysql_server.go b/managed/services/management/grpc/mysql_server.go index 3091103d2b..754770bbbc 100644 --- a/managed/services/management/grpc/mysql_server.go +++ b/managed/services/management/grpc/mysql_server.go @@ -30,7 +30,7 @@ type mySQLServer struct { } // NewManagementMySQLServer creates Management MySQL Server. -func NewManagementMySQLServer(s *management.MySQLService) managementpb.MySQLServer { +func NewManagementMySQLServer(s *management.MySQLService) managementpb.MySQLServer { //nolint:ireturn return &mySQLServer{svc: s} } diff --git a/managed/services/management/grpc/node_server.go b/managed/services/management/grpc/node_server.go index e9a549176e..57e54e5a30 100644 --- a/managed/services/management/grpc/node_server.go +++ b/managed/services/management/grpc/node_server.go @@ -30,7 +30,7 @@ type nodeServer struct { } // NewManagementNodeServer creates Management Node Server. -func NewManagementNodeServer(s *management.NodeService) managementpb.NodeServer { +func NewManagementNodeServer(s *management.NodeService) managementpb.NodeServer { //nolint:ireturn return &nodeServer{svc: s} } diff --git a/managed/services/management/grpc/postgresql_server.go b/managed/services/management/grpc/postgresql_server.go index d812e0b65a..cad7f99a94 100644 --- a/managed/services/management/grpc/postgresql_server.go +++ b/managed/services/management/grpc/postgresql_server.go @@ -30,7 +30,7 @@ type postgreSQLServer struct { } // NewManagementPostgreSQLServer creates Management PostgreSQL Server. -func NewManagementPostgreSQLServer(s *management.PostgreSQLService) managementpb.PostgreSQLServer { +func NewManagementPostgreSQLServer(s *management.PostgreSQLService) managementpb.PostgreSQLServer { //nolint:ireturn return &postgreSQLServer{svc: s} } diff --git a/managed/services/management/grpc/proxysql_server.go b/managed/services/management/grpc/proxysql_server.go index fe51149f33..2394827148 100644 --- a/managed/services/management/grpc/proxysql_server.go +++ b/managed/services/management/grpc/proxysql_server.go @@ -30,7 +30,7 @@ type proxySQLServer struct { } // NewManagementProxySQLServer creates Management ProxySQL Server. -func NewManagementProxySQLServer(s *management.ProxySQLService) managementpb.ProxySQLServer { +func NewManagementProxySQLServer(s *management.ProxySQLService) managementpb.ProxySQLServer { //nolint:ireturn return &proxySQLServer{svc: s} } diff --git a/managed/services/management/ia/common.go b/managed/services/management/ia/common.go index 1ded6b8cbe..4f219fa67c 100644 --- a/managed/services/management/ia/common.go +++ b/managed/services/management/ia/common.go @@ -170,8 +170,7 @@ func validateParameters(definitions models.AlertExprParamsDefinitions, values mo return status.Errorf(codes.InvalidArgument, "Parameter %s has type %s instead of %s.", d.Name, value.Type, d.Type) } - switch d.Type { //nolint:exhaustive - case models.Float: + if d.Type == models.Float { v := d.FloatParam fv := value.FloatValue if v.Min != nil && pointer.GetFloat64(v.Min) > fv { diff --git a/managed/services/management/ia/deps.go b/managed/services/management/ia/deps.go index b047152e00..12f19bc0a4 100644 --- a/managed/services/management/ia/deps.go +++ b/managed/services/management/ia/deps.go @@ -23,9 +23,9 @@ import ( "github.com/percona/pmm/managed/services/management/alerting" ) -//go:generate ../../../../bin/mockery -name=alertManager -case=snake -inpkg -testonly -//go:generate ../../../../bin/mockery -name=vmAlert -case=snake -inpkg -testonly -//go:generate ../../../../bin/mockery -name=templatesService -case=snake -inpkg -testonly +//go:generate ../../../../bin/mockery --name=alertManager --case=snake --inpackage --testonly +//go:generate ../../../../bin/mockery --name=vmAlert --case=snake --inpackage --testonly +//go:generate ../../../../bin/mockery --name=templatesService --case=snake --inpackage --testonly // alertManager is a subset of methods of alertmanager.Service used by this package. // We use it instead of real type for testing and to avoid dependency cycle. diff --git a/managed/services/management/ia/mock_alert_manager_test.go b/managed/services/management/ia/mock_alert_manager_test.go index 5832587b47..13e49aa95d 100644 --- a/managed/services/management/ia/mock_alert_manager_test.go +++ b/managed/services/management/ia/mock_alert_manager_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package ia @@ -21,6 +21,10 @@ func (_m *mockAlertManager) FindAlertsByID(ctx context.Context, params *services ret := _m.Called(ctx, params, ids) var r0 []*ammodels.GettableAlert + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *services.FilterParams, []string) ([]*ammodels.GettableAlert, error)); ok { + return rf(ctx, params, ids) + } if rf, ok := ret.Get(0).(func(context.Context, *services.FilterParams, []string) []*ammodels.GettableAlert); ok { r0 = rf(ctx, params, ids) } else { @@ -29,7 +33,6 @@ func (_m *mockAlertManager) FindAlertsByID(ctx context.Context, params *services } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *services.FilterParams, []string) error); ok { r1 = rf(ctx, params, ids) } else { @@ -44,6 +47,10 @@ func (_m *mockAlertManager) GetAlerts(ctx context.Context, params *services.Filt ret := _m.Called(ctx, params) var r0 []*ammodels.GettableAlert + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *services.FilterParams) ([]*ammodels.GettableAlert, error)); ok { + return rf(ctx, params) + } if rf, ok := ret.Get(0).(func(context.Context, *services.FilterParams) []*ammodels.GettableAlert); ok { r0 = rf(ctx, params) } else { @@ -52,7 +59,6 @@ func (_m *mockAlertManager) GetAlerts(ctx context.Context, params *services.Filt } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *services.FilterParams) error); ok { r1 = rf(ctx, params) } else { @@ -94,3 +100,18 @@ func (_m *mockAlertManager) UnsilenceAlerts(ctx context.Context, alerts []*ammod return r0 } + +// newMockAlertManager creates a new instance of mockAlertManager. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAlertManager(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAlertManager { + mock := &mockAlertManager{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/ia/mock_templates_service_test.go b/managed/services/management/ia/mock_templates_service_test.go index 6f1e68ad29..11c5f28e0e 100644 --- a/managed/services/management/ia/mock_templates_service_test.go +++ b/managed/services/management/ia/mock_templates_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package ia @@ -28,3 +28,18 @@ func (_m *mockTemplatesService) GetTemplates() map[string]alerting.TemplateInfo return r0 } + +// newMockTemplatesService creates a new instance of mockTemplatesService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockTemplatesService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockTemplatesService { + mock := &mockTemplatesService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/ia/mock_vm_alert_test.go b/managed/services/management/ia/mock_vm_alert_test.go index 83722527c7..b6195a3503 100644 --- a/managed/services/management/ia/mock_vm_alert_test.go +++ b/managed/services/management/ia/mock_vm_alert_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package ia @@ -13,3 +13,18 @@ type mockVmAlert struct { func (_m *mockVmAlert) RequestConfigurationUpdate() { _m.Called() } + +// newMockVmAlert creates a new instance of mockVmAlert. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockVmAlert(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockVmAlert { + mock := &mockVmAlert{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/ia/rules_service_test.go b/managed/services/management/ia/rules_service_test.go index e4178fc0a1..542e621cb2 100644 --- a/managed/services/management/ia/rules_service_test.go +++ b/managed/services/management/ia/rules_service_test.go @@ -22,6 +22,7 @@ import ( "github.com/stretchr/testify/require" ) +/* // func TestCreateAlertRule(t *testing.T) { // ctx := context.Background() // sqlDB := testdb.Open(t, models.SkipFixtures, nil) @@ -358,6 +359,7 @@ import ( // assert.EqualError(t, err, fmt.Sprintf("stat %s: no such file or directory", filename)) // }) // } +*/ func ruleFileName(testDir, ruleID string) string { return testDir + "/" + strings.TrimPrefix(ruleID, "/rule_id/") + ".yml" diff --git a/managed/services/management/mock_agents_registry_test.go b/managed/services/management/mock_agents_registry_test.go index ea855f6147..6c189c7b24 100644 --- a/managed/services/management/mock_agents_registry_test.go +++ b/managed/services/management/mock_agents_registry_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package management @@ -31,3 +31,18 @@ func (_m *mockAgentsRegistry) IsConnected(pmmAgentID string) bool { func (_m *mockAgentsRegistry) Kick(ctx context.Context, pmmAgentID string) { _m.Called(ctx, pmmAgentID) } + +// newMockAgentsRegistry creates a new instance of mockAgentsRegistry. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAgentsRegistry(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAgentsRegistry { + mock := &mockAgentsRegistry{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/mock_agents_state_updater_test.go b/managed/services/management/mock_agents_state_updater_test.go index dc2bdc59a9..17d52e1196 100644 --- a/managed/services/management/mock_agents_state_updater_test.go +++ b/managed/services/management/mock_agents_state_updater_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package management @@ -17,3 +17,18 @@ type mockAgentsStateUpdater struct { func (_m *mockAgentsStateUpdater) RequestStateUpdate(ctx context.Context, pmmAgentID string) { _m.Called(ctx, pmmAgentID) } + +// newMockAgentsStateUpdater creates a new instance of mockAgentsStateUpdater. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAgentsStateUpdater(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAgentsStateUpdater { + mock := &mockAgentsStateUpdater{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/mock_api_key_provider_test.go b/managed/services/management/mock_api_key_provider_test.go index 21df427bc7..0d5053584e 100644 --- a/managed/services/management/mock_api_key_provider_test.go +++ b/managed/services/management/mock_api_key_provider_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package management @@ -18,20 +18,23 @@ func (_m *mockApiKeyProvider) CreateAdminAPIKey(ctx context.Context, name string ret := _m.Called(ctx, name) var r0 int64 + var r1 string + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string) (int64, string, error)); ok { + return rf(ctx, name) + } if rf, ok := ret.Get(0).(func(context.Context, string) int64); ok { r0 = rf(ctx, name) } else { r0 = ret.Get(0).(int64) } - var r1 string if rf, ok := ret.Get(1).(func(context.Context, string) string); ok { r1 = rf(ctx, name) } else { r1 = ret.Get(1).(string) } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { r2 = rf(ctx, name) } else { @@ -40,3 +43,18 @@ func (_m *mockApiKeyProvider) CreateAdminAPIKey(ctx context.Context, name string return r0, r1, r2 } + +// newMockApiKeyProvider creates a new instance of mockApiKeyProvider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockApiKeyProvider(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockApiKeyProvider { + mock := &mockApiKeyProvider{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/mock_checks_service_test.go b/managed/services/management/mock_checks_service_test.go index cbcd758983..9baa9827c1 100644 --- a/managed/services/management/mock_checks_service_test.go +++ b/managed/services/management/mock_checks_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package management @@ -63,6 +63,10 @@ func (_m *mockChecksService) GetAdvisors() ([]check.Advisor, error) { ret := _m.Called() var r0 []check.Advisor + var r1 error + if rf, ok := ret.Get(0).(func() ([]check.Advisor, error)); ok { + return rf() + } if rf, ok := ret.Get(0).(func() []check.Advisor); ok { r0 = rf() } else { @@ -71,7 +75,6 @@ func (_m *mockChecksService) GetAdvisors() ([]check.Advisor, error) { } } - var r1 error if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { @@ -86,6 +89,10 @@ func (_m *mockChecksService) GetChecks() (map[string]check.Check, error) { ret := _m.Called() var r0 map[string]check.Check + var r1 error + if rf, ok := ret.Get(0).(func() (map[string]check.Check, error)); ok { + return rf() + } if rf, ok := ret.Get(0).(func() map[string]check.Check); ok { r0 = rf() } else { @@ -94,7 +101,6 @@ func (_m *mockChecksService) GetChecks() (map[string]check.Check, error) { } } - var r1 error if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { @@ -109,6 +115,10 @@ func (_m *mockChecksService) GetChecksResults(ctx context.Context, serviceID str ret := _m.Called(ctx, serviceID) var r0 []services.CheckResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) ([]services.CheckResult, error)); ok { + return rf(ctx, serviceID) + } if rf, ok := ret.Get(0).(func(context.Context, string) []services.CheckResult); ok { r0 = rf(ctx, serviceID) } else { @@ -117,7 +127,6 @@ func (_m *mockChecksService) GetChecksResults(ctx context.Context, serviceID str } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, serviceID) } else { @@ -132,6 +141,10 @@ func (_m *mockChecksService) GetDisabledChecks() ([]string, error) { ret := _m.Called() var r0 []string + var r1 error + if rf, ok := ret.Get(0).(func() ([]string, error)); ok { + return rf() + } if rf, ok := ret.Get(0).(func() []string); ok { r0 = rf() } else { @@ -140,7 +153,6 @@ func (_m *mockChecksService) GetDisabledChecks() ([]string, error) { } } - var r1 error if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { @@ -155,6 +167,10 @@ func (_m *mockChecksService) GetSecurityCheckResults() ([]services.CheckResult, ret := _m.Called() var r0 []services.CheckResult + var r1 error + if rf, ok := ret.Get(0).(func() ([]services.CheckResult, error)); ok { + return rf() + } if rf, ok := ret.Get(0).(func() []services.CheckResult); ok { r0 = rf() } else { @@ -163,7 +179,6 @@ func (_m *mockChecksService) GetSecurityCheckResults() ([]services.CheckResult, } } - var r1 error if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { @@ -200,3 +215,18 @@ func (_m *mockChecksService) ToggleCheckAlert(ctx context.Context, alertID strin return r0 } + +// newMockChecksService creates a new instance of mockChecksService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockChecksService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockChecksService { + mock := &mockChecksService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/mock_connection_checker_test.go b/managed/services/management/mock_connection_checker_test.go index 560c8beafa..0c17403dbb 100644 --- a/managed/services/management/mock_connection_checker_test.go +++ b/managed/services/management/mock_connection_checker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package management @@ -29,3 +29,18 @@ func (_m *mockConnectionChecker) CheckConnectionToService(ctx context.Context, q return r0 } + +// newMockConnectionChecker creates a new instance of mockConnectionChecker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockConnectionChecker(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockConnectionChecker { + mock := &mockConnectionChecker{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/mock_grafana_client_test.go b/managed/services/management/mock_grafana_client_test.go index af714e11b5..11b37bfdd2 100644 --- a/managed/services/management/mock_grafana_client_test.go +++ b/managed/services/management/mock_grafana_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package management @@ -19,13 +19,16 @@ func (_m *mockGrafanaClient) CreateAnnotation(_a0 context.Context, _a1 []string, ret := _m.Called(_a0, _a1, _a2, _a3, _a4) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string, time.Time, string, string) (string, error)); ok { + return rf(_a0, _a1, _a2, _a3, _a4) + } if rf, ok := ret.Get(0).(func(context.Context, []string, time.Time, string, string) string); ok { r0 = rf(_a0, _a1, _a2, _a3, _a4) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string, time.Time, string, string) error); ok { r1 = rf(_a0, _a1, _a2, _a3, _a4) } else { @@ -34,3 +37,18 @@ func (_m *mockGrafanaClient) CreateAnnotation(_a0 context.Context, _a1 []string, return r0, r1 } + +// newMockGrafanaClient creates a new instance of mockGrafanaClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockGrafanaClient(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockGrafanaClient { + mock := &mockGrafanaClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/mock_jobs_service_test.go b/managed/services/management/mock_jobs_service_test.go index 3937a6a6c1..accb002700 100644 --- a/managed/services/management/mock_jobs_service_test.go +++ b/managed/services/management/mock_jobs_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package management @@ -22,3 +22,18 @@ func (_m *mockJobsService) StopJob(jobID string) error { return r0 } + +// newMockJobsService creates a new instance of mockJobsService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockJobsService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockJobsService { + mock := &mockJobsService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/mock_prometheus_service_test.go b/managed/services/management/mock_prometheus_service_test.go index 6decf5f1b0..222a6edf82 100644 --- a/managed/services/management/mock_prometheus_service_test.go +++ b/managed/services/management/mock_prometheus_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package management @@ -13,3 +13,18 @@ type mockPrometheusService struct { func (_m *mockPrometheusService) RequestConfigurationUpdate() { _m.Called() } + +// newMockPrometheusService creates a new instance of mockPrometheusService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockPrometheusService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockPrometheusService { + mock := &mockPrometheusService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/mock_version_cache_test.go b/managed/services/management/mock_version_cache_test.go index 063a059b57..c13b96f53f 100644 --- a/managed/services/management/mock_version_cache_test.go +++ b/managed/services/management/mock_version_cache_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package management @@ -13,3 +13,18 @@ type mockVersionCache struct { func (_m *mockVersionCache) RequestSoftwareVersionsUpdate() { _m.Called() } + +// newMockVersionCache creates a new instance of mockVersionCache. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockVersionCache(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockVersionCache { + mock := &mockVersionCache{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/mock_victoria_metrics_client_test.go b/managed/services/management/mock_victoria_metrics_client_test.go index a7e769730e..6ae8bc8991 100644 --- a/managed/services/management/mock_victoria_metrics_client_test.go +++ b/managed/services/management/mock_victoria_metrics_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package management @@ -28,6 +28,11 @@ func (_m *mockVictoriaMetricsClient) Query(ctx context.Context, query string, ts ret := _m.Called(_ca...) var r0 model.Value + var r1 v1.Warnings + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string, time.Time, ...v1.Option) (model.Value, v1.Warnings, error)); ok { + return rf(ctx, query, ts, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, string, time.Time, ...v1.Option) model.Value); ok { r0 = rf(ctx, query, ts, opts...) } else { @@ -36,7 +41,6 @@ func (_m *mockVictoriaMetricsClient) Query(ctx context.Context, query string, ts } } - var r1 v1.Warnings if rf, ok := ret.Get(1).(func(context.Context, string, time.Time, ...v1.Option) v1.Warnings); ok { r1 = rf(ctx, query, ts, opts...) } else { @@ -45,7 +49,6 @@ func (_m *mockVictoriaMetricsClient) Query(ctx context.Context, query string, ts } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string, time.Time, ...v1.Option) error); ok { r2 = rf(ctx, query, ts, opts...) } else { @@ -54,3 +57,18 @@ func (_m *mockVictoriaMetricsClient) Query(ctx context.Context, query string, ts return r0, r1, r2 } + +// newMockVictoriaMetricsClient creates a new instance of mockVictoriaMetricsClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockVictoriaMetricsClient(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockVictoriaMetricsClient { + mock := &mockVictoriaMetricsClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/mysql.go b/managed/services/management/mysql.go index 8eeab76130..5493bbdffb 100644 --- a/managed/services/management/mysql.go +++ b/managed/services/management/mysql.go @@ -137,16 +137,17 @@ func (s *MySQLService) Add(ctx context.Context, req *managementpb.AddMySQLReques if req.QanMysqlPerfschema { row, err = models.CreateAgent(tx.Querier, models.QANMySQLPerfSchemaAgentType, &models.CreateAgentParams{ - PMMAgentID: req.PmmAgentId, - ServiceID: service.ServiceID, - Username: req.Username, - Password: req.Password, - TLS: req.Tls, - TLSSkipVerify: req.TlsSkipVerify, - MySQLOptions: models.MySQLOptionsFromRequest(req), - MaxQueryLength: req.MaxQueryLength, - QueryExamplesDisabled: req.DisableQueryExamples, - LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), + PMMAgentID: req.PmmAgentId, + ServiceID: service.ServiceID, + Username: req.Username, + Password: req.Password, + TLS: req.Tls, + TLSSkipVerify: req.TlsSkipVerify, + MySQLOptions: models.MySQLOptionsFromRequest(req), + MaxQueryLength: req.MaxQueryLength, + QueryExamplesDisabled: req.DisableQueryExamples, + CommentsParsingDisabled: req.DisableCommentsParsing, + LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), }) if err != nil { return err @@ -161,17 +162,18 @@ func (s *MySQLService) Add(ctx context.Context, req *managementpb.AddMySQLReques if req.QanMysqlSlowlog { row, err = models.CreateAgent(tx.Querier, models.QANMySQLSlowlogAgentType, &models.CreateAgentParams{ - PMMAgentID: req.PmmAgentId, - ServiceID: service.ServiceID, - Username: req.Username, - Password: req.Password, - TLS: req.Tls, - TLSSkipVerify: req.TlsSkipVerify, - MySQLOptions: models.MySQLOptionsFromRequest(req), - MaxQueryLength: req.MaxQueryLength, - QueryExamplesDisabled: req.DisableQueryExamples, - MaxQueryLogSize: maxSlowlogFileSize, - LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), + PMMAgentID: req.PmmAgentId, + ServiceID: service.ServiceID, + Username: req.Username, + Password: req.Password, + TLS: req.Tls, + TLSSkipVerify: req.TlsSkipVerify, + MySQLOptions: models.MySQLOptionsFromRequest(req), + MaxQueryLength: req.MaxQueryLength, + QueryExamplesDisabled: req.DisableQueryExamples, + CommentsParsingDisabled: req.DisableCommentsParsing, + MaxQueryLogSize: maxSlowlogFileSize, + LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), }) if err != nil { return err diff --git a/managed/services/management/node.go b/managed/services/management/node.go index edf56ce48e..0c17d5e3ea 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -31,7 +31,7 @@ import ( "github.com/percona/pmm/managed/services" ) -//go:generate ../../../bin/mockery -name=apiKeyProvider -case=snake -inpkg -testonly +//go:generate ../../../bin/mockery --name=apiKeyProvider --case=snake --inpackage --testonly type apiKeyProvider interface { CreateAdminAPIKey(ctx context.Context, name string) (int64, string, error) diff --git a/managed/services/management/postgresql.go b/managed/services/management/postgresql.go index 0470970e2d..dfdf559fa4 100644 --- a/managed/services/management/postgresql.go +++ b/managed/services/management/postgresql.go @@ -111,15 +111,17 @@ func (s *PostgreSQLService) Add(ctx context.Context, req *managementpb.AddPostgr if req.QanPostgresqlPgstatementsAgent { row, err = models.CreateAgent(tx.Querier, models.QANPostgreSQLPgStatementsAgentType, &models.CreateAgentParams{ - PMMAgentID: req.PmmAgentId, - ServiceID: service.ServiceID, - Username: req.Username, - Password: req.Password, - MaxQueryLength: req.MaxQueryLength, - TLS: req.Tls, - TLSSkipVerify: req.TlsSkipVerify, - PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(req), - LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), + PMMAgentID: req.PmmAgentId, + ServiceID: service.ServiceID, + Username: req.Username, + Password: req.Password, + MaxQueryLength: req.MaxQueryLength, + QueryExamplesDisabled: req.DisableQueryExamples, + CommentsParsingDisabled: req.DisableCommentsParsing, + TLS: req.Tls, + TLSSkipVerify: req.TlsSkipVerify, + PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(req), + LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), }) if err != nil { return err @@ -134,16 +136,17 @@ func (s *PostgreSQLService) Add(ctx context.Context, req *managementpb.AddPostgr if req.QanPostgresqlPgstatmonitorAgent { row, err = models.CreateAgent(tx.Querier, models.QANPostgreSQLPgStatMonitorAgentType, &models.CreateAgentParams{ - PMMAgentID: req.PmmAgentId, - ServiceID: service.ServiceID, - Username: req.Username, - Password: req.Password, - MaxQueryLength: req.MaxQueryLength, - QueryExamplesDisabled: req.DisableQueryExamples, - TLS: req.Tls, - TLSSkipVerify: req.TlsSkipVerify, - PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(req), - LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), + PMMAgentID: req.PmmAgentId, + ServiceID: service.ServiceID, + Username: req.Username, + Password: req.Password, + MaxQueryLength: req.MaxQueryLength, + QueryExamplesDisabled: req.DisableQueryExamples, + CommentsParsingDisabled: req.DisableCommentsParsing, + TLS: req.Tls, + TLSSkipVerify: req.TlsSkipVerify, + PostgreSQLOptions: models.PostgreSQLOptionsFromRequest(req), + LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), }) if err != nil { return err diff --git a/managed/services/management/rds.go b/managed/services/management/rds.go index 849be3070b..38daa0018c 100644 --- a/managed/services/management/rds.go +++ b/managed/services/management/rds.go @@ -43,7 +43,7 @@ import ( ) const ( - // maximum time for AWS discover APIs calls + // Maximum time for AWS discover APIs calls awsDiscoverTimeout = 7 * time.Second ) @@ -240,7 +240,7 @@ func (s *RDSService) DiscoverRDS(ctx context.Context, req *managementpb.Discover } // AddRDS adds RDS instance. -func (s *RDSService) AddRDS(ctx context.Context, req *managementpb.AddRDSRequest) (*managementpb.AddRDSResponse, error) { //nolint:cyclop +func (s *RDSService) AddRDS(ctx context.Context, req *managementpb.AddRDSRequest) (*managementpb.AddRDSResponse, error) { //nolint:cyclop,maintidx res := &managementpb.AddRDSResponse{} if e := s.db.InTransaction(func(tx *reform.TX) error { @@ -387,6 +387,7 @@ func (s *RDSService) AddRDS(ctx context.Context, req *managementpb.AddRDSRequest CustomLabels: req.CustomLabels, Address: &req.Address, Port: pointer.ToUint16(uint16(req.Port)), + Database: req.Database, }) if err != nil { return err diff --git a/managed/services/platform/platform.go b/managed/services/platform/platform.go index cf8eb09812..5af433c5db 100644 --- a/managed/services/platform/platform.go +++ b/managed/services/platform/platform.go @@ -188,7 +188,7 @@ func (s *Service) Disconnect(ctx context.Context, req *platformpb.DisconnectRequ } // forceDisconnect cleans up records of platform connection only from PMM side. -// this should only be used in case a user with admin credentials tries to disconnect. +// This should only be used in case a user with admin credentials tries to disconnect. // The SSO details should be removed from both the DB and grafana config. func (s *Service) forceDisconnect(ctx context.Context) error { err := models.DeletePerconaSSODetails(s.db.Querier) diff --git a/managed/services/preconditions.go b/managed/services/preconditions.go index 6f2f40293c..41e06cf179 100644 --- a/managed/services/preconditions.go +++ b/managed/services/preconditions.go @@ -17,6 +17,7 @@ package services import ( "github.com/AlekSi/pointer" + "github.com/pkg/errors" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "gopkg.in/reform.v1" @@ -25,7 +26,8 @@ import ( ) // CheckMongoDBBackupPreconditions checks compatibility of different types of scheduled backups and on-demand backups for MongoDB. -// WARNING: This function valid only when executed as part of transaction with serializable isolation level. +// +// WARNING: This function is valid only when executed as part of transaction with serializable isolation level. func CheckMongoDBBackupPreconditions(q *reform.Querier, mode models.BackupMode, clusterName, serviceID, scheduleID string) error { filter := models.ScheduledTasksFilter{ Disabled: pointer.ToBool(false), @@ -87,3 +89,86 @@ func CheckMongoDBBackupPreconditions(q *reform.Querier, mode models.BackupMode, return nil } + +// CheckArtifactOverlapping checks if there are other artifacts or scheduled tasks pointing to the same location and folder. +// Placing MySQL and MongoDB artifacts in the same folder is not desirable, while placing MongoDB artifacts of different clusters +// in the same folder may cause data inconsistency. +// +// WARNING: This function is valid only when executed as part of transaction with serializable isolation level. +func CheckArtifactOverlapping(q *reform.Querier, serviceID, locationID, folder string) error { + // TODO This doesn't work for all cases. For example, there may exist more than one storage locations pointing to the same place. + + const ( + usedByArtifactMsg = "Same location and folder already used for artifact %s of other service: %s" + usedByScheduledTaskMsg = "Same location and folder already used for scheduled task %s of other service: %s" + ) + + service, err := models.FindServiceByID(q, serviceID) + if err != nil { + return err + } + + artifacts, err := models.FindArtifacts(q, models.ArtifactFilters{ + LocationID: locationID, + Folder: &folder, + }) + if err != nil { + return err + } + + for _, artifact := range artifacts { + if artifact.ServiceID != serviceID { + svc, err := models.FindServiceByID(q, artifact.ServiceID) + if err != nil { + return err + } + + if service.ServiceType == models.MySQLServiceType && svc.ServiceType == models.MySQLServiceType { + continue + } + + if service.ServiceType == models.MongoDBServiceType && svc.ServiceType == models.MongoDBServiceType { + if svc.Cluster != service.Cluster { + return errors.Wrapf(ErrLocationFolderPairAlreadyUsed, usedByArtifactMsg, artifact.ID, serviceID) + } + continue + } + + return errors.Wrapf(ErrLocationFolderPairAlreadyUsed, usedByArtifactMsg, artifact.ID, serviceID) + } + } + + tasks, err := models.FindScheduledTasks(q, models.ScheduledTasksFilter{ + LocationID: locationID, + Folder: &folder, + }) + if err != nil { + return err + } + + var svcID string + + for _, task := range tasks { + svcID, err = task.ServiceID() + if err != nil { + return err + } + + if svcID != serviceID { + if service.ServiceType == models.MySQLServiceType && task.Type == models.ScheduledMySQLBackupTask { + continue + } + + if service.ServiceType == models.MongoDBServiceType && task.Type == models.ScheduledMongoDBBackupTask { + if task.Data.MongoDBBackupTask.ClusterName != service.Cluster { + return errors.Wrapf(ErrLocationFolderPairAlreadyUsed, usedByScheduledTaskMsg, task.ID, serviceID) + } + continue + } + + return errors.Wrapf(ErrLocationFolderPairAlreadyUsed, usedByScheduledTaskMsg, task.ID, serviceID) + } + } + + return nil +} diff --git a/managed/services/preconditions_test.go b/managed/services/preconditions_test.go index 323da39472..ba73f4e597 100644 --- a/managed/services/preconditions_test.go +++ b/managed/services/preconditions_test.go @@ -19,7 +19,10 @@ import ( "context" "database/sql" "testing" + "time" + "github.com/AlekSi/pointer" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -144,3 +147,124 @@ func TestCheckMongoDBBackupPreconditions(t *testing.T) { tests.AssertGRPCError(t, status.New(codes.InvalidArgument, "Incremental backups unsupported for MongoDB"), err) }) } + +func TestCheckArtifactOverlapping(t *testing.T) { + sqlDB := testdb.Open(t, models.SkipFixtures, nil) + db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) + t.Cleanup(func() { + require.NoError(t, sqlDB.Close()) + }) + + folder1, folder2 := "folder1", "folder2" + + node, err := models.CreateNode(db.Querier, models.GenericNodeType, &models.CreateNodeParams{ + NodeName: "test-node", + }) + require.NoError(t, err) + + mongoSvc1, err := models.AddNewService(db.Querier, models.MongoDBServiceType, &models.AddDBMSServiceParams{ + ServiceName: "mongodb1", + NodeID: node.NodeID, + Address: pointer.ToString("127.0.0.1"), + Port: pointer.ToUint16(60000), + Cluster: "cluster1", + }) + require.NoError(t, err) + + mongoSvc2, err := models.AddNewService(db.Querier, models.MongoDBServiceType, &models.AddDBMSServiceParams{ + ServiceName: "mongodb2", + NodeID: node.NodeID, + Address: pointer.ToString("127.0.0.1"), + Port: pointer.ToUint16(60000), + Cluster: "cluster1", + }) + require.NoError(t, err) + + mongoSvc3, err := models.AddNewService(db.Querier, models.MongoDBServiceType, &models.AddDBMSServiceParams{ + ServiceName: "mongodb3", + NodeID: node.NodeID, + Address: pointer.ToString("127.0.0.1"), + Port: pointer.ToUint16(60000), + Cluster: "cluster2", + }) + require.NoError(t, err) + + mysqlSvc1, err := models.AddNewService(db.Querier, models.MySQLServiceType, &models.AddDBMSServiceParams{ + ServiceName: "mysql1", + NodeID: node.NodeID, + Address: pointer.ToString("127.0.0.1"), + Port: pointer.ToUint16(60000), + Cluster: "mysql_cluster_1", + }) + require.NoError(t, err) + + mysqlSvc2, err := models.AddNewService(db.Querier, models.MySQLServiceType, &models.AddDBMSServiceParams{ + ServiceName: "mysql2", + NodeID: node.NodeID, + Address: pointer.ToString("127.0.0.1"), + Port: pointer.ToUint16(60000), + Cluster: "mysql_cluster_2", + }) + require.NoError(t, err) + + location, err := models.CreateBackupLocation(db.Querier, models.CreateBackupLocationParams{ + Name: "test_location", + BackupLocationConfig: models.BackupLocationConfig{ + FilesystemConfig: &models.FilesystemLocationConfig{ + Path: "/tmp", + }, + }, + }) + require.NoError(t, err) + + _, err = models.CreateScheduledTask(db.Querier, models.CreateScheduledTaskParams{ + CronExpression: "* * * * *", + StartAt: time.Now().Truncate(time.Second).UTC(), + Type: models.ScheduledMongoDBBackupTask, + Data: &models.ScheduledTaskData{ + MongoDBBackupTask: &models.MongoBackupTaskData{ + CommonBackupTaskData: models.CommonBackupTaskData{ + ServiceID: mongoSvc1.ServiceID, + LocationID: location.ID, + Name: "test", + Description: "test backup task", + DataModel: models.LogicalDataModel, + Mode: models.Snapshot, + Retention: 7, + Retries: 3, + RetryInterval: 5 * time.Second, + ClusterName: "cluster1", + Folder: folder1, + }, + }, + }, + }) + require.NoError(t, err) + + _, err = models.CreateArtifact(db.Querier, models.CreateArtifactParams{ + Name: "test_artifact", + Vendor: "mysql", + LocationID: location.ID, + ServiceID: mysqlSvc1.ServiceID, + DataModel: models.LogicalDataModel, + Mode: models.Snapshot, + Status: models.SuccessBackupStatus, + Folder: folder2, + }) + require.NoError(t, err) + + err = CheckArtifactOverlapping(db.Querier, mongoSvc2.ServiceID, location.ID, folder1) + assert.NoError(t, err) + + err = CheckArtifactOverlapping(db.Querier, mongoSvc3.ServiceID, location.ID, folder1) + assert.ErrorIs(t, err, ErrLocationFolderPairAlreadyUsed) + + err = CheckArtifactOverlapping(db.Querier, mysqlSvc1.ServiceID, location.ID, folder1) + assert.ErrorIs(t, err, ErrLocationFolderPairAlreadyUsed) + + err = CheckArtifactOverlapping(db.Querier, mysqlSvc2.ServiceID, location.ID, folder2) + assert.NoError(t, err) + + err = CheckArtifactOverlapping(db.Querier, mongoSvc1.ServiceID, location.ID, folder2) + assert.ErrorIs(t, err, ErrLocationFolderPairAlreadyUsed) +} diff --git a/managed/services/qan/client.go b/managed/services/qan/client.go index cd212bf958..4b48c8e172 100644 --- a/managed/services/qan/client.go +++ b/managed/services/qan/client.go @@ -189,6 +189,7 @@ func (c *Client) Collect(ctx context.Context, metricsBuckets []*agentpb.MetricsB c.l.Error(err) continue } + mb := &qanpb.MetricsBucket{ Queryid: m.Common.Queryid, ExplainFingerprint: m.Common.ExplainFingerprint, @@ -232,7 +233,7 @@ func (c *Client) Collect(ctx context.Context, metricsBuckets []*agentpb.MetricsB fillPostgreSQL(mb, m.Postgresql) } - // in order of fields in MetricsBucket + // Ordered the same as fields in MetricsBucket for labelName, field := range map[string]*string{ "machine_id": &mb.MachineId, "container_id": &mb.ContainerId, @@ -269,6 +270,9 @@ func (c *Client) Collect(ctx context.Context, metricsBuckets []*agentpb.MetricsB delete(labels, labelName) } + for k, l := range m.Common.Comments { + labels[k] = l + } mb.Labels = labels convertedMetricsBuckets = append(convertedMetricsBuckets, mb) diff --git a/managed/services/qan/deps.go b/managed/services/qan/deps.go index 10392dde07..f745e18e53 100644 --- a/managed/services/qan/deps.go +++ b/managed/services/qan/deps.go @@ -23,7 +23,7 @@ import ( qanpb "github.com/percona/pmm/api/qanpb" ) -//go:generate ../../../bin/mockery -name=qanCollectorClient -case=snake -inpkg -testonly +//go:generate ../../../bin/mockery --name=qanCollectorClient --case=snake --inpackage --testonly // qanClient is a subset of methods of qanpb.CollectorClient used by this package. // We use it instead of real type for testing. diff --git a/managed/services/qan/mock_qan_collector_client_test.go b/managed/services/qan/mock_qan_collector_client_test.go index 9919d1bab0..a0c5aa988e 100644 --- a/managed/services/qan/mock_qan_collector_client_test.go +++ b/managed/services/qan/mock_qan_collector_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package qan @@ -28,6 +28,10 @@ func (_m *mockQanCollectorClient) Collect(ctx context.Context, in *qanv1beta1.Co ret := _m.Called(_ca...) var r0 *qanv1beta1.CollectResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *qanv1beta1.CollectRequest, ...grpc.CallOption) (*qanv1beta1.CollectResponse, error)); ok { + return rf(ctx, in, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, *qanv1beta1.CollectRequest, ...grpc.CallOption) *qanv1beta1.CollectResponse); ok { r0 = rf(ctx, in, opts...) } else { @@ -36,7 +40,6 @@ func (_m *mockQanCollectorClient) Collect(ctx context.Context, in *qanv1beta1.Co } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *qanv1beta1.CollectRequest, ...grpc.CallOption) error); ok { r1 = rf(ctx, in, opts...) } else { @@ -45,3 +48,18 @@ func (_m *mockQanCollectorClient) Collect(ctx context.Context, in *qanv1beta1.Co return r0, r1 } + +// newMockQanCollectorClient creates a new instance of mockQanCollectorClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockQanCollectorClient(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockQanCollectorClient { + mock := &mockQanCollectorClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/scheduler/deps.go b/managed/services/scheduler/deps.go index 1c2666303d..0820f524b5 100644 --- a/managed/services/scheduler/deps.go +++ b/managed/services/scheduler/deps.go @@ -21,7 +21,7 @@ import ( "github.com/percona/pmm/managed/services/backup" ) -//go:generate ../../../bin/mockery -name=backupService -case=snake -inpkg -testonly +//go:generate ../../../bin/mockery --name=backupService --case=snake --inpackage --testonly type backupService interface { PerformBackup(ctx context.Context, params backup.PerformBackupParams) (string, error) diff --git a/managed/services/scheduler/mock_backup_service_test.go b/managed/services/scheduler/mock_backup_service_test.go index 07c4a5a4fe..892383c9c8 100644 --- a/managed/services/scheduler/mock_backup_service_test.go +++ b/managed/services/scheduler/mock_backup_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package scheduler @@ -20,13 +20,16 @@ func (_m *mockBackupService) PerformBackup(ctx context.Context, params backup.Pe ret := _m.Called(ctx, params) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, backup.PerformBackupParams) (string, error)); ok { + return rf(ctx, params) + } if rf, ok := ret.Get(0).(func(context.Context, backup.PerformBackupParams) string); ok { r0 = rf(ctx, params) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, backup.PerformBackupParams) error); ok { r1 = rf(ctx, params) } else { @@ -35,3 +38,18 @@ func (_m *mockBackupService) PerformBackup(ctx context.Context, params backup.Pe return r0, r1 } + +// newMockBackupService creates a new instance of mockBackupService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockBackupService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockBackupService { + mock := &mockBackupService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/scheduler/scheduler.go b/managed/services/scheduler/scheduler.go index 660b2f8ce9..127416d724 100644 --- a/managed/services/scheduler/scheduler.go +++ b/managed/services/scheduler/scheduler.go @@ -87,7 +87,7 @@ func (s *Service) Add(task Task, params AddParams) (*models.ScheduledTask, error // This transaction is valid only with serializable isolation level. On lower isolation levels it can produce anomalies. errTx := s.db.InTransactionContext(s.db.Querier.Context(), &sql.TxOptions{Isolation: sql.LevelSerializable}, func(tx *reform.TX) error { var err error - if err = checkPreconditions(tx.Querier, task.Data(), !params.Disabled, ""); err != nil { + if err = checkAddPreconditions(tx.Querier, task.Data(), !params.Disabled, ""); err != nil { return err } scheduledTask, err = models.CreateScheduledTask(tx.Querier, models.CreateScheduledTaskParams{ @@ -158,7 +158,7 @@ func (s *Service) Remove(id string) error { // Update changes scheduled task in DB and re-add it to scheduler. func (s *Service) Update(id string, params models.ChangeScheduledTaskParams) error { return s.db.InTransactionContext(s.db.Querier.Context(), &sql.TxOptions{Isolation: sql.LevelSerializable}, func(tx *reform.TX) error { - if err := checkPreconditions(tx.Querier, params.Data, !pointer.GetBool(params.Disable), id); err != nil { + if err := checkUpdatePreconditions(tx.Querier, params.Data, !pointer.GetBool(params.Disable), id); err != nil { return err } @@ -303,7 +303,7 @@ func (s *Service) taskFinished(id string, taskErr error) { } } -func (s *Service) convertDBTask(dbTask *models.ScheduledTask) (Task, error) { +func (s *Service) convertDBTask(dbTask *models.ScheduledTask) (Task, error) { //nolint:ireturn var task Task switch dbTask.Type { case models.ScheduledMySQLBackupTask: @@ -352,7 +352,29 @@ func (s *Service) convertDBTask(dbTask *models.ScheduledTask) (Task, error) { return task, nil } -func checkPreconditions(q *reform.Querier, data *models.ScheduledTaskData, enabled bool, scheduledTaskID string) error { +func checkAddPreconditions(q *reform.Querier, data *models.ScheduledTaskData, enabled bool, scheduledTaskID string) error { + switch { + case data.MySQLBackupTask != nil: + if err := services.CheckArtifactOverlapping(q, data.MySQLBackupTask.ServiceID, data.MySQLBackupTask.LocationID, data.MySQLBackupTask.Folder); err != nil { + return err + } + case data.MongoDBBackupTask != nil: + if err := services.CheckArtifactOverlapping(q, data.MongoDBBackupTask.ServiceID, data.MongoDBBackupTask.LocationID, data.MongoDBBackupTask.Folder); err != nil { + return err + } + if enabled { + return services.CheckMongoDBBackupPreconditions( + q, + data.MongoDBBackupTask.Mode, + data.MongoDBBackupTask.ClusterName, + data.MongoDBBackupTask.ServiceID, + scheduledTaskID) + } + } + return nil +} + +func checkUpdatePreconditions(q *reform.Querier, data *models.ScheduledTaskData, enabled bool, scheduledTaskID string) error { switch { case data.MySQLBackupTask != nil: case data.MongoDBBackupTask != nil: diff --git a/managed/services/scheduler/scheduler_test.go b/managed/services/scheduler/scheduler_test.go index ae011f6525..d71eb2ad35 100644 --- a/managed/services/scheduler/scheduler_test.go +++ b/managed/services/scheduler/scheduler_test.go @@ -20,6 +20,7 @@ import ( "testing" "time" + "github.com/AlekSi/pointer" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" @@ -33,30 +34,58 @@ import ( ) func TestService(t *testing.T) { - setup := func(t *testing.T, ctx context.Context) *Service { + setup := func(t *testing.T, ctx context.Context, serviceType models.ServiceType, serviceName string) (*Service, *models.Service, *models.BackupLocation) { t.Helper() sqlDB := testdb.Open(t, models.SkipFixtures, nil) + t.Cleanup(func() { + require.NoError(t, sqlDB.Close()) + }) + db := reform.NewDB(sqlDB, postgresql.Dialect, reform.NewPrintfLogger(t.Logf)) + + node, err := models.CreateNode(db.Querier, models.GenericNodeType, &models.CreateNodeParams{ + NodeName: "test-node-" + t.Name(), + }) + require.NoError(t, err) + + service, err := models.AddNewService(db.Querier, serviceType, &models.AddDBMSServiceParams{ + ServiceName: serviceName, + NodeID: node.NodeID, + Address: pointer.ToString("127.0.0.1"), + Port: pointer.ToUint16(60000), + }) + require.NoError(t, err) + + location, err := models.CreateBackupLocation(db.Querier, models.CreateBackupLocationParams{ + Name: "test_location", + BackupLocationConfig: models.BackupLocationConfig{ + FilesystemConfig: &models.FilesystemLocationConfig{ + Path: "/tmp", + }, + }, + }) + require.NoError(t, err) + backupService := &mockBackupService{} - svc := New(db, backupService) + schedulerSvc := New(db, backupService) - go svc.Run(ctx) - for !svc.scheduler.IsRunning() { + go schedulerSvc.Run(ctx) + for !schedulerSvc.scheduler.IsRunning() { // Wait a while, so scheduler is running time.Sleep(time.Millisecond * 10) } - return svc + return schedulerSvc, service, location } t.Run("invalid cron expression", func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - svc := setup(t, ctx) + scheduler, service, location := setup(t, ctx, models.MongoDBServiceType, "mongo_service") task, err := NewMongoDBBackupTask(&BackupTaskParams{ - ServiceID: "/service/test", - LocationID: "/location/test", + ServiceID: service.ServiceID, + LocationID: location.ID, Name: "test", Description: "test backup task", DataModel: models.LogicalDataModel, @@ -69,7 +98,7 @@ func TestService(t *testing.T) { cronExpr := "invalid * cron * expression" startAt := time.Now().Truncate(time.Second).UTC() - _, err = svc.Add(task, AddParams{ + _, err = scheduler.Add(task, AddParams{ CronExpression: cronExpr, StartAt: startAt, }) @@ -79,11 +108,11 @@ func TestService(t *testing.T) { t.Run("normal", func(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() - svc := setup(t, ctx) + scheduler, service, location := setup(t, ctx, models.MongoDBServiceType, "mongo_service") task, err := NewMongoDBBackupTask(&BackupTaskParams{ - ServiceID: "/service/test", - LocationID: "/location/test", + ServiceID: service.ServiceID, + LocationID: location.ID, Name: "test", Description: "test backup task", DataModel: models.LogicalDataModel, @@ -96,25 +125,25 @@ func TestService(t *testing.T) { cronExpr := "* * * * *" startAt := time.Now().Truncate(time.Second).UTC() - dbTask, err := svc.Add(task, AddParams{ + dbTask, err := scheduler.Add(task, AddParams{ CronExpression: cronExpr, StartAt: startAt, }) require.NoError(t, err) - assert.Len(t, svc.scheduler.Jobs(), 1) + assert.Len(t, scheduler.scheduler.Jobs(), 1) - findJob, err := models.FindScheduledTaskByID(svc.db.Querier, dbTask.ID) + findJob, err := models.FindScheduledTaskByID(scheduler.db.Querier, dbTask.ID) require.NoError(t, err) assert.Equal(t, startAt, dbTask.StartAt) assert.Equal(t, cronExpr, findJob.CronExpression) assert.Truef(t, dbTask.NextRun.After(startAt), "next run %s is before startAt %s", dbTask.NextRun, startAt) - err = svc.Remove(dbTask.ID) + err = scheduler.Remove(dbTask.ID) require.NoError(t, err) - assert.Len(t, svc.scheduler.Jobs(), 0) + assert.Len(t, scheduler.scheduler.Jobs(), 0) - _, err = models.FindScheduledTaskByID(svc.db.Querier, dbTask.ID) + _, err = models.FindScheduledTaskByID(scheduler.db.Querier, dbTask.ID) assert.ErrorIs(t, err, models.ErrNotFound) }) } diff --git a/managed/services/scheduler/task.go b/managed/services/scheduler/task.go index b0df978bdb..c277623822 100644 --- a/managed/services/scheduler/task.go +++ b/managed/services/scheduler/task.go @@ -84,7 +84,7 @@ type mySQLBackupTask struct { } // NewMySQLBackupTask create new task for mysql backup. -func NewMySQLBackupTask(params *BackupTaskParams) (Task, error) { +func NewMySQLBackupTask(params *BackupTaskParams) (Task, error) { //nolint:ireturn if err := params.Validate(); err != nil { return nil, err } @@ -147,7 +147,7 @@ type mongoDBBackupTask struct { } // NewMongoDBBackupTask create new task for mongo backup. -func NewMongoDBBackupTask(params *BackupTaskParams) (Task, error) { +func NewMongoDBBackupTask(params *BackupTaskParams) (Task, error) { //nolint:ireturn if err := params.Validate(); err != nil { return nil, err } diff --git a/managed/services/server/deps.go b/managed/services/server/deps.go index 9563fa27a2..3eef78b54a 100644 --- a/managed/services/server/deps.go +++ b/managed/services/server/deps.go @@ -24,17 +24,17 @@ import ( "github.com/percona/pmm/version" ) -//go:generate ../../../bin/mockery -name=grafanaClient -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=prometheusService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=alertmanagerService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=checksService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=vmAlertExternalRules -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=supervisordService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=telemetryService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=agentsStateUpdater -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=rulesService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=emailer -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=templatesService -case=snake -inpkg -testonly +//go:generate ../../../bin/mockery --name=grafanaClient --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=prometheusService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=alertmanagerService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=checksService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=vmAlertExternalRules --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=supervisordService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=telemetryService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=agentsStateUpdater --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=rulesService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=emailer --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=templatesService --case=snake --inpackage --testonly // healthChecker interface wraps all services that implements the IsReady method to report the // service health for the Readiness check. diff --git a/managed/services/server/mock_agents_state_updater_test.go b/managed/services/server/mock_agents_state_updater_test.go index 73b82fe412..2d25014bc3 100644 --- a/managed/services/server/mock_agents_state_updater_test.go +++ b/managed/services/server/mock_agents_state_updater_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package server @@ -26,3 +26,18 @@ func (_m *mockAgentsStateUpdater) UpdateAgentsState(ctx context.Context) error { return r0 } + +// newMockAgentsStateUpdater creates a new instance of mockAgentsStateUpdater. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAgentsStateUpdater(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAgentsStateUpdater { + mock := &mockAgentsStateUpdater{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/server/mock_alertmanager_service_test.go b/managed/services/server/mock_alertmanager_service_test.go index a8a63ba398..1d301e6aa4 100644 --- a/managed/services/server/mock_alertmanager_service_test.go +++ b/managed/services/server/mock_alertmanager_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package server @@ -31,3 +31,18 @@ func (_m *mockAlertmanagerService) IsReady(ctx context.Context) error { func (_m *mockAlertmanagerService) RequestConfigurationUpdate() { _m.Called() } + +// newMockAlertmanagerService creates a new instance of mockAlertmanagerService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAlertmanagerService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAlertmanagerService { + mock := &mockAlertmanagerService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/server/mock_checks_service_test.go b/managed/services/server/mock_checks_service_test.go index 8a564c7937..7e1158ee91 100644 --- a/managed/services/server/mock_checks_service_test.go +++ b/managed/services/server/mock_checks_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package server @@ -42,3 +42,18 @@ func (_m *mockChecksService) StartChecks(checkNames []string) error { func (_m *mockChecksService) UpdateIntervals(rare time.Duration, standard time.Duration, frequent time.Duration) { _m.Called(rare, standard, frequent) } + +// newMockChecksService creates a new instance of mockChecksService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockChecksService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockChecksService { + mock := &mockChecksService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/server/mock_emailer_test.go b/managed/services/server/mock_emailer_test.go index bf1475efd3..f06088f808 100644 --- a/managed/services/server/mock_emailer_test.go +++ b/managed/services/server/mock_emailer_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package server @@ -28,3 +28,18 @@ func (_m *mockEmailer) Send(ctx context.Context, settings *models.EmailAlertingS return r0 } + +// newMockEmailer creates a new instance of mockEmailer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockEmailer(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockEmailer { + mock := &mockEmailer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/server/mock_grafana_client_test.go b/managed/services/server/mock_grafana_client_test.go index 726d0ecf79..6eb7251b8a 100644 --- a/managed/services/server/mock_grafana_client_test.go +++ b/managed/services/server/mock_grafana_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package server @@ -26,3 +26,18 @@ func (_m *mockGrafanaClient) IsReady(ctx context.Context) error { return r0 } + +// newMockGrafanaClient creates a new instance of mockGrafanaClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockGrafanaClient(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockGrafanaClient { + mock := &mockGrafanaClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/server/mock_prometheus_service_test.go b/managed/services/server/mock_prometheus_service_test.go index 99e42ce4c6..b26b0212f9 100644 --- a/managed/services/server/mock_prometheus_service_test.go +++ b/managed/services/server/mock_prometheus_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package server @@ -31,3 +31,18 @@ func (_m *mockPrometheusService) IsReady(ctx context.Context) error { func (_m *mockPrometheusService) RequestConfigurationUpdate() { _m.Called() } + +// newMockPrometheusService creates a new instance of mockPrometheusService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockPrometheusService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockPrometheusService { + mock := &mockPrometheusService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/server/mock_rules_service_test.go b/managed/services/server/mock_rules_service_test.go index 81c9348dd8..f8cf6b3540 100644 --- a/managed/services/server/mock_rules_service_test.go +++ b/managed/services/server/mock_rules_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package server @@ -27,3 +27,18 @@ func (_m *mockRulesService) RemoveVMAlertRulesFiles() error { func (_m *mockRulesService) WriteVMAlertRulesFiles() { _m.Called() } + +// newMockRulesService creates a new instance of mockRulesService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockRulesService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockRulesService { + mock := &mockRulesService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/server/mock_supervisord_service_test.go b/managed/services/server/mock_supervisord_service_test.go index a8a4e25d98..f8f378255b 100644 --- a/managed/services/server/mock_supervisord_service_test.go +++ b/managed/services/server/mock_supervisord_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package server @@ -52,6 +52,10 @@ func (_m *mockSupervisordService) LastCheckUpdatesResult(ctx context.Context) (* ret := _m.Called(ctx) var r0 *version.UpdateCheckResult + var r1 time.Time + if rf, ok := ret.Get(0).(func(context.Context) (*version.UpdateCheckResult, time.Time)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) *version.UpdateCheckResult); ok { r0 = rf(ctx) } else { @@ -60,7 +64,6 @@ func (_m *mockSupervisordService) LastCheckUpdatesResult(ctx context.Context) (* } } - var r1 time.Time if rf, ok := ret.Get(1).(func(context.Context) time.Time); ok { r1 = rf(ctx) } else { @@ -75,13 +78,16 @@ func (_m *mockSupervisordService) StartUpdate() (uint32, error) { ret := _m.Called() var r0 uint32 + var r1 error + if rf, ok := ret.Get(0).(func() (uint32, error)); ok { + return rf() + } if rf, ok := ret.Get(0).(func() uint32); ok { r0 = rf() } else { r0 = ret.Get(0).(uint32) } - var r1 error if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { @@ -110,6 +116,11 @@ func (_m *mockSupervisordService) UpdateLog(offset uint32) ([]string, uint32, er ret := _m.Called(offset) var r0 []string + var r1 uint32 + var r2 error + if rf, ok := ret.Get(0).(func(uint32) ([]string, uint32, error)); ok { + return rf(offset) + } if rf, ok := ret.Get(0).(func(uint32) []string); ok { r0 = rf(offset) } else { @@ -118,14 +129,12 @@ func (_m *mockSupervisordService) UpdateLog(offset uint32) ([]string, uint32, er } } - var r1 uint32 if rf, ok := ret.Get(1).(func(uint32) uint32); ok { r1 = rf(offset) } else { r1 = ret.Get(1).(uint32) } - var r2 error if rf, ok := ret.Get(2).(func(uint32) error); ok { r2 = rf(offset) } else { @@ -148,3 +157,18 @@ func (_m *mockSupervisordService) UpdateRunning() bool { return r0 } + +// newMockSupervisordService creates a new instance of mockSupervisordService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockSupervisordService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockSupervisordService { + mock := &mockSupervisordService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/server/mock_telemetry_service_test.go b/managed/services/server/mock_telemetry_service_test.go index f1f2ea6095..5c10352822 100644 --- a/managed/services/server/mock_telemetry_service_test.go +++ b/managed/services/server/mock_telemetry_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package server @@ -42,3 +42,18 @@ func (_m *mockTelemetryService) GetSummaries() []string { return r0 } + +// newMockTelemetryService creates a new instance of mockTelemetryService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockTelemetryService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockTelemetryService { + mock := &mockTelemetryService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/server/mock_templates_service_test.go b/managed/services/server/mock_templates_service_test.go index 88a69361d2..28d52f5efb 100644 --- a/managed/services/server/mock_templates_service_test.go +++ b/managed/services/server/mock_templates_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package server @@ -17,3 +17,18 @@ type mockTemplatesService struct { func (_m *mockTemplatesService) CollectTemplates(ctx context.Context) { _m.Called(ctx) } + +// newMockTemplatesService creates a new instance of mockTemplatesService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockTemplatesService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockTemplatesService { + mock := &mockTemplatesService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/server/mock_vm_alert_external_rules_test.go b/managed/services/server/mock_vm_alert_external_rules_test.go index 0d9bd80ed8..d4407feb5c 100644 --- a/managed/services/server/mock_vm_alert_external_rules_test.go +++ b/managed/services/server/mock_vm_alert_external_rules_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package server @@ -18,13 +18,16 @@ func (_m *mockVmAlertExternalRules) ReadRules() (string, error) { ret := _m.Called() var r0 string + var r1 error + if rf, ok := ret.Get(0).(func() (string, error)); ok { + return rf() + } if rf, ok := ret.Get(0).(func() string); ok { r0 = rf() } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { @@ -75,3 +78,18 @@ func (_m *mockVmAlertExternalRules) WriteRules(rules string) error { return r0 } + +// newMockVmAlertExternalRules creates a new instance of mockVmAlertExternalRules. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockVmAlertExternalRules(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockVmAlertExternalRules { + mock := &mockVmAlertExternalRules{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/server/server.go b/managed/services/server/server.go index 36db793abf..258fb7647f 100644 --- a/managed/services/server/server.go +++ b/managed/services/server/server.go @@ -571,7 +571,7 @@ func (s *Server) validateChangeSettingsRequest(ctx context.Context, req *serverp } // ChangeSettings changes PMM Server settings. -func (s *Server) ChangeSettings(ctx context.Context, req *serverpb.ChangeSettingsRequest) (*serverpb.ChangeSettingsResponse, error) { //nolint:cyclop +func (s *Server) ChangeSettings(ctx context.Context, req *serverpb.ChangeSettingsRequest) (*serverpb.ChangeSettingsResponse, error) { //nolint:cyclop,maintidx s.envRW.RLock() defer s.envRW.RUnlock() diff --git a/managed/services/server/server_test.go b/managed/services/server/server_test.go index 382a99f35e..004df80387 100644 --- a/managed/services/server/server_test.go +++ b/managed/services/server/server_test.go @@ -286,7 +286,7 @@ func TestServer(t *testing.T) { }) } -func TestServer_TestEmailAlertingSettings(t *testing.T) { +func TestServer_TestEmailAlertingSettings(t *testing.T) { //nolint:tparallel t.Parallel() var server Server diff --git a/managed/services/supervisord/logs.go b/managed/services/supervisord/logs.go index a9f8d628ca..f347b3b986 100644 --- a/managed/services/supervisord/logs.go +++ b/managed/services/supervisord/logs.go @@ -62,7 +62,7 @@ type Logs struct { } // NewLogs creates a new Logs service. -// n is a number of last lines of log to read. +// The number of last log lines to read is n. func NewLogs(pmmVersion string, pmmUpdateChecker *PMMUpdateChecker) *Logs { return &Logs{ pmmVersion: pmmVersion, @@ -302,13 +302,24 @@ func readLog(name string, maxLines int, maxBytes int64) ([]byte, time.Time, erro } r := ring.New(maxLines) - s := bufio.NewScanner(f) - for s.Scan() { - r.Value = []byte(s.Text() + "\n") + reader := bufio.NewReader(f) + for { + b, err := reader.ReadBytes('\n') + if err == io.EOF { + // A special case when the last line does not end with a new line + if len(b) != 0 { + r.Value = b + r = r.Next() + } + break + } + + r.Value = b r = r.Next() - } - if err = s.Err(); err != nil { - return nil, m, errors.WithStack(err) + + if err != nil { + return nil, m, errors.WithStack(err) + } } res := make([]byte, 0, maxBytes) diff --git a/managed/services/supervisord/logs_test.go b/managed/services/supervisord/logs_test.go index 265e17c112..6b08395487 100644 --- a/managed/services/supervisord/logs_test.go +++ b/managed/services/supervisord/logs_test.go @@ -55,7 +55,6 @@ var commonExpectedFiles = []string{ "postgresql14.log", "qan-api2.ini", "qan-api2.log", - "supervisorctl_status.log", "supervisord.conf", "supervisord.log", "victoriametrics-promscrape.yml", @@ -70,11 +69,19 @@ var commonExpectedFiles = []string{ func TestReadLog(t *testing.T) { f, err := os.CreateTemp("", "pmm-managed-supervisord-tests-") require.NoError(t, err) + fNoNewLineEnding, err := os.CreateTemp("", "pmm-managed-supervisord-tests-") + require.NoError(t, err) + for i := 0; i < 10; i++ { - fmt.Fprintf(f, "line #%03d\n", i) // 10 bytes + fmt.Fprintf(f, "line #%03d\n", i) // 10 bytes + fmt.Fprintf(fNoNewLineEnding, "line #%03d\n", i) // 10 bytes } + fmt.Fprintf(fNoNewLineEnding, "some string without new line") require.NoError(t, f.Close()) - defer os.Remove(f.Name()) //nolint:errcheck + require.NoError(t, fNoNewLineEnding.Close()) + + defer os.Remove(f.Name()) //nolint:errcheck + defer os.Remove(fNoNewLineEnding.Name()) //nolint:errcheck t.Run("LimitByLines", func(t *testing.T) { b, m, err := readLog(f.Name(), 5, 500) @@ -85,6 +92,15 @@ func TestReadLog(t *testing.T) { assert.Equal(t, expected, actual) }) + t.Run("LimitByLines - no new line ending", func(t *testing.T) { + b, m, err := readLog(fNoNewLineEnding.Name(), 5, 500) + require.NoError(t, err) + assert.WithinDuration(t, time.Now(), m, 5*time.Second) + expected := []string{"line #006", "line #007", "line #008", "line #009", "some string without new line"} + actual := strings.Split(strings.TrimSpace(string(b)), "\n") + assert.Equal(t, expected, actual) + }) + t.Run("LimitByBytes", func(t *testing.T) { b, m, err := readLog(f.Name(), 500, 5) require.NoError(t, err) @@ -93,6 +109,15 @@ func TestReadLog(t *testing.T) { actual := strings.Split(strings.TrimSpace(string(b)), "\n") assert.Equal(t, expected, actual) }) + + t.Run("LimitByBytes - no new line ending", func(t *testing.T) { + b, m, err := readLog(fNoNewLineEnding.Name(), 500, 5) + require.NoError(t, err) + assert.WithinDuration(t, time.Now(), m, 5*time.Second) + expected := []string{"line"} + actual := strings.Split(strings.TrimSpace(string(b)), "\n") + assert.Equal(t, expected, actual) + }) } func TestAddAdminSummary(t *testing.T) { @@ -147,6 +172,11 @@ func TestFiles(t *testing.T) { continue } + if f.Name == "supervisorctl_status.log" { + // FIXME: this fails following the transition to EL9 + continue + } + assert.NoError(t, f.Err, "name = %q", f.Name) actual = append(actual, f.Name) @@ -183,7 +213,7 @@ func TestZip(t *testing.T) { additionalFiles = append(additionalFiles, "dbaas-controller.log") } // zip file includes client files - expected := append(commonExpectedFiles, additionalFiles...) + expected := append(commonExpectedFiles, additionalFiles...) //nolint:gocritic actual := make([]string, 0, len(r.File)) for _, f := range r.File { diff --git a/managed/services/supervisord/maintail_test.go b/managed/services/supervisord/maintail_test.go index 3b9d3e7375..94603da72d 100644 --- a/managed/services/supervisord/maintail_test.go +++ b/managed/services/supervisord/maintail_test.go @@ -24,6 +24,7 @@ import ( ) func TestParseEvent(t *testing.T) { + t.Parallel() t.Run("Normal", func(t *testing.T) { t.Parallel() diff --git a/managed/services/supervisord/pmm_config.go b/managed/services/supervisord/pmm_config.go index b971a80796..602b9a5546 100644 --- a/managed/services/supervisord/pmm_config.go +++ b/managed/services/supervisord/pmm_config.go @@ -56,7 +56,7 @@ func saveConfig(path string, cfg []byte) (err error) { } // compare with new config - if bytes.Compare(cfg, oldCfg) == 0 { + if bytes.Equal(cfg, oldCfg) { // nothing to change return nil } diff --git a/managed/services/supervisord/pprof_config.go b/managed/services/supervisord/pprof_config.go index ce41cfc64f..f4cc63ed62 100644 --- a/managed/services/supervisord/pprof_config.go +++ b/managed/services/supervisord/pprof_config.go @@ -1,4 +1,3 @@ -// pmm-managed // Copyright (C) 2017 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/managed/services/supervisord/supervisord_test.go b/managed/services/supervisord/supervisord_test.go index 963187c71c..ed6e515ff5 100644 --- a/managed/services/supervisord/supervisord_test.go +++ b/managed/services/supervisord/supervisord_test.go @@ -52,6 +52,7 @@ func TestConfig(t *testing.T) { tmpl := tmpl t.Run(tmpl.Name(), func(t *testing.T) { + t.Parallel() expected, err := os.ReadFile(filepath.Join(configDir, tmpl.Name()+".ini")) //nolint:gosec require.NoError(t, err) actual, err := s.marshalConfig(tmpl, settings, nil) @@ -125,6 +126,7 @@ func TestAddAlertManagerParam(t *testing.T) { t.Parallel() t.Run("empty alertmanager url", func(t *testing.T) { + t.Parallel() params := make(map[string]interface{}) err := addAlertManagerParams("", params) require.NoError(t, err) @@ -132,6 +134,7 @@ func TestAddAlertManagerParam(t *testing.T) { }) t.Run("simple alertmanager url", func(t *testing.T) { + t.Parallel() params := make(map[string]interface{}) err := addAlertManagerParams("https://some-alertmanager", params) require.NoError(t, err) @@ -139,6 +142,7 @@ func TestAddAlertManagerParam(t *testing.T) { }) t.Run("extract username and password from alertmanager url", func(t *testing.T) { + t.Parallel() params := make(map[string]interface{}) err := addAlertManagerParams("https://username1:PAsds!234@some-alertmanager", params) require.NoError(t, err) @@ -148,6 +152,7 @@ func TestAddAlertManagerParam(t *testing.T) { }) t.Run("incorrect alertmanager url", func(t *testing.T) { + t.Parallel() params := make(map[string]interface{}) err := addAlertManagerParams("*:9095", params) require.EqualError(t, err, `cannot parse AlertManagerURL: parse "*:9095": first path segment in URL cannot contain colon`) @@ -175,7 +180,9 @@ func TestSavePMMConfig(t *testing.T) { }, } for _, test := range tests { + test := test t.Run(test.description, func(t *testing.T) { + t.Parallel() expected, err := os.ReadFile(filepath.Join(configDir, test.file+".ini")) //nolint:gosec require.NoError(t, err) actual, err := marshalConfig(test.params) diff --git a/managed/services/telemetry/config.default.yml b/managed/services/telemetry/config.default.yml index 4d63fc7da4..74924104e0 100644 --- a/managed/services/telemetry/config.default.yml +++ b/managed/services/telemetry/config.default.yml @@ -65,6 +65,14 @@ telemetry: - metric_name: "pmm_server_dbaas_enabled" column: "dbaas_enabled" + - id: PMMServerAccessControlEnabled + source: PMMDB_SELECT + query: (CASE WHEN access_control->'enabled' = 'true' THEN '1' ELSE '0' END) AS access_control_enabled FROM settings s, jsonb_extract_path(s.settings, 'access_control') AS access_control + summary: "PMM Server Access Control feature enabled/disabled" + data: + - metric_name: "pmm_server_access_control_enabled" + column: "access_control_enabled" + - id: PMMServerUpdatesDisabled source: PMMDB_SELECT query: (CASE WHEN updates->'disabled' = 'true' THEN '1' ELSE '0' END) AS updates_disabled FROM settings s, jsonb_extract_path(s.settings, 'updates') AS updates @@ -409,6 +417,14 @@ telemetry: - metric_name: "pmm_server_usage_environments_count" column: "environments_count" + - id: PMMUsagePerconaRolesCount + source: PMMDB_SELECT + query: count(*) as roles_count from roles + summary: "Percona roles count" + data: + - metric_name: "pmm_server_percona_roles_count" + column: "roles_count" + - id: PMMUsageClustersCount source: PMMDB_SELECT query: count(distinct cluster) as clusters_count from services where cluster != ''; @@ -912,3 +928,11 @@ telemetry: - id: UIEvents summary: "UI Events" extension: UIEventsExtension + + - id: PostgresDBCount + source: VM + query: count by (service_id) (pg_stat_database_tup_fetched{service_name!="pmm-server-postgresql", datname!~"template.*|postgres", datid!="0"}) + summary: "Number of databases monitored per PostgreSQL server" + data: + - metric_name: "postgresql_db_count" + value: 1 diff --git a/managed/services/telemetry/datasource_grafana_sqlitedb.go b/managed/services/telemetry/datasource_grafana_sqlitedb.go index 7939813006..dfa6606a3b 100644 --- a/managed/services/telemetry/datasource_grafana_sqlitedb.go +++ b/managed/services/telemetry/datasource_grafana_sqlitedb.go @@ -47,7 +47,7 @@ func (d *dsGrafanaSelect) Enabled() bool { } // NewDataSourceGrafanaSqliteDB makes new data source for grafana sqlite database metrics. -func NewDataSourceGrafanaSqliteDB(config DSGrafanaSqliteDB, l *logrus.Entry) DataSource { +func NewDataSourceGrafanaSqliteDB(config DSGrafanaSqliteDB, l *logrus.Entry) DataSource { //nolint:ireturn return &dsGrafanaSelect{ l: l, config: config, diff --git a/managed/services/telemetry/datasources.go b/managed/services/telemetry/datasources.go index d3c4ec92ac..79276d8aac 100644 --- a/managed/services/telemetry/datasources.go +++ b/managed/services/telemetry/datasources.go @@ -36,7 +36,7 @@ type dataSourceRegistry struct { } // NewDataSourceRegistry makes new data source registry -func NewDataSourceRegistry(config ServiceConfig, l *logrus.Entry) (DataSourceLocator, error) { +func NewDataSourceRegistry(config ServiceConfig, l *logrus.Entry) (DataSourceLocator, error) { //nolint:ireturn pmmDB, err := NewDsPmmDBSelect(*config.DataSources.PmmDBSelect, l) if err != nil { return nil, err diff --git a/managed/services/telemetry/deps.go b/managed/services/telemetry/deps.go index 9e346046a2..148bd529a7 100644 --- a/managed/services/telemetry/deps.go +++ b/managed/services/telemetry/deps.go @@ -1,4 +1,3 @@ -// pmm-managed // Copyright (C) 2017 Percona LLC // // This program is free software: you can redistribute it and/or modify @@ -25,10 +24,10 @@ import ( "github.com/percona/pmm/api/serverpb" ) -//go:generate ../../../bin/mockery -name=distributionUtilService -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=sender -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=DataSourceLocator -case=snake -inpkg -testonly -//go:generate ../../../bin/mockery -name=DataSource -case=snake -inpkg -testonly +//go:generate ../../../bin/mockery --name=distributionUtilService --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=sender --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=DataSourceLocator --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=DataSource --case=snake --inpackage --testonly // distributionUtilService service to get info about OS on which pmm server is running type distributionUtilService interface { diff --git a/managed/services/telemetry/distribution_util.go b/managed/services/telemetry/distribution_util.go index 7ca1ca6b29..28213dfd3b 100644 --- a/managed/services/telemetry/distribution_util.go +++ b/managed/services/telemetry/distribution_util.go @@ -1,4 +1,3 @@ -// pmm-managed // Copyright (C) 2017 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/managed/services/telemetry/distribution_util_test.go b/managed/services/telemetry/distribution_util_test.go index cfed5ce801..59c62bb5c9 100644 --- a/managed/services/telemetry/distribution_util_test.go +++ b/managed/services/telemetry/distribution_util_test.go @@ -1,4 +1,3 @@ -// pmm-managed // Copyright (C) 2017 Percona LLC // // This program is free software: you can redistribute it and/or modify @@ -28,6 +27,7 @@ import ( ) func Test_distributionUtilServiceImpl_getDistributionMethodAndOS(t *testing.T) { + t.Parallel() const ( ami = "ami" ovf = "ovf" @@ -160,6 +160,7 @@ func writeToTmpFile(t *testing.T, tmpDistributionFile string, s string) (*os.Fil } func Test_distributionUtilServiceImpl_getLinuxDistribution(t *testing.T) { + t.Parallel() const ( tmpDistributionFile = "/tmp/distribution" tmpOsInfoFilePath = "/tmp/version" diff --git a/managed/services/telemetry/mock_data_source_locator_test.go b/managed/services/telemetry/mock_data_source_locator_test.go index a81dd2bd32..f3af331bac 100644 --- a/managed/services/telemetry/mock_data_source_locator_test.go +++ b/managed/services/telemetry/mock_data_source_locator_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package telemetry @@ -14,6 +14,10 @@ func (_m *MockDataSourceLocator) LocateTelemetryDataSource(name string) (DataSou ret := _m.Called(name) var r0 DataSource + var r1 error + if rf, ok := ret.Get(0).(func(string) (DataSource, error)); ok { + return rf(name) + } if rf, ok := ret.Get(0).(func(string) DataSource); ok { r0 = rf(name) } else { @@ -22,7 +26,6 @@ func (_m *MockDataSourceLocator) LocateTelemetryDataSource(name string) (DataSou } } - var r1 error if rf, ok := ret.Get(1).(func(string) error); ok { r1 = rf(name) } else { @@ -31,3 +34,18 @@ func (_m *MockDataSourceLocator) LocateTelemetryDataSource(name string) (DataSou return r0, r1 } + +// NewMockDataSourceLocator creates a new instance of MockDataSourceLocator. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockDataSourceLocator(t interface { + mock.TestingT + Cleanup(func()) +}, +) *MockDataSourceLocator { + mock := &MockDataSourceLocator{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/telemetry/mock_data_source_test.go b/managed/services/telemetry/mock_data_source_test.go index b3ca7ee94f..de113e6555 100644 --- a/managed/services/telemetry/mock_data_source_test.go +++ b/managed/services/telemetry/mock_data_source_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package telemetry @@ -47,6 +47,10 @@ func (_m *MockDataSource) FetchMetrics(ctx context.Context, config Config) ([]*p ret := _m.Called(ctx, config) var r0 []*pmmv1.ServerMetric_Metric + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, Config) ([]*pmmv1.ServerMetric_Metric, error)); ok { + return rf(ctx, config) + } if rf, ok := ret.Get(0).(func(context.Context, Config) []*pmmv1.ServerMetric_Metric); ok { r0 = rf(ctx, config) } else { @@ -55,7 +59,6 @@ func (_m *MockDataSource) FetchMetrics(ctx context.Context, config Config) ([]*p } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, Config) error); ok { r1 = rf(ctx, config) } else { @@ -78,3 +81,18 @@ func (_m *MockDataSource) Init(ctx context.Context) error { return r0 } + +// NewMockDataSource creates a new instance of MockDataSource. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockDataSource(t interface { + mock.TestingT + Cleanup(func()) +}, +) *MockDataSource { + mock := &MockDataSource{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/telemetry/mock_distribution_util_service_test.go b/managed/services/telemetry/mock_distribution_util_service_test.go index 8246512c39..1460cec05b 100644 --- a/managed/services/telemetry/mock_distribution_util_service_test.go +++ b/managed/services/telemetry/mock_distribution_util_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package telemetry @@ -19,20 +19,23 @@ func (_m *mockDistributionUtilService) getDistributionMethodAndOS() (serverpb.Di ret := _m.Called() var r0 serverpb.DistributionMethod + var r1 pmmv1.DistributionMethod + var r2 string + if rf, ok := ret.Get(0).(func() (serverpb.DistributionMethod, pmmv1.DistributionMethod, string)); ok { + return rf() + } if rf, ok := ret.Get(0).(func() serverpb.DistributionMethod); ok { r0 = rf() } else { r0 = ret.Get(0).(serverpb.DistributionMethod) } - var r1 pmmv1.DistributionMethod if rf, ok := ret.Get(1).(func() pmmv1.DistributionMethod); ok { r1 = rf() } else { r1 = ret.Get(1).(pmmv1.DistributionMethod) } - var r2 string if rf, ok := ret.Get(2).(func() string); ok { r2 = rf() } else { @@ -41,3 +44,18 @@ func (_m *mockDistributionUtilService) getDistributionMethodAndOS() (serverpb.Di return r0, r1, r2 } + +// newMockDistributionUtilService creates a new instance of mockDistributionUtilService. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockDistributionUtilService(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockDistributionUtilService { + mock := &mockDistributionUtilService{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/telemetry/mock_sender_test.go b/managed/services/telemetry/mock_sender_test.go index 7e32b58cee..66999a6ce5 100644 --- a/managed/services/telemetry/mock_sender_test.go +++ b/managed/services/telemetry/mock_sender_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package telemetry @@ -27,3 +27,18 @@ func (_m *mockSender) SendTelemetry(ctx context.Context, report *reporterv1.Repo return r0 } + +// newMockSender creates a new instance of mockSender. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockSender(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockSender { + mock := &mockSender{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/telemetry/telemetry_test.go b/managed/services/telemetry/telemetry_test.go index a2fd61a9ea..477ff027d4 100644 --- a/managed/services/telemetry/telemetry_test.go +++ b/managed/services/telemetry/telemetry_test.go @@ -1,4 +1,3 @@ -// pmm-managed // Copyright (C) 2017 Percona LLC // // This program is free software: you can redistribute it and/or modify @@ -46,6 +45,7 @@ const ( ) func TestRunTelemetryService(t *testing.T) { + t.Parallel() pgHostPort := "127.0.0.1:5432" pgHostPortFromEnv, ok := os.LookupEnv(envPGHostPort) if ok { diff --git a/managed/services/telemetry/uievents/uievents.go b/managed/services/telemetry/uievents/uievents.go index 795965f7b4..e66be330ba 100644 --- a/managed/services/telemetry/uievents/uievents.go +++ b/managed/services/telemetry/uievents/uievents.go @@ -254,7 +254,7 @@ func (s *Service) Store(_ context.Context, request *uievents.StoreRequest) (*uie } s.dashboardUsage[event.Uid] = stat } - stat.useCount = stat.useCount + 1 + stat.useCount++ err := stat.loadTime.RecordValue(int64(event.LoadTime)) if err != nil { s.l.Error("failed to record value", err) @@ -270,7 +270,7 @@ func (s *Service) Store(_ context.Context, request *uievents.StoreRequest) (*uie } s.componentsUsage[event.Component] = stat } - stat.useCount = stat.useCount + 1 + stat.useCount++ err := stat.loadTime.RecordValue(int64(event.LoadTime)) if err != nil { s.l.Error("failed to record value", err) diff --git a/managed/services/utils.go b/managed/services/utils.go deleted file mode 100644 index c67ba0518f..0000000000 --- a/managed/services/utils.go +++ /dev/null @@ -1,75 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -package services - -import ( - "github.com/percona-platform/saas/pkg/check" - "github.com/sirupsen/logrus" -) - -// GroupChecksByDB splits provided checks by database and returns three -// slices: for MySQL, for PostgreSQL and for MongoDB. -func GroupChecksByDB( - l *logrus.Entry, - checks map[string]check.Check, -) (map[string]check.Check, map[string]check.Check, map[string]check.Check) { - mySQLChecks := make(map[string]check.Check) - postgreSQLChecks := make(map[string]check.Check) - mongoDBChecks := make(map[string]check.Check) - for _, c := range checks { - switch c.Version { - case 1: - switch c.Type { - case check.MySQLSelect: - fallthrough - case check.MySQLShow: - mySQLChecks[c.Name] = c - - case check.PostgreSQLSelect: - fallthrough - case check.PostgreSQLShow: - postgreSQLChecks[c.Name] = c - - case check.MongoDBGetParameter: - fallthrough - case check.MongoDBBuildInfo: - fallthrough - case check.MongoDBGetCmdLineOpts: - fallthrough - case check.MongoDBReplSetGetStatus: - fallthrough - case check.MongoDBGetDiagnosticData: - mongoDBChecks[c.Name] = c - - default: - l.Warnf("Unknown check type %s, skip it.", c.Type) - } - case 2: - switch c.Family { - case check.MySQL: - mySQLChecks[c.Name] = c - case check.PostgreSQL: - postgreSQLChecks[c.Name] = c - case check.MongoDB: - mongoDBChecks[c.Name] = c - default: - l.Warnf("Unknown check family %s, skip it.", c.Family) - } - } - } - - return mySQLChecks, postgreSQLChecks, mongoDBChecks -} diff --git a/managed/services/utils_test.go b/managed/services/utils_test.go deleted file mode 100644 index a8d1623784..0000000000 --- a/managed/services/utils_test.go +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (C) 2017 Percona LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -package services - -import ( - "testing" - - "github.com/percona-platform/saas/pkg/check" - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestGroupChecksByDB(t *testing.T) { - t.Parallel() - - checks := map[string]check.Check{ - "MySQLShow": {Name: "MySQLShow", Version: 1, Type: check.MySQLShow}, - "MySQLSelect": {Name: "MySQLSelect", Version: 1, Type: check.MySQLSelect}, - "PostgreSQLShow": {Name: "PostgreSQLShow", Version: 1, Type: check.PostgreSQLShow}, - "PostgreSQLSelect": {Name: "PostgreSQLSelect", Version: 1, Type: check.PostgreSQLSelect}, - "MongoDBGetParameter": {Name: "MongoDBGetParameter", Version: 1, Type: check.MongoDBGetParameter}, - "MongoDBBuildInfo": {Name: "MongoDBBuildInfo", Version: 1, Type: check.MongoDBBuildInfo}, - "MongoDBGetCmdLineOpts": {Name: "MongoDBGetCmdLineOpts", Version: 1, Type: check.MongoDBGetCmdLineOpts}, - "MongoDBReplSetGetStatus": {Name: "MongoDBReplSetGetStatus", Version: 1, Type: check.MongoDBReplSetGetStatus}, - "MongoDBGetDiagnosticData": {Name: "MongoDBGetDiagnosticData", Version: 1, Type: check.MongoDBGetDiagnosticData}, - "unsupported type": {Name: "unsupported type", Version: 1, Type: check.Type("RedisInfo")}, - "missing type": {Name: "missing type", Version: 1}, - "MySQL family V2": {Name: "MySQL family V2", Version: 2, Family: check.MySQL}, - "PostgreSQL family V2": {Name: "PostgreSQL family V2", Version: 2, Family: check.PostgreSQL}, - "MongoDB family V2": {Name: "MongoDB family V2", Version: 2, Family: check.MongoDB}, - "missing family": {Name: "missing family", Version: 2}, - } - - l := logrus.WithField("component", "tests") - mySQLChecks, postgreSQLChecks, mongoDBChecks := GroupChecksByDB(l, checks) - - require.Len(t, mySQLChecks, 3) - require.Len(t, postgreSQLChecks, 3) - require.Len(t, mongoDBChecks, 6) - - // V1 checks - assert.Equal(t, check.MySQLShow, mySQLChecks["MySQLShow"].Type) - assert.Equal(t, check.MySQLSelect, mySQLChecks["MySQLSelect"].Type) - - assert.Equal(t, check.PostgreSQLShow, postgreSQLChecks["PostgreSQLShow"].Type) - assert.Equal(t, check.PostgreSQLSelect, postgreSQLChecks["PostgreSQLSelect"].Type) - - assert.Equal(t, check.MongoDBGetParameter, mongoDBChecks["MongoDBGetParameter"].Type) - assert.Equal(t, check.MongoDBBuildInfo, mongoDBChecks["MongoDBBuildInfo"].Type) - assert.Equal(t, check.MongoDBGetCmdLineOpts, mongoDBChecks["MongoDBGetCmdLineOpts"].Type) - assert.Equal(t, check.MongoDBReplSetGetStatus, mongoDBChecks["MongoDBReplSetGetStatus"].Type) - assert.Equal(t, check.MongoDBGetDiagnosticData, mongoDBChecks["MongoDBGetDiagnosticData"].Type) - - // V2 checks - assert.Equal(t, check.MySQL, mySQLChecks["MySQL family V2"].Family) - assert.Equal(t, check.PostgreSQL, postgreSQLChecks["PostgreSQL family V2"].Family) - assert.Equal(t, check.MongoDB, mongoDBChecks["MongoDB family V2"].Family) -} diff --git a/managed/services/versioncache/mock_versioner_test.go b/managed/services/versioncache/mock_versioner_test.go index 442c06f943..62ace911b7 100644 --- a/managed/services/versioncache/mock_versioner_test.go +++ b/managed/services/versioncache/mock_versioner_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v1.0.0. DO NOT EDIT. +// Code generated by mockery v2.32.0. DO NOT EDIT. package versioncache @@ -18,6 +18,10 @@ func (_m *MockVersioner) GetVersions(pmmAgentID string, softwares []agents.Softw ret := _m.Called(pmmAgentID, softwares) var r0 []agents.Version + var r1 error + if rf, ok := ret.Get(0).(func(string, []agents.Software) ([]agents.Version, error)); ok { + return rf(pmmAgentID, softwares) + } if rf, ok := ret.Get(0).(func(string, []agents.Software) []agents.Version); ok { r0 = rf(pmmAgentID, softwares) } else { @@ -26,7 +30,6 @@ func (_m *MockVersioner) GetVersions(pmmAgentID string, softwares []agents.Softw } } - var r1 error if rf, ok := ret.Get(1).(func(string, []agents.Software) error); ok { r1 = rf(pmmAgentID, softwares) } else { @@ -35,3 +38,18 @@ func (_m *MockVersioner) GetVersions(pmmAgentID string, softwares []agents.Softw return r0, r1 } + +// NewMockVersioner creates a new instance of MockVersioner. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewMockVersioner(t interface { + mock.TestingT + Cleanup(func()) +}, +) *MockVersioner { + mock := &MockVersioner{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/versioncache/versioncache.go b/managed/services/versioncache/versioncache.go index 79c19409e9..aaa4d006b6 100644 --- a/managed/services/versioncache/versioncache.go +++ b/managed/services/versioncache/versioncache.go @@ -36,7 +36,7 @@ var ( minCheckInterval = 5 * time.Second ) -//go:generate ../../../bin/mockery -name=Versioner -case=snake -inpkg -testonly +//go:generate ../../../bin/mockery --name=Versioner --case=snake --inpackage --testonly // Versioner contains method for retrieving versions of different software. type Versioner interface { diff --git a/managed/utils/collectors/collectors.go b/managed/utils/collectors/collectors.go index 6e0fd50c32..f08905b150 100644 --- a/managed/utils/collectors/collectors.go +++ b/managed/utils/collectors/collectors.go @@ -24,8 +24,8 @@ import ( // FilterOutCollectors removes from exporter's flags disabled collectors. // DisableCollector values should match collector flag till end of string or till `=` sign. // Examples: -// 1. if we pass `meminfo` then only "--collector.meminfo" but not "--collector.meminfo_numa" -// 2. if we pass `netstat.field` then "--collector.netstat.fields=^(.*_(InErrors|InErrs|InCsumErrors)..." should be disabled. +// 1. If we pass `meminfo` then only "--collector.meminfo" but not "--collector.meminfo_numa". +// 2. If we pass `netstat.field` then "--collector.netstat.fields=^(.*_(InErrors|InErrs|InCsumErrors)..." should be disabled. // 3. To disable "--collect.custom_query.hr" with directory ""--collect.custom_query.lr.directory" user should pass both names. func FilterOutCollectors(prefix string, args, disabledCollectors []string) []string { disabledCollectorsMap := make(map[string]struct{}) diff --git a/managed/utils/dir/dir.go b/managed/utils/dir/dir.go index cf046a0398..bd5f7ceb59 100644 --- a/managed/utils/dir/dir.go +++ b/managed/utils/dir/dir.go @@ -45,8 +45,8 @@ func CreateDataDir(path, username, groupname string, perm os.FileMode) error { return storedErr } -// FindFilesWithExtensions read path directory and returns all files satisfying provided extensions. -// file name is joined with provided path. +// FindFilesWithExtensions reads path directory and returns all files satisfying provided extensions. +// File name is joined with provided path. func FindFilesWithExtensions(path string, extensions ...string) ([]string, error) { var paths []string match := func(ext string) bool { diff --git a/managed/utils/envvars/parser.go b/managed/utils/envvars/parser.go index b473d546fa..4bd4fc67f2 100644 --- a/managed/utils/envvars/parser.go +++ b/managed/utils/envvars/parser.go @@ -84,7 +84,7 @@ func ParseEnvVars(envs []string) (envSettings *models.ChangeSettingsParams, errs var err error switch k { - case "_", "HOME", "HOSTNAME", "LANG", "PATH", "PWD", "SHLVL", "TERM": + case "_", "HOME", "HOSTNAME", "LANG", "PATH", "PWD", "SHLVL", "TERM", "LC_ALL": // skip default environment variables continue case "PMM_DEBUG", "PMM_TRACE": diff --git a/managed/utils/envvars/parser_test.go b/managed/utils/envvars/parser_test.go index 4416b054ca..6bb5d91a83 100644 --- a/managed/utils/envvars/parser_test.go +++ b/managed/utils/envvars/parser_test.go @@ -82,6 +82,7 @@ func TestEnvVarValidator(t *testing.T) { "HOSTNAME=host", "TERM=xterm-256color", "HOME=/home/user/", + "LC_ALL=en_US.utf8", } expectedEnvVars := &models.ChangeSettingsParams{} diff --git a/managed/utils/irt/metrics.go b/managed/utils/irt/metrics.go index 843a648449..19c9876ee0 100644 --- a/managed/utils/irt/metrics.go +++ b/managed/utils/irt/metrics.go @@ -24,7 +24,7 @@ import ( ) // WithMetrics returns http.RoundTripper instrumented with returned Prometheus metrics. -func WithMetrics(t http.RoundTripper, subsystem string) (http.RoundTripper, prom.Collector) { +func WithMetrics(t http.RoundTripper, subsystem string) (http.RoundTripper, prom.Collector) { //nolint:ireturn m := &metrics{ inflight: prom.NewGauge(prom.GaugeOpts{ Namespace: "promhttp", diff --git a/managed/utils/pprof/pprof.go b/managed/utils/pprof/pprof.go index 6ee6a92274..007a8b39f3 100644 --- a/managed/utils/pprof/pprof.go +++ b/managed/utils/pprof/pprof.go @@ -1,4 +1,3 @@ -// pmm-managed // Copyright (C) 2017 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/managed/utils/pprof/pprof_test.go b/managed/utils/pprof/pprof_test.go index 627780d8fc..f80204a99a 100644 --- a/managed/utils/pprof/pprof_test.go +++ b/managed/utils/pprof/pprof_test.go @@ -1,4 +1,3 @@ -// pmm-managed // Copyright (C) 2017 Percona LLC // // This program is free software: you can redistribute it and/or modify @@ -29,6 +28,7 @@ import ( func TestHeap(t *testing.T) { t.Parallel() t.Run("Heap test", func(t *testing.T) { + t.Parallel() heapBytes, err := Heap(true) assert.NoError(t, err) @@ -65,6 +65,7 @@ func TestProfile(t *testing.T) { }) t.Run("Profile break test", func(t *testing.T) { + t.Parallel() ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) go func() { profileBytes, err := Profile(ctx, 30*time.Second) @@ -91,6 +92,7 @@ func TestTrace(t *testing.T) { }) t.Run("Trace break test", func(t *testing.T) { + t.Parallel() // Create a new context ctx, cancel := context.WithTimeout(context.Background(), time.Second*30) go func() { diff --git a/qan-api2/.github/CONTRIBUTING.md b/qan-api2/.github/CONTRIBUTING.md index 779401e91a..ace5bd5a52 100644 --- a/qan-api2/.github/CONTRIBUTING.md +++ b/qan-api2/.github/CONTRIBUTING.md @@ -12,7 +12,7 @@ Run `make run` to start qan-api2 ## Run as part of pmm-server docker container Start PMM-server docker container as it mentioned in [pmm](https://github.com/percona/pmm) repository -Run `PMM_CONTAINER=pmm-managed-server make release deploy` to deploy local qan-api2 into pmm-server container +Run `PMM_CONTAINER=pmm-server make release deploy` to deploy local qan-api2 into pmm-server container where PMM_CONTAINER is a name of PMM-Server container. ## Testing diff --git a/qan-api2/Makefile b/qan-api2/Makefile index 90cac0b9b8..8190540f7e 100644 --- a/qan-api2/Makefile +++ b/qan-api2/Makefile @@ -12,7 +12,7 @@ PMM_RELEASE_TIMESTAMP ?= $(shell date '+%s') PMM_RELEASE_FULLCOMMIT ?= $(shell git rev-parse HEAD) PMM_RELEASE_BRANCH ?= $(shell git describe --always --contains --all) -PMM_CONTAINER ?= pmm-managed-server +PMM_CONTAINER ?= pmm-server release: ## Build qan-api2 release binary env CGO_ENABLED=0 go build -v -o $(PMM_RELEASE_PATH)/qan-api2 -ldflags " \ @@ -32,6 +32,13 @@ install-race: ## Install qan-api2 binary with race detector test-env-up: ## Start docker containers used for testing docker run -d --platform=linux/amd64 --name pmm-clickhouse-test -p19000:9000 yandex/clickhouse-server:21.3.20 + make test-env + +test-env-up-applem1: ## Start docker containers used for testing on Apple M1 and higher chips. + docker run -d --platform=linux/amd64 --name pmm-clickhouse-test -p19000:9000 clickhouse/clickhouse-server:head-alpine + make test-env + +test-env: sleep 10 docker exec pmm-clickhouse-test clickhouse client --query="CREATE DATABASE IF NOT EXISTS pmm_test;" cat migrations/sql/*.up.sql | docker exec -i pmm-clickhouse-test clickhouse client -d pmm_test --multiline --multiquery diff --git a/qan-api2/db.go b/qan-api2/db.go index d1845de681..de3ed9d776 100644 --- a/qan-api2/db.go +++ b/qan-api2/db.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify @@ -91,7 +90,7 @@ func createDB(dsn string) error { } defer defaultDB.Close() - result, err := defaultDB.Exec(fmt.Sprintf(`CREATE DATABASE %s ENGINE = Ordinary`, databaseName)) + result, err := defaultDB.Exec(fmt.Sprintf(`CREATE DATABASE %s ENGINE = Atomic`, databaseName)) if err != nil { log.Printf("Result: %v", result) return err diff --git a/qan-api2/db_test.go b/qan-api2/db_test.go index 34947722fe..1eb145ea93 100644 --- a/qan-api2/db_test.go +++ b/qan-api2/db_test.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/docker-compose.yaml b/qan-api2/docker-compose.yaml index 2157005fad..deb5eea0d2 100644 --- a/qan-api2/docker-compose.yaml +++ b/qan-api2/docker-compose.yaml @@ -3,7 +3,7 @@ version: "3" services: pmm-server: - container_name: pmm-managed-server + container_name: pmm-server image: perconalab/pmm-server:dev-latest ports: - 80:80 diff --git a/qan-api2/exporters/slow_log.go b/qan-api2/exporters/slow_log.go index 52f4c8b764..e13c81e03f 100644 --- a/qan-api2/exporters/slow_log.go +++ b/qan-api2/exporters/slow_log.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify @@ -78,7 +77,7 @@ func main() { ctx := context.TODO() events = parseSlowLog(*slowLogPath, logOpt) - fmt.Println("Parsing slowlog: ", *slowLogPath, "...") + fmt.Println("Parsing slowlog: ", *slowLogPath, "...") //nolint:forbidigo logStart, _ := time.Parse("2006-01-02 15:04:05", *logTimeStart) periodNumber := 0 @@ -413,7 +412,7 @@ func bulkSend(ctx context.Context, client qanpb.CollectorClient, fn func(*qanpb. if err != nil { return fmt.Errorf("sent error: %v", err) } - fmt.Printf("Send to QAN API %v Metrics Buckets.\n Response: %v\n", lenMB, resp) + fmt.Printf("Send to QAN API %v Metrics Buckets.\n Response: %v\n", lenMB, resp) //nolint:forbidigo } return nil } diff --git a/qan-api2/main.go b/qan-api2/main.go index 738a43f73e..9d94f52758 100644 --- a/qan-api2/main.go +++ b/qan-api2/main.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify @@ -321,7 +320,7 @@ func main() { dsn = *dsnF } - l.Info("DNS: ", dsn) + l.Info("DSN: ", dsn) db := NewDB(dsn, maxIdleConns, maxOpenConns) prom.MustRegister(sqlmetrics.NewCollector("clickhouse", "qan-api2", db.DB)) diff --git a/qan-api2/maincover_test.go b/qan-api2/maincover_test.go index 60f49b7824..1828a08ed0 100644 --- a/qan-api2/maincover_test.go +++ b/qan-api2/maincover_test.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/models/base.go b/qan-api2/models/base.go index b9a334a7f5..4f0368d8aa 100644 --- a/qan-api2/models/base.go +++ b/qan-api2/models/base.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/models/data_ingestion.go b/qan-api2/models/data_ingestion.go index 8df0225aaf..126052c9b4 100644 --- a/qan-api2/models/data_ingestion.go +++ b/qan-api2/models/data_ingestion.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/models/metrics.go b/qan-api2/models/metrics.go index 169c281549..604cd06659 100644 --- a/qan-api2/models/metrics.go +++ b/qan-api2/models/metrics.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify @@ -24,6 +23,7 @@ import ( "fmt" "log" "sort" + "strings" "text/template" "time" @@ -1034,18 +1034,16 @@ func (m *Metrics) ExplainFingerprintByQueryID(ctx context.Context, serviceID, qu } const selectedQueryMetadataTmpl = ` -SELECT any(service_name), - any(database), - any(schema), - any(username), - any(replication_set), - any(cluster), - any(service_type), - any(service_id), - any(environment), - any(node_id), - any(node_name), - any(node_type) +SELECT DISTINCT service_name, + database, + schema, + username, + replication_set, + cluster, + service_type, + environment, + node_name, + node_type FROM metrics WHERE period_start >= :period_start_from AND period_start <= :period_start_to {{ if not .Totals }} AND {{ .Group }} = '{{ .DimensionVal }}' @@ -1059,10 +1057,7 @@ WHERE period_start >= :period_start_from AND period_start <= :period_start_to AND ({{range $key, $vals := .Labels }}{{ $i = inc $i}} {{ if gt $i 1}} OR {{ end }} has(['{{ StringsJoin $vals "', '" }}'], labels.value[indexOf(labels.key, '{{ $key }}')]) {{ end }}) -{{ end }} -{{ if not .Totals }} GROUP BY {{ .Group }} {{ end }} -WITH TOTALS; ` // GetSelectedQueryMetadata returns metadata for given query ID. @@ -1121,26 +1116,57 @@ func (m *Metrics) GetSelectedQueryMetadata(ctx context.Context, periodStartFromS } defer rows.Close() + metadata := make(map[string]map[string]struct{}) + columnNames, err := rows.Columns() + if err != nil { + return nil, errors.Wrap(err, "failed to get column names") + } + for _, name := range columnNames { + metadata[name] = make(map[string]struct{}) + } + for rows.Next() { - err = rows.Scan( - &res.ServiceName, - &res.Database, - &res.Schema, - &res.Username, - &res.ReplicationSet, - &res.Cluster, - &res.ServiceType, - &res.ServiceId, - &res.Environment, - &res.NodeId, - &res.NodeName, - &res.NodeType) + row := make([]any, len(columnNames)) + for i := range columnNames { + row[i] = new(string) + } + + err = rows.Scan(row...) if err != nil { - return res, errors.Wrap(err, "failed to scan query") - } else { - return res, nil + if errors.Is(err, sql.ErrNoRows) { + return nil, errors.Wrap(err, "query_id doesnt exists") + } + return nil, errors.Wrap(err, "failed to scan query") + } + + for k, v := range row { + if value, ok := v.(*string); ok { + metadata[columnNames[k]][*value] = struct{}{} + } } } - return res, errors.New("query_id doesnt exists") + res.ServiceName = prepareMetadataProperty(metadata["service_name"]) + res.Database = prepareMetadataProperty(metadata["database"]) + res.Schema = prepareMetadataProperty(metadata["schema"]) + res.Username = prepareMetadataProperty(metadata["username"]) + res.ReplicationSet = prepareMetadataProperty(metadata["replication_set"]) + res.Cluster = prepareMetadataProperty(metadata["cluster"]) + res.ServiceType = prepareMetadataProperty(metadata["service_type"]) + res.Environment = prepareMetadataProperty(metadata["environment"]) + res.NodeName = prepareMetadataProperty(metadata["node_name"]) + res.NodeType = prepareMetadataProperty(metadata["node_type"]) + + return res, nil +} + +func prepareMetadataProperty(metadata map[string]struct{}) string { + res := []string{} + for k := range metadata { + res = append(res, k) + } + + sort.Strings(res) + + return strings.Join(res, ", ") } diff --git a/qan-api2/models/reporter.go b/qan-api2/models/reporter.go index effbd00522..4ceebcd10f 100644 --- a/qan-api2/models/reporter.go +++ b/qan-api2/models/reporter.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify @@ -95,7 +94,7 @@ WHERE period_start >= :period_start_from AND period_start <= :period_start_to {{ end }} {{ if .Labels }}{{$i := 0}} AND ({{range $key, $vals := .Labels }}{{ $i = inc $i}} - {{ if gt $i 1}} OR {{ end }} has(['{{ StringsJoin $vals "', '" }}'], labels.value[indexOf(labels.key, '{{ $key }}')]) + {{ if gt $i 1}} AND {{ end }} has(['{{ StringsJoin $vals "', '" }}'], labels.value[indexOf(labels.key, '{{ $key }}')]) {{ end }}) {{ end }} GROUP BY {{ .Group }} @@ -472,14 +471,14 @@ var ( // SelectFilters selects dimension and their values, and also keys and values of labels. func (r *Reporter) SelectFilters(ctx context.Context, periodStartFromSec, periodStartToSec int64, mainMetricName string, dimensions, labels map[string][]string) (*qanpb.FiltersReply, error) { //nolint:lll - result := qanpb.FiltersReply{ - Labels: make(map[string]*qanpb.ListLabels), - } - if !isValidMetricColumn(mainMetricName) { return nil, fmt.Errorf("invalid main metric name %s", mainMetricName) } + result := qanpb.FiltersReply{ + Labels: r.commentsIntoGroupLabels(ctx, periodStartFromSec, periodStartToSec), + } + for dimensionName, dimensionQuery := range dimensionQueries { subDimensions := make(map[string][]string) for k, v := range dimensions { @@ -583,3 +582,84 @@ func (r *Reporter) queryFilters(ctx context.Context, periodStartFromSec, return labels, totalMainMetricPerSec, nil } + +const queryLabels = ` +SELECT + labels.key, + labels.value +FROM metrics +WHERE (period_start >= ?) AND (period_start <= ?) +ORDER BY + labels.value ASC +` + +type customLabelArray struct { + keys []string + values []string +} + +func (r *Reporter) queryLabels(ctx context.Context, periodStartFromSec, + periodStartToSec int64, +) ([]*customLabelArray, error) { + var labels []*customLabelArray + + rows, err := r.db.QueryContext(ctx, queryLabels, periodStartFromSec, periodStartToSec) + if err != nil { + return nil, errors.Wrapf(err, "failed to select for QueryFilter %s", queryLabels) + } + defer rows.Close() //nolint:errcheck + + for rows.Next() { + var label customLabelArray + err = rows.Scan(&label.keys, &label.values) + if err != nil { + return nil, errors.Wrapf(err, "failed to scan for QueryFilter %s", queryLabels) + } + labels = append(labels, &label) + } + if err = rows.Err(); err != nil { + return nil, errors.Wrapf(err, "failed to select for QueryFilter %s", queryLabels) + } + + return labels, nil +} + +// commentsIntoGroupLabels parse labels and comment labels into filter groups and values. +func (r *Reporter) commentsIntoGroupLabels(ctx context.Context, periodStartFromSec, periodStartToSec int64) map[string]*qanpb.ListLabels { + groupLabels := make(map[string]*qanpb.ListLabels) + + labelKeysValues, err := r.queryLabels(ctx, periodStartFromSec, periodStartToSec) + if err != nil { + return groupLabels + } + + count := len(labelKeysValues) + res := make(map[string]map[string]float32) + for _, label := range labelKeysValues { + for index, key := range label.keys { + if _, ok := res[key]; !ok { + res[key] = make(map[string]float32) + } + + res[key][label.values[index]]++ + } + } + + for key, values := range res { + if _, ok := groupLabels[key]; !ok { + groupLabels[key] = &qanpb.ListLabels{ + Name: []*qanpb.Values{}, + } + } + + for k, v := range values { + val := qanpb.Values{ + Value: k, + MainMetricPercent: v / float32(count), + } + groupLabels[key].Name = append(groupLabels[key].Name, &val) + } + } + + return groupLabels +} diff --git a/qan-api2/services/analytics/base.go b/qan-api2/services/analytics/base.go index 0cb412cc3a..b9e9bd54e0 100644 --- a/qan-api2/services/analytics/base.go +++ b/qan-api2/services/analytics/base.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/services/analytics/filters.go b/qan-api2/services/analytics/filters.go index cfe80dbef4..da6cdc9bfe 100644 --- a/qan-api2/services/analytics/filters.go +++ b/qan-api2/services/analytics/filters.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/services/analytics/filters_test.go b/qan-api2/services/analytics/filters_test.go index 333ffc33d1..c7afc95c5a 100644 --- a/qan-api2/services/analytics/filters_test.go +++ b/qan-api2/services/analytics/filters_test.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify @@ -18,6 +17,7 @@ package analytics import ( "context" + "encoding/json" "log" "os" "testing" @@ -25,7 +25,6 @@ import ( _ "github.com/ClickHouse/clickhouse-go/151" // register database/sql driver // TODO replace with 'google.golang.org/protobuf/encoding/protojson' since this one is deprecated - "github.com/golang/protobuf/jsonpb" //nolint:staticcheck "github.com/golang/protobuf/ptypes/timestamp" "github.com/jmoiron/sqlx" "github.com/stretchr/testify/assert" @@ -34,6 +33,24 @@ import ( "github.com/percona/pmm/qan-api2/models" ) +type expected struct { + Labels map[string]listLabels `json:"labels,omitempty"` +} + +type listLabels struct { + Name []testValuesUnmarshal `json:"name,omitempty"` +} +type testValues struct { + MainMetricPercent float32 `json:"mainMetricPercent,omitempty"` + MainMetricPerSec float32 `json:"mainMetricPerSec,omitempty"` +} + +type testValuesUnmarshal struct { + Value string `json:"value,omitempty"` + MainMetricPercent any `json:"mainMetricPercent,omitempty"` + MainMetricPerSec any `json:"mainMetricPerSec,omitempty"` +} + func TestService_GetFilters(t *testing.T) { dsn, ok := os.LookupEnv("QANAPI_DSN_TEST") if !ok { @@ -172,13 +189,51 @@ func TestService_GetFilters(t *testing.T) { assert.Nil(t, got, "Service.GetFilters() return not nil") return } + + valuesGot := make(map[string]map[string]testValues) + for k, l := range got.Labels { + if _, ok := valuesGot[k]; !ok { + valuesGot[k] = make(map[string]testValues) + } + for _, v := range l.Name { + valuesGot[k][v.Value] = testValues{ + MainMetricPercent: v.MainMetricPercent, + MainMetricPerSec: v.MainMetricPerSec, + } + } + } + expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetFilters_"+tt.name+".json") - marshaler := jsonpb.Marshaler{Indent: " "} - gotJSON, err := marshaler.MarshalToString(got) + var unmarshal expected + err = json.Unmarshal(expectedJSON, &unmarshal) if err != nil { - t.Errorf("cannot marshal:%v", err) + t.Errorf("cannot unmarshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + + valuesExpected := make(map[string]map[string]testValues) + for k, l := range unmarshal.Labels { + if _, ok := valuesExpected[k]; !ok { + valuesExpected[k] = make(map[string]testValues) + } + for _, v := range l.Name { + percent := float32(0) + if p, ok := v.MainMetricPercent.(float64); ok { + percent = float32(p) + } + + perSec := float32(0) + if p, ok := v.MainMetricPerSec.(float64); ok { + perSec = float32(p) + } + + valuesExpected[k][v.Value] = testValues{ + MainMetricPercent: percent, + MainMetricPerSec: perSec, + } + } + } + + assert.ObjectsAreEqual(valuesExpected, valuesGot) }) } } diff --git a/qan-api2/services/analytics/metrics_names.go b/qan-api2/services/analytics/metrics_names.go index dad5428a51..5d5074e0a3 100644 --- a/qan-api2/services/analytics/metrics_names.go +++ b/qan-api2/services/analytics/metrics_names.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/services/analytics/metrics_names_test.go b/qan-api2/services/analytics/metrics_names_test.go index dafc96e0de..b9ca476b6f 100644 --- a/qan-api2/services/analytics/metrics_names_test.go +++ b/qan-api2/services/analytics/metrics_names_test.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/services/analytics/object_details.go b/qan-api2/services/analytics/object_details.go index 9aac614264..79ffa56ea2 100644 --- a/qan-api2/services/analytics/object_details.go +++ b/qan-api2/services/analytics/object_details.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/services/analytics/object_details_test.go b/qan-api2/services/analytics/object_details_test.go index d826295b8a..6a0173949c 100644 --- a/qan-api2/services/analytics/object_details_test.go +++ b/qan-api2/services/analytics/object_details_test.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/services/analytics/profile.go b/qan-api2/services/analytics/profile.go index 075056ebfa..de0e498254 100644 --- a/qan-api2/services/analytics/profile.go +++ b/qan-api2/services/analytics/profile.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/services/analytics/profile_test.go b/qan-api2/services/analytics/profile_test.go index 3e754056fd..429a7c1211 100644 --- a/qan-api2/services/analytics/profile_test.go +++ b/qan-api2/services/analytics/profile_test.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/services/receiver/receiver.go b/qan-api2/services/receiver/receiver.go index 617784504e..4d963dd2b7 100644 --- a/qan-api2/services/receiver/receiver.go +++ b/qan-api2/services/receiver/receiver.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/test_data/GetMetrics_group_by_queryid.json b/qan-api2/test_data/GetMetrics_group_by_queryid.json index d4e86c01e2..c383b330df 100644 --- a/qan-api2/test_data/GetMetrics_group_by_queryid.json +++ b/qan-api2/test_data/GetMetrics_group_by_queryid.json @@ -3435,15 +3435,13 @@ }, "fingerprint": "select @@global.slow_query_log_file", "metadata": { - "serviceName": "server0", - "schema": "schema29", - "username": "user8", + "serviceName": "server0, server1, server2, server3, server4, server5, server6, server7, server8, server9", + "schema": "schema0, schema1, schema10, schema13, schema14, schema20, schema21, schema23, schema27, schema28, schema29, schema3, schema30, schema31, schema33, schema35, schema37, schema40, schema42, schema44, schema46, schema47, schema48, schema51, schema52, schema53, schema56, schema58, schema59, schema60, schema61, schema65, schema68, schema69, schema70, schema72, schema74, schema75, schema76, schema77, schema80, schema81, schema82, schema84, schema88, schema89, schema94, schema96, schema97, schema99", + "username": "user1, user10, user14, user16, user24, user26, user27, user28, user30, user31, user32, user33, user34, user38, user40, user41, user44, user45, user46, user49, user55, user56, user6, user60, user61, user64, user67, user69, user70, user74, user76, user79, user8, user82, user84, user85, user86, user87, user89, user90, user91, user92, user95, user96, user97, user98, user99", "replicationSet": "replication_set1", "cluster": "cluster1", "serviceType": "service_type1", - "serviceId": "service_id1", "environment": "environment1", - "nodeId": "node_id1", "nodeName": "node_name1", "nodeType": "node_type1" } diff --git a/qan-api2/test_data/GetMetrics_sparklines_90_points.json b/qan-api2/test_data/GetMetrics_sparklines_90_points.json index 4b69df0d83..91cedf727d 100644 --- a/qan-api2/test_data/GetMetrics_sparklines_90_points.json +++ b/qan-api2/test_data/GetMetrics_sparklines_90_points.json @@ -1437,15 +1437,13 @@ }, "fingerprint": "select @@global.slow_query_log_file", "metadata": { - "serviceName": "server2", - "schema": "schema81", - "username": "user38", + "serviceName": "server2, server3, server4, server5, server6, server7, server8, server9", + "schema": "schema10, schema13, schema3, schema33, schema35, schema40, schema44, schema52, schema59, schema61, schema72, schema81, schema96", + "username": "user1, user26, user27, user28, user31, user38, user64, user82, user95, user96, user97, user98", "replicationSet": "replication_set1", "cluster": "cluster1", "serviceType": "service_type1", - "serviceId": "service_id1", "environment": "environment1", - "nodeId": "node_id1", "nodeName": "node_name1", "nodeType": "node_type1" } diff --git a/qan-api2/test_data/GetMetrics_total.json b/qan-api2/test_data/GetMetrics_total.json index 32978b0f56..d144f24dd5 100644 --- a/qan-api2/test_data/GetMetrics_total.json +++ b/qan-api2/test_data/GetMetrics_total.json @@ -6698,15 +6698,13 @@ } }, "metadata": { - "serviceName": "server0", - "schema": "schema12", - "username": "user19", + "serviceName": "server0, server1, server2, server3, server4, server5, server6, server7, server8, server9", + "schema": "schema0, schema1, schema10, schema11, schema12, schema13, schema14, schema15, schema16, schema17, schema18, schema19, schema2, schema20, schema21, schema22, schema23, schema24, schema25, schema26, schema27, schema28, schema29, schema3, schema30, schema31, schema32, schema33, schema34, schema35, schema36, schema37, schema38, schema39, schema4, schema40, schema41, schema42, schema43, schema44, schema45, schema46, schema47, schema48, schema49, schema5, schema50, schema51, schema52, schema53, schema54, schema55, schema56, schema57, schema58, schema59, schema6, schema60, schema61, schema62, schema63, schema64, schema65, schema66, schema67, schema68, schema69, schema7, schema70, schema71, schema72, schema73, schema74, schema75, schema76, schema77, schema78, schema79, schema8, schema80, schema81, schema82, schema83, schema84, schema85, schema86, schema87, schema88, schema89, schema9, schema90, schema91, schema92, schema93, schema94, schema95, schema96, schema97, schema98, schema99", + "username": "user0, user1, user10, user11, user12, user13, user14, user15, user16, user17, user18, user19, user2, user20, user21, user22, user23, user24, user25, user26, user27, user28, user29, user3, user30, user31, user32, user33, user34, user35, user36, user37, user38, user39, user4, user40, user41, user42, user43, user44, user45, user46, user47, user48, user49, user5, user50, user51, user52, user53, user54, user55, user56, user57, user58, user59, user6, user60, user61, user62, user63, user64, user65, user66, user67, user68, user69, user7, user70, user71, user72, user73, user74, user75, user76, user77, user78, user79, user8, user80, user81, user82, user83, user84, user85, user86, user87, user88, user89, user9, user90, user91, user92, user93, user94, user95, user96, user97, user98, user99", "replicationSet": "replication_set1", "cluster": "cluster1", "serviceType": "service_type1", - "serviceId": "service_id1", "environment": "environment1", - "nodeId": "node_id1", "nodeName": "node_name1", "nodeType": "node_type1" } diff --git a/qan-api2/test_data/TestService_GetFilters_success.json b/qan-api2/test_data/TestService_GetFilters_success.json index 3d0f582779..23d3afdd14 100644 --- a/qan-api2/test_data/TestService_GetFilters_success.json +++ b/qan-api2/test_data/TestService_GetFilters_success.json @@ -273,6 +273,606 @@ } ] }, + "label0": { + "name": [ + { + "value": "value43", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value57", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value92", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value95", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value82", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value68", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value88", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value1", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value51", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label1": { + "name": [ + { + "value": "value11", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value28", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value0", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value66", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value36", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value75", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value79", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value89", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value10", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value25", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value29", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value92", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label2": { + "name": [ + { + "value": "value3", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value36", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value63", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value27", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value74", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value49", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value24", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value33", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value59", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label3": { + "name": [ + { + "value": "value75", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value52", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value5", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value38", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value86", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value45", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value12", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value97", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value50", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value73", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label4": { + "name": [ + { + "value": "value42", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value85", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value8", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value64", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value80", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value75", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value13", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label5": { + "name": [ + { + "value": "value48", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value56", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value90", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value23", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value28", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value21", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value3", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value52", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label6": { + "name": [ + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value49", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value23", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value5", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value22", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value98", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value51", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value90", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label7": { + "name": [ + { + "value": "value27", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value72", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value32", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value14", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value23", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value0", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value10", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value60", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value11", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value16", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value74", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value79", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value40", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value20", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value64", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value86", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value35", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label8": { + "name": [ + { + "value": "value38", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value45", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value42", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value25", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value81", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value71", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value7", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value32", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value28", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value99", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label9": { + "name": [ + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value29", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value65", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value46", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value76", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value16", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value95", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value71", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value40", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value43", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value35", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value11", + "mainMetricPercent": 0.006802721 + } + ] + }, "machine_id": { "name": [ { diff --git a/qan-api2/test_data/TestService_GetFilters_success_with_dimensions_client_host_schema_service_name.json b/qan-api2/test_data/TestService_GetFilters_success_with_dimensions_client_host_schema_service_name.json index 8b5c2fa3ab..f0b31a6931 100644 --- a/qan-api2/test_data/TestService_GetFilters_success_with_dimensions_client_host_schema_service_name.json +++ b/qan-api2/test_data/TestService_GetFilters_success_with_dimensions_client_host_schema_service_name.json @@ -209,6 +209,606 @@ } ] }, + "label0": { + "name": [ + { + "value": "value57", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value1", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value51", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value92", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value43", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value68", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value95", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value82", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value88", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label1": { + "name": [ + { + "value": "value10", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value29", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value79", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value11", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value28", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value0", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value92", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value66", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value89", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value25", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value36", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value75", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label2": { + "name": [ + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value24", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value36", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value63", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value59", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value74", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value3", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value33", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value49", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value27", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label3": { + "name": [ + { + "value": "value52", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value38", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value12", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value45", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value73", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value97", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value86", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value75", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value5", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value50", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label4": { + "name": [ + { + "value": "value83", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value85", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value64", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value75", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value80", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value8", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value42", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label5": { + "name": [ + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value52", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value23", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value28", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value48", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value90", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value3", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value21", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value56", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label6": { + "name": [ + { + "value": "value51", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value90", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value49", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value23", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value98", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value5", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value22", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label7": { + "name": [ + { + "value": "value16", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value20", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value74", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value72", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value10", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value14", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value23", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value64", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value86", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value0", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value79", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value60", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value35", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value40", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value32", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value27", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value11", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label8": { + "name": [ + { + "value": "value28", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value25", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value38", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value81", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value42", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value32", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value45", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value71", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value7", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value99", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label9": { + "name": [ + { + "value": "value76", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value29", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value16", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value46", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value40", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value95", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value65", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value11", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value71", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value35", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value43", + "mainMetricPercent": 0.006802721 + } + ] + }, "machine_id": { "name": [ { diff --git a/qan-api2/test_data/TestService_GetFilters_success_with_dimensions_multiple.json b/qan-api2/test_data/TestService_GetFilters_success_with_dimensions_multiple.json index 70f3ae6833..2b43aef1e1 100644 --- a/qan-api2/test_data/TestService_GetFilters_success_with_dimensions_multiple.json +++ b/qan-api2/test_data/TestService_GetFilters_success_with_dimensions_multiple.json @@ -225,6 +225,606 @@ } ] }, + "label0": { + "name": [ + { + "value": "value51", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value92", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value82", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value57", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value88", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value1", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value95", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value43", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value68", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label1": { + "name": [ + { + "value": "value29", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value28", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value25", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value0", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value66", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value11", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value79", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value89", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value75", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value36", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value92", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value10", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label2": { + "name": [ + { + "value": "value74", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value3", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value24", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value33", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value36", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value59", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value63", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value49", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value27", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label3": { + "name": [ + { + "value": "value12", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value52", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value73", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value97", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value45", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value5", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value50", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value86", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value75", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value38", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label4": { + "name": [ + { + "value": "value80", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value75", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value8", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value42", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value85", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value64", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label5": { + "name": [ + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value21", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value23", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value90", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value56", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value28", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value3", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value52", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value48", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label6": { + "name": [ + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value22", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value98", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value49", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value23", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value5", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value51", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value90", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label7": { + "name": [ + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value0", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value79", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value23", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value11", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value40", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value64", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value14", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value32", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value16", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value74", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value72", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value86", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value35", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value60", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value27", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value20", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value10", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label8": { + "name": [ + { + "value": "value32", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value99", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value25", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value81", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value71", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value42", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value28", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value38", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value45", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value7", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label9": { + "name": [ + { + "value": "value35", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value43", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value29", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value65", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value46", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value76", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value95", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value40", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value11", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value16", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value71", + "mainMetricPercent": 0.006802721 + } + ] + }, "machine_id": { "name": [ { diff --git a/qan-api2/test_data/TestService_GetFilters_success_with_dimensions_username.json b/qan-api2/test_data/TestService_GetFilters_success_with_dimensions_username.json index f48d9bc412..e0d4e0fb7c 100644 --- a/qan-api2/test_data/TestService_GetFilters_success_with_dimensions_username.json +++ b/qan-api2/test_data/TestService_GetFilters_success_with_dimensions_username.json @@ -199,6 +199,606 @@ } ] }, + "label0": { + "name": [ + { + "value": "value51", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value43", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value88", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value1", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value92", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value95", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value82", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value68", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value57", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label1": { + "name": [ + { + "value": "value11", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value36", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value89", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value10", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value92", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value0", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value75", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value25", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value28", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value29", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value66", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value79", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label2": { + "name": [ + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value36", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value74", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value27", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value3", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value63", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value59", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value49", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value24", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value33", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label3": { + "name": [ + { + "value": "value73", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value45", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value12", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value50", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value38", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value86", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value52", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value5", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value97", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value75", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label4": { + "name": [ + { + "value": "value80", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value75", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value85", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value8", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value42", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value64", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label5": { + "name": [ + { + "value": "value23", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value28", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value21", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value56", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value48", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value90", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value3", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value52", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label6": { + "name": [ + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value51", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value49", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value22", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value98", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value90", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value23", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value5", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label7": { + "name": [ + { + "value": "value10", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value35", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value20", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value86", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value14", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value23", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value60", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value27", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value16", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value0", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value32", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value40", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value64", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value79", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value11", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value74", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value72", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label8": { + "name": [ + { + "value": "value99", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value25", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value81", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value45", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value7", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value42", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value32", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value38", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value71", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value28", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label9": { + "name": [ + { + "value": "value46", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value76", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value35", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value65", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value16", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value95", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value29", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value11", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value40", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value43", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value71", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + } + ] + }, "machine_id": { "name": [ { diff --git a/qan-api2/test_data/TestService_GetFilters_success_with_labels.json b/qan-api2/test_data/TestService_GetFilters_success_with_labels.json index 3d0f582779..24a3109903 100644 --- a/qan-api2/test_data/TestService_GetFilters_success_with_labels.json +++ b/qan-api2/test_data/TestService_GetFilters_success_with_labels.json @@ -273,6 +273,606 @@ } ] }, + "label0": { + "name": [ + { + "value": "value39", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value92", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value43", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value82", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value57", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value1", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value51", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value95", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value68", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value88", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label1": { + "name": [ + { + "value": "value75", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value79", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value10", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value36", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value92", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value11", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value25", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value28", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value66", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value89", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value0", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value29", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label2": { + "name": [ + { + "value": "value41", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value3", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value59", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value27", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value74", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value49", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value24", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value33", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value36", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value63", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label3": { + "name": [ + { + "value": "value12", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value45", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value75", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value52", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value50", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value86", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value5", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value38", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value73", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value97", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label4": { + "name": [ + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value85", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value8", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value42", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value64", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value80", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value75", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label5": { + "name": [ + { + "value": "value23", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value93", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value48", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value90", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value56", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value52", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value21", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value28", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value3", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value39", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label6": { + "name": [ + { + "value": "value9", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value49", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value13", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value23", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value51", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value90", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value5", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value22", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value98", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label7": { + "name": [ + { + "value": "value35", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value74", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value0", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value10", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value61", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value23", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value27", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value16", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value72", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value32", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value11", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value20", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value86", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value79", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value14", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value60", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value40", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value64", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value9", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label8": { + "name": [ + { + "value": "value71", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value7", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value32", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value28", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value38", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value81", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value45", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value37", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value62", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value25", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value70", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value42", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value99", + "mainMetricPercent": 0.006802721 + } + ] + }, + "label9": { + "name": [ + { + "value": "value46", + "mainMetricPercent": 0.013605442 + }, + { + "value": "value76", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value58", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value95", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value35", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value83", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value65", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value41", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value29", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value26", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value40", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value43", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value55", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value11", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value16", + "mainMetricPercent": 0.006802721 + }, + { + "value": "value71", + "mainMetricPercent": 0.006802721 + } + ] + }, "machine_id": { "name": [ { diff --git a/qan-api2/utils/interceptors/interceptors.go b/qan-api2/utils/interceptors/interceptors.go index d35b07f29c..c5aca053fb 100644 --- a/qan-api2/utils/interceptors/interceptors.go +++ b/qan-api2/utils/interceptors/interceptors.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/utils/logger/grpc.go b/qan-api2/utils/logger/grpc.go index c1758d91e6..d658750634 100644 --- a/qan-api2/utils/logger/grpc.go +++ b/qan-api2/utils/logger/grpc.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/qan-api2/utils/logger/logger.go b/qan-api2/utils/logger/logger.go index 27bf50438d..d51b3cc4f6 100644 --- a/qan-api2/utils/logger/logger.go +++ b/qan-api2/utils/logger/logger.go @@ -1,4 +1,3 @@ -// qan-api2 // Copyright (C) 2019 Percona LLC // // This program is free software: you can redistribute it and/or modify diff --git a/scripts/authfix.sh b/scripts/authfix.sh new file mode 100644 index 0000000000..52bbbea4c4 --- /dev/null +++ b/scripts/authfix.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -eu +trap "echo FAILED" ERR +sed -i 's^error_page 401 = /auth_request;^\0\nif ($request ~ (\\.\\.|%2[eE]%2[eE])) { return 403; }^' /etc/nginx/conf.d/pmm.conf +grep -Fq 'request ~ (\.\.|%2[eE]%2[eE])' /etc/nginx/conf.d/pmm.conf +nginx -t +nginx -s reload diff --git a/tools/go.mod b/tools/go.mod index 39d4f2b194..060dd70031 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -8,23 +8,23 @@ require ( github.com/BurntSushi/go-sumtype v0.0.0-20190304192233-fcb4a6205bdc github.com/Percona-Lab/swagger-order v0.0.0-20191002141859-166b3973d026 github.com/apache/skywalking-eyes v0.4.0 - github.com/bufbuild/buf v1.20.0 + github.com/bufbuild/buf v1.25.0 github.com/daixiang0/gci v0.10.1 github.com/envoyproxy/protoc-gen-validate v1.0.1 - github.com/go-delve/delve v1.20.2 + github.com/go-delve/delve v1.21.0 github.com/go-openapi/runtime v0.25.0 github.com/go-openapi/spec v0.20.4 github.com/go-swagger/go-swagger v0.29.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 github.com/jstemmer/go-junit-report v1.0.0 - github.com/quasilyte/go-consistent v0.0.0-20200404105227-766526bf1e96 + github.com/quasilyte/go-consistent v0.6.0 github.com/reviewdog/reviewdog v0.14.1 github.com/vburenin/ifacemaker v1.2.1 - github.com/vektra/mockery v1.1.2 + github.com/vektra/mockery/v2 v2.32.0 golang.org/x/perf v0.0.0-20211012211434-03971e389cd3 - golang.org/x/tools v0.9.3 + golang.org/x/tools v0.11.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 - google.golang.org/protobuf v1.30.0 + google.golang.org/protobuf v1.31.0 gopkg.in/reform.v1 v1.5.1 mvdan.cc/gofumpt v0.5.0 ) @@ -44,24 +44,26 @@ require ( github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect github.com/bmatcuk/doublestar/v2 v2.0.4 // indirect github.com/bradleyfalzon/ghinstallation/v2 v2.0.4 // indirect - github.com/bufbuild/connect-go v1.7.0 // indirect + github.com/bufbuild/connect-go v1.9.0 // indirect + github.com/bufbuild/connect-opentelemetry-go v0.4.0 // indirect github.com/bufbuild/protocompile v0.5.1 // indirect + github.com/chigopher/pathlib v0.15.0 // indirect github.com/cilium/ebpf v0.7.0 // indirect github.com/containerd/stargz-snapshotter/estargz v0.14.3 // indirect github.com/cosiner/argv v0.1.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/denisenkom/go-mssqldb v0.9.0 // indirect github.com/derekparker/trie v0.0.0-20221213183930-4c74548207f4 // indirect - github.com/docker/cli v24.0.2+incompatible // indirect + github.com/docker/cli v24.0.4+incompatible // indirect github.com/docker/distribution v2.8.2+incompatible // indirect - github.com/docker/docker v24.0.2+incompatible // indirect - github.com/docker/docker-credential-helpers v0.7.0 // indirect + github.com/docker/docker v24.0.4+incompatible // indirect + github.com/docker/docker-credential-helpers v0.8.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/felixge/fgprof v0.9.3 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect - github.com/fsnotify/fsnotify v1.5.4 // indirect - github.com/go-chi/chi/v5 v5.0.8 // indirect + github.com/fsnotify/fsnotify v1.6.0 // indirect + github.com/go-chi/chi/v5 v5.0.10 // indirect github.com/go-delve/liner v1.2.3-0.20220127212407-d32d89dd2a5d // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect @@ -91,13 +93,13 @@ require ( github.com/golang/protobuf v1.5.3 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/go-containerregistry v0.15.2 // indirect - github.com/google/go-dap v0.7.0 // indirect + github.com/google/go-dap v0.9.1 // indirect github.com/google/go-github/v33 v33.0.0 // indirect github.com/google/go-github/v39 v39.2.0 // indirect github.com/google/go-github/v41 v41.0.0 // indirect github.com/google/go-querystring v1.1.0 // indirect github.com/google/licensecheck v0.3.1 // indirect - github.com/google/pprof v0.0.0-20230510103437-eeec1cb781c3 // indirect + github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 // indirect github.com/google/uuid v1.3.0 // indirect github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/googleapis/gax-go/v2 v2.7.1 // indirect @@ -116,18 +118,19 @@ require ( github.com/jackc/pgx v3.6.2+incompatible // indirect github.com/jdxcode/netrc v0.0.0-20221124155335-4616370d1a84 // indirect github.com/jessevdk/go-flags v1.5.0 // indirect + github.com/jinzhu/copier v0.3.5 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/kisielk/gotool v1.0.0 // indirect - github.com/klauspost/compress v1.16.5 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/klauspost/pgzip v1.2.6 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lib/pq v1.10.6 // indirect github.com/lyft/protoc-gen-star/v2 v2.0.3 // indirect - github.com/magiconair/properties v1.8.6 // indirect + github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect - github.com/mattn/go-colorable v0.1.12 // indirect - github.com/mattn/go-isatty v0.0.14 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.17 // indirect github.com/mattn/go-runewidth v0.0.13 // indirect github.com/mattn/go-shellwords v1.0.12 // indirect github.com/mattn/go-sqlite3 v1.14.5 // indirect @@ -139,10 +142,9 @@ require ( github.com/morikuni/aec v1.0.0 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.1.0-rc3 // indirect + github.com/opencontainers/image-spec v1.1.0-rc4 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect - github.com/pelletier/go-toml v1.9.5 // indirect - github.com/pelletier/go-toml/v2 v2.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pkg/profile v1.7.0 // indirect @@ -152,17 +154,18 @@ require ( github.com/rivo/uniseg v0.2.0 // indirect github.com/rogpeppe/go-internal v1.10.0 // indirect github.com/rs/cors v1.9.0 // indirect + github.com/rs/zerolog v1.29.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/shopspring/decimal v1.2.0 // indirect - github.com/sirupsen/logrus v1.9.2 // indirect - github.com/spf13/afero v1.9.2 // indirect + github.com/sirupsen/logrus v1.9.3 // indirect + github.com/spf13/afero v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.12.0 // indirect - github.com/subosito/gotenv v1.4.0 // indirect - github.com/tetratelabs/wazero v1.1.0 // indirect + github.com/spf13/viper v1.15.0 // indirect + github.com/subosito/gotenv v1.4.2 // indirect + github.com/tetratelabs/wazero v1.3.0 // indirect github.com/toqueteos/webbrowser v1.2.0 // indirect github.com/vbatts/tar-split v0.11.3 // indirect github.com/vvakame/sdlog v0.0.0-20200409072131-7c0d359efddc // indirect @@ -179,16 +182,16 @@ require ( go.uber.org/zap v1.24.0 // indirect golang.org/x/arch v0.0.0-20190927153633-4e8777c89be4 // indirect golang.org/x/build v0.0.0-20200616162219-07bebbe343e9 // indirect - golang.org/x/crypto v0.9.0 // indirect + golang.org/x/crypto v0.11.0 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/net v0.10.0 // indirect + golang.org/x/mod v0.12.0 // indirect + golang.org/x/net v0.12.0 // indirect golang.org/x/oauth2 v0.8.0 // indirect - golang.org/x/sync v0.2.0 // indirect - golang.org/x/sys v0.8.0 // indirect - golang.org/x/term v0.8.0 // indirect - golang.org/x/text v0.9.0 // indirect - golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.10.0 // indirect + golang.org/x/term v0.10.0 // indirect + golang.org/x/text v0.11.0 // indirect + golang.org/x/time v0.1.0 // indirect golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect google.golang.org/api v0.114.0 // indirect google.golang.org/appengine v1.6.7 // indirect @@ -197,7 +200,7 @@ require ( google.golang.org/genproto/googleapis/rpc v0.0.0-20230530153820-e85fd2cbaebc // indirect google.golang.org/grpc v1.55.0 // indirect gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect - gopkg.in/ini.v1 v1.66.6 // indirect + gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/tools/go.sum b/tools/go.sum index 3b69a56b0c..e0d214b5ec 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -103,14 +103,18 @@ github.com/bradleyfalzon/ghinstallation/v2 v2.0.4 h1:tXKVfhE7FcSkhkv0UwkLvPDeZ4k github.com/bradleyfalzon/ghinstallation/v2 v2.0.4/go.mod h1:B40qPqJxWE0jDZgOR1JmaMy+4AY1eBP+IByOvqyAKp0= github.com/brianvoe/gofakeit v3.18.0+incompatible h1:wDOmHc9DLG4nRjUVVaxA+CEglKOW72Y5+4WNxUIkjM8= github.com/brianvoe/gofakeit v3.18.0+incompatible/go.mod h1:kfwdRA90vvNhPutZWfH7WPaDzUjz+CZFqG+rPkOjGOc= -github.com/bufbuild/buf v1.20.0 h1:B5+RQGsN+cs9eF0IyO6hdZAxEROVPjUPeX3a7PUVuBc= -github.com/bufbuild/buf v1.20.0/go.mod h1:4zmuvfUHapwU0dP2y4KNBjprXcBcr+Mtm1/KOHtR/Ng= -github.com/bufbuild/connect-go v1.7.0 h1:MGp82v7SCza+3RhsVhV7aMikwxvI3ZfD72YiGt8FYJo= -github.com/bufbuild/connect-go v1.7.0/go.mod h1:GmMJYR6orFqD0Y6ZgX8pwQ8j9baizDrIQMm1/a6LnHk= +github.com/bufbuild/buf v1.25.0 h1:HFxKrR8wFcZwrBInN50K/oJX/WOtPVq24rHb/ArjfBA= +github.com/bufbuild/buf v1.25.0/go.mod h1:GCKZ5bAP6Ht4MF7KcfaGVgBEXGumwAz2hXjjLVxx8ZU= +github.com/bufbuild/connect-go v1.9.0 h1:JIgAeNuFpo+SUPfU19Yt5TcWlznsN5Bv10/gI/6Pjoc= +github.com/bufbuild/connect-go v1.9.0/go.mod h1:CAIePUgkDR5pAFaylSMtNK45ANQjp9JvpluG20rhpV8= +github.com/bufbuild/connect-opentelemetry-go v0.4.0 h1:6JAn10SNqlQ/URhvRNGrIlczKw1wEXknBUUtmWqOiak= +github.com/bufbuild/connect-opentelemetry-go v0.4.0/go.mod h1:nwPXYoDOoc2DGyKE/6pT1Q9MPSi2Et2e6BieMD0l6WU= github.com/bufbuild/protocompile v0.5.1 h1:mixz5lJX4Hiz4FpqFREJHIXLfaLBntfaJv1h+/jS+Qg= github.com/bufbuild/protocompile v0.5.1/go.mod h1:G5iLmavmF4NsYtpZFvE3B/zFch2GIY8+wjsYLR/lc40= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/chigopher/pathlib v0.15.0 h1:1pg96WL3iC1/YyWV4UJSl3E0GBf4B+h5amBtsbAAieY= +github.com/chigopher/pathlib v0.15.0/go.mod h1:3+YPPV21mU9vyw8Mjp+F33CyCfE6iOzinpiqBcccv7I= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -129,6 +133,7 @@ github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cosiner/argv v0.1.0 h1:BVDiEL32lwHukgJKP87btEPenzrrHUjajs/8yzaqcXg= github.com/cosiner/argv v0.1.0/go.mod h1:EusR6TucWKX+zFgtdUsKT2Cvg45K5rtpCcWz4hK06d8= @@ -149,14 +154,14 @@ github.com/derekparker/trie v0.0.0-20221213183930-4c74548207f4 h1:atN94qKNhLpy+9 github.com/derekparker/trie v0.0.0-20221213183930-4c74548207f4/go.mod h1:C7Es+DLenIpPc9J6IYw4jrK0h7S9bKj4DNl8+KxGEXU= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/cli v24.0.2+incompatible h1:QdqR7znue1mtkXIJ+ruQMGQhpw2JzMJLRXp6zpzF6tM= -github.com/docker/cli v24.0.2+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/cli v24.0.4+incompatible h1:Y3bYF9ekNTm2VFz5U/0BlMdJy73D+Y1iAAZ8l63Ydzw= +github.com/docker/cli v24.0.4+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.2+incompatible h1:eATx+oLz9WdNVkQrr0qjQ8HvRJ4bOOxfzEo8R+dA3cg= -github.com/docker/docker v24.0.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/docker-credential-helpers v0.7.0 h1:xtCHsjxogADNZcdv1pKUHXryefjlVRqWqIhk/uXJp0A= -github.com/docker/docker-credential-helpers v0.7.0/go.mod h1:rETQfLdHNT3foU5kuNkFR1R1V12OJRRO5lzt2D1b5X0= +github.com/docker/docker v24.0.4+incompatible h1:s/LVDftw9hjblvqIeTiGYXBCD95nOEEl7qRsRrIOuQI= +github.com/docker/docker v24.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= +github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -180,14 +185,14 @@ github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwVZI= -github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= -github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= -github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-delve/delve v1.20.2 h1:rgPK7Iqb1oQk+i2Ilg0fpH6p5LqyixYiAt4N3Lhx4/Y= -github.com/go-delve/delve v1.20.2/go.mod h1:KQtnLRy2M+cNHCRnDzURxljVNbRTdvVDD5Mb10KGP18= +github.com/go-chi/chi/v5 v5.0.10 h1:rLz5avzKpjqxrYwXNfmjkrYYXOyLJd37pz53UFHC6vk= +github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-delve/delve v1.21.0 h1:npcc8TZhdVxaMSJon+zqcE3bXM/ck8SSOOWw/id13jI= +github.com/go-delve/delve v1.21.0/go.mod h1:U+OAdfhewudkHsVs/AwhfpSBu7t/NgIXH3+my4T5q78= github.com/go-delve/liner v1.2.3-0.20220127212407-d32d89dd2a5d h1:pxjSLshkZJGLVm0wv20f/H0oTWiq/egkoJQ2ja6LEvo= github.com/go-delve/liner v1.2.3-0.20220127212407-d32d89dd2a5d/go.mod h1:biJCRbqp51wS+I92HMqn5H8/A0PAhxn2vyOT+JqhiGI= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -243,15 +248,12 @@ github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+W github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY= github.com/go-toolsmith/astequal v1.0.1 h1:JbSszi42Jiqu36Gnf363HWS9MTEAz67vTQLponh3Moc= github.com/go-toolsmith/astequal v1.0.1/go.mod h1:4oGA3EZXTVItV/ipGiOx7NWkY5veFfcsOJVS2YxltLw= -github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= github.com/go-toolsmith/astinfo v1.0.0 h1:rNuhpyhsnsze/Pe1l/GUHwxo1rmN7Dyb6oAnFcrXh+w= github.com/go-toolsmith/astinfo v1.0.0/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU= -github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc= github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5 h1:eD9POs68PHkwrx7hAB78z1cb6PfGq/jyWn3wJywsH1o= github.com/go-toolsmith/pkgload v1.0.2-0.20220101231613-e814995d17c5/go.mod h1:3NAwwmD4uY/yggRxoEjk/S00MIV3A+H7rrE3i87eYxM= github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= -github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk= github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= @@ -278,6 +280,7 @@ github.com/gobuffalo/packd v0.1.0/go.mod h1:M2Juc+hhDXf/PnmBANFCqx4DM3wRbgDvnVWe github.com/gobuffalo/packr/v2 v2.0.9/go.mod h1:emmyGweYTm6Kdper+iywB6YK5YzuKchGtJQZ0Odn4pQ= github.com/gobuffalo/packr/v2 v2.2.0/go.mod h1:CaAwI0GPIAv+5wKLtv8Afwl+Cm78K/I/VCm/3ptBN+0= github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754/go.mod h1:HhnNqWY95UYwwW3uSASeV7vtgYkT2t16hJgV3AEPUpw= +github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= @@ -351,8 +354,8 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-containerregistry v0.15.2 h1:MMkSh+tjSdnmJZO7ljvEqV1DjfekB6VUEAZgy3a+TQE= github.com/google/go-containerregistry v0.15.2/go.mod h1:wWK+LnOv4jXMM23IT/F1wdYftGWGr47Is8CG+pmHK1Q= -github.com/google/go-dap v0.7.0 h1:088PdKBUkxAxrXrnY8FREUJXpS6Y6jhAyZIuJv3OGOM= -github.com/google/go-dap v0.7.0/go.mod h1:5q8aYQFnHOAZEMP+6vmq25HKYAEwE+LF5yh7JKrrhSQ= +github.com/google/go-dap v0.9.1 h1:d8dETjgHMR9/xs+Xza+NrZmB7jxIS5OtM2uRsyJVA/c= +github.com/google/go-dap v0.9.1/go.mod h1:HAeyoSd2WIfTfg+0GRXcFrb+RnojAtGNh+k+XTIxJDE= github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= github.com/google/go-github/v33 v33.0.0 h1:qAf9yP0qc54ufQxzwv+u9H0tiVOnPJxo0lI/JXqw3ZM= github.com/google/go-github/v33 v33.0.0/go.mod h1:GMdDnVZY/2TsWgp/lkYnpSAh6TrzhANBBwm6k6TTEXg= @@ -379,8 +382,8 @@ github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20211214055906-6f57359322fd/go.mod h1:KgnwoLYCZ8IQu3XUZ8Nc/bM9CCZFOyjUNOSygVozoDg= -github.com/google/pprof v0.0.0-20230510103437-eeec1cb781c3 h1:2XF1Vzq06X+inNqgJ9tRnGuw+ZVCB3FazXODD6JE1R8= -github.com/google/pprof v0.0.0-20230510103437-eeec1cb781c3/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= +github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8 h1:n6vlPhxsA+BW/XsS5+uqi7GyzaLa5MH7qlSLBZtRdiA= +github.com/google/pprof v0.0.0-20230705174524-200ffdc848b8/go.mod h1:Jh3hGz2jkYak8qXPD19ryItVnUgpgeqzdkY/D0EaeuA= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -465,6 +468,8 @@ github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0 github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/jhump/protoreflect v1.15.1 h1:HUMERORf3I3ZdX05WaQ6MIpd/NJ434hTp5YiKgfCL6c= +github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= +github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= @@ -484,8 +489,8 @@ github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= -github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -509,8 +514,8 @@ github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lyft/protoc-gen-star/v2 v2.0.3 h1:/3+/2sWyXeMLzKd1bX+ixWKgEMsULrIivpDsuaF441o= github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= -github.com/magiconair/properties v1.8.6/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= +github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= +github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= @@ -519,11 +524,14 @@ github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJ github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2/go.mod h1:Ld9puTsIW75CHf65OeIOkyKbteujpZVXDpWK6YGZbxE= github.com/markbates/safe v1.0.1/go.mod h1:nAqgmRi7cY2nqMc92/bSEeQA+R4OheNU2T1kNSCBdG0= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.12 h1:jF+Du6AlPIjs2BiUiQlKOX0rt3SujHxPnksPKZbaA40= github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= +github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= @@ -565,17 +573,15 @@ github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.1.0-rc3 h1:fzg1mXZFj8YdPeNkRXMg+zb88BFV0Ys52cJydRwBkb8= -github.com/opencontainers/image-spec v1.1.0-rc3/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= +github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= +github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE= -github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= -github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= -github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -599,8 +605,8 @@ github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/quasilyte/go-consistent v0.0.0-20200404105227-766526bf1e96 h1:6VBkISnfYpPtRvpE9wsVoxX+i0cDQFBPQPYzw259xWY= -github.com/quasilyte/go-consistent v0.0.0-20200404105227-766526bf1e96/go.mod h1:h5ob45vcE3sydtmo0lUDUmG3Y0HXudxMId1w+5G99VI= +github.com/quasilyte/go-consistent v0.6.0 h1:tY8DYfgM+7ADpOyr5X47i8hV/XbMNoucqnqZWVjI+rU= +github.com/quasilyte/go-consistent v0.6.0/go.mod h1:dKYK1JZl3150J1+Jh4cDYPCIu2MqybUBi0YVW2b2E6c= github.com/reva2/bitbucket-insights-api v1.0.0 h1:lpQ/Q7OmnG04w/EM77piOwZBxP41PeTlbytXxVrnplA= github.com/reva2/bitbucket-insights-api v1.0.0/go.mod h1:pLs+ki3MKUntrPryxaGIvpRLiEtBhwfJ/uvxQIMfqHU= github.com/reviewdog/errorformat v0.0.0-20220309155058-b075c45b6d9a h1:HIL+jTKsWmNT5WoTNwHQ0jUNJpFOmgeHLOsHMZInrF8= @@ -620,6 +626,9 @@ github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjR github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/cors v1.9.0 h1:l9HGsTsHJcvW14Nk7J9KFz8bzeAWXn3CG6bgt7LsrAE= github.com/rs/cors v1.9.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w= +github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -635,15 +644,15 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sirupsen/logrus v1.9.2 h1:oxx1eChJGI6Uks2ZC4W1zpLlVgqB8ner4EuQwV4Ik1Y= -github.com/sirupsen/logrus v1.9.2/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= +github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= +github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= @@ -660,8 +669,8 @@ github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnIn github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.12.0 h1:CZ7eSOd3kZoaYDLbXnmzgQI5RlciuXBMA+18HwHRfZQ= -github.com/spf13/viper v1.12.0/go.mod h1:b6COn30jlNxbm/V2IqWiNWkJ+vZNiMNksliPCiuKtSI= +github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= +github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -674,16 +683,15 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= 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= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.4.0 h1:yAzM1+SmVcz5R4tXGsNMu1jUl2aOJXoiWUCEwwnGrvs= -github.com/subosito/gotenv v1.4.0/go.mod h1:mZd6rFysKEcUhUHXJk0C/08wAgyDBFuwEYL7vWWGaGo= +github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= +github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= github.com/tarm/serial v0.0.0-20180830185346-98f6abe2eb07/go.mod h1:kDXzergiv9cbyO7IOYJZWg1U88JhDg3PB6klq9Hg2pA= -github.com/tetratelabs/wazero v1.1.0 h1:EByoAhC+QcYpwSZJSs/aV0uokxPwBgKxfiokSUwAknQ= -github.com/tetratelabs/wazero v1.1.0/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ= +github.com/tetratelabs/wazero v1.3.0 h1:nqw7zCldxE06B8zSZAY0ACrR9OH5QCcPwYmYlwtcwtE= +github.com/tetratelabs/wazero v1.3.0/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ= github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= @@ -694,8 +702,8 @@ github.com/vbatts/tar-split v0.11.3 h1:hLFqsOLQ1SsppQNTMpkpPXClLDfC2A3Zgy9OUU+RV github.com/vbatts/tar-split v0.11.3/go.mod h1:9QlHN18E+fEH7RdG+QAJJcuya3rqT7eXSTY7wGrAokY= github.com/vburenin/ifacemaker v1.2.1 h1:3Vq8B/bfBgjWTkv+jDg4dVL1KHt3k1K4lO7XRxYA2sk= github.com/vburenin/ifacemaker v1.2.1/go.mod h1:5WqrzX2aD7/hi+okBjcaEQJMg4lDGrpuEX3B8L4Wgrs= -github.com/vektra/mockery v1.1.2 h1:uc0Yn67rJpjt8U/mAZimdCKn9AeA97BOkjpmtBSlfP4= -github.com/vektra/mockery v1.1.2/go.mod h1:VcfZjKaFOPO+MpN4ZvwPjs4c48lkq1o3Ym8yHZJu0jU= +github.com/vektra/mockery/v2 v2.32.0 h1:IXUoQ3s5VxJPpi95DECUmkRUXZ44I1spQ3YatEypIF4= +github.com/vektra/mockery/v2 v2.32.0/go.mod h1:9lREs4VEeQiUS3rizYQx1saxHu2JiIhThP0q9+fDegM= github.com/vvakame/sdlog v0.0.0-20200409072131-7c0d359efddc h1:El7LEavRpa49dYFE9ezO8aQxQn5E7u7eQkFsaXsoQAY= github.com/vvakame/sdlog v0.0.0-20200409072131-7c0d359efddc/go.mod h1:MmhrKtbECoUJTctfak+MnOFoJ9XQqYZ7chcwV9O7v3I= github.com/xanzy/go-gitlab v0.63.0 h1:a9fXpKWykUS6dowapFej/2Wjf4aOAEFC1q2ZIcz4IpI= @@ -730,6 +738,7 @@ go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26 go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= +go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= go.starlark.net v0.0.0-20220816155156-cfacd8902214 h1:MqijAN3S61c7KWasOk+zIqIjHQPN6WUra/X3+YAkQxQ= @@ -766,8 +775,8 @@ golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220518034528-6f7dac969898/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.9.0 h1:LF6fAI+IutBocDJ2OT0Q1g8plpYljMZ4+lty+dsqw3g= -golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0= +golang.org/x/crypto v0.11.0 h1:6Ewdq3tDic1mg5xRO4milcWCfMVQhI4NkqWWvqejpuA= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -805,8 +814,8 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 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= @@ -849,8 +858,8 @@ golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220517181318-183a9ca12b87/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0 h1:cfawfvKITfUsFCeJIHJrbSxpeu/E81khclypR0GVT50= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= golang.org/x/oauth2 v0.0.0-20170207211851-4464e7848382/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -880,8 +889,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -937,7 +946,6 @@ golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211117180635-dee7805ff2e1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220517195934-5e4e11fc645e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -945,13 +953,13 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220906165534-d0df966e6959/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= -golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.8.0 h1:n5xxQn2i3PC0yLAbjTpNT85q/Kgzcr2gIoX9OrJUols= -golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0 h1:3R7pNqamzBraeqj/Tj8qt1aQ2HpmlC+Cx/qL/7hn4/c= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -961,16 +969,15 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.9.0 h1:2sjJmO8cDvYveuX97RDLsxlyUxLl+GHoLxBiRdHllBE= -golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac h1:7zkz7BUtwNFFqcowJ+RIgu2MaV/MapERkDIy+mwPyjs= -golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.1.0 h1:xYY+Bajn2a7VBmTM5GikTmnK8ZuX8YgnQCqZpbBNtmA= +golang.org/x/time v0.1.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -1009,8 +1016,6 @@ golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapK golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200323144430-8dcfad9e016e/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200406213809-066fd1390ee0/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -1031,8 +1036,8 @@ golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.9.3 h1:Gn1I8+64MsuTb/HpH+LmQtNas23LhUVr3rYZ0eKuaMM= -golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= +golang.org/x/tools v0.11.0 h1:EMCa6U9S2LtZXLAMoWiR/R8dAQFRqbAitmbJ2UKhoi8= +golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= 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= @@ -1146,8 +1151,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= -google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -1158,8 +1163,8 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.66.6 h1:LATuAqN/shcYAOkv3wl2L4rkaKqkcgTBQjOyYDvcPKI= -gopkg.in/ini.v1 v1.66.6/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/reform.v1 v1.5.1 h1:7vhDFW1n1xAPC6oDSvIvVvpRkaRpXlxgJ4QB4s3aDdo= gopkg.in/reform.v1 v1.5.1/go.mod h1:AIv0CbDRJ0ljQwptGeaIXfpDRo02uJwTq92aMFELEeU= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= diff --git a/tools/tools.go b/tools/tools.go index 2253150a33..bbe45acd65 100644 --- a/tools/tools.go +++ b/tools/tools.go @@ -34,7 +34,7 @@ import ( _ "github.com/quasilyte/go-consistent" _ "github.com/reviewdog/reviewdog/cmd/reviewdog" _ "github.com/vburenin/ifacemaker" - _ "github.com/vektra/mockery/cmd/mockery" + _ "github.com/vektra/mockery/v2" _ "golang.org/x/perf/cmd/benchstat" _ "golang.org/x/tools/cmd/goimports" _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" @@ -53,7 +53,7 @@ import ( //go:generate go build -o ../bin/go-sumtype github.com/BurntSushi/go-sumtype //go:generate go build -o ../bin/gofumpt mvdan.cc/gofumpt //go:generate go build -o ../bin/goimports golang.org/x/tools/cmd/goimports -//go:generate go build -o ../bin/mockery github.com/vektra/mockery/cmd/mockery +//go:generate go build -o ../bin/mockery github.com/vektra/mockery/v2 //go:generate go build -o ../bin/protoc-gen-go google.golang.org/protobuf/cmd/protoc-gen-go //go:generate go build -o ../bin/protoc-gen-go-grpc google.golang.org/grpc/cmd/protoc-gen-go-grpc //go:generate go build -o ../bin/protoc-gen-grpc-gateway github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway diff --git a/update/.ansible-lint b/update/.ansible-lint index 15133722a9..29c64847a3 100644 --- a/update/.ansible-lint +++ b/update/.ansible-lint @@ -1,4 +1,13 @@ --- +# https://ansible.readthedocs.io/projects/lint/configuring/#ansible-lint-configuration + skip_list: - - "303" # "supervisorctl used in place of supervisorctl module" - but we need more control - - "403" # "Package installs should not use latest" - but we need it + - "303" # "supervisorctl used in place of supervisorctl module" - we need more control + - "403" # "Package installs should not use latest" - we need latest + +warn_list: # don't move to 'skip_list' - it will silence them completely + - literal-compare # Don't compare to literal True/False + - risky-file-permissions # File permissions unset or incorrect + - no-changed-when # Commands should not change things if nothing needs doing + - parser-error # AnsibleParserError + - ignore-errors # Use failed_when and specify error conditions instead of using ignore_errors diff --git a/update/.devcontainer/install-dev-tools.sh b/update/.devcontainer/install-dev-tools.sh index 130c967792..861f1aeed9 100755 --- a/update/.devcontainer/install-dev-tools.sh +++ b/update/.devcontainer/install-dev-tools.sh @@ -8,7 +8,7 @@ set -o errexit set -o xtrace # download (in the background) the same verison as used by PMM build process -curl -sS https://dl.google.com/go/go1.20.4.linux-amd64.tar.gz -o /tmp/golang.tar.gz & +curl -sS https://dl.google.com/go/go1.20.5.linux-amd64.tar.gz -o /tmp/golang.tar.gz & # to install man pages sed -i '/nodocs/d' /etc/yum.conf @@ -17,24 +17,29 @@ sed -i '/nodocs/d' /etc/yum.conf sed -i'' -e 's^/release/^/experimental/^' /etc/yum.repos.d/pmm2-server.repo percona-release enable original testing -# this mirror always fails, on both AWS and github -echo "exclude=mirror.es.its.nyu.edu" >> /etc/yum/pluginconf.d/fastestmirror.conf -yum clean plugins +RHEL=$(rpm --eval '%{rhel}') +if [ "$RHEL" = "7" ]; then + # this mirror always fails, on both AWS and github + echo "exclude=mirror.es.its.nyu.edu" >> /etc/yum/pluginconf.d/fastestmirror.conf + yum clean plugins + # https://stackoverflow.com/questions/26734777/yum-error-cannot-retrieve-metalink-for-repository-epel-please-verify-its-path + sed -i "s/metalink=https/metalink=http/" /etc/yum.repos.d/epel.repo +fi # reinstall with man pages yum install -y yum rpm yum reinstall -y yum rpm yum install -y gcc git make pkgconfig \ - ansible-lint ansible \ + ansible \ mc tmux psmisc lsof which iproute \ bash-completion \ man man-pages -if [ $(rpm --eval '%{rhel}') = '7' ]; then - yum install -y glibc-static bash-completion-extras +if [ "$RHEL" = '7' ]; then + yum install -y ansible-lint glibc-static bash-completion-extras else - yum install -y --enablerepo=ol9_codeready_builder glibc-static + yum install -y ansible-lint glibc-static --enablerepo=ol9_codeready_builder fi fg || true @@ -49,8 +54,7 @@ go env # use modules to install (in the background) tagged releases cd $(mktemp -d) go mod init tools -env GOPROXY=https://proxy.golang.org go get -v \ - github.com/go-delve/delve/cmd/dlv@latest & +env GOPROXY=https://proxy.golang.org go get -v github.com/go-delve/delve/cmd/dlv@latest & cd /root/go/src/github.com/percona/pmm make init diff --git a/update/Makefile b/update/Makefile index abe2a32ba8..fb3afa5c60 100644 --- a/update/Makefile +++ b/update/Makefile @@ -23,14 +23,16 @@ LD_FLAGS = -ldflags " \ -X 'github.com/percona/pmm/version.FullCommit=$(PMM_RELEASE_FULLCOMMIT)' \ -X 'github.com/percona/pmm/version.Branch=$(PMM_RELEASE_BRANCH)' \ " +prep: ## Mark the root directory of pmm as safe for OL9 + git config --global --add safe.directory /root/go/src/github.com/percona/pmm -release: ## Build pmm-update release binary +release: prep ## Build pmm-update release binary env CGO_ENABLED=0 go build -v $(LD_FLAGS) -o $(PMM_RELEASE_PATH)/pmm-update -install: ## Install pmm-update binary +install: prep ## Install pmm-update binary go build -v $(LD_FLAGS) -o $(GOBIN)/pmm-update . -install-race: ## Install pmm-update binary with race detector +install-race: prep ## Install pmm-update binary with race detector go build -v $(LD_FLAGS) -race -o $(GOBIN)/pmm-update . TEST_FLAGS ?= -timeout=60s -count=1 -v -p 1 diff --git a/update/ansible/playbook/tasks/files/pmm.ini b/update/ansible/playbook/tasks/files/pmm.ini new file mode 100644 index 0000000000..73e4cd9615 --- /dev/null +++ b/update/ansible/playbook/tasks/files/pmm.ini @@ -0,0 +1,130 @@ +[unix_http_server] +chmod = 0700 +username = dummy +password = dummy + +[supervisorctl] +username = dummy +password = dummy + +; we rewrite autostart to true during update or build. +[program:pmm-update-perform-init] +command = /usr/sbin/pmm-update -run-playbook -playbook=/usr/share/pmm-update/ansible/playbook/tasks/init.yml +directory = / +autorestart = unexpected +priority=-1 +exitcodes = 0 +autostart = false +startretries = 3 +startsecs = 1 +stopsignal = TERM +stopwaitsecs = 300 +stdout_logfile = /srv/logs/pmm-update-perform-init.log +stdout_logfile_maxbytes = 50MB +stdout_logfile_backups = 3 +redirect_stderr = true + +[program:postgresql] +priority = 1 +command = + /usr/pgsql-14/bin/postgres + -D /srv/postgres14 + -c shared_preload_libraries=pg_stat_statements + -c pg_stat_statements.max=10000 + -c pg_stat_statements.track=all + -c pg_stat_statements.save=off +user = postgres +autorestart = true +autostart = true +startretries = 10 +startsecs = 1 +stopsignal = INT ; Fast Shutdown mode +stopwaitsecs = 300 +; postgresql.conf contains settings to log to stdout, +; so we delegate logfile management to supervisord +stdout_logfile = /srv/logs/postgresql14.log +stdout_logfile_maxbytes = 30MB +stdout_logfile_backups = 2 +redirect_stderr = true + +[program:clickhouse] +priority = 2 +command = /usr/bin/clickhouse-server --config-file=/etc/clickhouse-server/config.xml +autorestart = true +autostart = true +startretries = 10 +startsecs = 1 +stopsignal = TERM +stopwaitsecs = 300 +; config.xml contains settings to log to stdout (console), +; so we delegate logfile managemenet to supervisord +stdout_logfile = /srv/logs/clickhouse-server.log +stdout_logfile_maxbytes = 50MB +stdout_logfile_backups = 2 +redirect_stderr = true + +[program:nginx] +priority = 4 +command = nginx +autorestart = true +autostart = true +startretries = 10 +startsecs = 1 +stopsignal = TERM +stopwaitsecs = 10 +; nginx.conf contains settings to log to /dev/sdtout and /dev/stderr, +; which allows supervisord to manage the logs further. +stdout_logfile = /srv/logs/nginx.log +stdout_logfile_maxbytes = 50MB +stdout_logfile_backups = 2 +redirect_stderr = true + +[program:pmm-managed] +priority = 14 +command = + /usr/sbin/pmm-managed + --victoriametrics-config=/etc/victoriametrics-promscrape.yml + --victoriametrics-url=http://127.0.0.1:9090/prometheus + --postgres-name=pmm-managed + --postgres-username=pmm-managed + --postgres-password=pmm-managed + --supervisord-config-dir=/etc/supervisord.d +autorestart = true +autostart = true +startretries = 1000 +startsecs = 1 +stopsignal = TERM +stopwaitsecs = 300 +stdout_logfile = /srv/logs/pmm-managed.log +stdout_logfile_maxbytes = 50MB +stdout_logfile_backups = 2 +redirect_stderr = true + +[program:pmm-agent] +priority = 15 +command = /usr/sbin/pmm-agent --config-file=/usr/local/percona/pmm2/config/pmm-agent.yaml +autorestart = true +autostart = true +startretries = 1000 +startsecs = 1 +stopsignal = TERM +stopwaitsecs = 10 +stdout_logfile = /srv/logs/pmm-agent.log +stdout_logfile_maxbytes = 50MB +stdout_logfile_backups = 2 +redirect_stderr = true + +[program:pmm-update-perform] +command = /usr/sbin/pmm-update -perform -playbook=/usr/share/pmm-update/ansible/playbook/tasks/update.yml +directory = / +autorestart = unexpected +exitcodes = 0 +autostart = false +startretries = 10 +startsecs = 1 +stopsignal = TERM +stopwaitsecs = 300 +stdout_logfile = /srv/logs/pmm-update-perform.log +stdout_logfile_maxbytes = 50MB +stdout_logfile_backups = 3 +redirect_stderr = true diff --git a/update/ansible/playbook/tasks/roles/clickhouse/tasks/main.yml b/update/ansible/playbook/tasks/roles/clickhouse/tasks/main.yml index 61ed5c7508..2fb89b954b 100644 --- a/update/ansible/playbook/tasks/roles/clickhouse/tasks/main.yml +++ b/update/ansible/playbook/tasks/roles/clickhouse/tasks/main.yml @@ -81,9 +81,9 @@ - name: Install clickhouse package yum: name: - - clickhouse-client-{{ clickhouse_version}} - - clickhouse-server-{{ clickhouse_version}} - - clickhouse-common-static-{{ clickhouse_version}} + - clickhouse-client-{{ clickhouse_version }} + - clickhouse-server-{{ clickhouse_version }} + - clickhouse-common-static-{{ clickhouse_version }} state: installed enablerepo: clickhouse ignore_errors: "{{ ansible_check_mode }}" # We don't have clickhouse repo when we run ansible with --check @@ -100,7 +100,7 @@ capabilities: path: /usr/bin/clickhouse state: absent - capability: "{{ item}}" + capability: "{{ item }}" loop: - cap_ipc_lock - cap_sys_nice diff --git a/update/ansible/playbook/tasks/roles/dashboards_upgrade/tasks/main.yml b/update/ansible/playbook/tasks/roles/dashboards_upgrade/tasks/main.yml index cda0d9ed08..7c5080cfa9 100644 --- a/update/ansible/playbook/tasks/roles/dashboards_upgrade/tasks/main.yml +++ b/update/ansible/playbook/tasks/roles/dashboards_upgrade/tasks/main.yml @@ -45,11 +45,19 @@ state: absent loop: "{{ plugin_list['files'] }}" -- name: Synchronization plugin +- name: Copy plugins to the plugin directory synchronize: src: /usr/share/percona-dashboards/panels/ dest: /srv/grafana/plugins/ +- name: Set permissions for the plugin directory + file: + path: "/srv/grafana/plugins" + state: directory + owner: grafana + group: grafana + mode: "0775" + - name: Check that the SQLite grafana database exists stat: path: /srv/grafana/grafana.db @@ -61,7 +69,6 @@ supervisorctl: name: grafana state: stopped - supervisorctl_path: supervisorctl become: true when: ansible_distribution == 'CentOS' and ansible_distribution_major_version == '7' ignore_errors: true @@ -97,11 +104,13 @@ changed_when: true when: sqlite_grafana.stat.exists +- name: Remove the old clickhouse plugin + shell: grafana cli --pluginsDir /srv/grafana/plugins plugins remove vertamedia-clickhouse-datasource || true + - name: Restart grafana with new plugins EL7 supervisorctl: name: grafana state: restarted - supervisorctl_path: supervisorctl become: true ignore_errors: true when: ansible_distribution == 'CentOS' and ansible_distribution_major_version == '7' diff --git a/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini b/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini index 49a8aab607..73a6ed90e7 100644 --- a/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini +++ b/update/ansible/playbook/tasks/roles/grafana/files/grafana.ini @@ -1,18 +1,6 @@ ##################### Grafana Configuration ##################### # Only changed settings. You can find default settings in /usr/share/grafana/conf/defaults.ini -#################################### Database #################################### -[database] -# You can configure the database connection by specifying type, host, name, user and password -# as separate properties or as on string using the url properties. - -# Either "mysql", "postgres" or "sqlite3", it's your choice -type = postgres -host = localhost -user = grafana -# If the password contains # or ; you have to wrap it with triple quotes. Ex """#password;""" -password = grafana - [paths] # Directory where grafana will automatically scan and look for plugins plugins = /srv/grafana/plugins diff --git a/update/ansible/playbook/tasks/roles/grafana/tasks/main.yml b/update/ansible/playbook/tasks/roles/grafana/tasks/main.yml index 6c53e92edf..cce395aa28 100644 --- a/update/ansible/playbook/tasks/roles/grafana/tasks/main.yml +++ b/update/ansible/playbook/tasks/roles/grafana/tasks/main.yml @@ -23,42 +23,6 @@ group: grafana mode: '0444' -- name: Check that the SQLite grafana database exists - stat: - path: /srv/grafana/grafana.db - register: sqlite_grafana - -- name: Temporary change database to SQLite - block: - - name: Remove database options (SQLite is default) - ini_file: - dest: /etc/grafana/grafana.ini - section: database - option: type - value: absent - - - name: Remove database host - ini_file: - dest: /etc/grafana/grafana.ini - section: database - option: host - state: absent - - - name: Remove database user - ini_file: - dest: /etc/grafana/grafana.ini - section: database - option: user - state: absent - - - name: Remove database password - ini_file: - dest: /etc/grafana/grafana.ini - section: database - option: password - state: absent - when: sqlite_grafana.stat.exists - - name: Create provisioning directory file: path: "/usr/share/grafana/conf/provisioning/{{ item }}" diff --git a/update/ansible/playbook/tasks/roles/initialization/tasks/main.yml b/update/ansible/playbook/tasks/roles/initialization/tasks/main.yml index f84e0a2616..7957b96ee6 100644 --- a/update/ansible/playbook/tasks/roles/initialization/tasks/main.yml +++ b/update/ansible/playbook/tasks/roles/initialization/tasks/main.yml @@ -1,10 +1,5 @@ --- # This role contains tasks executed during initialization of PMM Server -- name: Determine type of upgrade - set_fact: - ui_upgrade: False - when: ui_upgrade is undefined - # PMM-10858 - In certain environments, including AWS EC2, some of the # EPEL repository mirrors do not respond within the time limit defined @@ -17,6 +12,11 @@ command: yum-config-manager --setopt=epel.timeout=1 --save changed_when: True +- name: Clean yum metadata + command: yum clean metadata + become: true + changed_when: True + - name: Get current version slurp: src: /srv/grafana/PERCONA_DASHBOARDS_VERSION @@ -65,35 +65,3 @@ include_role: name: postgres when: is_postgres_11.stat.exists - -- name: Create grafana database in postgres - postgresql_db: - name: grafana - state: present - -- name: Create grafana user in postgres - postgresql_user: - db: grafana - name: grafana - password: grafana - priv: 'ALL' - expires: infinity - state: present - when: not ansible_check_mode - -- name: Run SQLite -> Postgres only for docker upgrade - block: - - name: Check that the SQLite grafana database exists - stat: - path: /srv/grafana/grafana.db - register: is_database_sqlite - - - name: Migrate Grafana database from SQLite to Postgresql - include_role: - name: sqlite-to-postgres - when: is_database_sqlite.stat.exists - tags: - - skip_ansible_lint # '503 Tasks that run when changed should likely be handlers'. - # We use current_version_file['failed'] because we don't want to run this on creating container - when: not ui_upgrade and current_version_file['failed'] == false - diff --git a/update/ansible/playbook/tasks/roles/postgres/tasks/main.yml b/update/ansible/playbook/tasks/roles/postgres/tasks/main.yml index 0bab71b74d..e70c17ca80 100644 --- a/update/ansible/playbook/tasks/roles/postgres/tasks/main.yml +++ b/update/ansible/playbook/tasks/roles/postgres/tasks/main.yml @@ -217,12 +217,26 @@ state: absent when: is_upgrade.stat.exists - - name: Reread supervisord configuration + - name: Reread supervisord configuration EL7 + when: is_upgrade.stat.exists and ansible_distribution == 'CentOS' and ansible_distribution_major_version == '7' + command: supervisorctl reread + + - name: Reread supervisord configuration EL9 + when: is_upgrade.stat.exists and (ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux') and ansible_distribution_major_version == '9' command: /usr/local/bin/supervisorctl reread become: true - when: is_upgrade.stat.exists - - name: Restart Postgres + - name: Restart Postgres | EL7 + command: supervisorctl {{ item }} postgresql + changed_when: True + become: true + loop: + - stop + - remove + - add + when: is_upgrade.stat.exists and ansible_distribution == 'CentOS' and ansible_distribution_major_version == '7' + + - name: Restart Postgres | EL9 command: /usr/local/bin/supervisorctl {{ item }} postgresql changed_when: True become: true @@ -230,7 +244,7 @@ - stop - remove - add - when: is_upgrade.stat.exists + when: is_upgrade.stat.exists and (ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux') and ansible_distribution_major_version == '9' - name: Run pmm-managed again | EL7 supervisorctl: diff --git a/update/ansible/playbook/tasks/roles/sqlite-to-postgres/tasks/main.yml b/update/ansible/playbook/tasks/roles/sqlite-to-postgres/tasks/main.yml deleted file mode 100644 index 3d035a4a5a..0000000000 --- a/update/ansible/playbook/tasks/roles/sqlite-to-postgres/tasks/main.yml +++ /dev/null @@ -1,122 +0,0 @@ ---- -- name: Create Grafana backup dir - file: - path: "/srv/backup/grafana" - state: directory - owner: grafana - group: grafana - mode: '0700' - -- name: Stop grafana before upgrade - supervisorctl: - name: 'grafana' - state: stopped - -- name: Create backup for SQLite Grafana database - copy: - src: /srv/grafana/grafana.db - dest: "/srv/backup/grafana/grafana.db" - owner: grafana - group: grafana - mode: '0700' - -- name: Remove all ` symbols in grafana dashboard description - command: sqlite3 /srv/grafana/grafana.db -cmd ".timeout 60000" "UPDATE dashboard SET data = REPLACE(data, '`', '');" - changed_when: True - -- name: Disable provisioning before change database - ini_file: - dest: /etc/grafana/grafana.ini - section: paths - option: provisioning - value: conf/provisioning_disable - -- name: Switch to postgres - ini_file: - dest: /etc/grafana/grafana.ini - section: database - option: type - value: postgres - -- name: Set database host - ini_file: - dest: /etc/grafana/grafana.ini - section: database - option: host - value: localhost - -- name: Set database user - ini_file: - dest: /etc/grafana/grafana.ini - section: database - option: user - value: grafana - -- name: Set database password - ini_file: - dest: /etc/grafana/grafana.ini - section: database - option: password - value: grafana - -- name: Start grafana again - supervisorctl: - name: grafana - state: restarted - ignore_errors: yes - -- name: Check if initial data were created - postgresql_query: - db: grafana - query: SELECT 1 FROM org WHERE id=1 - retries: 3 - delay: 3 - register: psql_result - until: psql_result.rowcount == 1 - when: not ansible_check_mode - -- name: Wait for grafana database initialization - pause: - seconds: 10 - -- name: Stop grafana before upgrade - supervisorctl: - name: grafana - state: stopped - -- name: Remove default admin user - postgresql_query: - db: grafana - query: DELETE FROM public.user WHERE login='admin' - when: not ansible_check_mode - -- name: Run grafana migrator - command: grafana-db-migrator --change-char-to-text --reset-home-dashboard /srv/grafana/grafana.db "postgres://grafana:grafana@localhost:5432/grafana?sslmode=disable" - register: migrator_output - changed_when: "'All done' in migrator_output.stdout" - -- name: Enable provisioning after change database - ini_file: - dest: /etc/grafana/grafana.ini - section: paths - option: provisioning - value: conf/provisioning - -- name: Start grafana again - supervisorctl: - name: grafana - state: restarted - -- name: Wait for grafana initialization - pause: - seconds: 5 - -- name: Fix database/folder relationship - command: grafana-db-migrator --fix-folders-id /srv/grafana/grafana.db "postgres://grafana:grafana@localhost:5432/grafana?sslmode=disable" - register: migrator_output - changed_when: "'All done' in migrator_output.stdout" - -- name: Remove SQLite Grafana database - file: - path: /srv/grafana/grafana.db - state: absent diff --git a/update/ansible/playbook/tasks/update.yml b/update/ansible/playbook/tasks/update.yml index 39ca84dca7..48432dd482 100644 --- a/update/ansible/playbook/tasks/update.yml +++ b/update/ansible/playbook/tasks/update.yml @@ -20,7 +20,6 @@ - pmm2-client - pmm-dump - vmproxy - - grafana-db-migrator pre_tasks: - name: detect /srv/pmm-distribution stat: @@ -58,10 +57,31 @@ state: directory - name: Upgrade supervisor config + copy: + src: pmm.ini + dest: /etc/supervisord.d/pmm.ini + + - name: Generate new supervisor config command: pmm-managed-init register: managed_init_result changed_when: True + - name: Update postgresql version_1 + command: sed -i 's:-D /srv/postgres$:-D /srv/postgres14:' /etc/supervisord.d/pmm.ini + changed_when: true + + - name: Update postgresql version_2 + command: sed -i 's:/usr/pgsql/bin/postgres:/usr/pgsql-14/bin/postgres:' /etc/supervisord.d/pmm.ini + changed_when: true + + - name: Update postgresql version_3 + command: sed -i 's:/srv/logs/postgresql.log:/srv/logs/postgresql14.log:' /etc/supervisord.d/pmm.ini + changed_when: true + + - name: Update postgresql version_4 + command: sed -i 's:/usr/pgsql-11/bin/postgres:/usr/pgsql-14/bin/postgres:' /etc/supervisord.d/pmm.ini + changed_when: true + - name: Disable pmm-update-perform-init ini_file: path: /etc/supervisord.d/pmm.ini @@ -129,16 +149,9 @@ when: is_docker and not is_supervisor_running.stat.exists and (ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux') and ansible_distribution_major_version == '9' shell: /usr/local/bin/supervisord -c /etc/supervisord.conf & - - name: Wait until postgres port is present before continuing - wait_for: - host: localhost - port: 5432 - - name: Run initialization playbook include_role: name: initialization - vars: - ui_upgrade: True - name: Enable crond service when: not is_docker @@ -190,6 +203,13 @@ - skip_ansible_lint # '503 Tasks that run when changed should likely be handlers'. # The handler looks bad in this case + # TODO: join with the command above + - name: Cleanup yum metadata + command: yum clean metadata + become: true + tags: + - skip_ansible_lint + # Split download and update to produce a bit more of progress output. - name: Download pmm2 packages yum: @@ -202,7 +222,13 @@ name: "{{ pmm_packages }}" state: latest - # restart pmm-managed first as it may update supervisord configuration on start + + # restart pmm-managed-init and pmm-managed first as they may update supervisord configuration on start + - name: Generate new supervisor config + command: pmm-managed-init + register: managed_init_result + changed_when: True + - name: Restart pmm-managed EL7 when: ansible_distribution == 'CentOS' and ansible_distribution_major_version == '7' command: supervisorctl {{ item }} pmm-managed @@ -239,6 +265,7 @@ - tzdata - libssh2 - sshpass + - vi - name: Install nginx include_role: @@ -388,29 +415,6 @@ - name: Print other services's logs debug: var=update_result.stdout_lines - - name: Check that the SQLite grafana database exists - stat: - path: /srv/grafana/grafana.db - register: is_database_sqlite - - - name: Migrate Grafana database from SQLite to Postgresql - include_role: - name: sqlite-to-postgres - when: is_database_sqlite.stat.exists - tags: - - skip_ansible_lint # '503 Tasks that run when changed should likely be handlers'. - - - name: Fix grafana fields type - postgresql_query: - db: grafana - query: "{{ item }}" - loop: - - ALTER TABLE tag ALTER COLUMN key TYPE text; - - ALTER TABLE tag ALTER COLUMN value TYPE text; - - ALTER TABLE api_key ALTER COLUMN key TYPE text; - - ALTER TABLE api_key ALTER COLUMN name TYPE text; - when: not ansible_check_mode - # SIGUSR2 is sent to supervisord by pmm-managed right before the update for logging to work correctly. # We use that fact to show what was restarted during the update. - name: Get supervisord logs EL7 @@ -432,5 +436,3 @@ file: state: absent path: /var/cache/yum - - diff --git a/update/docker-compose.yml b/update/docker-compose.yml index 30e80f28b8..5be6dd1cbf 100644 --- a/update/docker-compose.yml +++ b/update/docker-compose.yml @@ -1,5 +1,4 @@ --- -version: '3' services: pmm-update-server: image: ${PMM_SERVER_IMAGE:-percona/pmm-server:2} @@ -7,7 +6,7 @@ services: environment: # for tests - PMM_SERVER_IMAGE=${PMM_SERVER_IMAGE:-percona/pmm-server:2} - - GO_VERSION=${GO_VERSION:-1.17.x} + - GO_VERSION=${GO_VERSION:-1.20.x} - PATH=/root/go/bin:$PATH - REVIEWDOG_GITHUB_API_TOKEN=${REVIEWDOG_GITHUB_API_TOKEN} volumes: diff --git a/update/pkg/yum/info.go b/update/pkg/yum/info.go index cd37f46d2f..f705d2922e 100644 --- a/update/pkg/yum/info.go +++ b/update/pkg/yum/info.go @@ -17,6 +17,7 @@ package yum import ( + "os/exec" "regexp" "strings" "time" @@ -25,7 +26,7 @@ import ( ) // parseInfo parses `yum info` stdout for a single version of a single package. -// also used to parse `yum repoinfo`. +// Also used to parse `yum repoinfo`. func parseInfo(lines []string, firstKey string) (map[string]string, error) { res := make(map[string]string) var prevKey string @@ -67,7 +68,12 @@ func parseInfo(lines []string, firstKey string) (map[string]string, error) { } func parseInfoTime(s string) (time.Time, error) { - return time.Parse("Mon Jan 2 15:04:05 2006", s) + layout := "Mon 2 Jan 2006 15:04:05 PM UTC" // layout for EL9, default + v, err := getRHELVersion() + if err == nil && v == "7" { + layout = "Mon Jan 2 15:04:05 2006" // change the layout for EL7 + } + return time.Parse(layout, s) } // fullVersion returns full (ugly) package version. @@ -100,3 +106,12 @@ func niceVersion(info map[string]string) string { } return info["Version"] } + +func getRHELVersion() (string, error) { + raw, err := exec.Command("rpm", "--eval", "%{rhel}").Output() + if err != nil { + return "", errors.Wrap(err, "couldn't get RHEL version") + } + + return strings.TrimSpace(string(raw)), nil +} diff --git a/update/pkg/yum/info_test.go b/update/pkg/yum/info_test.go index c0488cb18d..d8cc827c80 100644 --- a/update/pkg/yum/info_test.go +++ b/update/pkg/yum/info_test.go @@ -24,7 +24,11 @@ import ( "github.com/stretchr/testify/require" ) -func TestParseInfo(t *testing.T) { +func TestParseInfoEL7(t *testing.T) { + v, _ := getRHELVersion() + if v == "9" { + t.Skip("Skip running EL7 tests on EL9") + } t.Run("Installed", func(t *testing.T) { stdout := strings.Split(` Loading "fastestmirror" plugin @@ -147,7 +151,7 @@ func TestParseInfo(t *testing.T) { }) t.Run("Available", func(t *testing.T) { - // yum --verbose --showduplicates info available pmm-update, abbrivated + // yum --verbose --showduplicates info available pmm-update, abbreviated stdout := strings.Split(` Loading "fastestmirror" plugin Loading "ovl" plugin @@ -219,7 +223,7 @@ func TestParseInfo(t *testing.T) { }) t.Run("AvailableGA", func(t *testing.T) { - // yum --verbose --showduplicates info available pmm-update, abbrivated + // yum --verbose --showduplicates info available pmm-update, abbreviated stdout := strings.Split(` Available Packages Name : pmm-update @@ -337,3 +341,343 @@ func TestParseInfo(t *testing.T) { assert.Equal(t, time.Date(2021, 6, 1, 15, 30, 45, 0, time.UTC), releasetime) }) } + +func TestParseInfoEL9(t *testing.T) { + v, _ := getRHELVersion() + if v == "7" { + t.Skip("Skip running EL9 tests on EL7") + } + t.Run("Installed EL9", func(t *testing.T) { + stdout := strings.Split(` + Starting "yum --verbose info installed pmm-managed" ... + Loaded plugins: builddep, changelog, config-manager, copr, debug, debuginfo-install, download, generate_completion_cache, groups-manager, needs-restarting, playground, repoclosure, repodiff, repograph, repomanage, reposync, system-upgrade + YUM version: 4.14.0 + cachedir: /var/cache/dnf + Unknown configuration option: async = 1 in /etc/yum.repos.d/clickhouse.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/local.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/nginx.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/percona-ppg-11.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/percona-ppg-14.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/pmm2-server.repo + User-Agent: constructed: 'libdnf (Oracle Linux Server 9.2; server; Linux.x86_64)' + Installed Packages + Name : pmm-managed + Version : 2.39.0 + Release : 20.2306271313.b6d58b6.el9 + Architecture : x86_64 + Size : 125 M + Source : pmm-managed-2.39.0-20.2306271313.b6d58b6.el9.src.rpm + Repository : @System + From repo : local + Packager : None + Buildtime : Tue 27 Jun 2023 01:13:03 PM UTC + Install time : Tue 27 Jun 2023 01:31:05 PM UTC + Installed by : System + Summary : Percona Monitoring and Management management daemon + URL : https://github.com/percona/pmm + License : AGPLv3 + Description : pmm-managed manages configuration of PMM server components (VictoriaMetrics, + : Grafana, etc.) and exposes API for that. Those APIs are used by pmm-admin tool. + : See PMM docs for more information. + `, "\n") + expected := map[string]string{ + "Name": "pmm-managed", + "Version": "2.39.0", + "Release": "20.2306271313.b6d58b6.el9", + "Architecture": "x86_64", + "Size": "125 M", + "Source": "pmm-managed-2.39.0-20.2306271313.b6d58b6.el9.src.rpm", + "Repository": "@System", + "From repo": "local", + "Packager": "None", + "Buildtime": "Tue 27 Jun 2023 01:13:03 PM UTC", + "Install time": "Tue 27 Jun 2023 01:31:05 PM UTC", + "Installed by": "System ", + "Summary": "Percona Monitoring and Management management daemon", + "URL": "https://github.com/percona/pmm", + "License": "AGPLv3", + "Description": "pmm-managed manages configuration of PMM server components (VictoriaMetrics, " + + "Grafana, etc.) and exposes API for that. Those APIs are used by pmm-admin tool. " + + "See PMM docs for more information.", + } + actual, err := parseInfo(stdout, "Name") + require.NoError(t, err) + assert.Equal(t, expected, actual) + buildtime, err := parseInfoTime(actual["Buildtime"]) + require.NoError(t, err) + assert.Equal(t, time.Date(2023, 6, 27, 13, 13, 3, 0, time.UTC), buildtime) + assert.Equal(t, "2.39.0-20.2306271313.b6d58b6.el9", fullVersion(actual)) + assert.Equal(t, "2.39.0", niceVersion(actual)) + }) + + t.Run("Updates EL9", func(t *testing.T) { + // yum --verbose info updates pmm-update + stdout := strings.Split(` + Loaded plugins: builddep, changelog, config-manager, copr, debug, debuginfo-install, download, generate_completion_cache, groups-manager, needs-restarting, playground, repoclosure, repodiff, repograph, repomanage, reposync, system-upgrade + YUM version: 4.14.0 + cachedir: /var/cache/dnf + Unknown configuration option: async = 1 in /etc/yum.repos.d/clickhouse.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/local.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/nginx.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/percona-ppg-11.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/percona-ppg-14.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/pmm2-server.repo + User-Agent: constructed: 'libdnf (Oracle Linux Server 9.2; server; Linux.x86_64)' + repo: using cache for: ol9_developer_EPEL + ol9_developer_EPEL: using metadata from Wed 28 Jun 2023 02:28:50 PM UTC. + repo: using cache for: ol9_baseos_latest + ol9_baseos_latest: using metadata from Fri 23 Jun 2023 04:59:24 AM UTC. + repo: using cache for: ol9_appstream + ol9_appstream: using metadata from Fri 23 Jun 2023 05:03:17 AM UTC. + repo: using cache for: percona-release-x86_64 + percona-release-x86_64: using metadata from Mon 26 Jun 2023 01:02:27 PM UTC. + repo: using cache for: percona-release-noarch + percona-release-noarch: using metadata from Wed 06 Jul 2022 08:25:44 PM UTC. + repo: using cache for: percona-testing-x86_64 + percona-testing-x86_64: using metadata from Wed 28 Jun 2023 05:27:06 PM UTC. + repo: using cache for: percona-testing-noarch + percona-testing-noarch: using metadata from Wed 06 Jul 2022 08:20:55 PM UTC. + repo: using cache for: percona-ppg-11 + percona-ppg-11: using metadata from Mon 22 May 2023 08:40:15 AM UTC. + repo: using cache for: percona-ppg-14 + percona-ppg-14: using metadata from Wed 28 Jun 2023 02:57:51 PM UTC. + repo: using cache for: prel-release-noarch + prel-release-noarch: using metadata from Thu 16 Sep 2021 06:35:55 AM UTC. + repo: using cache for: pmm2-server + pmm2-server: using metadata from Wed 28 Jun 2023 02:46:09 PM UTC. + Last metadata expiration check: 1:42:51 ago on Wed 28 Jun 2023 07:06:43 PM UTC. + Available Upgrades + Name : pmm-update + Version : 2.39.0 + Release : 67.2306281336.d0d7fcb.el9 + Architecture : noarch + Size : 886 k + Source : pmm-update-2.39.0-67.2306281336.d0d7fcb.el9.src.rpm + Repository : pmm2-server + Packager : None + Buildtime : Wed 28 Jun 2023 01:36:03 PM UTC + Summary : Tool for updating packages and OS configuration for PMM Server + URL : https://github.com/percona/pmm + License : AGPLv3 + Description : Tool for updating packages and OS configuration for PMM Server + `, "\n") + expected := map[string]string{ + "Name": "pmm-update", + "Architecture": "noarch", + "Version": "2.39.0", + "Release": "67.2306281336.d0d7fcb.el9", + "Size": "886 k", + "Source": "pmm-update-2.39.0-67.2306281336.d0d7fcb.el9.src.rpm", + "Repository": "pmm2-server", + "Packager": "None", + "Buildtime": "Wed 28 Jun 2023 01:36:03 PM UTC", + "Summary": "Tool for updating packages and OS configuration for PMM Server", + "URL": "https://github.com/percona/pmm", + "License": "AGPLv3", + "Description": "Tool for updating packages and OS configuration for PMM Server", + } + actual, err := parseInfo(stdout, "Name") + require.NoError(t, err) + assert.Equal(t, expected, actual) + buildtime, err := parseInfoTime(actual["Buildtime"]) + require.NoError(t, err) + assert.Equal(t, time.Date(2023, 6, 28, 13, 36, 3, 0, time.UTC), buildtime) + assert.Equal(t, "2.39.0-67.2306281336.d0d7fcb.el9", fullVersion(actual)) + assert.Equal(t, "2.39.0", niceVersion(actual)) + }) + + t.Run("AvailableGA EL9", func(t *testing.T) { + // yum --verbose --showduplicates info available pmm-update (just two versions) + stdout := strings.Split(` + Loaded plugins: builddep, changelog, config-manager, copr, debug, debuginfo-install, download, generate_completion_cache, groups-manager, needs-restarting, playground, repoclosure, repodiff, repograph, repomanage, reposync, system-upgrade + YUM version: 4.14.0 + cachedir: /var/cache/dnf + Unknown configuration option: async = 1 in /etc/yum.repos.d/clickhouse.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/local.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/nginx.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/percona-ppg-11.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/percona-ppg-14.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/pmm2-server.repo + User-Agent: constructed: 'libdnf (Oracle Linux Server 9.2; server; Linux.x86_64)' + repo: using cache for: ol9_developer_EPEL + ol9_developer_EPEL: using metadata from Wed 28 Jun 2023 02:28:50 PM UTC. + repo: using cache for: ol9_baseos_latest + ol9_baseos_latest: using metadata from Fri 23 Jun 2023 04:59:24 AM UTC. + repo: using cache for: ol9_appstream + ol9_appstream: using metadata from Fri 23 Jun 2023 05:03:17 AM UTC. + repo: using cache for: percona-release-x86_64 + percona-release-x86_64: using metadata from Mon 26 Jun 2023 01:02:27 PM UTC. + repo: using cache for: percona-release-noarch + percona-release-noarch: using metadata from Wed 06 Jul 2022 08:25:44 PM UTC. + repo: using cache for: percona-testing-x86_64 + percona-testing-x86_64: using metadata from Wed 28 Jun 2023 05:27:06 PM UTC. + repo: using cache for: percona-testing-noarch + percona-testing-noarch: using metadata from Wed 06 Jul 2022 08:20:55 PM UTC. + repo: using cache for: percona-ppg-11 + percona-ppg-11: using metadata from Mon 22 May 2023 08:40:15 AM UTC. + repo: using cache for: percona-ppg-14 + percona-ppg-14: using metadata from Wed 28 Jun 2023 02:57:51 PM UTC. + repo: using cache for: prel-release-noarch + prel-release-noarch: using metadata from Thu 16 Sep 2021 06:35:55 AM UTC. + repo: using cache for: pmm2-server + pmm2-server: using metadata from Wed 28 Jun 2023 02:46:09 PM UTC. + Last metadata expiration check: 1:18:00 ago on Wed 28 Jun 2023 07:06:43 PM UTC. + Available Packages + Name : pmm-update + Version : 2.39.0 + Release : 67.2306280932.70f3748.el9 + Architecture : noarch + Size : 887 k + Source : pmm-update-2.39.0-67.2306280932.70f3748.el9.src.rpm + Repository : pmm2-server + Packager : None + Buildtime : Wed 28 Jun 2023 09:32:21 AM UTC + Summary : Tool for updating packages and OS configuration for PMM Server + URL : https://github.com/percona/pmm + License : AGPLv3 + Description : Tool for updating packages and OS configuration for PMM Server + + Name : pmm-update + Version : 2.39.0 + Release : 67.2306281012.fe8e947.el9 + Architecture : noarch + Size : 887 k + Source : pmm-update-2.39.0-67.2306281012.fe8e947.el9.src.rpm + Repository : pmm2-server + Packager : None + Buildtime : Wed 28 Jun 2023 10:12:02 AM UTC + Summary : Tool for updating packages and OS configuration for PMM Server + URL : https://github.com/percona/pmm + License : AGPLv3 + Description : Tool for updating packages and OS configuration for PMM Server + `, "\n") + expected := map[string]string{ + "Name": "pmm-update", + "Architecture": "noarch", + "Version": "2.39.0", + "Release": "67.2306280932.70f3748.el9", + "Size": "887 k", + "Source": "pmm-update-2.39.0-67.2306280932.70f3748.el9.src.rpm", + "Repository": "pmm2-server", + "Packager": "None", + "Buildtime": "Wed 28 Jun 2023 09:32:21 AM UTC", + "Summary": "Tool for updating packages and OS configuration for PMM Server", + "URL": "https://github.com/percona/pmm", + "License": "AGPLv3", + "Description": "Tool for updating packages and OS configuration for PMM Server", + } + actual, err := parseInfo(stdout, "Name") + assert.EqualError(t, err, "second `Name` encountered") + assert.Equal(t, expected, actual) + buildtime, err := parseInfoTime(actual["Buildtime"]) + require.NoError(t, err) + assert.Equal(t, time.Date(2023, 6, 28, 9, 32, 21, 0, time.UTC), buildtime) + assert.Equal(t, "2.39.0-67.2306280932.70f3748.el9", fullVersion(actual)) + assert.Equal(t, "2.39.0", niceVersion(actual)) + }) + + t.Run("Empty EL9", func(t *testing.T) { + // yum --verbose info updates pmm-managed + // "Error: No matching Packages to list" goes to stderr. + // The output below is generated when there are no updates available. + stdout := strings.Split(` + Loaded plugins: builddep, changelog, config-manager, copr, debug, debuginfo-install, download, generate_completion_cache, groups-manager, needs-restarting, playground, repoclosure, repodiff, repograph, repomanage, reposync, system-upgrade + YUM version: 4.14.0 + cachedir: /var/cache/dnf + Unknown configuration option: async = 1 in /etc/yum.repos.d/clickhouse.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/local.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/nginx.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/percona-ppg-11.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/percona-ppg-14.repo + Unknown configuration option: async = 1 in /etc/yum.repos.d/pmm2-server.repo + User-Agent: constructed: 'libdnf (Oracle Linux Server 9.2; server; Linux.x86_64)' + repo: using cache for: ol9_developer_EPEL + ol9_developer_EPEL: using metadata from Wed 28 Jun 2023 02:28:50 PM UTC. + repo: using cache for: ol9_baseos_latest + ol9_baseos_latest: using metadata from Fri 23 Jun 2023 04:59:24 AM UTC. + repo: using cache for: ol9_appstream + ol9_appstream: using metadata from Fri 23 Jun 2023 05:03:17 AM UTC. + repo: using cache for: percona-release-x86_64 + percona-release-x86_64: using metadata from Mon 26 Jun 2023 01:02:27 PM UTC. + repo: using cache for: percona-release-noarch + percona-release-noarch: using metadata from Wed 06 Jul 2022 08:25:44 PM UTC. + repo: using cache for: percona-testing-x86_64 + percona-testing-x86_64: using metadata from Wed 28 Jun 2023 05:27:06 PM UTC. + repo: using cache for: percona-testing-noarch + percona-testing-noarch: using metadata from Wed 06 Jul 2022 08:20:55 PM UTC. + repo: using cache for: percona-ppg-11 + percona-ppg-11: using metadata from Mon 22 May 2023 08:40:15 AM UTC. + repo: using cache for: percona-ppg-14 + percona-ppg-14: using metadata from Wed 28 Jun 2023 02:57:51 PM UTC. + repo: using cache for: prel-release-noarch + prel-release-noarch: using metadata from Thu 16 Sep 2021 06:35:55 AM UTC. + repo: using cache for: pmm2-server + pmm2-server: using metadata from Wed 28 Jun 2023 02:46:09 PM UTC. + Last metadata expiration check: 0:59:54 ago on Wed 28 Jun 2023 07:06:43 PM UTC. + `, "\n") + actual, err := parseInfo(stdout, "Name") + require.NoError(t, err) + assert.Empty(t, actual) + }) + + t.Run("RepoInfo EL9", func(t *testing.T) { + // yum repoinfo pmm2-server. + stdout := strings.Split(` + Last metadata expiration check: 9:26:06 ago on Wed 28 Jun 2023 09:26:18 AM UTC. + Repo-id : pmm2-server + Repo-name : PMM Server YUM repository - x86_64 + Repo-status : enabled + Repo-revision : 1687873070 + Repo-updated : Tue 27 Jun 2023 01:25:23 PM UTC + Repo-pkgs : 478 + Repo-available-pkgs: 478 + Repo-size : 3.7 G + Repo-baseurl : https://repo.percona.com/pmm2-components/yum/experimental/9/RPMS/x86_64/ + Repo-expire : 172,800 second(s) (last: Wed 28 Jun 2023 09:26:18 AM UTC) + Repo-filename : /etc/yum.repos.d/pmm2-server.repo + Total packages: 478 + `, "\n") + expected := map[string]string{ + "Repo-id": "pmm2-server", + "Repo-name": "PMM Server YUM repository - x86_64", + "Repo-status": "enabled", + "Repo-revision": "1687873070", + "Repo-updated": "Tue 27 Jun 2023 01:25:23 PM UTC", + "Repo-pkgs": "478", + "Repo-available-pkgs": "478", + "Repo-size": "3.7 G", + "Repo-baseurl": "https://repo.percona.com/pmm2-components/yum/experimental/9/RPMS/x86_64/", + "Repo-expire": "172,800 second(s) (last: Wed 28 Jun 2023 09:26:18 AM UTC)", + "Repo-filename": "/etc/yum.repos.d/pmm2-server.repo", + "Total packages": "478", + } + actual, err := parseInfo(stdout, "Repo-id") + require.NoError(t, err) + assert.Equal(t, expected, actual) + releasetime, err := parseInfoTime(actual["Repo-updated"]) + require.NoError(t, err) + assert.Equal(t, time.Date(2023, time.June, 27, 13, 25, 23, 0, time.UTC), releasetime) + }) +} + +func TestGetRHELVersion(t *testing.T) { + t.Run("getRHELVersion EL9", func(t *testing.T) { + actual, err := getRHELVersion() + if actual == "7" { + t.Skip("Skip running EL9 tests on EL7") + } + expected := "9" + require.NoError(t, err) + assert.Equal(t, expected, actual) + }) + + t.Run("getRHELVersion EL7", func(t *testing.T) { + actual, err := getRHELVersion() + if actual == "9" { + t.Skip("Skip running EL7 test on EL9") + } + expected := "7" + require.NoError(t, err) + assert.Equal(t, expected, actual) + }) +} diff --git a/update/pkg/yum/yum.go b/update/pkg/yum/yum.go index a4b46e78d6..f9b906f86d 100644 --- a/update/pkg/yum/yum.go +++ b/update/pkg/yum/yum.go @@ -84,6 +84,8 @@ func getReleaseTime(ctx context.Context, repo string) (string, error) { // Check returns up-to-date versions information for a package with given name. // It runs slowly. func Check(ctx context.Context, name string) (*version.UpdateCheckResult, error) { + repoPropName := "Repository" // default value for RHEL9 + installed, err := Installed(ctx, name) if err != nil { return nil, err @@ -108,14 +110,25 @@ func Check(ctx context.Context, name string) (*version.UpdateCheckResult, error) if err != nil { return nil, err } + + v, err := getRHELVersion() + if err == nil && v == "7" { + // change the prop name for EL7 + repoPropName = "Repo" + } + repo, ok := info[repoPropName] + if !ok { + return nil, errors.New("Repository field is not found in yum info") + } + res.Latest = version.PackageInfo{ Version: niceVersion(info), FullVersion: fullVersion(info), - Repo: info["Repo"], + Repo: repo, } // replace Buildtime with repo release time to show time of release. - repoUpdated, err := getReleaseTime(ctx, info["Repo"]) + repoUpdated, err := getReleaseTime(ctx, repo) if err != nil { return nil, err } diff --git a/utils/sqlmetrics/reform.go b/utils/sqlmetrics/reform.go index ffbe99a2e1..843ffced74 100644 --- a/utils/sqlmetrics/reform.go +++ b/utils/sqlmetrics/reform.go @@ -114,7 +114,7 @@ func (r *Reform) Reset() { } var ( - // check interfaces + // Check interfaces. _ reform.Logger = (*Reform)(nil) _ prom.Collector = (*Reform)(nil) ) diff --git a/vmproxy/main_test.go b/vmproxy/main_test.go index 48d132f500..c4d72f4287 100644 --- a/vmproxy/main_test.go +++ b/vmproxy/main_test.go @@ -27,6 +27,7 @@ func TestProxy(t *testing.T) { t.Parallel() t.Run("shall run proxy with no error", func(t *testing.T) { + t.Parallel() err := runProxy(flags{}, func(cfg proxy.Config) error { return nil }) diff --git a/vmproxy/proxy/proxy.go b/vmproxy/proxy/proxy.go index 907043345b..8fcb9e6683 100644 --- a/vmproxy/proxy/proxy.go +++ b/vmproxy/proxy/proxy.go @@ -26,6 +26,7 @@ import ( "net/url" "time" + "github.com/pkg/errors" "github.com/sirupsen/logrus" ) @@ -93,10 +94,8 @@ func director(target *url.URL, headerName string) func(*http.Request) { logrus.Error(err) } - if parsed != nil { - for _, f := range parsed { - q.Add("extra_filters[]", f) - } + for _, f := range parsed { + q.Add("extra_filters[]", f) } req.URL.RawQuery = q.Encode() @@ -121,13 +120,11 @@ func parseFilters(filters string) ([]string, error) { decoded, err := base64.StdEncoding.DecodeString(filters) if err != nil { - logrus.Errorf("Could not decode filters header. %v", err) - return nil, fmt.Errorf("could not decode filters header") + return nil, errors.Wrapf(err, "could not decode filters header") } if err := json.Unmarshal(decoded, &parsed); err != nil { - logrus.Errorf("Could not parse filters JSON. %v", err) - return nil, fmt.Errorf("could not parse filters JSON") + return nil, errors.Wrapf(err, "could not parse filters JSON") } return parsed, nil