From 0e70f5deaec67d4e47c820dbe775a13a2f506a57 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 16:20:48 +0300 Subject: [PATCH 01/44] Bump golang.org/x/tools from 0.19.0 to 0.20.0 (#2950) Bumps [golang.org/x/tools](https://github.com/golang/tools) from 0.19.0 to 0.20.0. - [Release notes](https://github.com/golang/tools/releases) - [Commits](https://github.com/golang/tools/compare/v0.19.0...v0.20.0) --- updated-dependencies: - dependency-name: golang.org/x/tools dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 10 +++++----- go.sum | 16 ++++++++-------- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 685a64e696..c13beed1ad 100644 --- a/go.mod +++ b/go.mod @@ -76,11 +76,11 @@ require ( github.com/stretchr/testify v1.9.0 go.mongodb.org/mongo-driver v1.14.0 go.starlark.net v0.0.0-20230717150657-8a3343210976 - golang.org/x/crypto v0.21.0 + golang.org/x/crypto v0.22.0 golang.org/x/sync v0.7.0 golang.org/x/sys v0.19.0 golang.org/x/text v0.14.0 - golang.org/x/tools v0.19.0 + golang.org/x/tools v0.20.0 google.golang.org/genproto/googleapis/api v0.0.0-20240227224415-6ceb2ff114de google.golang.org/genproto/googleapis/rpc v0.0.0-20240227224415-6ceb2ff114de google.golang.org/grpc v1.63.0 @@ -250,10 +250,10 @@ require ( github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect go.opentelemetry.io/otel v1.24.0 // indirect go.opentelemetry.io/otel/trace v1.24.0 // indirect - golang.org/x/mod v0.16.0 // indirect - golang.org/x/net v0.22.0 // indirect + golang.org/x/mod v0.17.0 // indirect + golang.org/x/net v0.24.0 // indirect golang.org/x/oauth2 v0.17.0 // indirect - golang.org/x/term v0.18.0 // indirect + golang.org/x/term v0.19.0 // indirect google.golang.org/appengine v1.6.8 // 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 c1f1563295..75895d9e06 100644 --- a/go.sum +++ b/go.sum @@ -875,8 +875,8 @@ 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.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.16.0 h1:QX4fJ0Rr5cPQCF7O9lh9Se4pmwfwskqZfq5moyldzic= -golang.org/x/mod v0.16.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= 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 +916,8 @@ golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc= -golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= +golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= +golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= 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= @@ -1011,8 +1011,8 @@ golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= -golang.org/x/term v0.18.0 h1:FcHjZXDMxI8mM3nwhX9HlKop4C0YQvCVCdwYl2wOtE8= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= +golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= 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= @@ -1090,8 +1090,8 @@ 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.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.19.0 h1:tfGCXNR1OsFG+sVdLAitlpjAvD/I6dHDKnYrpEZUHkw= -golang.org/x/tools v0.19.0/go.mod h1:qoJWxmGSIBmAeriMx19ogtrEPrGtDbPK634QFIcLAhc= +golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= +golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= 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= From 1d73b27b8478434f7329813160e5b986542fd312 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 8 Apr 2024 13:38:25 +0000 Subject: [PATCH 02/44] Bump github.com/apache/skywalking-eyes from 0.5.0 to 0.6.0 in /tools (#2949) Bumps [github.com/apache/skywalking-eyes](https://github.com/apache/skywalking-eyes) from 0.5.0 to 0.6.0. - [Release notes](https://github.com/apache/skywalking-eyes/releases) - [Changelog](https://github.com/apache/skywalking-eyes/blob/main/CHANGES.md) - [Commits](https://github.com/apache/skywalking-eyes/compare/v0.5.0...v0.6.0) --- updated-dependencies: - dependency-name: github.com/apache/skywalking-eyes dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/go.mod | 2 +- tools/go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tools/go.mod b/tools/go.mod index 9a7a76814e..49dc08d732 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -7,7 +7,7 @@ replace github.com/go-openapi/spec => github.com/Percona-Lab/spec v0.20.5-percon 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.5.0 + github.com/apache/skywalking-eyes v0.6.0 github.com/bufbuild/buf v1.29.0 github.com/daixiang0/gci v0.13.0 github.com/envoyproxy/protoc-gen-validate v1.0.4 diff --git a/tools/go.sum b/tools/go.sum index e0058e58d1..215f89c824 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -95,8 +95,8 @@ github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFI github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antlr4-go/antlr/v4 v4.13.0 h1:lxCg3LAv+EUK6t1i0y1V6/SLeUi0eKEKdhQAlS8TVTI= github.com/antlr4-go/antlr/v4 v4.13.0/go.mod h1:pfChB/xh/Unjila75QW7+VU4TSnWnnk9UTnmpPaOR2g= -github.com/apache/skywalking-eyes v0.5.0 h1:X41jAhmnJazHuR5mOGt1nZA7mFaAluf9mvB1JBzr5xI= -github.com/apache/skywalking-eyes v0.5.0/go.mod h1:rwVEbfh8GovISedSOc7nHGrcnkQ7sfTc31iYU5hSpEE= +github.com/apache/skywalking-eyes v0.6.0 h1:qlEE8Wgy6fKXusxAOrI7ANNdO9vKfiGNczI6kygMR4o= +github.com/apache/skywalking-eyes v0.6.0/go.mod h1:rwVEbfh8GovISedSOc7nHGrcnkQ7sfTc31iYU5hSpEE= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= From 4ffea7f5ace7a0c37f6c1ecdade4ea71f248c804 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Apr 2024 09:06:06 +0100 Subject: [PATCH 03/44] Bump @typescript-eslint/parser from 7.2.0 to 7.6.0 in /cli-tests (#2952) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 7.2.0 to 7.6.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.6.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 114 ++++++++++++++++++------------------ cli-tests/package.json | 2 +- 2 files changed, 59 insertions(+), 57 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 145e602b06..d8d8452670 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -12,7 +12,7 @@ "@types/luxon": "^3.4.0", "dotenv": "^16.4.0", "luxon": "^3.4.4", - "playwright": "^1.33.0", + "playwright": "^1.41.2", "promise-retry": "^2.0.1", "shelljs": "^0.8.5", "typescript": "^5.4.2" @@ -21,7 +21,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^7.3.1", - "@typescript-eslint/parser": "^7.2.0", + "@typescript-eslint/parser": "^7.6.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", @@ -343,19 +343,19 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", - "integrity": "sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.2.0", - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/typescript-estree": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/typescript-estree": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -371,16 +371,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.2.0.tgz", - "integrity": "sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz", + "integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0" + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -497,12 +497,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.2.0.tgz", - "integrity": "sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz", + "integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -510,22 +510,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.2.0.tgz", - "integrity": "sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz", + "integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "@typescript-eslint/visitor-keys": "7.2.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -547,9 +547,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -686,16 +686,16 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.2.0.tgz", - "integrity": "sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz", + "integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.2.0", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.6.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2595,29 +2595,31 @@ } }, "node_modules/playwright": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.33.0.tgz", - "integrity": "sha512-+zzU3V2TslRX2ETBRgQKsKytYBkJeLZ2xzUj4JohnZnxQnivoUvOvNbRBYWSYykQTO0Y4zb8NwZTYFUO+EpPBQ==", - "hasInstallScript": true, + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.43.0.tgz", + "integrity": "sha512-SiOKHbVjTSf6wHuGCbqrEyzlm6qvXcv7mENP+OZon1I07brfZLGdfWV0l/efAzVx7TF3Z45ov1gPEkku9q25YQ==", "dependencies": { - "playwright-core": "1.33.0" + "playwright-core": "1.43.0" }, "bin": { "playwright": "cli.js" }, "engines": { - "node": ">=14" + "node": ">=16" + }, + "optionalDependencies": { + "fsevents": "2.3.2" } }, "node_modules/playwright-core": { - "version": "1.33.0", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.33.0.tgz", - "integrity": "sha512-aizyPE1Cj62vAECdph1iaMILpT0WUDCq3E6rW6I+dleSbBoGbktvJtzS6VHkZ4DKNEOG9qJpiom/ZxO+S15LAw==", + "version": "1.43.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.43.0.tgz", + "integrity": "sha512-iWFjyBUH97+pUFiyTqSLd8cDMMOS0r2ZYz2qEsPjH8/bX++sbIJT35MSwKnp1r/OQBAqC5XO99xFbJ9XClhf4w==", "bin": { - "playwright": "cli.js" + "playwright-core": "cli.js" }, "engines": { - "node": ">=14" + "node": ">=16" } }, "node_modules/prelude-ls": { @@ -2812,9 +2814,9 @@ } }, "node_modules/semver": { - "version": "7.5.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", - "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -3006,12 +3008,12 @@ } }, "node_modules/ts-api-utils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.1.tgz", - "integrity": "sha512-lC/RGlPmwdrIBFTX59wwNzqh7aR2otPNPR/5brHZm/XKFYKsfqxihXUe9pU3JI+3vGkl+vyCoNNnPhJn3aLK1A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { - "node": ">=16.13.0" + "node": ">=16" }, "peerDependencies": { "typescript": ">=4.2.0" diff --git a/cli-tests/package.json b/cli-tests/package.json index e971b719a3..b6fa30309e 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -25,7 +25,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^7.3.1", - "@typescript-eslint/parser": "^7.2.0", + "@typescript-eslint/parser": "^7.6.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", From c0ae40886d05baaf6380d457a705b2269fad9157 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 9 Apr 2024 08:13:48 +0000 Subject: [PATCH 04/44] Bump @typescript-eslint/eslint-plugin from 7.3.1 to 7.6.0 in /cli-tests (#2953) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 7.3.1 to 7.6.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.6.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 294 ++++-------------------------------- cli-tests/package.json | 2 +- 2 files changed, 34 insertions(+), 262 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index d8d8452670..100e058902 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -20,7 +20,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.3.1", + "@typescript-eslint/eslint-plugin": "^7.6.0", "@typescript-eslint/parser": "^7.6.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", @@ -54,9 +54,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.6.2.tgz", - "integrity": "sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw==", + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -261,22 +261,22 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.3.1.tgz", - "integrity": "sha512-STEDMVQGww5lhCuNXVSQfbfuNII5E08QWkvAw5Qwf+bj2WT+JkG1uc+5/vXA3AOYMDHVOSpL+9rcbEUiHIm2dw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.6.0.tgz", + "integrity": "sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.3.1", - "@typescript-eslint/type-utils": "7.3.1", - "@typescript-eslint/utils": "7.3.1", - "@typescript-eslint/visitor-keys": "7.3.1", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/type-utils": "7.6.0", + "@typescript-eslint/utils": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -295,53 +295,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.3.1.tgz", - "integrity": "sha512-fVS6fPxldsKY2nFvyT7IP78UO1/I2huG+AYu5AMjCT9wtl6JFiDnsv4uad4jQ0GTFzcUV5HShVeN96/17bTBag==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.3.1", - "@typescript-eslint/visitor-keys": "7.3.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.3.1.tgz", - "integrity": "sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.3.1.tgz", - "integrity": "sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.3.1", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/parser": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.6.0.tgz", @@ -388,15 +341,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.3.1.tgz", - "integrity": "sha512-iFhaysxFsMDQlzJn+vr3OrxN8NmdQkHks4WaqD4QBnt5hsq234wcYdyQ9uquzJJIDAj5W4wQne3yEsYA6OmXGw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.6.0.tgz", + "integrity": "sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.3.1", - "@typescript-eslint/utils": "7.3.1", + "@typescript-eslint/typescript-estree": "7.6.0", + "@typescript-eslint/utils": "7.6.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -414,88 +367,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.3.1.tgz", - "integrity": "sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.3.1.tgz", - "integrity": "sha512-tLpuqM46LVkduWP7JO7yVoWshpJuJzxDOPYIVWUUZbW+4dBpgGeUdl/fQkhuV0A8eGnphYw3pp8d2EnvPOfxmQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.3.1", - "@typescript-eslint/visitor-keys": "7.3.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.3.1.tgz", - "integrity": "sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.3.1", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/types": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz", @@ -562,18 +433,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.3.1.tgz", - "integrity": "sha512-jIERm/6bYQ9HkynYlNZvXpzmXWZGhMbrOvq3jJzOSOlKXsVjrrolzWBjDW6/TvT5Q3WqaN4EkmcfdQwi9tDjBQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.6.0.tgz", + "integrity": "sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.3.1", - "@typescript-eslint/types": "7.3.1", - "@typescript-eslint/typescript-estree": "7.3.1", - "semver": "^7.5.4" + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/typescript-estree": "7.6.0", + "semver": "^7.6.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -586,105 +457,6 @@ "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.3.1.tgz", - "integrity": "sha512-fVS6fPxldsKY2nFvyT7IP78UO1/I2huG+AYu5AMjCT9wtl6JFiDnsv4uad4jQ0GTFzcUV5HShVeN96/17bTBag==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.3.1", - "@typescript-eslint/visitor-keys": "7.3.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.3.1.tgz", - "integrity": "sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.3.1.tgz", - "integrity": "sha512-tLpuqM46LVkduWP7JO7yVoWshpJuJzxDOPYIVWUUZbW+4dBpgGeUdl/fQkhuV0A8eGnphYw3pp8d2EnvPOfxmQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.3.1", - "@typescript-eslint/visitor-keys": "7.3.1", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.3.1.tgz", - "integrity": "sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.3.1", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz", @@ -1923,9 +1695,9 @@ } }, "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" diff --git a/cli-tests/package.json b/cli-tests/package.json index b6fa30309e..e5a2fec8b7 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.3.1", + "@typescript-eslint/eslint-plugin": "^7.6.0", "@typescript-eslint/parser": "^7.6.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", From 7afd5eca5a301b982345291441df5a87437f0b3f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 12 Apr 2024 20:48:21 +0300 Subject: [PATCH 05/44] Bump eslint-plugin-playwright from 1.5.1 to 1.6.0 in /cli-tests (#2954) Bumps [eslint-plugin-playwright](https://github.com/playwright-community/eslint-plugin-playwright) from 1.5.1 to 1.6.0. - [Release notes](https://github.com/playwright-community/eslint-plugin-playwright/releases) - [Changelog](https://github.com/playwright-community/eslint-plugin-playwright/blob/main/CHANGELOG.md) - [Commits](https://github.com/playwright-community/eslint-plugin-playwright/compare/v1.5.1...v1.6.0) --- updated-dependencies: - dependency-name: eslint-plugin-playwright dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 8 ++++---- cli-tests/package.json | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 100e058902..c1d1a34934 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -26,7 +26,7 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", "eslint-plugin-import": "^2.29.0", - "eslint-plugin-playwright": "^1.5.1" + "eslint-plugin-playwright": "^1.6.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -1171,9 +1171,9 @@ } }, "node_modules/eslint-plugin-playwright": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-1.5.1.tgz", - "integrity": "sha512-2cHnSYMmxVRHALlwM1LjFpHaptYufokUKJDqccVILaAVI+SdS5z7msjD3gv8l6How4ux/rvxeS4lXu9OrpOXhg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-1.6.0.tgz", + "integrity": "sha512-tI1E/EDbHT4Fx5KvukUG3RTIT0gk44gvTP8bNwxLCFsUXVM98ZJG5zWU6Om5JOzH9FrmN4AhMu/UKyEsu0ZoDA==", "dev": true, "dependencies": { "globals": "^13.23.0" diff --git a/cli-tests/package.json b/cli-tests/package.json index e5a2fec8b7..1bdbc97116 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -30,6 +30,6 @@ "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", "eslint-plugin-import": "^2.29.0", - "eslint-plugin-playwright": "^1.5.1" + "eslint-plugin-playwright": "^1.6.0" } } From 2f7cace6b8f6f8360b1f016e1e1a6bfd2ab85c2f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 15:28:27 +0200 Subject: [PATCH 06/44] Bump go.mongodb.org/mongo-driver from 1.14.0 to 1.15.0 (#2956) Bumps [go.mongodb.org/mongo-driver](https://github.com/mongodb/mongo-go-driver) from 1.14.0 to 1.15.0. - [Release notes](https://github.com/mongodb/mongo-go-driver/releases) - [Commits](https://github.com/mongodb/mongo-go-driver/compare/v1.14.0...v1.15.0) --- updated-dependencies: - dependency-name: go.mongodb.org/mongo-driver dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c13beed1ad..be04ff72d2 100644 --- a/go.mod +++ b/go.mod @@ -74,7 +74,7 @@ require ( github.com/sirupsen/logrus v1.9.3 github.com/stretchr/objx v0.5.2 github.com/stretchr/testify v1.9.0 - go.mongodb.org/mongo-driver v1.14.0 + go.mongodb.org/mongo-driver v1.15.0 go.starlark.net v0.0.0-20230717150657-8a3343210976 golang.org/x/crypto v0.22.0 golang.org/x/sync v0.7.0 diff --git a/go.sum b/go.sum index 75895d9e06..3b9948860a 100644 --- a/go.sum +++ b/go.sum @@ -799,8 +799,8 @@ github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5t go.mongodb.org/mongo-driver v1.6.0/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8= go.mongodb.org/mongo-driver v1.7.0/go.mod h1:Q4oFMbo1+MSNqICAdYMlC/zSTrwCogR4R8NzkI+yfU8= go.mongodb.org/mongo-driver v1.11.4/go.mod h1:PTSz5yu21bkT/wXpkS7WR5f0ddqw5quethTUn9WM+2g= -go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= -go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= +go.mongodb.org/mongo-driver v1.15.0 h1:rJCKC8eEliewXjZGf0ddURtl7tTVy1TK3bfl0gkUSLc= +go.mongodb.org/mongo-driver v1.15.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c= 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= From 91567369d067f8d3e6a350521794c965e34ad63a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 20:14:04 +0100 Subject: [PATCH 07/44] Bump @typescript-eslint/parser from 7.6.0 to 7.7.0 in /cli-tests (#2958) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 7.6.0 to 7.7.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.7.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 115 +++++++++++++++++++++++++++++++++--- cli-tests/package.json | 2 +- 2 files changed, 108 insertions(+), 9 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index c1d1a34934..6e09395e84 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -21,7 +21,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^7.6.0", - "@typescript-eslint/parser": "^7.6.0", + "@typescript-eslint/parser": "^7.7.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", @@ -296,15 +296,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.6.0.tgz", - "integrity": "sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.0.tgz", + "integrity": "sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.6.0", - "@typescript-eslint/types": "7.6.0", - "@typescript-eslint/typescript-estree": "7.6.0", - "@typescript-eslint/visitor-keys": "7.6.0", + "@typescript-eslint/scope-manager": "7.7.0", + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/typescript-estree": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0", "debug": "^4.3.4" }, "engines": { @@ -323,6 +323,105 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz", + "integrity": "sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", + "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz", + "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.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": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", + "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.7.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "7.6.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index 1bdbc97116..6574204e42 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -25,7 +25,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^7.6.0", - "@typescript-eslint/parser": "^7.6.0", + "@typescript-eslint/parser": "^7.7.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", From 4daf521c0f478449ce0d24f7a24c9522a6147bd5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 19:21:35 +0000 Subject: [PATCH 08/44] Bump @typescript-eslint/eslint-plugin from 7.6.0 to 7.7.0 in /cli-tests (#2957) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 7.6.0 to 7.7.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.7.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 163 +++++++----------------------------- cli-tests/package.json | 2 +- 2 files changed, 33 insertions(+), 132 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 6e09395e84..dc22491ef7 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -20,7 +20,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.6.0", + "@typescript-eslint/eslint-plugin": "^7.7.0", "@typescript-eslint/parser": "^7.7.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", @@ -261,16 +261,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.6.0.tgz", - "integrity": "sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz", + "integrity": "sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.6.0", - "@typescript-eslint/type-utils": "7.6.0", - "@typescript-eslint/utils": "7.6.0", - "@typescript-eslint/visitor-keys": "7.6.0", + "@typescript-eslint/scope-manager": "7.7.0", + "@typescript-eslint/type-utils": "7.7.0", + "@typescript-eslint/utils": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.3.1", @@ -323,7 +323,7 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/scope-manager": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz", "integrity": "sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==", @@ -340,113 +340,14 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", - "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz", - "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.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": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", - "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.7.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz", - "integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.6.0", - "@typescript-eslint/visitor-keys": "7.6.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.6.0.tgz", - "integrity": "sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz", + "integrity": "sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.6.0", - "@typescript-eslint/utils": "7.6.0", + "@typescript-eslint/typescript-estree": "7.7.0", + "@typescript-eslint/utils": "7.7.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -467,9 +368,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz", - "integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", + "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -480,13 +381,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz", - "integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz", + "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.6.0", - "@typescript-eslint/visitor-keys": "7.6.0", + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/visitor-keys": "7.7.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -532,17 +433,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.6.0.tgz", - "integrity": "sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.0.tgz", + "integrity": "sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.15", "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.6.0", - "@typescript-eslint/types": "7.6.0", - "@typescript-eslint/typescript-estree": "7.6.0", + "@typescript-eslint/scope-manager": "7.7.0", + "@typescript-eslint/types": "7.7.0", + "@typescript-eslint/typescript-estree": "7.7.0", "semver": "^7.6.0" }, "engines": { @@ -557,12 +458,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz", - "integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==", + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", + "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/types": "7.7.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { diff --git a/cli-tests/package.json b/cli-tests/package.json index 6574204e42..f23b1de376 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.6.0", + "@typescript-eslint/eslint-plugin": "^7.7.0", "@typescript-eslint/parser": "^7.7.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", From 41db807ee41daee1c65535884cd8287060897b73 Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Sat, 20 Apr 2024 11:40:31 +0300 Subject: [PATCH 09/44] PMM-7 Fix imports protobuf (#2964) --- go.mod | 2 +- managed/services/agents/channel/channel.go | 7 +- managed/services/agents/state.go | 4 +- managed/services/management/rds_test.go | 6 +- qan-api2/services/analytics/filters_test.go | 27 ++- .../services/analytics/object_details_test.go | 113 ++++++----- qan-api2/services/analytics/profile_test.go | 178 +++++++++--------- 7 files changed, 167 insertions(+), 170 deletions(-) diff --git a/go.mod b/go.mod index be04ff72d2..39fdee8865 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,6 @@ require ( github.com/go-openapi/validate v0.24.0 github.com/go-sql-driver/mysql v1.7.1 github.com/golang-migrate/migrate/v4 v4.17.0 - github.com/golang/protobuf v1.5.4 github.com/google/uuid v1.6.0 github.com/grafana/grafana-api-golang-client v0.27.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 @@ -116,6 +115,7 @@ require ( github.com/go-logr/stdr v1.2.2 // indirect github.com/golang-jwt/jwt/v5 v5.2.0 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect + github.com/golang/protobuf v1.5.4 // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 // indirect diff --git a/managed/services/agents/channel/channel.go b/managed/services/agents/channel/channel.go index 448010495e..12de14e636 100644 --- a/managed/services/agents/channel/channel.go +++ b/managed/services/agents/channel/channel.go @@ -21,12 +21,13 @@ import ( "sync" "sync/atomic" - "github.com/golang/protobuf/proto" //nolint:staticcheck "github.com/pkg/errors" "github.com/sirupsen/logrus" protostatus "google.golang.org/genproto/googleapis/rpc/status" "google.golang.org/grpc/codes" grpcstatus "google.golang.org/grpc/status" + "google.golang.org/protobuf/encoding/prototext" + "google.golang.org/protobuf/proto" "github.com/percona/pmm/api/agentpb" "github.com/percona/pmm/utils/logger" @@ -194,7 +195,7 @@ func (c *Channel) send(msg *agentpb.ServerMessage) { if size := proto.Size(msg); size < 100 { c.l.Debugf("Sending message (%d bytes): %s.", size, msg) } else { - c.l.Debugf("Sending message (%d bytes):\n%s\n", size, proto.MarshalTextString(msg)) + c.l.Debugf("Sending message (%d bytes):\n%s\n", size, prototext.Format(msg)) } } @@ -229,7 +230,7 @@ func (c *Channel) runReceiver() { if size := proto.Size(msg); size < 100 { c.l.Debugf("Received message (%d bytes): %s.", size, msg) } else { - c.l.Debugf("Received message (%d bytes):\n%s\n", size, proto.MarshalTextString(msg)) + c.l.Debugf("Received message (%d bytes):\n%s\n", size, prototext.Format(msg)) } } diff --git a/managed/services/agents/state.go b/managed/services/agents/state.go index d7ad55ea4c..ed0c4e0ecd 100644 --- a/managed/services/agents/state.go +++ b/managed/services/agents/state.go @@ -21,9 +21,9 @@ import ( "time" "github.com/AlekSi/pointer" - "github.com/golang/protobuf/proto" //nolint:staticcheck "github.com/pkg/errors" "github.com/sirupsen/logrus" + "google.golang.org/protobuf/encoding/prototext" "gopkg.in/reform.v1" "github.com/percona/pmm/api/agentpb" @@ -274,7 +274,7 @@ func (u *StateUpdater) sendSetStateRequest(ctx context.Context, agent *pmmAgentI AgentProcesses: agentProcesses, BuiltinAgents: builtinAgents, } - l.Debugf("sendSetStateRequest:\n%s", proto.MarshalTextString(state)) + l.Debugf("sendSetStateRequest:\n%s", prototext.Format(state)) resp, err := agent.channel.SendAndWaitResponse(state) if err != nil { diff --git a/managed/services/management/rds_test.go b/managed/services/management/rds_test.go index c339ffa17a..c103825de1 100644 --- a/managed/services/management/rds_test.go +++ b/managed/services/management/rds_test.go @@ -26,12 +26,12 @@ import ( "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/aws/aws-sdk-go/aws/session" - "github.com/golang/protobuf/proto" //nolint:staticcheck "github.com/google/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "google.golang.org/protobuf/encoding/prototext" "gopkg.in/reform.v1" "gopkg.in/reform.v1/dialects/postgresql" @@ -318,7 +318,7 @@ func TestRDSService(t *testing.T) { Status: inventorypb.AgentStatus_UNKNOWN, }, } - assert.Equal(t, proto.MarshalTextString(expected), proto.MarshalTextString(resp)) // for better diffs + assert.Equal(t, prototext.Format(expected), prototext.Format(resp)) // for better diffs }) t.Run("AddRDSPostgreSQL", func(t *testing.T) { @@ -408,6 +408,6 @@ func TestRDSService(t *testing.T) { Status: inventorypb.AgentStatus_UNKNOWN, }, } - assert.Equal(t, proto.MarshalTextString(expected), proto.MarshalTextString(resp)) // for better diffs + assert.Equal(t, prototext.Format(expected), prototext.Format(resp)) // for better diffs }) } diff --git a/qan-api2/services/analytics/filters_test.go b/qan-api2/services/analytics/filters_test.go index 31b4fb81f4..a627add915 100644 --- a/qan-api2/services/analytics/filters_test.go +++ b/qan-api2/services/analytics/filters_test.go @@ -24,10 +24,9 @@ import ( "time" _ "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/ptypes/timestamp" "github.com/jmoiron/sqlx" "github.com/stretchr/testify/assert" + "google.golang.org/protobuf/types/known/timestamppb" qanpb "github.com/percona/pmm/api/qanpb" "github.com/percona/pmm/qan-api2/models" @@ -82,8 +81,8 @@ func TestService_GetFilters(t *testing.T) { "success", fields{rm: rm, mm: mm}, &qanpb.FiltersRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, }, &want, false, @@ -92,8 +91,8 @@ func TestService_GetFilters(t *testing.T) { "success_with_dimensions_username", fields{rm: rm, mm: mm}, &qanpb.FiltersRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, Labels: []*qanpb.MapFieldEntry{ {Key: "username", Value: []string{"user1", "user2"}}, }, @@ -105,8 +104,8 @@ func TestService_GetFilters(t *testing.T) { "success_with_dimensions_client_host_schema_service_name", fields{rm: rm, mm: mm}, &qanpb.FiltersRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, Labels: []*qanpb.MapFieldEntry{ {Key: "client_host", Value: []string{"10.11.12.1", "10.11.12.2", "10.11.12.3", "10.11.12.4", "10.11.12.5", "10.11.12.6", "10.11.12.7", "10.11.12.8", "10.11.12.9", "10.11.12.10", "10.11.12.11", "10.11.12.12", "10.11.12.13"}}, {Key: "schema", Value: []string{"schema65", "schema6", "schema42", "schema76", "schema90", "schema39", "schema1", "schema17", "schema79", "schema10"}}, @@ -120,8 +119,8 @@ func TestService_GetFilters(t *testing.T) { "success_with_dimensions_multiple", fields{rm: rm, mm: mm}, &qanpb.FiltersRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, Labels: []*qanpb.MapFieldEntry{ {Key: "container_id", Value: []string{"container_id"}}, {Key: "container_name", Value: []string{"container_name1"}}, @@ -148,8 +147,8 @@ func TestService_GetFilters(t *testing.T) { "success_with_labels", fields{rm: rm, mm: mm}, &qanpb.FiltersRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, Labels: []*qanpb.MapFieldEntry{ {Key: "label0", Value: []string{"value1"}}, }, @@ -161,8 +160,8 @@ func TestService_GetFilters(t *testing.T) { "fail", fields{rm: rm, mm: mm}, &qanpb.FiltersRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t2.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t1.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t2.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t1.Unix()}, }, nil, true, diff --git a/qan-api2/services/analytics/object_details_test.go b/qan-api2/services/analytics/object_details_test.go index 05793dd581..27b93ee4c6 100644 --- a/qan-api2/services/analytics/object_details_test.go +++ b/qan-api2/services/analytics/object_details_test.go @@ -21,11 +21,10 @@ import ( "testing" "time" - // 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/stretchr/testify/assert" "github.com/stretchr/testify/require" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/types/known/timestamppb" qanpb "github.com/percona/pmm/api/qanpb" "github.com/percona/pmm/qan-api2/models" @@ -53,7 +52,7 @@ func TestService_GetQueryExample(t *testing.T) { "no_period_start_from", fields{rm: rm, mm: mm}, &qanpb.QueryExampleRequest{ - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", FilterBy: "B305F6354FA21F2A", Limit: 5, @@ -65,7 +64,7 @@ func TestService_GetQueryExample(t *testing.T) { "no_period_start_to", fields{rm: rm, mm: mm}, &qanpb.QueryExampleRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, GroupBy: "queryid", FilterBy: "B305F6354FA21F2A", Limit: 5, @@ -77,8 +76,8 @@ func TestService_GetQueryExample(t *testing.T) { "no_group", fields{rm: rm, mm: mm}, &qanpb.QueryExampleRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, FilterBy: "B305F6354FA21F2A", Limit: 5, }, @@ -89,8 +88,8 @@ func TestService_GetQueryExample(t *testing.T) { "no_limit", fields{rm: rm, mm: mm}, &qanpb.QueryExampleRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", FilterBy: "B305F6354FA21F2A", }, @@ -101,8 +100,8 @@ func TestService_GetQueryExample(t *testing.T) { "invalid_group_name", fields{rm: rm, mm: mm}, &qanpb.QueryExampleRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "invalid_group_name", FilterBy: "B305F6354FA21F2A", }, @@ -113,8 +112,8 @@ func TestService_GetQueryExample(t *testing.T) { "not_found", fields{rm: rm, mm: mm}, &qanpb.QueryExampleRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", FilterBy: "unexist", }, @@ -138,12 +137,12 @@ func TestService_GetQueryExample(t *testing.T) { } expectedJSON := getExpectedJSON(t, got, "../../test_data/GetQueryExample_"+tt.name+".json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := protojson.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + require.JSONEq(t, string(expectedJSON), string(gotJSON)) }) } } @@ -170,8 +169,8 @@ func TestService_GetMetricsError(t *testing.T) { "not_found", fields{rm: rm, mm: mm}, &qanpb.MetricsRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", FilterBy: "unexist", }, @@ -182,7 +181,7 @@ func TestService_GetMetricsError(t *testing.T) { "no_period_start_from", fields{rm: rm, mm: mm}, &qanpb.MetricsRequest{ - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", FilterBy: "B305F6354FA21F2A", }, @@ -193,7 +192,7 @@ func TestService_GetMetricsError(t *testing.T) { "no_period_start_to", fields{rm: rm, mm: mm}, &qanpb.MetricsRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, GroupBy: "queryid", FilterBy: "B305F6354FA21F2A", }, @@ -204,8 +203,8 @@ func TestService_GetMetricsError(t *testing.T) { "invalid_group_name", fields{rm: rm, mm: mm}, &qanpb.MetricsRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "no_group_name", FilterBy: "B305F6354FA21F2A", }, @@ -216,8 +215,8 @@ func TestService_GetMetricsError(t *testing.T) { "not_found_labels", fields{rm: rm, mm: mm}, &qanpb.MetricsRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "no_group_name", FilterBy: "B305F6354FA21F2A", Labels: []*qanpb.MapFieldEntry{ @@ -283,8 +282,8 @@ func TestService_GetMetrics(t *testing.T) { mm: mm, } in := &qanpb.MetricsRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", FilterBy: "B305F6354FA21F2A", } @@ -292,12 +291,12 @@ func TestService_GetMetrics(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetMetrics()") expectedJSON := getExpectedJSON(t, got, "../../test_data/GetMetrics_group_by_queryid.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := protojson.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - require.JSONEq(t, string(expectedJSON), gotJSON) + require.JSONEq(t, string(expectedJSON), string(gotJSON)) }) t3, _ := time.Parse(time.RFC3339, "2019-01-01T01:30:00Z") @@ -307,8 +306,8 @@ func TestService_GetMetrics(t *testing.T) { mm: mm, } in := &qanpb.MetricsRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t3.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t3.Unix()}, GroupBy: "queryid", FilterBy: "B305F6354FA21F2A", } @@ -316,12 +315,12 @@ func TestService_GetMetrics(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetMetrics()") expectedJSON := getExpectedJSON(t, got, "../../test_data/GetMetrics_sparklines_90_points.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := protojson.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - require.JSONEq(t, string(expectedJSON), gotJSON) + require.JSONEq(t, string(expectedJSON), string(gotJSON)) }) t.Run("total", func(t *testing.T) { @@ -330,8 +329,8 @@ func TestService_GetMetrics(t *testing.T) { mm: mm, } in := &qanpb.MetricsRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", FilterBy: "", // Empty filter get all queries. Totals: true, @@ -340,12 +339,12 @@ func TestService_GetMetrics(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetMetrics()") expectedJSON := getExpectedJSON(t, got, "../../test_data/GetMetrics_total.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := protojson.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) } @@ -373,8 +372,8 @@ func TestService_GetLabels(t *testing.T) { "success", fields{rm: rm, mm: mm}, &qanpb.ObjectDetailsLabelsRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", FilterBy: "1D410B4BE5060972", }, @@ -391,12 +390,12 @@ func TestService_GetLabels(t *testing.T) { require.Equal(t, tt.wantErr, err) expectedJSON := getExpectedJSON(t, got, "../../test_data/GetLabels"+tt.name+".json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := protojson.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) tt = testCase{ @@ -404,7 +403,7 @@ func TestService_GetLabels(t *testing.T) { fields{rm: rm, mm: mm}, &qanpb.ObjectDetailsLabelsRequest{ PeriodStartFrom: nil, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", FilterBy: "1D410B4BE5060972", }, @@ -425,7 +424,7 @@ func TestService_GetLabels(t *testing.T) { "required to", fields{rm: rm, mm: mm}, &qanpb.ObjectDetailsLabelsRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, PeriodStartTo: nil, GroupBy: "queryid", FilterBy: "1D410B4BE5060972", @@ -444,8 +443,8 @@ func TestService_GetLabels(t *testing.T) { }) request := &qanpb.ObjectDetailsLabelsRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "", FilterBy: "1D410B4BE5060972", } @@ -467,8 +466,8 @@ func TestService_GetLabels(t *testing.T) { }) request = &qanpb.ObjectDetailsLabelsRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", FilterBy: "", } @@ -489,17 +488,17 @@ func TestService_GetLabels(t *testing.T) { require.Equal(t, tt.wantErr, err) expectedJSON := getExpectedJSON(t, got, "../../test_data/GetLabels_"+tt.name+".json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := protojson.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) request = &qanpb.ObjectDetailsLabelsRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t2.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t1.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t2.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t1.Unix()}, GroupBy: "queryid", FilterBy: "1D410B4BE5060972", } @@ -521,8 +520,8 @@ func TestService_GetLabels(t *testing.T) { }) request = &qanpb.ObjectDetailsLabelsRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "invalid group", FilterBy: "1D410B4BE5060972", } diff --git a/qan-api2/services/analytics/profile_test.go b/qan-api2/services/analytics/profile_test.go index 95e22f1f81..4d4d466516 100644 --- a/qan-api2/services/analytics/profile_test.go +++ b/qan-api2/services/analytics/profile_test.go @@ -23,13 +23,11 @@ import ( "testing" "time" - // TODO replace with 'google.golang.org/protobuf/encoding/protojson' since this one is deprecated. - "github.com/golang/protobuf/jsonpb" //nolint:staticcheck - // TODO replace with 'google.golang.org/protobuf/proto' since this one is deprecated. - "github.com/golang/protobuf/proto" //nolint:staticcheck - "github.com/golang/protobuf/ptypes/timestamp" "github.com/jmoiron/sqlx" "github.com/stretchr/testify/assert" + jsonpb "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/types/known/timestamppb" qanpb "github.com/percona/pmm/api/qanpb" "github.com/percona/pmm/qan-api2/models" @@ -51,14 +49,14 @@ func setup() *sqlx.DB { func getExpectedJSON(t *testing.T, got proto.Message, filename string) []byte { t.Helper() if os.Getenv("REFRESH_TEST_DATA") != "" { - marshaler := jsonpb.Marshaler{ + marshaler := jsonpb.MarshalOptions{ Indent: "\t", } - json, err := marshaler.MarshalToString(got) + json, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - err = os.WriteFile(filename, []byte(json), 0o644) //nolint:gosec + err = os.WriteFile(filename, json, 0o644) //nolint:gosec if err != nil { t.Errorf("cannot write:%v", err) } @@ -92,8 +90,8 @@ func TestService_GetReport(t *testing.T) { "success", fields{rm: rm, mm: mm}, &qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", Columns: []string{"query_time", "lock_time", "sort_scan"}, OrderBy: "query_time", @@ -107,8 +105,8 @@ func TestService_GetReport(t *testing.T) { "load without query_time", fields{rm: rm, mm: mm}, &qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", Columns: []string{"load", "lock_time", "sort_scan"}, OrderBy: "-load", @@ -122,8 +120,8 @@ func TestService_GetReport(t *testing.T) { "wrong_time_range", fields{rm: rm, mm: mm}, &qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t2.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t1.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t2.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t1.Unix()}, }, nil, true, @@ -153,12 +151,12 @@ func TestService_GetReport(t *testing.T) { return } expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_"+tt.name+".json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) } } @@ -182,8 +180,8 @@ func TestService_GetReport_Mix(t *testing.T) { }{ fields{rm: rm, mm: mm}, &qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", Columns: []string{"query_time", "lock_time", "sort_scan"}, OrderBy: "-query_time", @@ -215,12 +213,12 @@ func TestService_GetReport_Mix(t *testing.T) { return } expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Mix_reverce_order.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) t.Run("correct_load", func(t *testing.T) { @@ -234,12 +232,12 @@ func TestService_GetReport_Mix(t *testing.T) { return } expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Mix_correct_load.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), string(gotJSON)) //nolint:unconvert //keeps converting automatically + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) t.Run("correct_latency", func(t *testing.T) { @@ -254,12 +252,12 @@ func TestService_GetReport_Mix(t *testing.T) { return } expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Mix_correct_latency.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), string(gotJSON)) //nolint:unconvert //keeps converting automatically + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) t.Run("no error on limit is 0", func(t *testing.T) { @@ -306,8 +304,8 @@ func TestService_GetReport_Groups(t *testing.T) { } in := qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", Columns: []string{ "query_time", "lock_time", "sort_scan", "rows_sent", "rows_examined", "rows_affected", @@ -329,12 +327,12 @@ func TestService_GetReport_Groups(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Groups_group_by_queryid.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) t.Run("group_by_service_name", func(t *testing.T) { @@ -344,8 +342,8 @@ func TestService_GetReport_Groups(t *testing.T) { } in := qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "service_name", Columns: []string{ "query_time", "lock_time", "sort_scan", "rows_sent", "rows_examined", "rows_affected", @@ -367,12 +365,12 @@ func TestService_GetReport_Groups(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Groups_group_by_service_name.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) t.Run("group_by_database", func(t *testing.T) { @@ -382,8 +380,8 @@ func TestService_GetReport_Groups(t *testing.T) { } in := qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "database", Columns: []string{ "query_time", "lock_time", "sort_scan", "rows_sent", "rows_examined", "rows_affected", @@ -405,12 +403,12 @@ func TestService_GetReport_Groups(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Groups_group_by_database.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) t.Run("group_by_schema", func(t *testing.T) { @@ -420,8 +418,8 @@ func TestService_GetReport_Groups(t *testing.T) { } in := qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "schema", Columns: []string{ "query_time", "lock_time", "sort_scan", "rows_sent", "rows_examined", "rows_affected", @@ -443,12 +441,12 @@ func TestService_GetReport_Groups(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Groups_group_by_schema.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) t.Run("group_by_username", func(t *testing.T) { @@ -458,8 +456,8 @@ func TestService_GetReport_Groups(t *testing.T) { } in := qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "username", Columns: []string{ "query_time", "lock_time", "sort_scan", "rows_sent", "rows_examined", "rows_affected", @@ -481,12 +479,12 @@ func TestService_GetReport_Groups(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Groups_group_by_username.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) t.Run("group_by_client_host", func(t *testing.T) { @@ -496,8 +494,8 @@ func TestService_GetReport_Groups(t *testing.T) { } in := qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "client_host", Columns: []string{ "query_time", "lock_time", "sort_scan", "rows_sent", "rows_examined", "rows_affected", @@ -519,12 +517,12 @@ func TestService_GetReport_Groups(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Groups_group_by_client_host.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), string(gotJSON)) //nolint:unconvert //keeps converting automatically + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) } @@ -555,8 +553,8 @@ func TestService_GetReport_AllLabels(t *testing.T) { "", fields{rm: rm, mm: mm}, &qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", Columns: []string{"query_time", "lock_time", "sort_scan"}, OrderBy: "-query_time", @@ -656,8 +654,8 @@ func TestService_GetReport_Sparklines(t *testing.T) { } in := qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", Columns: []string{ "query_time", "lock_time", "sort_scan", "rows_sent", "rows_examined", "rows_affected", @@ -679,12 +677,12 @@ func TestService_GetReport_Sparklines(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_sparklines_60_points.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), string(gotJSON)) //nolint:unconvert //keeps converting automatically + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) t3, _ := time.Parse(time.RFC3339, "2019-01-01T01:30:00Z") @@ -695,8 +693,8 @@ func TestService_GetReport_Sparklines(t *testing.T) { } in := qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t3.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t3.Unix()}, GroupBy: "queryid", Columns: []string{ "query_time", "lock_time", "sort_scan", "rows_sent", "rows_examined", "rows_affected", @@ -718,12 +716,12 @@ func TestService_GetReport_Sparklines(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_sparklines_90_points.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) } @@ -741,8 +739,8 @@ func TestService_GetReport_Search(t *testing.T) { } in := qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", Columns: []string{ "query_time", @@ -757,12 +755,12 @@ func TestService_GetReport_Search(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Search_search_queryid.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) t.Run("search_fingerprint", func(t *testing.T) { @@ -772,8 +770,8 @@ func TestService_GetReport_Search(t *testing.T) { } in := qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", Columns: []string{ "query_time", @@ -788,12 +786,12 @@ func TestService_GetReport_Search(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Search_search_fingerprint.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) t.Run("search_service_name", func(t *testing.T) { @@ -803,8 +801,8 @@ func TestService_GetReport_Search(t *testing.T) { } in := qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "service_name", Columns: []string{ "query_time", @@ -819,12 +817,12 @@ func TestService_GetReport_Search(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestService_GetReport_Search_search_service_name.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), gotJSON) + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) } @@ -842,8 +840,8 @@ func TestServiceGetReportSpecialMetrics(t *testing.T) { } in := qanpb.ReportRequest{ - PeriodStartFrom: ×tamp.Timestamp{Seconds: t1.Unix()}, - PeriodStartTo: ×tamp.Timestamp{Seconds: t2.Unix()}, + PeriodStartFrom: ×tamppb.Timestamp{Seconds: t1.Unix()}, + PeriodStartTo: ×tamppb.Timestamp{Seconds: t2.Unix()}, GroupBy: "queryid", Columns: []string{ "num_queries_with_errors", "num_queries_with_warnings", "num_queries", "load", @@ -857,11 +855,11 @@ func TestServiceGetReportSpecialMetrics(t *testing.T) { assert.NoError(t, err, "Unexpected error in Service.GetReport()") expectedJSON := getExpectedJSON(t, got, "../../test_data/TestServiceGetReportSpecialMetrics_num_queries_with_errors.json") - marshaler := jsonpb.Marshaler{Indent: "\t"} - gotJSON, err := marshaler.MarshalToString(got) + marshaler := jsonpb.MarshalOptions{Indent: "\t"} + gotJSON, err := marshaler.Marshal(got) if err != nil { t.Errorf("cannot marshal:%v", err) } - assert.JSONEq(t, string(expectedJSON), string(gotJSON)) //nolint:unconvert //keeps converting automatically + assert.JSONEq(t, string(expectedJSON), string(gotJSON)) }) } From 24ec9c2e9e4b457776812674c6823f0d78f241e1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 21 Apr 2024 21:27:45 +0000 Subject: [PATCH 10/44] Bump github.com/prometheus/common from 0.47.0 to 0.52.3 (#2955) * Bump github.com/prometheus/common from 0.47.0 to 0.52.3 Bumps [github.com/prometheus/common](https://github.com/prometheus/common) from 0.47.0 to 0.52.3. - [Release notes](https://github.com/prometheus/common/releases) - [Commits](https://github.com/prometheus/common/compare/v0.47.0...v0.52.3) --- updated-dependencies: - dependency-name: github.com/prometheus/common dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] * PMM-7 Update percona/exporter_shared * PMM-7 Update percona/exporter_shared --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Nurlan Moldomurov Co-authored-by: Nurlan Moldomurov Co-authored-by: Michael Okoko <10512379+idoqo@users.noreply.github.com> --- go.mod | 20 +++++++++++--------- go.sum | 33 ++++++++++++++++----------------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/go.mod b/go.mod index 39fdee8865..fb1b32c216 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,8 @@ module github.com/percona/pmm -go 1.21 +go 1.22 + +toolchain go1.22.2 // Update saas with // go get -v github.com/percona-platform/saas@latest @@ -21,7 +23,7 @@ require ( github.com/ClickHouse/clickhouse-go/v2 v2.23.0 github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/alecthomas/kong v0.9.0 - github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 + github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 github.com/aws/aws-sdk-go v1.51.3 github.com/blang/semver v3.5.1+incompatible @@ -57,7 +59,7 @@ require ( github.com/percona-platform/dbaas-api v0.0.0-20230103182808-d79c449a9f4c github.com/percona-platform/saas v0.0.0-20230728161159-ad6bdeb8a3d9 github.com/percona/dbaas-operator v0.1.6 - github.com/percona/exporter_shared v0.7.4 + github.com/percona/exporter_shared v0.7.5 github.com/percona/go-mysql v0.0.0-20210427141028-73d29c6da78c github.com/percona/percona-toolkit v3.2.1+incompatible github.com/percona/promconfig v0.2.5 @@ -66,8 +68,8 @@ require ( github.com/pkg/sftp v1.13.6 github.com/pmezard/go-difflib v1.0.0 github.com/prometheus/alertmanager v0.27.0 - github.com/prometheus/client_golang v1.18.0 - github.com/prometheus/common v0.47.0 + github.com/prometheus/client_golang v1.19.0 + github.com/prometheus/common v0.52.3 github.com/ramr/go-reaper v0.2.1 github.com/robfig/cron/v3 v3.0.1 github.com/sirupsen/logrus v1.9.3 @@ -173,7 +175,7 @@ require ( github.com/armon/go-metrics v0.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/charmbracelet/harmonica v0.2.0 // indirect github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 // indirect github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 // indirect @@ -233,10 +235,10 @@ require ( github.com/paulmach/orb v0.11.1 // indirect github.com/pierrec/lz4/v4 v4.1.21 // indirect github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect - github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect github.com/prometheus/exporter-toolkit v0.11.0 // indirect - github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/procfs v0.13.0 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/rs/xid v1.5.0 // indirect github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect @@ -252,7 +254,7 @@ require ( go.opentelemetry.io/otel/trace v1.24.0 // indirect golang.org/x/mod v0.17.0 // indirect golang.org/x/net v0.24.0 // indirect - golang.org/x/oauth2 v0.17.0 // indirect + golang.org/x/oauth2 v0.18.0 // indirect golang.org/x/term v0.19.0 // indirect google.golang.org/appengine v1.6.8 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect diff --git a/go.sum b/go.sum index 3b9948860a..f9eb68a1e7 100644 --- a/go.sum +++ b/go.sum @@ -105,8 +105,8 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= -github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9 h1:ez/4by2iGztzR4L0zgAOR8lTQK9VlyBVVd7G4omaOQs= +github.com/alecthomas/units v0.0.0-20231202071711-9a357b53e9c9/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/andybalholm/brotli v1.1.0 h1:eLKJA0d02Lf0mVpIDgYnqXcUn0GqVmEFny3VuID1U3M= github.com/andybalholm/brotli v1.1.0/go.mod h1:sms7XGricyQI9K10gOSf56VKKWS4oLer58Q+mhRPtnY= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= @@ -144,8 +144,8 @@ github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqy github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= +github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/charmbracelet/bubbles v0.18.0 h1:PYv1A036luoBGroX6VWjQIE9Syf2Wby2oOl/39KLfy0= github.com/charmbracelet/bubbles v0.18.0/go.mod h1:08qhZhtIwzgrtBjAcJnij1t1H0ZRjwHyGsy6AL11PSw= github.com/charmbracelet/bubbletea v0.25.0 h1:bAfwk7jRz7FKFl9RzlIULPkStffg5k6pNt5dywy4TcM= @@ -646,8 +646,8 @@ github.com/percona-platform/saas v0.0.0-20230728161159-ad6bdeb8a3d9 h1:KkOH+Y4sV github.com/percona-platform/saas v0.0.0-20230728161159-ad6bdeb8a3d9/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= -github.com/percona/exporter_shared v0.7.4/go.mod h1:bweWrCdYX+iAONTNUNIIkXGDjGg8dbFL0VBxuUv0wus= +github.com/percona/exporter_shared v0.7.5 h1:sIhdDtKOfH0jsqtTAi41C7wm1R42yXYeAkK0QWhgN7k= +github.com/percona/exporter_shared v0.7.5/go.mod h1:P8ZHDzveyJRGD4ZIRNiEMuAdDexBpQWf2mAVwtyVcYU= github.com/percona/go-mysql v0.0.0-20210427141028-73d29c6da78c h1:1SZ7nS+kSaO63IpaKspf/gf8602QcgP2eXNPMNOIc0M= github.com/percona/go-mysql v0.0.0-20210427141028-73d29c6da78c/go.mod h1:/SGLf9OMxlnK6jq4mkFiImBcJXXk5jwD+lDrwDaGXcw= github.com/percona/percona-backup-mongodb v1.8.1 h1:Fc2DzIh2N+ioNgBlNg0wAJw8yRt3IoXOKQcQAFbPt6g= @@ -684,22 +684,21 @@ 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.18.0 h1:HzFfmkOzH5Q8L8G+kSJKUx5dtG87sewO+FoDDqP5Tbk= -github.com/prometheus/client_golang v1.18.0/go.mod h1:T+GXkCk5wSJyOqMIzVgvvjFDlkOQntgjkJWKrN5txjA= +github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= +github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= -github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= +github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.31.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.47.0 h1:p5Cz0FNHo7SnWOmWmoRozVcjEp0bIVU8cV7OShpjL1k= -github.com/prometheus/common v0.47.0/go.mod h1:0/KsvlIEfPQCQ5I2iNSAWKPZziNCvRs5EC6ILDTlAPc= +github.com/prometheus/common v0.52.3 h1:5f8uj6ZwHSscOGNdIQg6OiZv/ybiK2CO2q2drVZAQSA= +github.com/prometheus/common v0.52.3/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/exporter-toolkit v0.11.0 h1:yNTsuZ0aNCNFQ3aFTD2uhPOvr4iD7fdBvKPAEGkNf+g= @@ -709,8 +708,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.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= -github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o= +github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= 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/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -924,8 +923,8 @@ golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4Iltr golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.17.0 h1:6m3ZPmLEFdVxKKWnKq4VqZ60gutO35zm+zrAHVmHyDQ= -golang.org/x/oauth2 v0.17.0/go.mod h1:OzPDGQiuQMguemayvdylqddI7qcD9lnSDb+1FiwQ5HA= +golang.org/x/oauth2 v0.18.0 h1:09qnuIAgzdx1XplqJvW6CQqMCtGZykZWcXzPMPUusvI= +golang.org/x/oauth2 v0.18.0/go.mod h1:Wf7knwG0MPoWIMMBgFlEaSUDaKskp0dCfrlJRJXbBi8= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= From 354569970966aac03ee6c7983d2a780ace147d15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 22 Apr 2024 17:39:56 +0300 Subject: [PATCH 11/44] Bump github.com/prometheus/common from 0.52.3 to 0.53.0 (#2966) Bumps [github.com/prometheus/common](https://github.com/prometheus/common) from 0.52.3 to 0.53.0. - [Release notes](https://github.com/prometheus/common/releases) - [Commits](https://github.com/prometheus/common/compare/v0.52.3...v0.53.0) --- updated-dependencies: - dependency-name: github.com/prometheus/common dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fb1b32c216..f0eae72a45 100644 --- a/go.mod +++ b/go.mod @@ -69,7 +69,7 @@ require ( github.com/pmezard/go-difflib v1.0.0 github.com/prometheus/alertmanager v0.27.0 github.com/prometheus/client_golang v1.19.0 - github.com/prometheus/common v0.52.3 + github.com/prometheus/common v0.53.0 github.com/ramr/go-reaper v0.2.1 github.com/robfig/cron/v3 v3.0.1 github.com/sirupsen/logrus v1.9.3 diff --git a/go.sum b/go.sum index f9eb68a1e7..d76bd40b7c 100644 --- a/go.sum +++ b/go.sum @@ -697,8 +697,8 @@ github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8b github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.52.3 h1:5f8uj6ZwHSscOGNdIQg6OiZv/ybiK2CO2q2drVZAQSA= -github.com/prometheus/common v0.52.3/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= +github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE= +github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/exporter-toolkit v0.11.0 h1:yNTsuZ0aNCNFQ3aFTD2uhPOvr4iD7fdBvKPAEGkNf+g= From c6044dfc7d6ec52ed9640337914f18b3bbc603ba Mon Sep 17 00:00:00 2001 From: PMM Jenkins Date: Tue, 23 Apr 2024 07:39:44 +0000 Subject: [PATCH 12/44] Update descriptors --- descriptor.bin | Bin 705527 -> 705614 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/descriptor.bin b/descriptor.bin index 212cdbd67aee2c18f29c9556d7bffc155d8660bb..79b5cc9768314a54dd222d5552f3f4df792d709c 100644 GIT binary patch delta 5307 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 delta 5152 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 bI1_F#G{LMhLjF23k+CLtXlVX%RWss$$-Zer From 3aed8f33b6e4f473e97c721bb522be954e267f56 Mon Sep 17 00:00:00 2001 From: Michael Okoko <10512379+idoqo@users.noreply.github.com> Date: Wed, 24 Apr 2024 11:26:06 +0100 Subject: [PATCH 13/44] PMM-12619: Make PMM environment variables more consistent (#2857) * refactored environment variables * update migration doc * replace test line * drop no lint rule * fix parser tests * re-order table values * remove deprecated env variables * fix tests * use singluar advisor * introduce PMM_DEV_ prefix for dev-related variables * clean up environment variables * drop printf * drop unused variable * update tests * add notes for removed variable * update oauth variables * update changed variable list * update variable check validation * refactor tests * surpress linter error --- .github/workflows/api-tests.yml | 5 +- .github/workflows/managed.yml | 4 +- agent/docker-compose.yml | 7 +- api-tests/docker-compose.yml | 7 +- .../management/alerting/alerting_test.go | 2 +- .../roles/grafana/files/datasources.yml | 20 +-- build/docker/server/README.md | 31 ++-- docker-compose.yml | 165 +++++++++--------- docs/process/best_practices.md | 8 + .../process/v2_to_v3_environment_variables.md | 57 ++++++ managed/CONTRIBUTING.md | 34 ++-- managed/cmd/pmm-managed-init/main.go | 4 +- managed/cmd/pmm-managed-starlark/main.go | 2 +- managed/cmd/pmm-managed/main.go | 22 +-- .../models/percona_sso_model_helpers_test.go | 8 +- managed/services/checks/checks.go | 4 +- managed/services/checks/checks_test.go | 4 +- managed/services/config/config.go | 2 +- .../management/alerting/service_test.go | 8 +- managed/services/server/server.go | 16 +- managed/services/server/server_test.go | 42 ++--- managed/services/supervisord/supervisord.go | 40 ++--- managed/services/telemetry/config.default.yml | 4 +- managed/services/telemetry/config.go | 10 +- managed/testdata/supervisord.d/grafana.ini | 22 +-- managed/testdata/supervisord.d/qan-api2.ini | 4 +- managed/utils/envvars/parser.go | 84 ++++----- managed/utils/envvars/parser_test.go | 96 ++++------ managed/utils/interceptors/interceptors.go | 2 +- qan-api2/main.go | 8 +- 30 files changed, 379 insertions(+), 343 deletions(-) create mode 100644 docs/process/v2_to_v3_environment_variables.md diff --git a/.github/workflows/api-tests.yml b/.github/workflows/api-tests.yml index ee856a59e6..3d560b0264 100644 --- a/.github/workflows/api-tests.yml +++ b/.github/workflows/api-tests.yml @@ -94,9 +94,8 @@ jobs: container_name: pmm-agent_pmm-server environment: - PMM_DEBUG=1 - - PERCONA_TEST_CHECKS_INTERVAL=10s - - PERCONA_TEST_PLATFORM_ADDRESS=https://check-dev.percona.com - - PERCONA_TEST_PLATFORM_PUBLIC_KEY=RWTg+ZmCCjt7O8eWeAmTLAqW+1ozUbpRSKSwNTmO+exlS5KEIPYWuYdX + - PMM_DEV_PERCONA_PLATFORM_ADDRESS=https://check-dev.percona.com + - PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY=RWTg+ZmCCjt7O8eWeAmTLAqW+1ozUbpRSKSwNTmO+exlS5KEIPYWuYdX ports: - 80:8080 - 443:8443 diff --git a/.github/workflows/managed.yml b/.github/workflows/managed.yml index 120d538409..e79ce022c4 100644 --- a/.github/workflows/managed.yml +++ b/.github/workflows/managed.yml @@ -29,8 +29,8 @@ jobs: PMM_SERVER_IMAGE: perconalab/pmm-server:3-dev-latest AWS_ACCESS_KEY: ${{ secrets.AWS_ACCESS_KEY }} AWS_SECRET_KEY: ${{ secrets.AWS_SECRET_KEY }} - OAUTH_PMM_CLIENT_ID: ${{ secrets.OAUTH_PMM_CLIENT_ID }} - OAUTH_PMM_CLIENT_SECRET: ${{ secrets.OAUTH_PMM_CLIENT_SECRET }} + PMM_DEV_OAUTH_CLIENT_ID: ${{ secrets.OAUTH_PMM_CLIENT_ID }} + PMM_DEV_OAUTH_CLIENT_SECRET: ${{ secrets.OAUTH_PMM_CLIENT_SECRET }} DEVCONTAINER_CACHE_ENABLED: false steps: diff --git a/agent/docker-compose.yml b/agent/docker-compose.yml index 1d0bc80557..a8f7aecb78 100644 --- a/agent/docker-compose.yml +++ b/agent/docker-compose.yml @@ -10,12 +10,11 @@ services: - "127.0.0.1:443:8443" environment: - PMM_DEBUG=1 - - PERCONA_TEST_CHECKS_INTERVAL=10s # for local development - - PERCONA_TEST_CHECKS_FILE=/srv/checks/custom-checks.yml + - PMM_DEV_ADVISOR_CHECKS_FILE=/srv/checks/custom-checks.yml # for check-dev - # - PERCONA_TEST_SAAS_HOST=check-dev.percona.com:443 - # - PERCONA_TEST_CHECKS_PUBLIC_KEY=RWTg+ZmCCjt7O8eWeAmTLAqW+1ozUbpRSKSwNTmO+exlS5KEIPYWuYdX + # - PMM_DEV_PERCONA_PLATFORM_ADDRESS=check-dev.percona.com:443 + # - PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY=RWTg+ZmCCjt7O8eWeAmTLAqW+1ozUbpRSKSwNTmO+exlS5KEIPYWuYdX volumes: - ./testdata/checks:/srv/checks diff --git a/api-tests/docker-compose.yml b/api-tests/docker-compose.yml index b3452357cd..ea21aff444 100644 --- a/api-tests/docker-compose.yml +++ b/api-tests/docker-compose.yml @@ -10,12 +10,11 @@ services: - 127.0.0.1:443:8443 environment: - PMM_DEBUG=1 - - PERCONA_TEST_CHECKS_INTERVAL=10s # for local development - # - PERCONA_TEST_CHECKS_FILE=/srv/checks/custom-checks.yml + # - PMM_DEV_ADVISOR_CHECKS_FILE=/srv/checks/custom-checks.yml # for check-dev - - PERCONA_TEST_SAAS_HOST=check-dev.percona.com - - PERCONA_TEST_CHECKS_PUBLIC_KEY=RWTg+ZmCCjt7O8eWeAmTLAqW+1ozUbpRSKSwNTmO+exlS5KEIPYWuYdX + - PMM_DEV_PERCONA_PLATFORM_ADDRESS=check-dev.percona.com + - PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY=RWTg+ZmCCjt7O8eWeAmTLAqW+1ozUbpRSKSwNTmO+exlS5KEIPYWuYdX volumes: - ./testdata/checks:/srv/checks diff --git a/api-tests/management/alerting/alerting_test.go b/api-tests/management/alerting/alerting_test.go index 80657c5369..3a26e37518 100644 --- a/api-tests/management/alerting/alerting_test.go +++ b/api-tests/management/alerting/alerting_test.go @@ -41,7 +41,7 @@ import ( // Note: Even though the Alerting service checks for alerting enabled or disabled before returning results // we don't enable or disable Alerting explicit in our tests since it is enabled by default through -// DISABLE_ALERTING env var. +// PMM_DISABLE_ALERTING env var. func TestRulesAPI(t *testing.T) { t.Parallel() client := alertingClient.Default.Alerting diff --git a/build/ansible/roles/grafana/files/datasources.yml b/build/ansible/roles/grafana/files/datasources.yml index ce5e7e2f1f..f6b50d2e30 100644 --- a/build/ansible/roles/grafana/files/datasources.yml +++ b/build/ansible/roles/grafana/files/datasources.yml @@ -19,17 +19,17 @@ datasources: orgId: 1 type: postgres access: proxy - url: ${PERCONA_TEST_POSTGRES_ADDR} - user: ${PERCONA_TEST_POSTGRES_USERNAME} - database: ${PERCONA_TEST_POSTGRES_DBNAME} + url: ${PMM_POSTGRES_ADDR} + user: ${PMM_POSTGRES_USERNAME} + database: ${PMM_POSTGRES_DBNAME} jsonData: - sslRootCertFile: ${PERCONA_TEST_POSTGRES_SSL_CA_PATH} - sslKeyFile: ${PERCONA_TEST_POSTGRES_SSL_KEY_PATH} - sslCertFile: ${PERCONA_TEST_POSTGRES_SSL_CERT_PATH} + sslRootCertFile: ${PMM_POSTGRES_SSL_CA_PATH} + sslKeyFile: ${PMM_POSTGRES_SSL_KEY_PATH} + sslCertFile: ${PMM_POSTGRES_SSL_CERT_PATH} postgresVersion: "1100" - sslmode: ${PERCONA_TEST_POSTGRES_SSL_MODE} + sslmode: ${PMM_POSTGRES_SSL_MODE} secureJsonData: - password: ${PERCONA_TEST_POSTGRES_DBPASSWORD} + password: ${PMM_POSTGRES_DBPASSWORD} - name: PTSummary version: 2 orgId: 1 @@ -40,6 +40,6 @@ datasources: version: 2 type: grafana-clickhouse-datasource jsonData: - port: ${PERCONA_TEST_PMM_CLICKHOUSE_PORT} - server: ${PERCONA_TEST_PMM_CLICKHOUSE_HOST} + port: ${PMM_CLICKHOUSE_PORT} + server: ${PMM_CLICKHOUSE_HOST} tlsSkipVerify: false \ No newline at end of file diff --git a/build/docker/server/README.md b/build/docker/server/README.md index d49a8136c2..e5ceb49a49 100644 --- a/build/docker/server/README.md +++ b/build/docker/server/README.md @@ -23,22 +23,21 @@ This example uses the tag `:3` to pull the latest PMM 3.x version, but other, [m You can use these environment variables (-e VAR) when running the Docker image. -| Variable | Description | -|--------------------------|-----------------------------------------------------------------------------------------------------------------------------| -| DISABLE_UPDATES | Disable automatic updates | -| DISABLE_TELEMETRY | Disable built-in telemetry and disable STT if telemetry is disabled | -| DISABLE_ALERTING | Disable percona alerting | -| METRICS_RESOLUTION | High metrics resolution in seconds | -| METRICS_RESOLUTION_HR | High metrics resolution (same as above) | -| METRICS_RESOLUTION_MR | Medium metrics resolution in seconds | -| METRICS_RESOLUTION_LR | Low metrics resolution in seconds | -| DATA_RETENTION | How long to keep time-series data in ClickHouse. This variable accepts golang style duration format, example: 24h, 30m, 10s | -| ENABLE_VM_CACHE | Enable cache in VM | -| ENABLE_AZUREDISCOVER | Enable support for discovery of Azure databases | -| ENABLE_BACKUP_MANAGEMENT | Enable integrated backup tools | -| PMM_PUBLIC_ADDRESS | External IP address or the DNS name on which PMM server is running. | -| PMM_DEBUG | Enables a more verbose log level | -| PMM_TRACE | Enables a more verbose log level including traceback information | +| Variable | Description | +|------------------------------|-----------------------------------------------------------------------------------------------------------------------------| +| PMM_DISABLE_UPDATES | Disable automatic updates | +| PMM_DISABLE_TELEMETRY | Disable built-in telemetry and disable STT if telemetry is disabled | +| PMM_DISABLE_ALERTING | Disable Percona alerting | +| PMM_METRICS_RESOLUTION | High metrics resolution in seconds | +| PMM_METRICS_RESOLUTION_HR | High metrics resolution (same as above) | +| PMM_METRICS_RESOLUTION_MR | Medium metrics resolution in seconds | +| PMM_METRICS_RESOLUTION_LR | Low metrics resolution in seconds | +| PMM_DATA_RETENTION | How long to keep time-series data in ClickHouse. This variable accepts golang style duration format, example: 24h, 30m, 10s | +| PMM_ENABLE_VM_CACHE | Enable cache in VM | +| PMM_ENABLE_AZURE_DISCOVER | Enable support for discovery of Azure databases | +| PMM_PUBLIC_ADDRESS | External IP address or the DNS name on which PMM server is running. | +| PMM_DEBUG | Enables a more verbose log level | +| PMM_TRACE | Enables a more verbose log level including traceback information | ## For more information please visit: diff --git a/docker-compose.yml b/docker-compose.yml index 0195e96f9f..7317df4e0f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,36 +16,36 @@ services: networks: - ${NETWORK:-default} environment: - - PMM_RELEASE_PATH=/root/go/bin - - REVIEWDOG_GITHUB_API_TOKEN=${REVIEWDOG_GITHUB_API_TOKEN} - AWS_ACCESS_KEY=${AWS_ACCESS_KEY} - AWS_SECRET_KEY=${AWS_SECRET_KEY} - - ENABLE_RBAC=${ENABLE_RBAC:-0} - - LESS_LOG_NOISE=1 - - PERCONA_TEST_VERSION_SERVICE_URL=${PERCONA_TEST_VERSION_SERVICE_URL} + - REVIEWDOG_GITHUB_API_TOKEN=${REVIEWDOG_GITHUB_API_TOKEN} + - PMM_LESS_LOG_NOISE=1 + - PMM_RELEASE_PATH=/root/go/bin + - PMM_ENABLE_ACCESS_CONTROL=${PMM_ENABLE_ACCESS_CONTROL:-0} + - PMM_DEV_VERSION_SERVICE_URL=${PMM_DEV_VERSION_SERVICE_URL} - PMM_WATCHTOWER_HOST=${PMM_WATCHTOWER_HOST:-http://watchtower:8080} - PMM_WATCHTOWER_TOKEN=${PMM_WATCHTOWER_TOKEN:-INSECURE_TOKEN} - # - PERCONA_TEST_PLATFORM_ADDRESS=https://check.localhost - # - PERCONA_TEST_PLATFORM_INSECURE=1 - # - PERCONA_TEST_PLATFORM_PUBLIC_KEY= - # - PERCONA_TEST_TELEMETRY_INTERVAL=10s - # - PERCONA_TEST_TELEMETRY_DISABLE_START_DELAY=1 - # - PERCONA_TEST_TELEMETRY_RETRY_BACKOFF=10s - # - PERCONA_TEST_PMM_CLICKHOUSE_ADDR=127.0.0.1:9000 - # - PERCONA_TEST_PMM_CLICKHOUSE_DATABASE=pmm - # - PERCONA_TEST_PMM_CLICKHOUSE_BLOCK_SIZE=10000 - # - PERCONA_TEST_PMM_CLICKHOUSE_POOL_SIZE=2 + # - PMM_DEV_PERCONA_PLATFORM_ADDRESS=https://check.localhost + # - PMM_DEV_PERCONA_PLATFORM_INSECURE=1 + # - PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY= + # - PMM_DEV_TELEMETRY_INTERVAL=10s + # - PMM_DEV_TELEMETRY_DISABLE_START_DELAY=1 + # - PMM_DEV_TELEMETRY_RETRY_BACKOFF=10s + # - PMM_CLICKHOUSE_ADDR=127.0.0.1:9000 + # - PMM_CLICKHOUSE_DATABASE=pmm + # - PMM_CLICKHOUSE_BLOCK_SIZE=10000 + # - PMM_CLICKHOUSE_POOL_SIZE=2 # - PMM_DEBUG=1 - # - PERCONA_TEST_CHECKS_FILE=/srv/checks/local-checks.yml - # - PERCONA_TEST_POSTGRES_ADDR=pg - # - PERCONA_TEST_POSTGRES_DBNAME=pmm-managed - # - PERCONA_TEST_POSTGRES_USERNAME=pmm-managed - # - PERCONA_TEST_POSTGRES_DBPASSWORD=pmm-managed - # - PERCONA_TEST_POSTGRES_SSL_MODE=verify-full - # - PERCONA_TEST_POSTGRES_SSL_CA_PATH=/tmp/certs/root.crt - # - PERCONA_TEST_POSTGRES_SSL_KEY_PATH=/tmp/certs/pmm-managed.key - # - PERCONA_TEST_POSTGRES_SSL_CERT_PATH=/tmp/certs/pmm-managed.crt - # - PERCONA_TEST_PMM_DISABLE_BUILTIN_POSTGRES=1 + # - PMM_DEV_ADVISOR_CHECKS_FILE=/srv/checks/local-checks.yml + # - PMM_POSTGRES_ADDR=pg + # - PMM_POSTGRES_DBNAME=pmm-managed + # - PMM_POSTGRES_USERNAME=pmm-managed + # - PMM_POSTGRES_DBPASSWORD=pmm-managed + # - PMM_POSTGRES_SSL_MODE=verify-full + # - PMM_POSTGRES_SSL_CA_PATH=/tmp/certs/root.crt + # - PMM_POSTGRES_SSL_KEY_PATH=/tmp/certs/pmm-managed.key + # - PMM_POSTGRES_SSL_CERT_PATH=/tmp/certs/pmm-managed.crt + # - PMM_DISABLE_BUILTIN_POSTGRES=1 # - GF_DATABASE_SSL_MODE=verify-full # - GF_DATABASE_CA_CERT_PATH=/tmp/certs/root.crt # - GF_DATABASE_CLIENT_KEY_PATH=/tmp/certs/grafana.key @@ -224,26 +224,25 @@ services: - REVIEWDOG_GITHUB_API_TOKEN=${REVIEWDOG_GITHUB_API_TOKEN} - AWS_ACCESS_KEY=${AWS_ACCESS_KEY} - AWS_SECRET_KEY=${AWS_SECRET_KEY} - - ENABLE_BACKUP_MANAGEMENT=1 - # - PERCONA_TEST_PLATFORM_ADDRESS=https://check.localhost - # - PERCONA_TEST_PLATFORM_INSECURE=1 - # - PERCONA_TEST_PLATFORM_PUBLIC_KEY= - # - PERCONA_TEST_TELEMETRY_INTERVAL=10s - # - PERCONA_TEST_TELEMETRY_RETRY_BACKOFF=10s - # - PERCONA_TEST_TELEMETRY_DISABLE_START_DELAY=1 - - PERCONA_TEST_PMM_CLICKHOUSE_ADDR=${CH_HOSTNAME:-ch}:9000 - - PERCONA_TEST_PMM_CLICKHOUSE_DATABASE=pmm - - PERCONA_TEST_PMM_CLICKHOUSE_BLOCK_SIZE=10000 - - PERCONA_TEST_PMM_CLICKHOUSE_POOL_SIZE=2 - - PERCONA_TEST_PMM_DISABLE_BUILTIN_CLICKHOUSE=1 - - PERCONA_TEST_POSTGRES_ADDR=pg:5432 - - PERCONA_TEST_POSTGRES_USERNAME=pmm-managed - - PERCONA_TEST_POSTGRES_DBPASSWORD=pmm-managed - - PERCONA_TEST_PMM_DISABLE_BUILTIN_POSTGRES=1 - # - PERCONA_TEST_POSTGRES_SSL_MODE=require - # - PERCONA_TEST_POSTGRES_SSL_CA_PATH=/certs/root.crt - # - PERCONA_TEST_POSTGRES_SSL_KEY_PATH=/certs/pmm-managed.key - # - PERCONA_TEST_POSTGRES_SSL_CERT_PATH=/certs/pmm-managed.crt + # - PMM_DEV_PERCONA_PLATFORM_ADDRESS=https://check.localhost + # - PMM_DEV_PERCONA_PLATFORM_INSECURE=1 + # - PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY= + # - PMM_DEV_TELEMETRY_INTERVAL=10s + # - PMM_DEV_TELEMETRY_RETRY_BACKOFF=10s + # - PMM_DEV_TELEMETRY_DISABLE_START_DELAY=1 + - PMM_CLICKHOUSE_ADDR=${CH_HOSTNAME:-ch}:9000 + - PMM_CLICKHOUSE_DATABASE=pmm + - PMM_CLICKHOUSE_BLOCK_SIZE=10000 + - PMM_CLICKHOUSE_POOL_SIZE=2 + - PMM_DISABLE_BUILTIN_CLICKHOUSE=1 + - PMM_POSTGRES_ADDR=pg:5432 + - PMM_POSTGRES_USERNAME=pmm-managed + - PMM_POSTGRES_DBPASSWORD=pmm-managed + - PMM_DISABLE_BUILTIN_POSTGRES=1 + # - PMM_POSTGRES_SSL_MODE=require + # - PMM_POSTGRES_SSL_CA_PATH=/certs/root.crt + # - PMM_POSTGRES_SSL_KEY_PATH=/certs/pmm-managed.key + # - PMM_POSTGRES_SSL_CERT_PATH=/certs/pmm-managed.crt - GF_DATABASE_URL=postgres://grafana:grafana@pg:5432/grafana # - GF_DATABASE_SSL_MODE=require # - PMM_DEBUG=1 @@ -308,25 +307,25 @@ services: - REVIEWDOG_GITHUB_API_TOKEN=${REVIEWDOG_GITHUB_API_TOKEN} - AWS_ACCESS_KEY=${AWS_ACCESS_KEY} - AWS_SECRET_KEY=${AWS_SECRET_KEY} - # - PERCONA_TEST_PLATFORM_ADDRESS=https://check.localhost - # - PERCONA_TEST_PLATFORM_INSECURE=1 - # - PERCONA_TEST_PLATFORM_PUBLIC_KEY= - # - PERCONA_TEST_TELEMETRY_INTERVAL=10s - # - PERCONA_TEST_TELEMETRY_RETRY_BACKOFF=10s - # - PERCONA_TEST_TELEMETRY_DISABLE_START_DELAY=1 - - PERCONA_TEST_PMM_CLICKHOUSE_ADDR=${CH_HOSTNAME:-ch}:9000 - - PERCONA_TEST_PMM_CLICKHOUSE_DATABASE=pmm - - PERCONA_TEST_PMM_CLICKHOUSE_BLOCK_SIZE=10000 - - PERCONA_TEST_PMM_CLICKHOUSE_POOL_SIZE=2 - - PERCONA_TEST_PMM_DISABLE_BUILTIN_CLICKHOUSE=1 - - PERCONA_TEST_POSTGRES_ADDR=pg:5432 - - PERCONA_TEST_POSTGRES_USERNAME=pmm-managed - - PERCONA_TEST_POSTGRES_DBPASSWORD=pmm-managed - - PERCONA_TEST_PMM_DISABLE_BUILTIN_POSTGRES=1 - # - PERCONA_TEST_POSTGRES_SSL_MODE=require - # - PERCONA_TEST_POSTGRES_SSL_CA_PATH=/certs/root.crt - # - PERCONA_TEST_POSTGRES_SSL_KEY_PATH=/certs/pmm-managed.key - # - PERCONA_TEST_POSTGRES_SSL_CERT_PATH=/certs/pmm-managed.crt + # - PMM_DEV_PERCONA_PLATFORM_ADDRESS=https://check.localhost + # - PMM_DEV_PERCONA_PLATFORM_INSECURE=1 + # - PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY= + # - PMM_DEV_TELEMETRY_INTERVAL=10s + # - PMM_DEV_TELEMETRY_RETRY_BACKOFF=10s + # - PMM_DEV_TELEMETRY_DISABLE_START_DELAY=1 + - PMM_CLICKHOUSE_ADDR=${CH_HOSTNAME:-ch}:9000 + - PMM_CLICKHOUSE_DATABASE=pmm + - PMM_CLICKHOUSE_BLOCK_SIZE=10000 + - PMM_CLICKHOUSE_POOL_SIZE=2 + - PMM_DISABLE_BUILTIN_CLICKHOUSE=1 + - PMM_POSTGRES_ADDR=pg:5432 + - PMM_POSTGRES_USERNAME=pmm-managed + - PMM_POSTGRES_DBPASSWORD=pmm-managed + - PMM_DISABLE_BUILTIN_POSTGRES=1 + # - PMM_POSTGRES_SSL_MODE=require + # - PMM_POSTGRES_SSL_CA_PATH=/certs/root.crt + # - PMM_POSTGRES_SSL_KEY_PATH=/certs/pmm-managed.key + # - PMM_POSTGRES_SSL_CERT_PATH=/certs/pmm-managed.crt - GF_DATABASE_URL=postgres://grafana:grafana@pg:5432/grafana # - GF_DATABASE_SSL_MODE=require # - PMM_DEBUG=1 @@ -390,25 +389,25 @@ services: - REVIEWDOG_GITHUB_API_TOKEN=${REVIEWDOG_GITHUB_API_TOKEN} - AWS_ACCESS_KEY=${AWS_ACCESS_KEY} - AWS_SECRET_KEY=${AWS_SECRET_KEY} - # - PERCONA_TEST_PLATFORM_ADDRESS=https://check.localhost - # - PERCONA_TEST_PLATFORM_INSECURE=1 - # - PERCONA_TEST_PLATFORM_PUBLIC_KEY= - # - PERCONA_TEST_TELEMETRY_INTERVAL=10s - # - PERCONA_TEST_TELEMETRY_RETRY_BACKOFF=10s - # - PERCONA_TEST_TELEMETRY_DISABLE_START_DELAY=1 - - PERCONA_TEST_PMM_CLICKHOUSE_ADDR=${CH_HOSTNAME:-ch}:9000 - - PERCONA_TEST_PMM_CLICKHOUSE_DATABASE=pmm - - PERCONA_TEST_PMM_CLICKHOUSE_BLOCK_SIZE=10000 - - PERCONA_TEST_PMM_CLICKHOUSE_POOL_SIZE=2 - - PERCONA_TEST_PMM_DISABLE_BUILTIN_CLICKHOUSE=1 - - PERCONA_TEST_POSTGRES_ADDR=pg:5432 - - PERCONA_TEST_POSTGRES_USERNAME=pmm-managed - - PERCONA_TEST_POSTGRES_DBPASSWORD=pmm-managed - - PERCONA_TEST_PMM_DISABLE_BUILTIN_POSTGRES=1 - # - PERCONA_TEST_POSTGRES_SSL_MODE=require - # - PERCONA_TEST_POSTGRES_SSL_CA_PATH=/certs/root.crt - # - PERCONA_TEST_POSTGRES_SSL_KEY_PATH=/certs/pmm-managed.key - # - PERCONA_TEST_POSTGRES_SSL_CERT_PATH=/certs/pmm-managed.crt + # - PMM_DEV_PERCONA_PLATFORM_ADDRESS=https://check.localhost + # - PMM_DEV_PERCONA_PLATFORM_INSECURE=1 + # - PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY= + # - PMM_DEV_TELEMETRY_INTERVAL=10s + # - PMM_DEV_TELEMETRY_RETRY_BACKOFF=10s + # - PMM_DEV_TELEMETRY_DISABLE_START_DELAY=1 + - PMM_CLICKHOUSE_ADDR=${CH_HOSTNAME:-ch}:9000 + - PMM_CLICKHOUSE_DATABASE=pmm + - PMM_CLICKHOUSE_BLOCK_SIZE=10000 + - PMM_CLICKHOUSE_POOL_SIZE=2 + - PMM_DISABLE_BUILTIN_CLICKHOUSE=1 + - PMM_POSTGRES_ADDR=pg:5432 + - PMM_POSTGRES_USERNAME=pmm-managed + - PMM_POSTGRES_DBPASSWORD=pmm-managed + - PMM_DISABLE_BUILTIN_POSTGRES=1 + # - PMM_POSTGRES_SSL_MODE=require + # - PMM_POSTGRES_SSL_CA_PATH=/certs/root.crt + # - PMM_POSTGRES_SSL_KEY_PATH=/certs/pmm-managed.key + # - PMM_POSTGRES_SSL_CERT_PATH=/certs/pmm-managed.crt - GF_DATABASE_URL=postgres://grafana:grafana@pg:5432/grafana # - GF_DATABASE_SSL_MODE=require # - PMM_DEBUG=1 diff --git a/docs/process/best_practices.md b/docs/process/best_practices.md index f93fa188cd..62f666a745 100644 --- a/docs/process/best_practices.md +++ b/docs/process/best_practices.md @@ -26,6 +26,14 @@ - Supervisor-level dependencies between services are not strictly required (due to restarts everything will work eventually), but are nice to have: they help avoid scarry errors in logs. - The big exception is exporters: we should follow practices established by the Prometheus community and not fail if the system under monitoring is not available. Other startup errors, like a missing certificate file, should still terminate the exporter. +### Environment Variables +For consistency, environment variables should keep to the following suggestions: +- Use the `PMM_DEV_` prefix for any environment variable that is to be used for *only* development/test purposes i.e., +variables that are not meant for end-users in any circumstance e.g., `PMM_DEV_PERCONA_PLATFORM_ADDRESS` +- Use the `PMM_TEST_` prefix for any variable that is not part of PMM GA functionality. +- Use the `PMM_` prefix for variables that is part of PMM GA functionality. +- Use a sub-prefix if a number of env vars relate to one component, e.g., `PMM_TEST_HA_` +- The use of PERCONA_ prefix is prohibited (exception: PMM_PERCONA_PLATFORM_URL, since it's part of a proper name, not a prefix) ## Code style - `gofumpt -s ` (note the `-s`) diff --git a/docs/process/v2_to_v3_environment_variables.md b/docs/process/v2_to_v3_environment_variables.md new file mode 100644 index 0000000000..f059f978da --- /dev/null +++ b/docs/process/v2_to_v3_environment_variables.md @@ -0,0 +1,57 @@ +## Migrating PMM v2 environment variables to v3 +We've renamed some environment variables used by PMM for consistency. +Below is a list of affected variables and their new names. + +| PMM 2 | PMM 3 | Comments | +|-----------------------------------------------|--------------------------------------------|--------------------------------------------------------------| +| `DATA_RETENTION` | `PMM_DATA_RETENTION` | | +| `DISABLE_ALERTING` | `PMM_DISABLE_ALERTING` | | +| `DISABLE_UPDATES` | `PMM_DISABLE_UPDATES` | | +| `DISABLE_TELEMETRY` | `PMM_DISABLE_TELEMETRY` | | +| `PERCONA_PLATFORM_API_TIMEOUT` | `PMM_DEV_PERCONA_PLATFORM_API_TIMEOUT` | | +| `DISABLE_BACKUP_MANAGEMENT` | `PMM_DISABLE_BACKUP_MANAGEMENT` | | +| `ENABLE_AZUREDISCOVER` | `PMM_ENABLE_AZURE_DISCOVER` | | +| `ENABLE_RBAC` | `PMM_ENABLE_ACCESS_CONTROL` | | +| `LESS_LOG_NOISE` | `PMM_LESS_LOG_NOISE` | | +| `METRICS_RESOLUTION` | `PMM_METRICS_RESOLUTION` | | +| `METRICS_RESOLUTION_HR` | `PMM_METRICS_RESOLUTION_HR` | | +| `METRICS_RESOLUTION_LR` | `PMM_METRICS_RESOLUTION_LR` | | +| `METRICS_RESOLUTION_MR` | `PMM_METRICS_RESOLUTION_MR` | | +| `OAUTH_PMM_CLIENT_ID` | `PMM_DEV_OAUTH_CLIENT_ID` | | +| `OAUTH_PMM_CLIENT_SECRET` | `PMM_DEV_OAUTH_CLIENT_SECRET` | | +| `PERCONA_TEST_AUTH_HOST` | | Removed in PMM v3, use `PMM_DEV_PERCONA_PLATFORM_ADDRESS` | +| `PERCONA_TEST_CHECKS_FILE` | `PMM_DEV_ADVISOR_CHECKS_FILE` | | +| `PERCONA_TEST_CHECKS_HOST` | | Removed in PMM v3, use `PMM_DEV_PERCONA_PLATFORM_ADDRESS` | +| `PERCONA_TEST_CHECKS_INTERVAL` | | Removed in PMM v3 as it wasn't actually used. | +| `PERCONA_TEST_CHECKS_PUBLIC_KEY` | | Removed in PMM v3, use `PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY` | +| `PERCONA_TEST_NICER_API` | `PMM_NICER_API` | | +| `PERCONA_TEST_PMM_CLICKHOUSE_ADDR` | `PMM_CLICKHOUSE_ADDR` | | +| `PERCONA_TEST_PMM_CLICKHOUSE_BLOCK_SIZE` | `PMM_CLICKHOUSE_BLOCK_SIZE` | | +| `PERCONA_TEST_PMM_CLICKHOUSE_DATABASE` | `PMM_CLICKHOUSE_DATABASE` | | +| `PERCONA_TEST_PMM_CLICKHOUSE_DATASOURCE` | `PMM_CLICKHOUSE_DATASOURCE` | | +| `PERCONA_TEST_PMM_CLICKHOUSE_HOST` | `PMM_CLICKHOUSE_HOST` | | +| `PERCONA_TEST_PMM_CLICKHOUSE_POOL_SIZE` | `PMM_CLICKHOUSE_POOL_SIZE` | | +| `PERCONA_TEST_PMM_CLICKHOUSE_PORT` | `PMM_CLICKHOUSE_PORT` | | +| `PERCONA_TEST_PMM_DISABLE_BUILTIN_CLICKHOUSE` | `PMM_DISABLE_BUILTIN_CLICKHOUSE` | | +| `PERCONA_TEST_PMM_DISABLE_BUILTIN_POSTGRES` | `PMM_DISABLE_BUILTIN_POSTGRES` | | +| `PERCONA_TEST_INTERFACE_TO_BIND` | `PMM_INTERFACE_TO_BIND` | | +| `PERCONA_TEST_PLATFORM_ADDRESS` | `PMM_DEV_PERCONA_PLATFORM_ADDRESS` | | +| `PERCONA_TEST_PLATFORM_INSECURE` | `PMM_DEV_PERCONA_PLATFORM_INSECURE` | | +| `PERCONA_TEST_PLATFORM_PUBLIC_KEY` | `PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY` | | +| `PERCONA_TEST_POSTGRES_ADDR` | `PMM_POSTGRES_ADDR` | | +| `PERCONA_TEST_POSTGRES_DBNAME` | `PMM_POSTGRES_DBNAME` | | +| `PERCONA_TEST_POSTGRES_SSL_CA_PATH` | `PMM_POSTGRES_SSL_CA_PATH` | | +| `PERCONA_TEST_POSTGRES_SSL_CERT_PATH` | `PMM_POSTGRES_SSL_CERT_PATH` | | +| `PERCONA_TEST_POSTGRES_SSL_KEY_PATH` | `PMM_POSTGRES_SSL_KEY_PATH` | | +| `PERCONA_TEST_POSTGRES_SSL_MODE` | `PMM_POSTGRES_SSL_MODE` | | +| `PERCONA_TEST_POSTGRES_DBPASSWORD` | `PMM_POSTGRES_DBPASSWORD` | | +| `PERCONA_TEST_SAAS_HOST` | | Removed in PMM v3, use `PMM_DEV_PERCONA_PLATFORM_ADDRESS` | +| `PERCONA_TEST_POSTGRES_USERNAME` | `PMM_POSTGRES_USERNAME` | | +| `PERCONA_TEST_STARLARK_ALLOW_RECURSION` | `PMM_DEV_ADVISOR_STARLARK_ALLOW_RECURSION` | | +| `PMM_TEST_TELEMETRY_DISABLE_SEND` | `PMM_DEV_TELEMETRY_DISABLE_SEND` | | +| `PERCONA_TEST_TELEMETRY_DISABLE_START_DELAY` | `PMM_DEV_TELEMETRY_DISABLE_START_DELAY` | | +| `PMM_TEST_TELEMETRY_FILE` | `PMM_DEV_TELEMETRY_FILE` | | +| `PERCONA_TEST_TELEMETRY_HOST` | `PMM_DEV_TELEMETRY_HOST` | | +| `PERCONA_TEST_TELEMETRY_INTERVAL` | `PMM_DEV_TELEMETRY_INTERVAL` | | +| `PERCONA_TEST_TELEMETRY_RETRY_BACKOFF` | `PMM_DEV_TELEMETRY_RETRY_BACKOFF` | | +| `PERCONA_TEST_VERSION_SERVICE_URL` | `PMM_DEV_VERSION_SERVICE_URL` | | diff --git a/managed/CONTRIBUTING.md b/managed/CONTRIBUTING.md index ddbafd1018..bebeceb0a3 100644 --- a/managed/CONTRIBUTING.md +++ b/managed/CONTRIBUTING.md @@ -53,25 +53,21 @@ go test -timeout=30s -p 1 ./... ## Available test environment variables: -| Variable | Description | Default | -| ------------------------------------------ | ------------------------------------------------------------------------------------------------------------------- | ---------------------------------------- | -| PERCONA_TEST_PMM_CLICKHOUSE_ADDR | Sets Clickhouse address | 127.0.0.1:9000 | -| PERCONA_TEST_PMM_CLICKHOUSE_DATABASE | Sets Clickhouse database | pmm | -| PERCONA_TEST_PMM_CLICKHOUSE_POOL_SIZE | Sets Clickhouse connections pool size | none | -| PERCONA_TEST_PMM_CLICKHOUSE_BLOCK_SIZE | Sets Clickhouse block size | none | -| PERCONA_TEST_STARLARK_ALLOW_RECURSION | Allows recursive functions in checks scripts | false | -| PERCONA_TEST_NICER_API | Enables nicer API with default/zero values in response. | false | -| PERCONA_TEST_VERSION_SERVICE_URL | Sets versions service URL | https://check.percona.com/versions/v1 | -| PERCONA_TEST_CHECKS_FILE | Specifies path to local checks file and disables downlading checks files from Percona Platform | none | -| PERCONA_TEST_CHECKS_DISABLE_START_DELAY | Disables checks service startup delay | false | -| PERCONA_TEST_TELEMETRY_INTERVAL | Sets telemetry reporting interval | 24h | -| PERCONA_TEST_TELEMETRY_DISABLE_SEND | Disables sending of telemetry data to SaaS. This param doesn't affect telemetry data gathering from the datasources | false | -| PERCONA_TEST_TELEMETRY_FILE | Sets path for telemetry config file | | -| PERCONA_TEST_TELEMETRY_DISABLE_START_DELAY | Disable the default telemetry execution start delay, so that telemetry gathering is run immediately upon system | false | -| PERCONA_TEST_TELEMETRY_RETRY_BACKOFF | Sets telemetry reporting retry backoff time | 1h | -| PERCONA_TEST_PLATFORM_ADDRESS | Sets Percona Platform address | https://check.percona.com | -| PERCONA_TEST_PLATFORM_INSECURE | Allows insecure TLS connections to Percona Platform | false | -| PERCONA_TEST_PLATFORM_PUBLIC_KEY | Sets Percona Platform public key (Minisign) | set of keys embedded into managed binary | +| Variable | Description | Default | +|------------------------------------------|---------------------------------------------------------------------------------------------------------------------|------------------------------------------| +| PMM_DEV_ADVISOR_STARLARK_ALLOW_RECURSION | Allows recursive functions in checks scripts | false | +| PMM_NICER_API | Enables nicer API with default/zero values in response. | false | +| PMM_DEV_VERSION_SERVICE_URL | Sets versions service URL | https://check.percona.com/versions/v1 | +| PMM_DEV_ADVISOR_CHECKS_FILE | Specifies path to local checks file and disables downlading checks files from Percona Platform | none | +| PMM_ADVISORS_CHECKS_DISABLE_START_DELAY | Disables checks service startup delay | false | +| PMM_DEV_TELEMETRY_INTERVAL | Sets telemetry reporting interval | 24h | +| PMM_DEV_TELEMETRY_DISABLE_SEND | Disables sending of telemetry data to SaaS. This param doesn't affect telemetry data gathering from the datasources | false | +| PMM_DEV_TELEMETRY_FILE | Sets path for telemetry config file | | +| PMM_DEV_TELEMETRY_DISABLE_START_DELAY | Disable the default telemetry execution start delay, so that telemetry gathering is run immediately upon system | false | +| PMM_DEV_TELEMETRY_RETRY_BACKOFF | Sets telemetry reporting retry backoff time | 1h | +| PMM_DEV_PERCONA_PLATFORM_ADDRESS | Sets Percona Platform address | https://check.percona.com | +| PMM_DEV_PERCONA_PLATFORM_INSECURE | Allows insecure TLS connections to Percona Platform | false | +| PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY | Sets Percona Platform public key (Minisign) | set of keys embedded into managed binary | ## Add instances for monitoring diff --git a/managed/cmd/pmm-managed-init/main.go b/managed/cmd/pmm-managed-init/main.go index 2a3a076ea7..4934ef1401 100644 --- a/managed/cmd/pmm-managed-init/main.go +++ b/managed/cmd/pmm-managed-init/main.go @@ -53,8 +53,8 @@ func main() { } pmmConfigParams := make(map[string]any) - pmmConfigParams["DisableInternalDB"], _ = strconv.ParseBool(os.Getenv("PERCONA_TEST_PMM_DISABLE_BUILTIN_POSTGRES")) - pmmConfigParams["DisableInternalClickhouse"], _ = strconv.ParseBool(os.Getenv("PERCONA_TEST_PMM_DISABLE_BUILTIN_CLICKHOUSE")) + pmmConfigParams["DisableInternalDB"], _ = strconv.ParseBool(os.Getenv("PMM_DISABLE_BUILTIN_POSTGRES")) + pmmConfigParams["DisableInternalClickhouse"], _ = strconv.ParseBool(os.Getenv("PMM_DISABLE_BUILTIN_CLICKHOUSE")) if err := supervisord.SavePMMConfig(pmmConfigParams); err != nil { logrus.Errorf("PMM Server configuration error: %s.", err) os.Exit(1) diff --git a/managed/cmd/pmm-managed-starlark/main.go b/managed/cmd/pmm-managed-starlark/main.go index b574e8db9c..e9c7ecf1bc 100644 --- a/managed/cmd/pmm-managed-starlark/main.go +++ b/managed/cmd/pmm-managed-starlark/main.go @@ -42,7 +42,7 @@ const ( memoryLimitBytes = 1024 * 1024 * 1024 // Only used for testing. - starlarkRecursionFlag = "PERCONA_TEST_STARLARK_ALLOW_RECURSION" + starlarkRecursionFlag = "PMM_DEV_ADVISOR_STARLARK_ALLOW_RECURSION" // Warning messages. cpuUsageWarning = "Failed to limit CPU usage" diff --git a/managed/cmd/pmm-managed/main.go b/managed/cmd/pmm-managed/main.go index a5a5cf3c0c..c6b4a85b70 100644 --- a/managed/cmd/pmm-managed/main.go +++ b/managed/cmd/pmm-managed/main.go @@ -357,7 +357,7 @@ func runHTTP1Server(ctx context.Context, deps *http1ServerDeps) { } // FIXME make that a default behavior: https://jira.percona.com/browse/PMM-6722 - if nicer, _ := strconv.ParseBool(os.Getenv("PERCONA_TEST_NICER_API")); nicer { + if nicer, _ := strconv.ParseBool(os.Getenv("PMM_NICER_API")); nicer { l.Warn("Enabling nicer API with default/zero values in response.") marshaller.EmitUnpopulated = true } @@ -658,32 +658,32 @@ func main() { //nolint:cyclop,maintidx postgresAddrF := kingpin.Flag("postgres-addr", "PostgreSQL address"). Default(models.DefaultPostgreSQLAddr). - Envar("PERCONA_TEST_POSTGRES_ADDR"). + Envar("PMM_POSTGRES_ADDR"). String() postgresDBNameF := kingpin.Flag("postgres-name", "PostgreSQL database name"). Default("pmm-managed"). - Envar("PERCONA_TEST_POSTGRES_DBNAME"). + Envar("PMM_POSTGRES_DBNAME"). String() postgresDBUsernameF := kingpin.Flag("postgres-username", "PostgreSQL database username"). Default("pmm-managed"). - Envar("PERCONA_TEST_POSTGRES_USERNAME"). + Envar("PMM_POSTGRES_USERNAME"). String() postgresSSLModeF := kingpin.Flag("postgres-ssl-mode", "PostgreSQL SSL mode"). Default(models.DisableSSLMode). - Envar("PERCONA_TEST_POSTGRES_SSL_MODE"). + Envar("PMM_POSTGRES_SSL_MODE"). Enum(models.DisableSSLMode, models.RequireSSLMode, models.VerifyCaSSLMode, models.VerifyFullSSLMode) postgresSSLCAPathF := kingpin.Flag("postgres-ssl-ca-path", "PostgreSQL SSL CA root certificate path"). - Envar("PERCONA_TEST_POSTGRES_SSL_CA_PATH"). + Envar("PMM_POSTGRES_SSL_CA_PATH"). String() postgresDBPasswordF := kingpin.Flag("postgres-password", "PostgreSQL database password"). Default("pmm-managed"). - Envar("PERCONA_TEST_POSTGRES_DBPASSWORD"). + Envar("PMM_POSTGRES_DBPASSWORD"). String() postgresSSLKeyPathF := kingpin.Flag("postgres-ssl-key-path", "PostgreSQL SSL key path"). - Envar("PERCONA_TEST_POSTGRES_SSL_KEY_PATH"). + Envar("PMM_POSTGRES_SSL_KEY_PATH"). String() postgresSSLCertPathF := kingpin.Flag("postgres-ssl-cert-path", "PostgreSQL SSL certificate path"). - Envar("PERCONA_TEST_POSTGRES_SSL_CERT_PATH"). + Envar("PMM_POSTGRES_SSL_CERT_PATH"). String() haEnabled := kingpin.Flag("ha-enable", "Enable HA"). @@ -720,8 +720,8 @@ func main() { //nolint:cyclop,maintidx debugF := kingpin.Flag("debug", "Enable debug logging").Envar("PMM_DEBUG").Bool() traceF := kingpin.Flag("trace", "[DEPRECATED] Enable trace logging (implies debug)").Envar("PMM_TRACE").Bool() - clickHouseDatabaseF := kingpin.Flag("clickhouse-name", "Clickhouse database name").Default("pmm").Envar("PERCONA_TEST_PMM_CLICKHOUSE_DATABASE").String() - clickhouseAddrF := kingpin.Flag("clickhouse-addr", "Clickhouse database address").Default("127.0.0.1:9000").Envar("PERCONA_TEST_PMM_CLICKHOUSE_ADDR").String() + clickHouseDatabaseF := kingpin.Flag("clickhouse-name", "Clickhouse database name").Default("pmm").Envar("PMM_CLICKHOUSE_DATABASE").String() + clickhouseAddrF := kingpin.Flag("clickhouse-addr", "Clickhouse database address").Default("127.0.0.1:9000").Envar("PMM_CLICKHOUSE_ADDR").String() watchtowerHostF := kingpin.Flag("watchtower-host", "Watchtower host").Default("http://watchtower:8080").Envar("PMM_WATCHTOWER_HOST").URL() diff --git a/managed/models/percona_sso_model_helpers_test.go b/managed/models/percona_sso_model_helpers_test.go index 23f59c2d7d..663a4661b6 100644 --- a/managed/models/percona_sso_model_helpers_test.go +++ b/managed/models/percona_sso_model_helpers_test.go @@ -47,9 +47,9 @@ func TestPerconaSSODetails(t *testing.T) { orgID := uuid.NewString() t.Run("CorrectCredentials", func(t *testing.T) { - clientID, clientSecret := os.Getenv("OAUTH_PMM_CLIENT_ID"), os.Getenv("OAUTH_PMM_CLIENT_SECRET") + clientID, clientSecret := os.Getenv("PMM_DEV_OAUTH_CLIENT_ID"), os.Getenv("PMM_DEV_OAUTH_CLIENT_SECRET") if clientID == "" || clientSecret == "" { - t.Skip("Environment variables OAUTH_PMM_CLIENT_ID / OAUTH_PMM_CLIENT_SECRET are not defined, skipping test") + t.Skip("Environment variables PMM_DEV_OAUTH_CLIENT_ID / PMM_DEV_OAUTH_CLIENT_SECRET are not defined, skipping test") } db, cleanup := setupDB(t) @@ -117,9 +117,9 @@ func TestPerconaSSODetails(t *testing.T) { }) t.Run("WrongURL", func(t *testing.T) { - clientID, clientSecret := os.Getenv("OAUTH_PMM_CLIENT_ID"), os.Getenv("OAUTH_PMM_CLIENT_SECRET") + clientID, clientSecret := os.Getenv("PMM_DEV_OAUTH_CLIENT_ID"), os.Getenv("PMM_DEV_OAUTH_CLIENT_SECRET") if clientID == "" || clientSecret == "" { - t.Skip("Environment variables OAUTH_PMM_CLIENT_ID / OAUTH_PMM_CLIENT_SECRET are not defined, skipping test") + t.Skip("Environment variables PMM_DEV_OAUTH_CLIENT_ID / PMM_DEV_OAUTH_CLIENT_SECRET are not defined, skipping test") } db, cleanup := setupDB(t) diff --git a/managed/services/checks/checks.go b/managed/services/checks/checks.go index cced2f6a86..64f4dfd749 100644 --- a/managed/services/checks/checks.go +++ b/managed/services/checks/checks.go @@ -56,8 +56,8 @@ const ( defaultStartDelay = time.Minute // Environment variables that affect checks service; only for testing. - envCheckFile = "PERCONA_TEST_CHECKS_FILE" //nolint:gosec - envDisableStartDelay = "PERCONA_TEST_CHECKS_DISABLE_START_DELAY" + envCheckFile = "PMM_DEV_ADVISOR_CHECKS_FILE" + envDisableStartDelay = "PMM_ADVISORS_CHECKS_DISABLE_START_DELAY" checkExecutionTimeout = 5 * time.Minute // limits execution time for every single check platformRequestTimeout = 2 * time.Minute // time limit to get checks list from the portal diff --git a/managed/services/checks/checks_test.go b/managed/services/checks/checks_test.go index b38f0b1d4e..feeb983d69 100644 --- a/managed/services/checks/checks_test.go +++ b/managed/services/checks/checks_test.go @@ -54,9 +54,9 @@ var ( ) func TestDownloadAdvisors(t *testing.T) { - clientID, clientSecret := os.Getenv("OAUTH_PMM_CLIENT_ID"), os.Getenv("OAUTH_PMM_CLIENT_SECRET") + clientID, clientSecret := os.Getenv("PMM_DEV_OAUTH_CLIENT_ID"), os.Getenv("PMM_DEV_OAUTH_CLIENT_SECRET") if clientID == "" || clientSecret == "" { - t.Skip("Environment variables OAUTH_PMM_CLIENT_ID / OAUTH_PMM_CLIENT_SECRET are not defined, skipping test") + t.Skip("Environment variables PMM_DEV_OAUTH_CLIENT_ID / PMM_DEV_OAUTH_CLIENT_SECRET are not defined, skipping test") } setupClients(t) diff --git a/managed/services/config/config.go b/managed/services/config/config.go index fd4cedf7b5..0ae7ecc672 100644 --- a/managed/services/config/config.go +++ b/managed/services/config/config.go @@ -30,7 +30,7 @@ import ( ) const ( - envConfigPath = "PERCONA_PMM_CONFIG_PATH" + envConfigPath = "PMM_TEST_CONFIG_PATH" defaultConfigPath = "/etc/percona/pmm/pmm-managed.yml" ) diff --git a/managed/services/management/alerting/service_test.go b/managed/services/management/alerting/service_test.go index 08bc38d10d..0e1d7de3e5 100644 --- a/managed/services/management/alerting/service_test.go +++ b/managed/services/management/alerting/service_test.go @@ -43,9 +43,9 @@ const ( func TestCollect(t *testing.T) { t.Parallel() - clientID, clientSecret := os.Getenv("OAUTH_PMM_CLIENT_ID"), os.Getenv("OAUTH_PMM_CLIENT_SECRET") + clientID, clientSecret := os.Getenv("PMM_DEV_OAUTH_CLIENT_ID"), os.Getenv("PMM_DEV_OAUTH_CLIENT_SECRET") if clientID == "" || clientSecret == "" { - t.Skip("Environment variables OAUTH_PMM_CLIENT_ID / OAUTH_PMM_CLIENT_SECRET are not defined, skipping test") + t.Skip("Environment variables PMM_DEV_OAUTH_CLIENT_ID / PMM_DEV_OAUTH_CLIENT_SECRET are not defined, skipping test") } ctx := context.Background() @@ -110,9 +110,9 @@ func TestCollect(t *testing.T) { } func TestDownloadTemplates(t *testing.T) { - clientID, clientSecret := os.Getenv("OAUTH_PMM_CLIENT_ID"), os.Getenv("OAUTH_PMM_CLIENT_SECRET") + clientID, clientSecret := os.Getenv("PMM_DEV_OAUTH_CLIENT_ID"), os.Getenv("PMM_DEV_OAUTH_CLIENT_SECRET") if clientID == "" || clientSecret == "" { - t.Skip("Environment variables OAUTH_PMM_CLIENT_ID / OAUTH_PMM_CLIENT_SECRET are not defined, skipping test") + t.Skip("Environment variables PMM_DEV_OAUTH_CLIENT_ID / PMM_DEV_OAUTH_CLIENT_SECRET are not defined, skipping test") } sqlDB := testdb.Open(t, models.SkipFixtures, nil) diff --git a/managed/services/server/server.go b/managed/services/server/server.go index dc4d9634d1..0a18699ecb 100644 --- a/managed/services/server/server.go +++ b/managed/services/server/server.go @@ -295,7 +295,7 @@ func (s *Server) StartUpdate(ctx context.Context, req *serverpb.StartUpdateReque s.envRW.RUnlock() if updatesDisabled { - return nil, status.Error(codes.FailedPrecondition, "Updates are disabled via DISABLE_UPDATES environment variable.") + return nil, status.Error(codes.FailedPrecondition, "Updates are disabled via PMM_DISABLE_UPDATES environment variable.") } err := s.updater.StartUpdate(ctx, req.GetNewImage()) @@ -469,12 +469,12 @@ func (s *Server) validateChangeSettingsRequest(ctx context.Context, req *serverp // check request parameters compatibility with environment variables if req.EnableUpdates && s.envSettings.DisableUpdates { - return status.Error(codes.FailedPrecondition, "Updates are disabled via DISABLE_UPDATES environment variable.") + return status.Error(codes.FailedPrecondition, "Updates are disabled via PMM_DISABLE_UPDATES environment variable.") } // ignore req.DisableTelemetry and req.DisableStt even if they are present since that will not change anything if req.EnableTelemetry && s.envSettings.DisableTelemetry { - return status.Error(codes.FailedPrecondition, "Telemetry is disabled via DISABLE_TELEMETRY environment variable.") + return status.Error(codes.FailedPrecondition, "Telemetry is disabled via PMM_DISABLE_TELEMETRY environment variable.") } // ignore req.EnableAlerting even if they are present since that will not change anything @@ -484,23 +484,23 @@ func (s *Server) validateChangeSettingsRequest(ctx context.Context, req *serverp // ignore req.DisableAzurediscover even if they are present since that will not change anything if req.DisableAzurediscover && s.envSettings.EnableAzurediscover { - return status.Error(codes.FailedPrecondition, "Azure Discover is enabled via ENABLE_AZUREDISCOVER environment variable.") + return status.Error(codes.FailedPrecondition, "Azure Discover is enabled via PMM_ENABLE_AZURE_DISCOVER environment variable.") } if !canUpdateDurationSetting(metricsRes.GetHr().AsDuration(), s.envSettings.MetricsResolutions.HR) { - return status.Error(codes.FailedPrecondition, "High resolution for metrics is set via METRICS_RESOLUTION_HR (or METRICS_RESOLUTION) environment variable.") + return status.Error(codes.FailedPrecondition, "High resolution for metrics is set via PMM_METRICS_RESOLUTION_HR (or PMM_METRICS_RESOLUTION) environment variable.") //nolint:lll } if !canUpdateDurationSetting(metricsRes.GetMr().AsDuration(), s.envSettings.MetricsResolutions.MR) { - return status.Error(codes.FailedPrecondition, "Medium resolution for metrics is set via METRICS_RESOLUTION_MR environment variable.") + return status.Error(codes.FailedPrecondition, "Medium resolution for metrics is set via PMM_METRICS_RESOLUTION_MR environment variable.") } if !canUpdateDurationSetting(metricsRes.GetLr().AsDuration(), s.envSettings.MetricsResolutions.LR) { - return status.Error(codes.FailedPrecondition, "Low resolution for metrics is set via METRICS_RESOLUTION_LR environment variable.") + return status.Error(codes.FailedPrecondition, "Low resolution for metrics is set via PMM_METRICS_RESOLUTION_LR environment variable.") } if !canUpdateDurationSetting(req.DataRetention.AsDuration(), s.envSettings.DataRetention) { - return status.Error(codes.FailedPrecondition, "Data retention for queries is set via DATA_RETENTION environment variable.") + return status.Error(codes.FailedPrecondition, "Data retention for queries is set via PMM_DATA_RETENTION environment variable.") } return nil diff --git a/managed/services/server/server_test.go b/managed/services/server/server_test.go index 82a67d3cb6..5d6e83f78f 100644 --- a/managed/services/server/server_test.go +++ b/managed/services/server/server_test.go @@ -90,12 +90,12 @@ func TestServer(t *testing.T) { t.Run("Typical", func(t *testing.T) { s := newServer(t) errs := s.UpdateSettingsFromEnv([]string{ - "DISABLE_UPDATES=true", - "DISABLE_TELEMETRY=1", - "METRICS_RESOLUTION_HR=1s", - "METRICS_RESOLUTION_MR=2s", - "METRICS_RESOLUTION_LR=3s", - "DATA_RETENTION=240h", + "PMM_DISABLE_UPDATES=true", + "PMM_DISABLE_TELEMETRY=1", + "PMM_METRICS_RESOLUTION_HR=1s", + "PMM_METRICS_RESOLUTION_MR=2s", + "PMM_METRICS_RESOLUTION_LR=3s", + "PMM_DATA_RETENTION=240h", "PMM_PUBLIC_ADDRESS=1.2.3.4:5678", }) require.Empty(t, errs) @@ -111,9 +111,9 @@ func TestServer(t *testing.T) { t.Run("Untypical", func(t *testing.T) { s := newServer(t) errs := s.UpdateSettingsFromEnv([]string{ - "DISABLE_TELEMETRY=TrUe", - "METRICS_RESOLUTION=3S", - "DATA_RETENTION=360H", + "PMM_DISABLE_TELEMETRY=TrUe", + "PMM_METRICS_RESOLUTION=3S", + "PMM_DATA_RETENTION=360H", }) require.Empty(t, errs) assert.Equal(t, true, s.envSettings.DisableTelemetry) @@ -124,27 +124,27 @@ func TestServer(t *testing.T) { t.Run("NoValue", func(t *testing.T) { s := newServer(t) errs := s.UpdateSettingsFromEnv([]string{ - "DISABLE_TELEMETRY", + "PMM_DISABLE_TELEMETRY", }) require.Len(t, errs, 1) - require.EqualError(t, errs[0], `failed to parse environment variable "DISABLE_TELEMETRY"`) + require.EqualError(t, errs[0], `failed to parse environment variable "PMM_DISABLE_TELEMETRY"`) assert.False(t, s.envSettings.DisableTelemetry) }) t.Run("InvalidValue", func(t *testing.T) { s := newServer(t) errs := s.UpdateSettingsFromEnv([]string{ - "DISABLE_TELEMETRY=", + "PMM_DISABLE_TELEMETRY=", }) require.Len(t, errs, 1) - require.EqualError(t, errs[0], `invalid value "" for environment variable "DISABLE_TELEMETRY"`) + require.EqualError(t, errs[0], `invalid value "" for environment variable "PMM_DISABLE_TELEMETRY"`) assert.False(t, s.envSettings.DisableTelemetry) }) t.Run("MetricsLessThenMin", func(t *testing.T) { s := newServer(t) errs := s.UpdateSettingsFromEnv([]string{ - "METRICS_RESOLUTION=5ns", + "PMM_METRICS_RESOLUTION=5ns", }) require.Len(t, errs, 1) var errInvalidArgument *models.InvalidArgumentError @@ -156,7 +156,7 @@ func TestServer(t *testing.T) { t.Run("DataRetentionLessThenMin", func(t *testing.T) { s := newServer(t) errs := s.UpdateSettingsFromEnv([]string{ - "DATA_RETENTION=12h", + "PMM_DATA_RETENTION=12h", }) require.Len(t, errs, 1) var errInvalidArgument *models.InvalidArgumentError @@ -168,7 +168,7 @@ func TestServer(t *testing.T) { t.Run("Data retention is not a natural number of days", func(t *testing.T) { s := newServer(t) errs := s.UpdateSettingsFromEnv([]string{ - "DATA_RETENTION=30h", + "PMM_DATA_RETENTION=30h", }) require.Len(t, errs, 1) var errInvalidArgument *models.InvalidArgumentError @@ -180,10 +180,10 @@ func TestServer(t *testing.T) { t.Run("Data retention without suffix", func(t *testing.T) { s := newServer(t) errs := s.UpdateSettingsFromEnv([]string{ - "DATA_RETENTION=30", + "PMM_DATA_RETENTION=30", }) require.Len(t, errs, 1) - require.EqualError(t, errs[0], `environment variable "DATA_RETENTION=30" has invalid duration 30`) + require.EqualError(t, errs[0], `environment variable "PMM_DATA_RETENTION=30" has invalid duration 30`) assert.Zero(t, s.envSettings.DataRetention) }) }) @@ -194,7 +194,7 @@ func TestServer(t *testing.T) { ctx := context.TODO() s.envSettings.DisableUpdates = true - expected := status.New(codes.FailedPrecondition, "Updates are disabled via DISABLE_UPDATES environment variable.") + expected := status.New(codes.FailedPrecondition, "Updates are disabled via PMM_DISABLE_UPDATES environment variable.") tests.AssertGRPCError(t, expected, s.validateChangeSettingsRequest(ctx, &serverpb.ChangeSettingsRequest{ EnableUpdates: true, })) @@ -203,7 +203,7 @@ func TestServer(t *testing.T) { })) s.envSettings.DisableTelemetry = true - expected = status.New(codes.FailedPrecondition, "Telemetry is disabled via DISABLE_TELEMETRY environment variable.") + expected = status.New(codes.FailedPrecondition, "Telemetry is disabled via PMM_DISABLE_TELEMETRY environment variable.") tests.AssertGRPCError(t, expected, s.validateChangeSettingsRequest(ctx, &serverpb.ChangeSettingsRequest{ EnableTelemetry: true, })) @@ -224,7 +224,7 @@ func TestServer(t *testing.T) { server.UpdateSettingsFromEnv([]string{ "ENABLE_ALERTING=1", - "ENABLE_AZUREDISCOVER=1", + "PMM_ENABLE_AZURE_DISCOVER=1", }) ctx := context.TODO() diff --git a/managed/services/supervisord/supervisord.go b/managed/services/supervisord/supervisord.go index 2d94414418..41c0f5bf19 100644 --- a/managed/services/supervisord/supervisord.go +++ b/managed/services/supervisord/supervisord.go @@ -422,11 +422,11 @@ func getValueFromENV(envName string, defaultValue string) string { // marshalConfig marshals supervisord program configuration. func (s *Service) marshalConfig(tmpl *template.Template, settings *models.Settings, ssoDetails *models.PerconaSSODetails) ([]byte, error) { - clickhouseDatabase := getValueFromENV("PERCONA_TEST_PMM_CLICKHOUSE_DATABASE", defaultClickhouseDatabase) - clickhouseAddr := getValueFromENV("PERCONA_TEST_PMM_CLICKHOUSE_ADDR", defaultClickhouseAddr) - clickhouseDataSourceAddr := getValueFromENV("PERCONA_TEST_PMM_CLICKHOUSE_DATASOURCE_ADDR", defaultClickhouseDataSourceAddr) - clickhousePoolSize := getValueFromENV("PERCONA_TEST_PMM_CLICKHOUSE_POOL_SIZE", "") - clickhouseBlockSize := getValueFromENV("PERCONA_TEST_PMM_CLICKHOUSE_BLOCK_SIZE", "") + clickhouseDatabase := getValueFromENV("PMM_CLICKHOUSE_DATABASE", defaultClickhouseDatabase) + clickhouseAddr := getValueFromENV("PMM_CLICKHOUSE_ADDR", defaultClickhouseAddr) + clickhouseDataSourceAddr := getValueFromENV("PMM_CLICKHOUSE_DATASOURCE_ADDR", defaultClickhouseDataSourceAddr) + clickhousePoolSize := getValueFromENV("PMM_CLICKHOUSE_POOL_SIZE", "") + clickhouseBlockSize := getValueFromENV("PMM_CLICKHOUSE_BLOCK_SIZE", "") clickhouseAddrPair := strings.SplitN(clickhouseAddr, ":", 2) vmSearchDisableCache := getValueFromENV("VM_search_disableCache", strconv.FormatBool(!settings.VictoriaMetrics.CacheEnabled)) vmSearchMaxQueryLen := getValueFromENV("VM_search_maxQueryLen", defaultVMSearchMaxQueryLen) @@ -725,10 +725,10 @@ command = /usr/sbin/percona-qan-api2 --data-retention={{ .DataRetentionDays }} environment = - PERCONA_TEST_PMM_CLICKHOUSE_ADDR="{{ .ClickhouseAddr }}", - PERCONA_TEST_PMM_CLICKHOUSE_DATABASE="{{ .ClickhouseDatabase }}", -{{ if .ClickhousePoolSize }} PERCONA_TEST_PMM_CLICKHOUSE_POOL_SIZE={{ .ClickhousePoolSize }},{{- end}} -{{ if .ClickhouseBlockSize }} PERCONA_TEST_PMM_CLICKHOUSE_BLOCK_SIZE={{ .ClickhouseBlockSize }}{{- end}} + PMM_CLICKHOUSE_ADDR="{{ .ClickhouseAddr }}", + PMM_CLICKHOUSE_DATABASE="{{ .ClickhouseDatabase }}", +{{ if .ClickhousePoolSize }} PMM_CLICKHOUSE_POOL_SIZE={{ .ClickhousePoolSize }},{{- end}} +{{ if .ClickhouseBlockSize }} PMM_CLICKHOUSE_BLOCK_SIZE={{ .ClickhouseBlockSize }}{{- end}} user = pmm autorestart = true autostart = true @@ -765,17 +765,17 @@ command = cfg:default.auth.oauth_allow_insecure_email_lookup="true" {{- end}} environment = - PERCONA_TEST_POSTGRES_ADDR="{{ .PostgresAddr }}", - PERCONA_TEST_POSTGRES_DBNAME="{{ .PostgresDBName }}", - PERCONA_TEST_POSTGRES_USERNAME="{{ .PostgresDBUsername }}", - PERCONA_TEST_POSTGRES_DBPASSWORD="{{ .PostgresDBPassword }}", - PERCONA_TEST_POSTGRES_SSL_MODE="{{ .PostgresSSLMode }}", - PERCONA_TEST_POSTGRES_SSL_CA_PATH="{{ .PostgresSSLCAPath }}", - PERCONA_TEST_POSTGRES_SSL_KEY_PATH="{{ .PostgresSSLKeyPath }}", - PERCONA_TEST_POSTGRES_SSL_CERT_PATH="{{ .PostgresSSLCertPath }}", - PERCONA_TEST_PMM_CLICKHOUSE_DATASOURCE_ADDR="{{ .ClickhouseDataSourceAddr }}", - PERCONA_TEST_PMM_CLICKHOUSE_HOST="{{ .ClickhouseHost }}", - PERCONA_TEST_PMM_CLICKHOUSE_PORT="{{ .ClickhousePort }}", + PMM_POSTGRES_ADDR="{{ .PostgresAddr }}", + PMM_POSTGRES_DBNAME="{{ .PostgresDBName }}", + PMM_POSTGRES_USERNAME="{{ .PostgresDBUsername }}", + PMM_POSTGRES_DBPASSWORD="{{ .PostgresDBPassword }}", + PMM_POSTGRES_SSL_MODE="{{ .PostgresSSLMode }}", + PMM_POSTGRES_SSL_CA_PATH="{{ .PostgresSSLCAPath }}", + PMM_POSTGRES_SSL_KEY_PATH="{{ .PostgresSSLKeyPath }}", + PMM_POSTGRES_SSL_CERT_PATH="{{ .PostgresSSLCertPath }}", + PMM_CLICKHOUSE_DATASOURCE_ADDR="{{ .ClickhouseDataSourceAddr }}", + PMM_CLICKHOUSE_HOST="{{ .ClickhouseHost }}", + PMM_CLICKHOUSE_PORT="{{ .ClickhousePort }}", {{- if .PerconaSSODetails}} GF_AUTH_SIGNOUT_REDIRECT_URL="https://{{ .IssuerDomain }}/login/signout?fromURI=https://{{ .PMMServerAddress }}/graph/login" {{- end}} diff --git a/managed/services/telemetry/config.default.yml b/managed/services/telemetry/config.default.yml index 4e9aae6820..ed7bf76dd1 100644 --- a/managed/services/telemetry/config.default.yml +++ b/managed/services/telemetry/config.default.yml @@ -965,8 +965,8 @@ telemetry: summary: "Use of External DBs" data: - metric_name: "pmm_server_ha_clickhouse_address" - column: "PERCONA_TEST_PMM_CLICKHOUSE_ADDR" + column: "PMM_CLICKHOUSE_ADDR" - metric_name: "pmm_server_ha_postgres_address" - column: "PERCONA_TEST_POSTGRES_ADDR" + column: "PMM_POSTGRES_ADDR" - metric_name: "pmm_server_ha_vm_url" column: "PMM_VM_URL" diff --git a/managed/services/telemetry/config.go b/managed/services/telemetry/config.go index 006d0fb3ba..53ccf7d42c 100644 --- a/managed/services/telemetry/config.go +++ b/managed/services/telemetry/config.go @@ -30,11 +30,11 @@ import ( ) const ( - envDisableSend = "PERCONA_TEST_TELEMETRY_DISABLE_SEND" - envConfigFile = "PERCONA_TEST_TELEMETRY_FILE" - envDisableStartDelay = "PERCONA_TEST_TELEMETRY_DISABLE_START_DELAY" - envReportingInterval = "PERCONA_TEST_TELEMETRY_INTERVAL" - envReportingRetryBackoff = "PERCONA_TEST_TELEMETRY_RETRY_BACKOFF" + envDisableSend = "PMM_DEV_TELEMETRY_DISABLE_SEND" + envConfigFile = "PMM_DEV_TELEMETRY_FILE" + envDisableStartDelay = "PMM_DEV_TELEMETRY_DISABLE_START_DELAY" + envReportingInterval = "PMM_DEV_TELEMETRY_INTERVAL" + envReportingRetryBackoff = "PMM_DEV_TELEMETRY_RETRY_BACKOFF" ) const ( diff --git a/managed/testdata/supervisord.d/grafana.ini b/managed/testdata/supervisord.d/grafana.ini index ba5408a3f4..107cdf2661 100644 --- a/managed/testdata/supervisord.d/grafana.ini +++ b/managed/testdata/supervisord.d/grafana.ini @@ -8,17 +8,17 @@ command = --config=/etc/grafana/grafana.ini cfg:default.server.domain="192.168.0.42:8443" environment = - PERCONA_TEST_POSTGRES_ADDR="127.0.0.1:5432", - PERCONA_TEST_POSTGRES_DBNAME="postgres", - PERCONA_TEST_POSTGRES_USERNAME="db_username", - PERCONA_TEST_POSTGRES_DBPASSWORD="db_password", - PERCONA_TEST_POSTGRES_SSL_MODE="verify", - PERCONA_TEST_POSTGRES_SSL_CA_PATH="path-to-CA-cert", - PERCONA_TEST_POSTGRES_SSL_KEY_PATH="path-to-key", - PERCONA_TEST_POSTGRES_SSL_CERT_PATH="path-to-cert", - PERCONA_TEST_PMM_CLICKHOUSE_DATASOURCE_ADDR="127.0.0.1:8123", - PERCONA_TEST_PMM_CLICKHOUSE_HOST="127.0.0.1", - PERCONA_TEST_PMM_CLICKHOUSE_PORT="9000", + PMM_POSTGRES_ADDR="127.0.0.1:5432", + PMM_POSTGRES_DBNAME="postgres", + PMM_POSTGRES_USERNAME="db_username", + PMM_POSTGRES_DBPASSWORD="db_password", + PMM_POSTGRES_SSL_MODE="verify", + PMM_POSTGRES_SSL_CA_PATH="path-to-CA-cert", + PMM_POSTGRES_SSL_KEY_PATH="path-to-key", + PMM_POSTGRES_SSL_CERT_PATH="path-to-cert", + PMM_CLICKHOUSE_DATASOURCE_ADDR="127.0.0.1:8123", + PMM_CLICKHOUSE_HOST="127.0.0.1", + PMM_CLICKHOUSE_PORT="9000", user = pmm directory = /usr/share/grafana autorestart = true diff --git a/managed/testdata/supervisord.d/qan-api2.ini b/managed/testdata/supervisord.d/qan-api2.ini index 94124e5afb..3422475cb7 100644 --- a/managed/testdata/supervisord.d/qan-api2.ini +++ b/managed/testdata/supervisord.d/qan-api2.ini @@ -6,8 +6,8 @@ command = /usr/sbin/percona-qan-api2 --data-retention=30 environment = - PERCONA_TEST_PMM_CLICKHOUSE_ADDR="127.0.0.1:9000", - PERCONA_TEST_PMM_CLICKHOUSE_DATABASE="pmm", + PMM_CLICKHOUSE_ADDR="127.0.0.1:9000", + PMM_CLICKHOUSE_DATABASE="pmm", user = pmm diff --git a/managed/utils/envvars/parser.go b/managed/utils/envvars/parser.go index 9e9ad2e0f8..35adf8fa2c 100644 --- a/managed/utils/envvars/parser.go +++ b/managed/utils/envvars/parser.go @@ -32,12 +32,12 @@ import ( const ( defaultPlatformAddress = "https://check.percona.com" - envPlatformAddress = "PERCONA_TEST_PLATFORM_ADDRESS" - envPlatformInsecure = "PERCONA_TEST_PLATFORM_INSECURE" - envPlatformPublicKey = "PERCONA_TEST_PLATFORM_PUBLIC_KEY" - evnInterfaceToBind = "PERCONA_TEST_INTERFACE_TO_BIND" - envEnableAccessControl = "ENABLE_RBAC" - envPlatformAPITimeout = "PERCONA_PLATFORM_API_TIMEOUT" + envPlatformAddress = "PMM_DEV_PERCONA_PLATFORM_ADDRESS" + envPlatformInsecure = "PMM_DEV_PERCONA_PLATFORM_INSECURE" + envPlatformPublicKey = "PMM_DEV_PERCONA_PLATFORM_PUBLIC_KEY" + evnInterfaceToBind = "PMM_INTERFACE_TO_BIND" + envEnableAccessControl = "PMM_ENABLE_ACCESS_CONTROL" + envPlatformAPITimeout = "PMM_DEV_PERCONA_PLATFORM_API_TIMEOUT" defaultPlatformAPITimeout = 30 * time.Second // ENVvmAgentPrefix is the prefix for environment variables related to the VM agent. ENVvmAgentPrefix = "VMAGENT_" @@ -56,13 +56,13 @@ func (e InvalidDurationError) Error() string { return string(e) } // In case of error, the docker run terminates. // Short description of environment variables: // - PATH, HOSTNAME, TERM, HOME are default environment variables that will be ignored; -// - DISABLE_UPDATES is a boolean flag to enable or disable pmm-server update; -// - DISABLE_TELEMETRY is a boolean flag to enable or disable pmm telemetry (and disable STT if telemetry is disabled); -// - DISABLE_ALERTING disables Percona Alerting; -// - METRICS_RESOLUTION, METRICS_RESOLUTION_MR, METRICS_RESOLUTION_HR, METRICS_RESOLUTION_LR are durations of metrics resolution; -// - DATA_RETENTION is the duration of how long keep time-series data in ClickHouse; -// - ENABLE_AZUREDISCOVER enables Azure Discover; -// - ENABLE_RBAC enables Access control; +// - PMM_DISABLE_UPDATES is a boolean flag to enable or disable pmm-server update; +// - PMM_DISABLE_TELEMETRY is a boolean flag to enable or disable pmm telemetry (and disable STT if telemetry is disabled); +// - PMM_DISABLE_ALERTING disables Percona Alerting; +// - PMM_METRICS_RESOLUTION, PMM_METRICS_RESOLUTION_MR, PMM_METRICS_RESOLUTION_HR, PMM_METRICS_RESOLUTION_LR are durations of metrics resolution; +// - PMM_DATA_RETENTION is the duration of how long keep time-series data in ClickHouse; +// - PMM_ENABLE_AZURE_DISCOVER enables Azure Discover; +// - PMM_ENABLE_ACCESS_CONTROL enables Access control; // - the environment variables prefixed with GF_ passed as related to Grafana. // - the environment variables relating to proxies // - the environment variable set by podman @@ -87,42 +87,47 @@ func ParseEnvVars(envs []string) (*models.ChangeSettingsParams, []error, []strin case "_", "HOME", "HOSTNAME", "LANG", "PATH", "PWD", "SHLVL", "TERM", "LC_ALL", "SHELL", "LOGNAME", "USER", "PS1": // skip default environment variables continue + case "NO_PROXY", "HTTP_PROXY", "HTTPS_PROXY": + continue + + case "CONTAINER": + continue case "PMM_DEBUG", "PMM_TRACE": // skip cross-component environment variables that are already handled by kingpin continue - case "PERCONA_TEST_VERSION_SERVICE_URL": + case "PMM_DEV_VERSION_SERVICE_URL": // skip pmm-managed environment variables that are already handled by kingpin continue - case "PERCONA_TEST_PMM_CLICKHOUSE_DATABASE", "PERCONA_TEST_PMM_CLICKHOUSE_ADDR", "PERCONA_TEST_PMM_CLICKHOUSE_BLOCK_SIZE", "PERCONA_TEST_PMM_CLICKHOUSE_POOL_SIZE": //nolint:lll + case "PMM_CLICKHOUSE_DATABASE", "PMM_CLICKHOUSE_ADDR", "PMM_CLICKHOUSE_BLOCK_SIZE", "PMM_CLICKHOUSE_POOL_SIZE": // skip env variables for external clickhouse continue - case "DISABLE_UPDATES": + case "PMM_DISABLE_UPDATES": envSettings.DisableUpdates, err = strconv.ParseBool(v) if err != nil { err = fmt.Errorf("invalid value %q for environment variable %q", v, k) } - case "DISABLE_TELEMETRY": + case "PMM_DISABLE_TELEMETRY": envSettings.DisableTelemetry, err = strconv.ParseBool(v) if err != nil { err = fmt.Errorf("invalid value %q for environment variable %q", v, k) } - case "METRICS_RESOLUTION", "METRICS_RESOLUTION_HR": + case "PMM_METRICS_RESOLUTION", "PMM_METRICS_RESOLUTION_HR": if envSettings.MetricsResolutions.HR, err = parseStringDuration(v); err != nil { err = formatEnvVariableError(err, env, v) } - case "METRICS_RESOLUTION_MR": + case "PMM_METRICS_RESOLUTION_MR": if envSettings.MetricsResolutions.MR, err = parseStringDuration(v); err != nil { err = formatEnvVariableError(err, env, v) } - case "METRICS_RESOLUTION_LR": + case "PMM_METRICS_RESOLUTION_LR": if envSettings.MetricsResolutions.LR, err = parseStringDuration(v); err != nil { err = formatEnvVariableError(err, env, v) } - case "DATA_RETENTION": + case "PMM_DATA_RETENTION": if envSettings.DataRetention, err = parseStringDuration(v); err != nil { err = formatEnvVariableError(err, env, v) } - case "ENABLE_VM_CACHE": + case "PMM_ENABLE_VM_CACHE": envSettings.EnableVMCache, err = strconv.ParseBool(v) if err != nil { err = fmt.Errorf("invalid value %q for environment variable %q", v, k) @@ -131,28 +136,22 @@ func ParseEnvVars(envs []string) (*models.ChangeSettingsParams, []error, []strin // disable cache explicitly envSettings.DisableVMCache = true } - case "DISABLE_ALERTING": + case "PMM_DISABLE_ALERTING": envSettings.DisableAlerting, err = strconv.ParseBool(v) if err != nil { err = fmt.Errorf("invalid value %q for environment variable %q", v, k) } - case "ENABLE_AZUREDISCOVER": + case "PMM_ENABLE_AZURE_DISCOVER": envSettings.EnableAzurediscover, err = strconv.ParseBool(v) if err != nil { err = fmt.Errorf("invalid value %q for environment variable %q", v, k) } - case "DISABLE_BACKUP_MANAGEMENT": + case "PMM_DISABLE_BACKUP_MANAGEMENT": envSettings.DisableBackupManagement, err = strconv.ParseBool(v) if err != nil { err = fmt.Errorf("invalid value %q for environment variable %q", v, k) } - case "PERCONA_TEST_AUTH_HOST", "PERCONA_TEST_CHECKS_HOST", "PERCONA_TEST_TELEMETRY_HOST", "PERCONA_TEST_SAAS_HOST": - warns = append(warns, fmt.Sprintf("environment variable %q is removed and replaced by %q", k, envPlatformAddress)) - - case "PERCONA_TEST_CHECKS_PUBLIC_KEY": - warns = append(warns, fmt.Sprintf("environment variable %q is removed and replaced by %q", k, envPlatformPublicKey)) - case "PMM_PUBLIC_ADDRESS": envSettings.PMMPublicAddress = v @@ -162,12 +161,6 @@ func ParseEnvVars(envs []string) (*models.ChangeSettingsParams, []error, []strin err = fmt.Errorf("invalid value %q for environment variable %q", v, k) } - case "NO_PROXY", "HTTP_PROXY", "HTTPS_PROXY": - continue - - case "CONTAINER": - continue - case "PMM_INSTALL_METHOD": continue @@ -217,12 +210,23 @@ func ParseEnvVars(envs []string) (*models.ChangeSettingsParams, []error, []strin continue } - if !strings.HasPrefix(k, "PERCONA_TEST_") { - warns = append(warns, fmt.Sprintf("unknown environment variable %q", env)) + // skip PMM development environment variables + if strings.HasPrefix(k, "PMM_DEV_") { + continue + } + + // skip PMM test environment variables + if strings.HasPrefix(k, "PMM_TEST_") { + warns = append(warns, fmt.Sprintf("environment variable %q may be removed or replaced in the future", env)) + continue + } + + if strings.HasPrefix(k, "PERCONA_") { + warns = append(warns, "PERCONA_* env variables IS NOT SUPPORTED, please use PMM_* env variables, for details please check our documentation") continue } - warns = append(warns, fmt.Sprintf("environment variable %q IS NOT SUPPORTED and WILL BE REMOVED IN THE FUTURE", k)) + warns = append(warns, fmt.Sprintf("unknown environment variable %q", env)) } if err != nil { diff --git a/managed/utils/envvars/parser_test.go b/managed/utils/envvars/parser_test.go index 2d823ea055..2e1c910f8d 100644 --- a/managed/utils/envvars/parser_test.go +++ b/managed/utils/envvars/parser_test.go @@ -33,12 +33,12 @@ func TestEnvVarValidator(t *testing.T) { t.Parallel() envs := []string{ - "DISABLE_UPDATES=True", - "DISABLE_TELEMETRY=True", - "METRICS_RESOLUTION=5m", - "METRICS_RESOLUTION_MR=5s", - "METRICS_RESOLUTION_LR=1h", - "DATA_RETENTION=72h", + "PMM_DISABLE_UPDATES=True", + "PMM_DISABLE_TELEMETRY=True", + "PMM_METRICS_RESOLUTION=5m", + "PMM_METRICS_RESOLUTION_MR=5s", + "PMM_METRICS_RESOLUTION_LR=1h", + "PMM_DATA_RETENTION=72h", } expectedEnvVars := &models.ChangeSettingsParams{ DataRetention: 72 * time.Hour, @@ -117,26 +117,26 @@ func TestEnvVarValidator(t *testing.T) { t.Parallel() envs := []string{ - "DISABLE_UPDATES", - "DISABLE_TELEMETRY", - "DISABLE_UPDATES=5", - "DISABLE_TELEMETRY=X", - "METRICS_RESOLUTION=5f", - "METRICS_RESOLUTION_MR=s5", - "METRICS_RESOLUTION_LR=1hour", - "DATA_RETENTION=keep one week", + "PMM_DISABLE_UPDATES", + "PMM_DISABLE_TELEMETRY", + "PMM_DISABLE_UPDATES=5", + "PMM_DISABLE_TELEMETRY=X", + "PMM_METRICS_RESOLUTION=5f", + "PMM_METRICS_RESOLUTION_MR=s5", + "PMM_METRICS_RESOLUTION_LR=1hour", + "PMM_DATA_RETENTION=keep one week", } expectedEnvVars := &models.ChangeSettingsParams{} expectedErrs := []error{ - fmt.Errorf(`failed to parse environment variable "DISABLE_UPDATES"`), - fmt.Errorf(`failed to parse environment variable "DISABLE_TELEMETRY"`), - fmt.Errorf(`invalid value "5" for environment variable "DISABLE_UPDATES"`), - fmt.Errorf(`invalid value "x" for environment variable "DISABLE_TELEMETRY"`), - fmt.Errorf(`environment variable "METRICS_RESOLUTION=5f" has invalid duration 5f`), - fmt.Errorf(`environment variable "METRICS_RESOLUTION_MR=s5" has invalid duration s5`), - fmt.Errorf(`environment variable "METRICS_RESOLUTION_LR=1hour" has invalid duration 1hour`), - fmt.Errorf(`environment variable "DATA_RETENTION=keep one week" has invalid duration keep one week`), + fmt.Errorf(`failed to parse environment variable "PMM_DISABLE_UPDATES"`), + fmt.Errorf(`failed to parse environment variable "PMM_DISABLE_TELEMETRY"`), + fmt.Errorf(`invalid value "5" for environment variable "PMM_DISABLE_UPDATES"`), + fmt.Errorf(`invalid value "x" for environment variable "PMM_DISABLE_TELEMETRY"`), + fmt.Errorf(`environment variable "PMM_METRICS_RESOLUTION=5f" has invalid duration 5f`), + fmt.Errorf(`environment variable "PMM_METRICS_RESOLUTION_MR=s5" has invalid duration s5`), + fmt.Errorf(`environment variable "PMM_METRICS_RESOLUTION_LR=1hour" has invalid duration 1hour`), + fmt.Errorf(`environment variable "PMM_DATA_RETENTION=keep one week" has invalid duration keep one week`), } gotEnvVars, gotErrs, gotWarns := ParseEnvVars(envs) @@ -145,57 +145,33 @@ func TestEnvVarValidator(t *testing.T) { assert.Nil(t, gotWarns) }) - t.Run("PERCONA_TEST_PLATFORM_ADDRESS env vars with warnings", func(t *testing.T) { + t.Run("v2 valid env vars with 'PERCONA_*' prefix show warnings", func(t *testing.T) { t.Parallel() envs := []string{ "PERCONA_TEST_PLATFORM_ADDRESS=https://host:333", - } - expectedEnvVars := &models.ChangeSettingsParams{} - expectedWarns := []string{ - `environment variable "PERCONA_TEST_PLATFORM_ADDRESS" IS NOT SUPPORTED and WILL BE REMOVED IN THE FUTURE`, - } - - gotEnvVars, gotErrs, gotWarns := ParseEnvVars(envs) - assert.Nil(t, gotErrs) - assert.Equal(t, expectedEnvVars, gotEnvVars) - assert.Equal(t, expectedWarns, gotWarns) - }) - - t.Run("PERCONA_TEST_CHECKS_PUBLIC_KEY env vars with warnings", func(t *testing.T) { - t.Parallel() - - envs := []string{ "PERCONA_TEST_CHECKS_PUBLIC_KEY=some key", + "PERCONA_TEST_AUTH_HOST=host:333", + "PERCONA_TEST_CHECKS_HOST=host:333", + "PERCONA_TEST_TELEMETRY_HOST=host:333", + "PERCONA_TEST_SAAS_HOST=host:333", } expectedEnvVars := &models.ChangeSettingsParams{} expectedWarns := []string{ - `environment variable "PERCONA_TEST_CHECKS_PUBLIC_KEY" is removed and replaced by "PERCONA_TEST_PLATFORM_PUBLIC_KEY"`, + `PERCONA_* env variables IS NOT SUPPORTED, please use PMM_* env variables, for details please check our documentation`, + `PERCONA_* env variables IS NOT SUPPORTED, please use PMM_* env variables, for details please check our documentation`, + `PERCONA_* env variables IS NOT SUPPORTED, please use PMM_* env variables, for details please check our documentation`, + `PERCONA_* env variables IS NOT SUPPORTED, please use PMM_* env variables, for details please check our documentation`, + `PERCONA_* env variables IS NOT SUPPORTED, please use PMM_* env variables, for details please check our documentation`, + `PERCONA_* env variables IS NOT SUPPORTED, please use PMM_* env variables, for details please check our documentation`, } - gotEnvVars, gotErrs, gotWarns := ParseEnvVars(envs) - assert.Nil(t, gotErrs) + gotEnvVars, _, gotWarns := ParseEnvVars(envs) + // assert.Nil(t, gotErrs) assert.Equal(t, expectedEnvVars, gotEnvVars) assert.Equal(t, expectedWarns, gotWarns) }) - t.Run("SAAS env vars with errors", func(t *testing.T) { - t.Parallel() - - for _, k := range []string{ - "PERCONA_TEST_AUTH_HOST", - "PERCONA_TEST_CHECKS_HOST", - "PERCONA_TEST_TELEMETRY_HOST", - "PERCONA_TEST_SAAS_HOST", - } { - expected := fmt.Sprintf(`environment variable %q is removed and replaced by "PERCONA_TEST_PLATFORM_ADDRESS"`, k) - envs := []string{k + "=host:333"} - _, gotErrs, gotWarns := ParseEnvVars(envs) - assert.Equal(t, []string{expected}, gotWarns) - assert.Nil(t, gotErrs) - } - }) - t.Run("Parse Platform API Timeout", func(t *testing.T) { t.Parallel() @@ -206,7 +182,7 @@ func TestEnvVarValidator(t *testing.T) { }{ { value: "", respVal: time.Second * 30, - msg: "Environment variable \"PERCONA_PLATFORM_API_TIMEOUT\" is not set, using \"30s\" as a default timeout for platform API.", + msg: "Environment variable \"PMM_DEV_PERCONA_PLATFORM_API_TIMEOUT\" is not set, using \"30s\" as a default timeout for platform API.", }, { value: "10s", respVal: time.Second * 10, diff --git a/managed/utils/interceptors/interceptors.go b/managed/utils/interceptors/interceptors.go index 8a3a4e7173..a246c7c8bd 100644 --- a/managed/utils/interceptors/interceptors.go +++ b/managed/utils/interceptors/interceptors.go @@ -94,7 +94,7 @@ func Unary(interceptor grpc.UnaryServerInterceptor) UnaryInterceptorType { l := logrus.WithField("request", logger.MakeRequestID()) ctx = logger.SetEntry(ctx, l) - if info.FullMethod == "/server.Server/Readiness" && os.Getenv("LESS_LOG_NOISE") != "" { + if info.FullMethod == "/server.Server/Readiness" && os.Getenv("PMM_LESS_LOG_NOISE") != "" { l = logrus.NewEntry(logrus.New()) l.Logger.SetOutput(io.Discard) } diff --git a/qan-api2/main.go b/qan-api2/main.go index df5457964d..c1496b1e76 100644 --- a/qan-api2/main.go +++ b/qan-api2/main.go @@ -262,12 +262,12 @@ func main() { debugBindF := kingpin.Flag("listen-debug-addr", "Debug server listen address").Default("127.0.0.1:9933").String() dataRetentionF := kingpin.Flag("data-retention", "QAN data Retention (in days)").Default("30").Uint() dsnF := kingpin.Flag("dsn", "ClickHouse database DSN. Can be override with database/host/port options").Default(defaultDsnF).String() - clickHouseDatabaseF := kingpin.Flag("clickhouse-name", "Clickhouse database name").Default("pmm").Envar("PERCONA_TEST_PMM_CLICKHOUSE_DATABASE").String() - clickhouseAddrF := kingpin.Flag("clickhouse-addr", "Clickhouse database address").Default("127.0.0.1:9000").Envar("PERCONA_TEST_PMM_CLICKHOUSE_ADDR").String() + clickHouseDatabaseF := kingpin.Flag("clickhouse-name", "Clickhouse database name").Default("pmm").Envar("PMM_CLICKHOUSE_DATABASE").String() + clickhouseAddrF := kingpin.Flag("clickhouse-addr", "Clickhouse database address").Default("127.0.0.1:9000").Envar("PMM_CLICKHOUSE_ADDR").String() clickhouseBlockSizeF := kingpin.Flag("clickhouse-block-size", "Number of rows that can be load from table in one cycle"). - Default("10000").Envar("PERCONA_TEST_PMM_CLICKHOUSE_BLOCK_SIZE").String() + Default("10000").Envar("PMM_CLICKHOUSE_BLOCK_SIZE").String() clickhousePoolSizeF := kingpin.Flag("clickhouse-pool-size", "Controls how much queries can be run simultaneously"). - Default("2").Envar("PERCONA_TEST_PMM_CLICKHOUSE_POOL_SIZE").String() + Default("2").Envar("PMM_CLICKHOUSE_POOL_SIZE").String() debugF := kingpin.Flag("debug", "Enable debug logging").Bool() traceF := kingpin.Flag("trace", "Enable trace logging (implies debug)").Bool() From 561b807e7c949a959c1046d4abf7e0613f3b7fcf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Wed, 24 Apr 2024 18:57:32 +0200 Subject: [PATCH 14/44] PMM-7 Service accounts length fix. (#2973) --- managed/services/grafana/client.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 724eb01388..3054a8f43a 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -47,8 +47,8 @@ var ErrFailedToGetToken = errors.New("failed to get token") const ( defaultEvaluationInterval = time.Minute - pmmServiceTokenName = "pmm-agent-service-token" //nolint:gosec - pmmServiceAccountName = "pmm-agent-service-account" //nolint:gosec + pmmServiceTokenName = "pmm-agent-st" //nolint:gosec + pmmServiceAccountName = "pmm-agent-sa" //nolint:gosec ) // Client represents a client for Grafana API. From 3747ab15bb8ed3bb30ed3d4fe6b80ba4dcba2c92 Mon Sep 17 00:00:00 2001 From: Alex Demidoff Date: Fri, 26 Apr 2024 15:22:42 +0400 Subject: [PATCH 15/44] PMM-7 Upgrade codecov-action (#2974) * PMM-7 upgrade codecov-action * PMM-7 add codecov token * PMM-7 add token to update.yml * PMM-7 trigger the build * PMM-7 output NodeJS version * PMM-7 output npx and playwright versions --- .github/workflows/admin.yml | 19 +++++++++---------- .github/workflows/agent.yml | 3 ++- .github/workflows/managed.yml | 3 ++- .github/workflows/update.yml | 4 +++- .github/workflows/vmproxy.yml | 9 ++++----- 5 files changed, 20 insertions(+), 18 deletions(-) diff --git a/.github/workflows/admin.yml b/.github/workflows/admin.yml index 99b8d970d2..5720120856 100644 --- a/.github/workflows/admin.yml +++ b/.github/workflows/admin.yml @@ -65,19 +65,18 @@ jobs: run: make test-cover - name: Upload coverage results - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: file: cover.out flags: admin fail_ci_if_error: false + token: ${{ secrets.CODECOV_TOKEN }} - name: Run debug commands on failure if: ${{ failure() }} run: | - env - go version - go env - pwd + env | sort + go env | sort git status cli-test: @@ -161,9 +160,9 @@ jobs: - name: Run debug commands on failure if: ${{ failure() }} run: | - env - go version - go env - node --version - pwd + env | sort + go env | sort git status + node --version + npx --version + npx playwright --version diff --git a/.github/workflows/agent.yml b/.github/workflows/agent.yml index c1c5facf5c..3d51b98349 100644 --- a/.github/workflows/agent.yml +++ b/.github/workflows/agent.yml @@ -102,12 +102,13 @@ jobs: run: make test-cover - name: Upload coverage results - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: file: cover.out flags: agent env_vars: MYSQL_IMAGE,MONGO_IMAGE,POSTGRES_IMAGE,PMM_SERVER_IMAGE fail_ci_if_error: false + token: ${{ secrets.CODECOV_TOKEN }} - name: Run debug commands on failure if: ${{ failure() }} diff --git a/.github/workflows/managed.yml b/.github/workflows/managed.yml index 067f9c6e6a..b4cfef6034 100644 --- a/.github/workflows/managed.yml +++ b/.github/workflows/managed.yml @@ -88,12 +88,13 @@ jobs: run: docker exec -i pmm-server make -C managed test-update - name: Upload coverage results - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: file: managed/cover.out flags: managed env_vars: PMM_SERVER_IMAGE fail_ci_if_error: false + token: ${{ secrets.CODECOV_TOKEN }} - name: Cache if: ${{ fromJSON(env.DEVCONTAINER_CACHE_ENABLED) }} diff --git a/.github/workflows/update.yml b/.github/workflows/update.yml index bbe76d37df..0403edcd19 100644 --- a/.github/workflows/update.yml +++ b/.github/workflows/update.yml @@ -63,8 +63,10 @@ jobs: run: docker exec pmm-update-server make -C /root/go/src/github.com/percona/pmm/update run-race-cover RUN_FLAGS='-debug -check' - name: Upload coverage results - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: file: cover.out flags: update fail_ci_if_error: false + token: ${{ secrets.CODECOV_TOKEN }} + diff --git a/.github/workflows/vmproxy.yml b/.github/workflows/vmproxy.yml index 95f04fee8c..9ad4605176 100644 --- a/.github/workflows/vmproxy.yml +++ b/.github/workflows/vmproxy.yml @@ -67,17 +67,16 @@ jobs: run: make test-cover - name: Upload coverage results - uses: codecov/codecov-action@v3 + uses: codecov/codecov-action@v4 with: file: cover.out flags: vmproxy fail_ci_if_error: false + token: ${{ secrets.CODECOV_TOKEN }} - name: Run debug commands on failure if: ${{ failure() }} run: | - env - go version - go env - pwd + env | sort + go env | sort git status From 1d87743d488ee7615297ae6156d4668c13eddee2 Mon Sep 17 00:00:00 2001 From: Talha Bin Rizwan Date: Mon, 29 Apr 2024 16:00:50 +0500 Subject: [PATCH 16/44] PMM-13075 Build pmm client for Ubuntu Noble (24..04) (#2977) --- build/scripts/build-client-deb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/scripts/build-client-deb b/build/scripts/build-client-deb index 2a94002557..f1593517b1 100755 --- a/build/scripts/build-client-deb +++ b/build/scripts/build-client-deb @@ -21,7 +21,7 @@ main() { apt-get update case "\$OS_VERSION" in - 11 | 12 | 22.04) apt-get -y install git lsb-release devscripts dh-make;; + 11 | 12 | 22.04 | 24.04) apt-get -y install git lsb-release devscripts dh-make;; *) apt-get -y install git lsb-release devscripts dh-make dh-systemd;; esac mkdir -p /tmp/pmm From dc10c5092a97907376e534a9e5b820bf1f57fcc7 Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Tue, 30 Apr 2024 09:43:50 +0300 Subject: [PATCH 17/44] PMM-12776 Update go version for API tests (#2978) --- Dockerfile | 2 +- vmproxy/proxy/proxy.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 46ab87ad75..64db89a18d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # This Dockerfile is used only for API tests. -FROM golang:1.21 +FROM golang:1.22 RUN export GOPATH=$(go env GOPATH) && \ mkdir -p $GOPATH/src/github.com/percona/pmm diff --git a/vmproxy/proxy/proxy.go b/vmproxy/proxy/proxy.go index 4ad7655ae8..f4fb80a054 100644 --- a/vmproxy/proxy/proxy.go +++ b/vmproxy/proxy/proxy.go @@ -54,7 +54,7 @@ func getHandler(cfg Config) http.HandlerFunc { Director: director(cfg.TargetURL, cfg.HeaderName), } - return http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { + return func(rw http.ResponseWriter, req *http.Request) { logrus.Infof("%s: %s", req.Method, req.URL) if failOnInvalidHeader(rw, req, cfg.HeaderName) { @@ -62,7 +62,7 @@ func getHandler(cfg Config) http.HandlerFunc { } rProxy.ServeHTTP(rw, req) - }) + } } func failOnInvalidHeader(rw http.ResponseWriter, req *http.Request, headerName string) bool { From 3258363c5ce742798d7030895ec79ed1df55daff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Tue, 30 Apr 2024 17:12:47 +0200 Subject: [PATCH 18/44] PMM-7 Fix for service accounts tests stability. (#2976) * PMM-7 Test. * trigger * trigger * trigger * trigger * trigger * trigger * trigger * trigger * trigger * PMM-7 test. * trigger * trigger * trigger * PMM-7 Test if fails are due to locked accounts. * PMM-7 Test not in parallels. * trigger * trigger * trigger * PMM-7 Comment about locks. * trigger --- managed/services/grafana/auth_server_test.go | 1 + managed/services/grafana/client_test.go | 10 ---------- 2 files changed, 1 insertion(+), 10 deletions(-) diff --git a/managed/services/grafana/auth_server_test.go b/managed/services/grafana/auth_server_test.go index 0b1bbbe14c..8b03a2ad2c 100644 --- a/managed/services/grafana/auth_server_test.go +++ b/managed/services/grafana/auth_server_test.go @@ -292,6 +292,7 @@ func TestServerClientConnection(t *testing.T) { assert.Nil(t, authError) }) + // Beware: Five or more wrong tries will lock user with error message: "Invalid user or password". t.Run("Basic auth - fail", func(t *testing.T) { t.Parallel() diff --git a/managed/services/grafana/client_test.go b/managed/services/grafana/client_test.go index 66963ded67..25cb50f3a1 100644 --- a/managed/services/grafana/client_test.go +++ b/managed/services/grafana/client_test.go @@ -41,8 +41,6 @@ func TestClient(t *testing.T) { t.Run("getRole", func(t *testing.T) { t.Run("GrafanaAdmin", func(t *testing.T) { - t.Parallel() - u, err := c.getAuthUser(ctx, authHeaders) role := u.role assert.NoError(t, err) @@ -51,8 +49,6 @@ func TestClient(t *testing.T) { }) t.Run("NoAnonymousAccess", func(t *testing.T) { - t.Parallel() - // See [auth.anonymous] in grafana.ini. // Even if anonymous access is enabled, returned role is None, not org_role. @@ -101,8 +97,6 @@ func TestClient(t *testing.T) { role := role t.Run(fmt.Sprintf("Basic auth %s", role.String()), func(t *testing.T) { - t.Parallel() - login := fmt.Sprintf("basic-%s-%d", role, time.Now().Nanosecond()) userID, err := c.testCreateUser(ctx, login, role, authHeaders) require.NoError(t, err) @@ -127,8 +121,6 @@ func TestClient(t *testing.T) { }) t.Run(fmt.Sprintf("API Key auth %s", role.String()), func(t *testing.T) { - t.Parallel() - login := fmt.Sprintf("api-%s-%d", role, time.Now().Nanosecond()) apiKeyID, apiKey, err := c.createAPIKey(ctx, login, role, authHeaders) require.NoError(t, err) @@ -152,8 +144,6 @@ func TestClient(t *testing.T) { }) t.Run(fmt.Sprintf("Service token auth %s", role.String()), func(t *testing.T) { - t.Parallel() - nodeName := fmt.Sprintf("test-node-%s", role) serviceAccountID, err := c.createServiceAccount(ctx, role, nodeName, true, authHeaders) require.NoError(t, err) From f8ee9405e7feef8f725cc26d5fa4d8105eb3a12e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 2 May 2024 14:35:29 +0200 Subject: [PATCH 19/44] Bump @typescript-eslint/eslint-plugin from 7.7.0 to 7.8.0 in /cli-tests (#2980) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 7.7.0 to 7.8.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.8.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 266 +++++++++++++++++++++++++++++++++--- cli-tests/package.json | 2 +- 2 files changed, 248 insertions(+), 20 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index dc22491ef7..ee84fa9812 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -20,7 +20,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.7.0", + "@typescript-eslint/eslint-plugin": "^7.8.0", "@typescript-eslint/parser": "^7.7.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", @@ -261,16 +261,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.7.0.tgz", - "integrity": "sha512-GJWR0YnfrKnsRoluVO3PRb9r5aMZriiMMM/RHj5nnTrBy1/wIgk76XCtCKcnXGjpZQJQRFtGV9/0JJ6n30uwpQ==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", + "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/type-utils": "7.7.0", - "@typescript-eslint/utils": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/type-utils": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.3.1", @@ -295,6 +295,53 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.0.tgz", @@ -341,13 +388,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.7.0.tgz", - "integrity": "sha512-bOp3ejoRYrhAlnT/bozNQi3nio9tIgv3U5C0mVDdZC7cpcQEDZXvq8inrHYghLVwuNABRqrMW5tzAv88Vy77Sg==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", + "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.7.0", - "@typescript-eslint/utils": "7.7.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/utils": "7.8.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -367,6 +414,88 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/types": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", @@ -433,17 +562,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.7.0.tgz", - "integrity": "sha512-LKGAXMPQs8U/zMRFXDZOzmMKgFv3COlxUQ+2NMPhbqgVm6R1w+nU1i4836Pmxu9jZAuIeyySNrN/6Rc657ggig==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.15", "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/typescript-estree": "7.7.0", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", "semver": "^7.6.0" }, "engines": { @@ -457,6 +586,105 @@ "eslint": "^8.56.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "7.7.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index f23b1de376..9b7973db5a 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.7.0", + "@typescript-eslint/eslint-plugin": "^7.8.0", "@typescript-eslint/parser": "^7.7.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", From 0ed5396f4f87057810de0cd2cd1264efaf57c0e8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 May 2024 09:22:48 +0200 Subject: [PATCH 20/44] Bump @typescript-eslint/parser from 7.7.0 to 7.8.0 in /cli-tests (#2979) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 7.7.0 to 7.8.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.8.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 258 +++--------------------------------- cli-tests/package.json | 2 +- 2 files changed, 16 insertions(+), 244 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index ee84fa9812..1e0de4e96a 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -21,7 +21,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.7.0", + "@typescript-eslint/parser": "^7.8.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", @@ -295,63 +295,16 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", - "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", - "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/parser": { "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", - "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", "dev": true, "dependencies": { + "@typescript-eslint/scope-manager": "7.8.0", "@typescript-eslint/types": "7.8.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.7.0.tgz", - "integrity": "sha512-fNcDm3wSwVM8QYL4HKVBggdIPAy9Q41vcvC/GtDobw3c4ndVT3K6cqudUmjHPw8EAp4ufax0o58/xvWaP2FmTg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.7.0", - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/typescript-estree": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", "debug": "^4.3.4" }, "engines": { @@ -371,13 +324,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.7.0.tgz", - "integrity": "sha512-/8INDn0YLInbe9Wt7dK4cXLDYp0fNHP5xKLHvZl3mOT5X17rK/YShXaiNmorl+/U4VKCVIjJnx4Ri5b0y+HClw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0" + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -414,7 +367,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/types": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", @@ -427,7 +380,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", @@ -455,88 +408,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", - "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.8.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.7.0.tgz", - "integrity": "sha512-G01YPZ1Bd2hn+KPpIbrAhEWOn5lQBrjxkzHkWvP6NucMXFtfXoevK82hzQdpfuQYuhkvFDeQYbzXCjR1z9Z03w==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.7.0.tgz", - "integrity": "sha512-8p71HQPE6CbxIBy2kWHqM1KGrC07pk6RJn40n0DSc6bMOBBREZxSDJ+BmRzc8B5OdaMh1ty3mkuWRg4sCFiDQQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.7.0", - "@typescript-eslint/visitor-keys": "7.7.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -586,65 +457,7 @@ "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", - "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", - "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", - "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/visitor-keys": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", @@ -661,47 +474,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.7.0.tgz", - "integrity": "sha512-h0WHOj8MhdhY8YWkzIF30R379y0NqyOHExI9N9KCzvmu05EgG4FumeYa3ccfKUSphyWkWQE1ybVrgz/Pbam6YA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.7.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index 9b7973db5a..12e3bf2534 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -25,7 +25,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^7.8.0", - "@typescript-eslint/parser": "^7.7.0", + "@typescript-eslint/parser": "^7.8.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", From a262bf301247954ce394002bb23e89532d277626 Mon Sep 17 00:00:00 2001 From: Matej Kubinec <32638572+matejkubinec@users.noreply.github.com> Date: Fri, 3 May 2024 15:20:34 +0200 Subject: [PATCH 21/44] PMM-12741 Percona templated alerts - interval & folder uid (#2919) * PMM-12741 Use folder uid for alert rules & handle evaluation interval * PMM-12741 Format files * PMM-12741 Rename parameter --- api/managementpb/alerting/alerting.pb.go | 190 ++++++++++-------- .../alerting/alerting.pb.validate.go | 29 +++ api/managementpb/alerting/alerting.proto | 2 + api/managementpb/alerting/json/alerting.json | 5 + .../client/alerting/create_rule_responses.go | 3 + api/swagger/swagger-dev.json | 5 + api/swagger/swagger.json | 5 + managed/services/grafana/client.go | 14 +- managed/services/management/alerting/deps.go | 2 +- .../alerting/mock_grafana_client_test.go | 10 +- .../services/management/alerting/service.go | 18 +- 11 files changed, 173 insertions(+), 110 deletions(-) diff --git a/api/managementpb/alerting/alerting.pb.go b/api/managementpb/alerting/alerting.pb.go index 4d7f20be77..818395c988 100644 --- a/api/managementpb/alerting/alerting.pb.go +++ b/api/managementpb/alerting/alerting.pb.go @@ -1198,6 +1198,8 @@ type CreateRuleRequest 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"` // Filters. Filters []*Filter `protobuf:"bytes,9,rep,name=filters,proto3" json:"filters,omitempty"` + // Evaluation Interval + Interval *durationpb.Duration `protobuf:"bytes,10,opt,name=interval,proto3" json:"interval,omitempty"` } func (x *CreateRuleRequest) Reset() { @@ -1295,6 +1297,13 @@ func (x *CreateRuleRequest) GetFilters() []*Filter { return nil } +func (x *CreateRuleRequest) GetInterval() *durationpb.Duration { + if x != nil { + return x.Interval + } + return nil +} + type CreateRuleResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1484,7 +1493,7 @@ var file_managementpb_alerting_alerting_proto_rawDesc = []byte{ 0x6c, 0x6f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x12, 0x18, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x42, 0x07, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xd8, 0x03, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8f, 0x04, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, @@ -1510,78 +1519,82 @@ var file_managementpb_alerting_alerting_proto_rawDesc = []byte{ 0x73, 0x12, 0x2d, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x14, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x62, 0x0a, 0x0e, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x45, 0x4d, - 0x50, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x4f, 0x55, 0x52, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x42, 0x55, 0x49, 0x4c, 0x54, 0x5f, - 0x49, 0x4e, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x41, 0x41, 0x53, 0x10, 0x02, 0x12, 0x0d, - 0x0a, 0x09, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, - 0x08, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x50, 0x49, 0x10, 0x04, 0x2a, 0x3e, 0x0a, 0x0a, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x49, 0x4c, - 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x01, 0x12, 0x0c, 0x0a, - 0x08, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x02, 0x32, 0xc9, 0x05, 0x0a, 0x08, - 0x41, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x89, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, - 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x21, 0x2e, 0x61, 0x6c, 0x65, - 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x76, - 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x6c, 0x65, - 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x8e, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, - 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x6c, - 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, - 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x6c, 0x65, 0x72, - 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, - 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, - 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, - 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, - 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x6c, 0x65, - 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x8e, 0x01, 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x22, 0x2e, 0x61, 0x6c, 0x65, 0x72, - 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, - 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, - 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x6c, - 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x2f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x7e, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, - 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 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, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x2f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0xaa, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, - 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x42, 0x0d, 0x41, 0x6c, 0x65, - 0x72, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3b, 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, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x3b, 0x61, - 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, - 0x02, 0x0b, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0b, - 0x41, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x17, 0x41, 0x6c, - 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0c, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, - 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x35, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x0a, 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, 0x08, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 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, 0x14, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x62, + 0x0a, 0x0e, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x45, 0x4d, 0x50, 0x4c, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x4f, 0x55, + 0x52, 0x43, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, + 0x08, 0x42, 0x55, 0x49, 0x4c, 0x54, 0x5f, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x53, + 0x41, 0x41, 0x53, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x46, 0x49, + 0x4c, 0x45, 0x10, 0x03, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x41, 0x50, 0x49, + 0x10, 0x04, 0x2a, 0x3e, 0x0a, 0x0a, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x17, 0x0a, 0x13, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x41, 0x54, + 0x43, 0x48, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, + 0x10, 0x02, 0x32, 0xc9, 0x05, 0x0a, 0x08, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x12, + 0x89, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x12, 0x21, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x31, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, + 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x8e, 0x01, 0x0a, 0x0e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x22, + 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, + 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x8e, 0x01, 0x0a, + 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x12, + 0x22, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, + 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x8e, 0x01, + 0x0a, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x12, 0x22, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x7e, + 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1e, 0x2e, 0x61, + 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x61, + 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2f, 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, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, + 0x67, 0x2f, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x2f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0xaa, + 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x2e, + 0x76, 0x31, 0x42, 0x0d, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x50, 0x01, 0x5a, 0x3b, 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, 0x6c, 0x65, + 0x72, 0x74, 0x69, 0x6e, 0x67, 0x3b, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x76, 0x31, + 0xa2, 0x02, 0x03, 0x41, 0x58, 0x58, 0xaa, 0x02, 0x0b, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, + 0x67, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0b, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5c, + 0x56, 0x31, 0xe2, 0x02, 0x17, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5c, 0x56, 0x31, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0c, 0x41, + 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -1657,21 +1670,22 @@ var file_managementpb_alerting_alerting_proto_depIdxs = []int32{ 26, // 20: alerting.v1.CreateRuleRequest.severity:type_name -> management.Severity 21, // 21: alerting.v1.CreateRuleRequest.custom_labels:type_name -> alerting.v1.CreateRuleRequest.CustomLabelsEntry 15, // 22: alerting.v1.CreateRuleRequest.filters:type_name -> alerting.v1.Filter - 7, // 23: alerting.v1.Alerting.ListTemplates:input_type -> alerting.v1.ListTemplatesRequest - 9, // 24: alerting.v1.Alerting.CreateTemplate:input_type -> alerting.v1.CreateTemplateRequest - 11, // 25: alerting.v1.Alerting.UpdateTemplate:input_type -> alerting.v1.UpdateTemplateRequest - 13, // 26: alerting.v1.Alerting.DeleteTemplate:input_type -> alerting.v1.DeleteTemplateRequest - 17, // 27: alerting.v1.Alerting.CreateRule:input_type -> alerting.v1.CreateRuleRequest - 8, // 28: alerting.v1.Alerting.ListTemplates:output_type -> alerting.v1.ListTemplatesResponse - 10, // 29: alerting.v1.Alerting.CreateTemplate:output_type -> alerting.v1.CreateTemplateResponse - 12, // 30: alerting.v1.Alerting.UpdateTemplate:output_type -> alerting.v1.UpdateTemplateResponse - 14, // 31: alerting.v1.Alerting.DeleteTemplate:output_type -> alerting.v1.DeleteTemplateResponse - 18, // 32: alerting.v1.Alerting.CreateRule:output_type -> alerting.v1.CreateRuleResponse - 28, // [28:33] is the sub-list for method output_type - 23, // [23:28] is the sub-list for method input_type - 23, // [23:23] is the sub-list for extension type_name - 23, // [23:23] is the sub-list for extension extendee - 0, // [0:23] is the sub-list for field type_name + 25, // 23: alerting.v1.CreateRuleRequest.interval:type_name -> google.protobuf.Duration + 7, // 24: alerting.v1.Alerting.ListTemplates:input_type -> alerting.v1.ListTemplatesRequest + 9, // 25: alerting.v1.Alerting.CreateTemplate:input_type -> alerting.v1.CreateTemplateRequest + 11, // 26: alerting.v1.Alerting.UpdateTemplate:input_type -> alerting.v1.UpdateTemplateRequest + 13, // 27: alerting.v1.Alerting.DeleteTemplate:input_type -> alerting.v1.DeleteTemplateRequest + 17, // 28: alerting.v1.Alerting.CreateRule:input_type -> alerting.v1.CreateRuleRequest + 8, // 29: alerting.v1.Alerting.ListTemplates:output_type -> alerting.v1.ListTemplatesResponse + 10, // 30: alerting.v1.Alerting.CreateTemplate:output_type -> alerting.v1.CreateTemplateResponse + 12, // 31: alerting.v1.Alerting.UpdateTemplate:output_type -> alerting.v1.UpdateTemplateResponse + 14, // 32: alerting.v1.Alerting.DeleteTemplate:output_type -> alerting.v1.DeleteTemplateResponse + 18, // 33: alerting.v1.Alerting.CreateRule:output_type -> alerting.v1.CreateRuleResponse + 29, // [29:34] is the sub-list for method output_type + 24, // [24:29] is the sub-list for method input_type + 24, // [24:24] is the sub-list for extension type_name + 24, // [24:24] is the sub-list for extension extendee + 0, // [0:24] is the sub-list for field type_name } func init() { file_managementpb_alerting_alerting_proto_init() } diff --git a/api/managementpb/alerting/alerting.pb.validate.go b/api/managementpb/alerting/alerting.pb.validate.go index b3d3e3d9e3..fea97c38bc 100644 --- a/api/managementpb/alerting/alerting.pb.validate.go +++ b/api/managementpb/alerting/alerting.pb.validate.go @@ -2166,6 +2166,35 @@ func (m *CreateRuleRequest) validate(all bool) error { } + if all { + switch v := interface{}(m.GetInterval()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, CreateRuleRequestValidationError{ + field: "Interval", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, CreateRuleRequestValidationError{ + field: "Interval", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetInterval()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return CreateRuleRequestValidationError{ + field: "Interval", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return CreateRuleRequestMultiError(errors) } diff --git a/api/managementpb/alerting/alerting.proto b/api/managementpb/alerting/alerting.proto index 2356bb6b34..0a0058995d 100644 --- a/api/managementpb/alerting/alerting.proto +++ b/api/managementpb/alerting/alerting.proto @@ -187,6 +187,8 @@ message CreateRuleRequest { map custom_labels = 8; // Filters. repeated Filter filters = 9; + // Evaluation Interval + google.protobuf.Duration interval = 10; } message CreateRuleResponse {} diff --git a/api/managementpb/alerting/json/alerting.json b/api/managementpb/alerting/json/alerting.json index 31a3e0fe4f..20ed2054b3 100644 --- a/api/managementpb/alerting/json/alerting.json +++ b/api/managementpb/alerting/json/alerting.json @@ -83,6 +83,11 @@ "type": "string", "x-order": 2 }, + "interval": { + "type": "string", + "title": "Evaluation Interval", + "x-order": 9 + }, "name": { "description": "Rule name.", "type": "string", diff --git a/api/managementpb/alerting/json/client/alerting/create_rule_responses.go b/api/managementpb/alerting/json/client/alerting/create_rule_responses.go index 645d3f8b71..bfac8fc01f 100644 --- a/api/managementpb/alerting/json/client/alerting/create_rule_responses.go +++ b/api/managementpb/alerting/json/client/alerting/create_rule_responses.go @@ -150,6 +150,9 @@ type CreateRuleBody struct { // Filters. Filters []*CreateRuleParamsBodyFiltersItems0 `json:"filters"` + + // Evaluation Interval + Interval string `json:"interval,omitempty"` } // Validate validates this create rule body diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 5d2e61646d..9a3b980655 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -26751,6 +26751,11 @@ } }, "x-order": 8 + }, + "interval": { + "type": "string", + "title": "Evaluation Interval", + "x-order": 9 } } } diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index e559c5d421..a786b6f5e0 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -22017,6 +22017,11 @@ } }, "x-order": 8 + }, + "interval": { + "type": "string", + "title": "Evaluation Interval", + "x-order": 9 } } } diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 3054a8f43a..842819387b 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -46,9 +46,8 @@ import ( var ErrFailedToGetToken = errors.New("failed to get token") const ( - defaultEvaluationInterval = time.Minute - pmmServiceTokenName = "pmm-agent-st" //nolint:gosec - pmmServiceAccountName = "pmm-agent-sa" //nolint:gosec + pmmServiceTokenName = "pmm-agent-st" //nolint:gosec + pmmServiceAccountName = "pmm-agent-sa" //nolint:gosec ) // Client represents a client for Grafana API. @@ -484,7 +483,7 @@ func (c *Client) DeleteServiceAccount(ctx context.Context, nodeName string, forc } // CreateAlertRule creates Grafana alert rule. -func (c *Client) CreateAlertRule(ctx context.Context, folderName, groupName string, rule *services.Rule) error { +func (c *Client) CreateAlertRule(ctx context.Context, folderUID, groupName, interval string, rule *services.Rule) error { authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return err @@ -497,7 +496,7 @@ func (c *Client) CreateAlertRule(ctx context.Context, folderName, groupName stri } var group AlertRuleGroup - if err := c.do(ctx, http.MethodGet, fmt.Sprintf("/api/ruler/grafana/api/v1/rules/%s/%s", folderName, groupName), "", authHeaders, nil, &group); err != nil { + if err := c.do(ctx, http.MethodGet, fmt.Sprintf("/api/ruler/grafana/api/v1/rules/%s/%s", folderUID, groupName), "", authHeaders, nil, &group); err != nil { return err } @@ -509,8 +508,7 @@ func (c *Client) CreateAlertRule(ctx context.Context, folderName, groupName stri group.Rules = append(group.Rules, b) if group.Interval == "" { - // TODO: align it with grafanas default value: https://grafana.com/docs/grafana/v9.0/setup-grafana/configure-grafana/#min_interval - group.Interval = defaultEvaluationInterval.String() + group.Interval = interval } if err = validateDurations(group.Interval, rule.For); err != nil { @@ -522,7 +520,7 @@ func (c *Client) CreateAlertRule(ctx context.Context, folderName, groupName stri return err } - if err := c.do(ctx, "POST", fmt.Sprintf("/api/ruler/grafana/api/v1/rules/%s", folderName), "", authHeaders, body, nil); err != nil { + if err := c.do(ctx, "POST", fmt.Sprintf("/api/ruler/grafana/api/v1/rules/%s", folderUID), "", authHeaders, body, nil); err != nil { if err != nil { if cErr, ok := errors.Cause(err).(*clientError); ok { //nolint:errorlint return status.Error(codes.InvalidArgument, cErr.ErrorMessage) diff --git a/managed/services/management/alerting/deps.go b/managed/services/management/alerting/deps.go index 5b09e90958..30c5d8abde 100644 --- a/managed/services/management/alerting/deps.go +++ b/managed/services/management/alerting/deps.go @@ -24,7 +24,7 @@ import ( ) type grafanaClient interface { - CreateAlertRule(ctx context.Context, folderName, groupName string, rule *services.Rule) error + CreateAlertRule(ctx context.Context, folderUID, groupName, interval string, rule *services.Rule) error GetDatasourceUIDByID(ctx context.Context, id int64) (string, error) GetFolderByUID(ctx context.Context, uid string) (*gapi.Folder, error) } diff --git a/managed/services/management/alerting/mock_grafana_client_test.go b/managed/services/management/alerting/mock_grafana_client_test.go index 79ff8f0f6d..b0af805207 100644 --- a/managed/services/management/alerting/mock_grafana_client_test.go +++ b/managed/services/management/alerting/mock_grafana_client_test.go @@ -16,17 +16,17 @@ type mockGrafanaClient struct { mock.Mock } -// CreateAlertRule provides a mock function with given fields: ctx, folderName, groupName, rule -func (_m *mockGrafanaClient) CreateAlertRule(ctx context.Context, folderName string, groupName string, rule *services.Rule) error { - ret := _m.Called(ctx, folderName, groupName, rule) +// CreateAlertRule provides a mock function with given fields: ctx, folderUID, groupName, interval, rule +func (_m *mockGrafanaClient) CreateAlertRule(ctx context.Context, folderUID string, groupName string, interval string, rule *services.Rule) error { + ret := _m.Called(ctx, folderUID, groupName, interval, rule) if len(ret) == 0 { panic("no return value specified for CreateAlertRule") } var r0 error - if rf, ok := ret.Get(0).(func(context.Context, string, string, *services.Rule) error); ok { - r0 = rf(ctx, folderName, groupName, rule) + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, *services.Rule) error); ok { + r0 = rf(ctx, folderUID, groupName, interval, rule) } else { r0 = ret.Error(0) } diff --git a/managed/services/management/alerting/service.go b/managed/services/management/alerting/service.go index cd972dd2b7..24797263ce 100644 --- a/managed/services/management/alerting/service.go +++ b/managed/services/management/alerting/service.go @@ -52,8 +52,9 @@ import ( ) const ( - templatesDir = "/srv/alerting/templates" - portalRequestTimeout = 2 * time.Minute // time limit to get templates list from the portal + templatesDir = "/srv/alerting/templates" + portalRequestTimeout = 2 * time.Minute // time limit to get templates list from the portal + defaultEvaluationInterval = time.Minute dirPerm = os.FileMode(0o775) ) @@ -701,11 +702,6 @@ func (s *Service) CreateRule(ctx context.Context, req *alerting.CreateRuleReques return nil, status.Error(codes.InvalidArgument, "Rule group name should be specified.") } - folder, err := s.grafanaClient.GetFolderByUID(ctx, req.FolderUid) - if err != nil { - return nil, err - } - metricsDatasourceUID, err := s.grafanaClient.GetDatasourceUIDByID(ctx, 1) // 1 - it's id of Metrics datasource in PMM if err != nil { return nil, err @@ -803,7 +799,13 @@ func (s *Service) CreateRule(ctx context.Context, req *alerting.CreateRuleReques Labels: labels, } - err = s.grafanaClient.CreateAlertRule(ctx, folder.Title, req.Group, &rule) + // TODO: align it with grafanas default value: https://grafana.com/docs/grafana/v9.0/setup-grafana/configure-grafana/#min_interval + interval := defaultEvaluationInterval.String() + if req.Interval != nil { + interval = req.Interval.AsDuration().String() + } + + err = s.grafanaClient.CreateAlertRule(ctx, req.FolderUid, req.Group, interval, &rule) if err != nil { return nil, err } From 87ab44eab5d7a7dbdd5034264a62a86b8ff326ad Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Tue, 7 May 2024 23:02:47 +0300 Subject: [PATCH 22/44] PMM-3303 Monitor internal clickhouse (#2943) * PMM-3303 Monitor internal clickhouse * PMM-3303 Fix linter * PMM-3303 Fix tests --------- Co-authored-by: Roman Novikov --- .../services/victoriametrics/prometheus.go | 3 ++- .../victoriametrics/scrape_configs.go | 15 +++++++++++++ .../victoriametrics/victoriametrics_test.go | 22 +++++++++++++++++++ .../testdata/victoriametrics/promscrape.yml | 11 ++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/managed/services/victoriametrics/prometheus.go b/managed/services/victoriametrics/prometheus.go index 717868763f..15fc1a55b0 100644 --- a/managed/services/victoriametrics/prometheus.go +++ b/managed/services/victoriametrics/prometheus.go @@ -209,7 +209,8 @@ func AddInternalServicesToScrape(cfg *config.Config, s models.MetricsResolutions scrapeConfigForAlertmanager(s.MR), scrapeConfigForGrafana(s.MR), scrapeConfigForPMMManaged(s.MR), - scrapeConfigForQANAPI2(s.MR)) + scrapeConfigForQANAPI2(s.MR), + scrapeConfigForClickhouse(s.MR)) // TODO Refactor to remove boolean positional parameter when Prometheus is removed if dbaas { cfg.ScrapeConfigs = append(cfg.ScrapeConfigs, scrapeConfigForDBaaSController(s.MR)) diff --git a/managed/services/victoriametrics/scrape_configs.go b/managed/services/victoriametrics/scrape_configs.go index 6c05e6c716..fc54b785eb 100644 --- a/managed/services/victoriametrics/scrape_configs.go +++ b/managed/services/victoriametrics/scrape_configs.go @@ -62,6 +62,21 @@ func scrapeConfigForAlertmanager(interval time.Duration) *config.ScrapeConfig { } } +func scrapeConfigForClickhouse(mr time.Duration) *config.ScrapeConfig { + return &config.ScrapeConfig{ + JobName: "clickhouse", + ScrapeInterval: config.Duration(mr), + ScrapeTimeout: scrapeTimeout(mr), + MetricsPath: "/metrics", + ServiceDiscoveryConfig: config.ServiceDiscoveryConfig{ + StaticConfigs: []*config.Group{{ + Targets: []string{"127.0.0.1:9363"}, + Labels: map[string]string{"instance": "pmm-server"}, + }}, + }, + } +} + func scrapeConfigForGrafana(interval time.Duration) *config.ScrapeConfig { return &config.ScrapeConfig{ JobName: "grafana", diff --git a/managed/services/victoriametrics/victoriametrics_test.go b/managed/services/victoriametrics/victoriametrics_test.go index 413afcf5f2..778abdcc28 100644 --- a/managed/services/victoriametrics/victoriametrics_test.go +++ b/managed/services/victoriametrics/victoriametrics_test.go @@ -323,6 +323,17 @@ scrape_configs: labels: instance: pmm-server follow_redirects: false + - job_name: clickhouse + honor_timestamps: false + scrape_interval: 10s + scrape_timeout: 9s + metrics_path: /metrics + static_configs: + - targets: + - 127.0.0.1:9363 + labels: + instance: pmm-server + follow_redirects: false - job_name: mongodb_exporter_agent_id_cfec996c-4fe6-41d9-83cb-e1a3b1fe10a8_hr honor_timestamps: false scrape_interval: 5s @@ -890,6 +901,17 @@ scrape_configs: labels: instance: pmm-server follow_redirects: false + - job_name: clickhouse + honor_timestamps: false + scrape_interval: 10s + scrape_timeout: 9s + metrics_path: /metrics + static_configs: + - targets: + - 127.0.0.1:9363 + labels: + instance: pmm-server + follow_redirects: false `) + "\n" newcfg, err := svc.marshalConfig(svc.loadBaseConfig()) assert.NoError(t, err) diff --git a/managed/testdata/victoriametrics/promscrape.yml b/managed/testdata/victoriametrics/promscrape.yml index 2e06cb670c..95b8774779 100644 --- a/managed/testdata/victoriametrics/promscrape.yml +++ b/managed/testdata/victoriametrics/promscrape.yml @@ -70,3 +70,14 @@ scrape_configs: labels: instance: pmm-server follow_redirects: false + - job_name: clickhouse + honor_timestamps: false + scrape_interval: 10s + scrape_timeout: 9s + metrics_path: /metrics + static_configs: + - targets: + - 127.0.0.1:9363 + labels: + instance: pmm-server + follow_redirects: false From 920976907eb07558d0cd9e2ee26a630c31302c1f Mon Sep 17 00:00:00 2001 From: PMM Jenkins Date: Thu, 9 May 2024 06:26:15 +0000 Subject: [PATCH 23/44] Update descriptors --- descriptor.bin | Bin 705614 -> 705751 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/descriptor.bin b/descriptor.bin index 79b5cc9768314a54dd222d5552f3f4df792d709c..0fef5fb20602e1bcf3e056f394599305747565da 100644 GIT binary patch delta 736 zcmYMw&1=*^7zXgXGqW?BS9G`2-Bwl#VGE^NJe8uLVAI8qTJ)rm9t3+RT39NS>cxXa zBHEM3IcaY_Rs|s!Q43{-N(#z~$_mN~wSR_h;v_lb@H~0)n=pG%C%&yutc4J=kcT2H zh4PJhG|aZnp3d2U{q0bkBUn@zRF@%b54 zy5u+qU|t`nnt3pSL*~||8j4!8KlIg0EMM&bY(Jb;Lj*TNC6ICs?!5P6r$VHWQ+fZ)cZDi8XatG+ApfT_H z?Zp+-m{vFS4wS2S9ffol4LZO+ne}OPE$Dz8O!%Z{T6CZ`o<%yX1Cy7q^8c;S@*{{{ zkT{5LG8eCQ-!}8|bZUc^F|aRY(pRT~7-Y?2Kz0oE6ImoXhN(Gg1KE2ZKIb-A+m<&{ zn`zkv_QQPeRSB3L440`W^G$uO>M4a57=+ho>5nVUSV^xdxg!( z?iDsC`zMHBxy`L@%emC1Q6Jb}Q)#Ko7y2Np_7ViyeHdtFk?cO4JZJAj&}V-@?B}+y Uc2YjsXeoNi^tjPR3tz7N13q|*(f|Me delta 582 zcmYMv%St0b6b9fvrz%y+31Tc2K@glEV~n^GQAALqctuy*`UL7@$j~tQ1SRg>Y7n6} z5kVrT?Tv_+ER+mrHg4R^eyTH-^r9C3Uv)lCz3lei?euSZ;GxGn?!`QDB7b$@!Mg8t z$k_zGGXJ()YS70kBIm!Q{4W-u}hJS#(o6;+_2Hwwp^~+ zOo=k!yZ)P#OX+fCGh>${n;E-oY~A-G-rKZT8#R6f@Kf(i$%UB;h?M;!H=`A3N!Ozp jt-!#z{W3RWe}I29*5Y=pu>75wmgdCGN%)y*I@ Date: Sat, 11 May 2024 06:28:35 +0000 Subject: [PATCH 24/44] Bump golang.org/x/tools from 0.20.0 to 0.21.0 in /tools (#2986) Bumps [golang.org/x/tools](https://github.com/golang/tools) from 0.20.0 to 0.21.0. - [Release notes](https://github.com/golang/tools/releases) - [Commits](https://github.com/golang/tools/compare/v0.20.0...v0.21.0) --- updated-dependencies: - dependency-name: golang.org/x/tools dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- tools/go.mod | 12 ++++++------ tools/go.sum | 23 ++++++++++++----------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/tools/go.mod b/tools/go.mod index 49dc08d732..94272010c4 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -22,7 +22,7 @@ require ( github.com/vburenin/ifacemaker v1.2.1 github.com/vektra/mockery/v2 v2.40.2 golang.org/x/perf v0.0.0-20230717203022-1ba3a21238c9 - golang.org/x/tools v0.20.0 + golang.org/x/tools v0.21.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 google.golang.org/protobuf v1.32.0 gopkg.in/reform.v1 v1.5.1 @@ -213,15 +213,15 @@ require ( go.uber.org/zap v1.26.0 // indirect golang.org/x/arch v0.6.0 // indirect golang.org/x/build v0.0.0-20230906094020-6ed658a430ec // indirect - golang.org/x/crypto v0.22.0 // indirect + golang.org/x/crypto v0.23.0 // indirect golang.org/x/exp v0.0.0-20240112132812-db7319d0e0e3 // indirect golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.24.0 // indirect + golang.org/x/net v0.25.0 // indirect golang.org/x/oauth2 v0.16.0 // indirect golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.19.0 // indirect - golang.org/x/term v0.19.0 // indirect - golang.org/x/text v0.14.0 // indirect + golang.org/x/sys v0.20.0 // indirect + golang.org/x/term v0.20.0 // indirect + golang.org/x/text v0.15.0 // indirect golang.org/x/time v0.3.0 // indirect google.golang.org/api v0.149.0 // indirect google.golang.org/appengine v1.6.8 // indirect diff --git a/tools/go.sum b/tools/go.sum index 215f89c824..9b8d530267 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -762,8 +762,8 @@ golang.org/x/crypto v0.3.0/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4 golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30= -golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M= +golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -855,8 +855,8 @@ golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w= -golang.org/x/net v0.24.0/go.mod h1:2Q7sJY5mzlzWjKtYUEXSlBWCdyaioyXzRB2RtU8KVE8= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= 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= @@ -947,8 +947,8 @@ golang.org/x/sys v0.5.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/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= +golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= 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= @@ -957,8 +957,8 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= -golang.org/x/term v0.19.0 h1:+ThwsDv+tYfnJFhF4L8jITxu1tdTWRTZpdsWgEgjL6Q= -golang.org/x/term v0.19.0/go.mod h1:2CuTdWZ7KHSQwUzKva0cbMg6q2DMI3Mmxp+gKJbskEk= +golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= 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= @@ -973,8 +973,9 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= 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= @@ -1039,8 +1040,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.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.20.0 h1:hz/CVckiOxybQvFw6h7b/q80NTr9IUQb4s1IIzW7KNY= -golang.org/x/tools v0.20.0/go.mod h1:WvitBU7JJf6A4jOdg4S1tviW9bhUxkgeCui/0JHctQg= +golang.org/x/tools v0.21.0 h1:qc0xYgIbsSDt9EyWz05J5wfa7LOVW0YTLOXrqdLAWIw= +golang.org/x/tools v0.21.0/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= 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= From 12f20220a309d09e6b82365be8522454be7704c3 Mon Sep 17 00:00:00 2001 From: Alex Demidoff Date: Tue, 14 May 2024 15:29:31 +0400 Subject: [PATCH 25/44] PMM-7 upgrade go to v1.22 (#2990) --- .github/workflows/clean.yml | 2 +- Dockerfile | 2 +- build/docker/rpmbuild/Dockerfile | 2 +- build/docker/rpmbuild/Dockerfile.el9 | 2 +- devcontainer.Dockerfile | 2 +- tools/go.mod | 6 ++++-- tools/go.sum | 4 ++-- update/.devcontainer/install-dev-tools.sh | 2 +- update/docker-compose.yml | 2 +- 9 files changed, 13 insertions(+), 11 deletions(-) diff --git a/.github/workflows/clean.yml b/.github/workflows/clean.yml index 90dfcbc3e8..c3e0ad8709 100644 --- a/.github/workflows/clean.yml +++ b/.github/workflows/clean.yml @@ -13,7 +13,7 @@ jobs: fail-fast: false matrix: go: - - version: 1.21.x + - version: 1.22.x may-fail: false - version: tip may-fail: true diff --git a/Dockerfile b/Dockerfile index 46ab87ad75..64db89a18d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ # This Dockerfile is used only for API tests. -FROM golang:1.21 +FROM golang:1.22 RUN export GOPATH=$(go env GOPATH) && \ mkdir -p $GOPATH/src/github.com/percona/pmm diff --git a/build/docker/rpmbuild/Dockerfile b/build/docker/rpmbuild/Dockerfile index b564b43e95..f6ddc34db3 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.21.7 +ENV GO_VERSION 1.22.2 ENV GO_RELEASER_VERSION 1.24.0 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 b4778015b1..01ef74f1a5 100644 --- a/build/docker/rpmbuild/Dockerfile.el9 +++ b/build/docker/rpmbuild/Dockerfile.el9 @@ -25,7 +25,7 @@ RUN yum update -y && \ yum clean all && rm -rf /var/cache/yum # keep that format for easier search -ENV GO_VERSION 1.21.7 +ENV GO_VERSION 1.22.2 ENV GO_RELEASER_VERSION 1.24.0 RUN if [ `uname -i` == "x86_64" ]; then ARCH=amd64; else ARCH=arm64; fi && \ diff --git a/devcontainer.Dockerfile b/devcontainer.Dockerfile index 0f12d4180a..10a3a94498 100644 --- a/devcontainer.Dockerfile +++ b/devcontainer.Dockerfile @@ -2,7 +2,7 @@ ARG PMM_SERVER_IMAGE="perconalab/pmm-server:dev-latest" FROM $PMM_SERVER_IMAGE ARG PMM_SERVER_IMAGE -ARG GO_VERSION="1.21.x" +ARG GO_VERSION="1.22.x" RUN echo "Building with: GO: $GO_VERSION, PMM: $PMM_SERVER_IMAGE" ENV GOPATH=/root/go diff --git a/tools/go.mod b/tools/go.mod index 94272010c4..ff0ca966cb 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -1,6 +1,8 @@ module github.com/percona/pmm/tools -go 1.21 +go 1.22 + +toolchain go1.22.2 replace github.com/go-openapi/spec => github.com/Percona-Lab/spec v0.20.5-percona @@ -20,7 +22,7 @@ require ( github.com/quasilyte/go-consistent v0.6.0 github.com/reviewdog/reviewdog v0.17.0 github.com/vburenin/ifacemaker v1.2.1 - github.com/vektra/mockery/v2 v2.40.2 + github.com/vektra/mockery/v2 v2.43.0 golang.org/x/perf v0.0.0-20230717203022-1ba3a21238c9 golang.org/x/tools v0.21.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 diff --git a/tools/go.sum b/tools/go.sum index 9b8d530267..3b57bdcbe6 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -682,8 +682,8 @@ github.com/vbatts/tar-split v0.11.5 h1:3bHCTIheBm1qFTcgh9oPu+nNBtX+XJIupG/vacinC github.com/vbatts/tar-split v0.11.5/go.mod h1:yZbwRsSeGjusneWgA781EKej9HF8vme8okylkAeNKLk= 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/v2 v2.40.2 h1:JKuQ74IXibMCGKG6F0yvH/s2sNs1CHy/nGBP0We5DJ8= -github.com/vektra/mockery/v2 v2.40.2/go.mod h1:KYBZF/7sqOa86BaOZPYsoCZWEWLS90a5oBLg2pVudxY= +github.com/vektra/mockery/v2 v2.43.0 h1:9jgLwYbFIKPwWJUeK6Y+0s9oLRIGXLfW4FWlmF9R8c0= +github.com/vektra/mockery/v2 v2.43.0/go.mod h1:XNTE9RIu3deGAGQRVjP1VZxGpQNm0YedZx4oDs3prr8= github.com/vvakame/sdlog v1.2.0 h1:gwZRXZ0EmhJQJN/Do/+PTQigcmFiSqZ07aDjxqGOLT8= github.com/vvakame/sdlog v1.2.0/go.mod h1:gFYv2g/iR3pJSxkJz0YnkNmhNbXT5R3PzWsfZKGQADY= github.com/xanzy/go-gitlab v0.96.0 h1:LGkZ+wSNMRtHIBaYE4Hq3dZVjprwHv3Y1+rhKU3WETs= diff --git a/update/.devcontainer/install-dev-tools.sh b/update/.devcontainer/install-dev-tools.sh index 8b2f5dab9b..04d964f3ee 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.21.7.linux-amd64.tar.gz -o /tmp/golang.tar.gz & +curl -sS https://dl.google.com/go/go1.22.2.linux-amd64.tar.gz -o /tmp/golang.tar.gz & # to install man pages sed -i '/nodocs/d' /etc/yum.conf diff --git a/update/docker-compose.yml b/update/docker-compose.yml index 2bf87f6d11..dab0b29593 100644 --- a/update/docker-compose.yml +++ b/update/docker-compose.yml @@ -6,7 +6,7 @@ services: environment: # for tests - PMM_SERVER_IMAGE=${PMM_SERVER_IMAGE:-percona/pmm-server:2} - - GO_VERSION=${GO_VERSION:-1.21.x} + - GO_VERSION=${GO_VERSION:-1.22.x} - PATH=/root/go/bin:$PATH - REVIEWDOG_GITHUB_API_TOKEN=${REVIEWDOG_GITHUB_API_TOKEN} volumes: From 09f8817542111f94e815c2f6d08fff69145edddb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Tue, 14 May 2024 14:26:25 +0200 Subject: [PATCH 26/44] PMM-13095 Remove trimming of slowlog query IDs. (#2984) * PMM-13095 Remove trimming of slowlog query IDs. * PMM-13095 Lint. * PMM-13095 Typo. * Update agent/agents/mysql/slowlog/slowlog.go Co-authored-by: Alex Demidoff * PMM-13095 Changes. --------- Co-authored-by: Alex Demidoff --- agent/agents/mysql/slowlog/slowlog.go | 16 +- qan-api2/exporters/slow_log.go | 448 -------------------------- 2 files changed, 15 insertions(+), 449 deletions(-) delete mode 100644 qan-api2/exporters/slow_log.go diff --git a/agent/agents/mysql/slowlog/slowlog.go b/agent/agents/mysql/slowlog/slowlog.go index b4e3c33629..acc10c8316 100644 --- a/agent/agents/mysql/slowlog/slowlog.go +++ b/agent/agents/mysql/slowlog/slowlog.go @@ -17,7 +17,9 @@ package slowlog import ( "context" + "crypto/md5" //nolint:gosec "database/sql" + "encoding/hex" "fmt" "io" "math" @@ -370,7 +372,7 @@ func (s *SlowLog) processFile(ctx context.Context, file string, outlierTime floa s.l.Tracef("Parsed slowlog event: %+v.", e) fingerprint := query.Fingerprint(e.Query) - digest := query.Id(fingerprint) + digest := hashIntoQueryID(fingerprint) aggregator.AddEvent(e, digest, e.User, e.Host, e.Db, e.Server, e.Query) case <-t.C: @@ -391,6 +393,18 @@ func (s *SlowLog) processFile(ctx context.Context, file string, outlierTime floa } } +// hashIntoQueryID returns slowlog query ID hashed by MD5 from given fingerprint. +func hashIntoQueryID(fingerprint string) string { + // MD5 is used only to hash fingerprint into query ID, so there is no risk. + // It is ideal due to its length (32 chars) and it corresponds to Perfschema query ID length. + id := md5.New() //nolint:gosec + _, err := io.WriteString(id, fingerprint) + if err != nil { + logrus.Debugf("cannot hash fingerprint into query ID: %s", err.Error()) + } + return strings.ToUpper(hex.EncodeToString(id.Sum(nil))) +} + // makeBuckets is a pure function for easier testing. // //nolint:cyclop,maintidx diff --git a/qan-api2/exporters/slow_log.go b/qan-api2/exporters/slow_log.go deleted file mode 100644 index 52f37e0075..0000000000 --- a/qan-api2/exporters/slow_log.go +++ /dev/null @@ -1,448 +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 . - -//go:build ignore -// +build ignore - -package main - -import ( - "flag" - "fmt" - "log" - "math/rand" - "os" - "path/filepath" - "time" - - "github.com/percona/go-mysql/event" - slowlog "github.com/percona/go-mysql/log" - parser "github.com/percona/go-mysql/log/slow" - "github.com/percona/go-mysql/query" - "github.com/pkg/errors" - "golang.org/x/net/context" - "google.golang.org/grpc" - - "github.com/percona/pmm/api/inventorypb" - "github.com/percona/pmm/api/qanpb" -) - -const ( - agentID = "dc889ca7be92a66f0a00f616f69ffa7b" - dbServer = "fb_db" -) - -type closedChannelError struct { - error -} - -func main() { - r := rand.New(rand.NewSource(time.Now().UnixNano())) - - logOpt := slowlog.Options{} - slowLogPath := flag.String("slow-log", "logs/mysql-slow.log", "Path to MySQL slow log file") - logTimeStart := flag.String("logTimeStart", "2019-01-01 00:00:00", "Start fake time of query from") - serverURL := flag.String("server-url", "127.0.0.1:80", "ULR of QAN-API Server") - newEventWait := flag.Duration("new-event-wait", 10*time.Second, "Time to wait for a new event in slow log.") - flag.Parse() - - log.SetOutput(os.Stderr) - - var opts []grpc.DialOption - opts = append(opts, grpc.WithInsecure()) - - conn, err := grpc.Dial(*serverURL, opts...) - if err != nil { - log.Fatalf("fail to dial: %v", err) - } - defer func() { - _ = conn.Close() - }() - client := qanpb.NewCollectorClient(conn) - - events := parseSlowLog(*slowLogPath, logOpt) - - ctx := context.TODO() - - events = parseSlowLog(*slowLogPath, logOpt) - fmt.Println("Parsing slowlog: ", *slowLogPath, "...") //nolint:forbidigo - - logStart, _ := time.Parse("2006-01-02 15:04:05", *logTimeStart) - periodNumber := 0 - - var periodStart time.Time - if periodStart.IsZero() { - periodStart = logStart.Add(time.Duration(periodNumber) * time.Minute) - } - - for { - // start := time.Now() - var prewTs time.Time - err = bulkSend(ctx, client, func(am *qanpb.CollectRequest) error { - i := 0 - aggregator := event.NewAggregator(true, 0, 1) // add right params - for e := range events { - fingerprint := query.Fingerprint(e.Query) - digest := query.Id(fingerprint) - - e.Db = fmt.Sprintf("schema%d", r.Intn(100)) // fake 100 - e.User = fmt.Sprintf("user%d", r.Intn(100)) // fake 100 - e.Host = fmt.Sprintf("10.11.12.%d", r.Intn(100)) // fake 100 - e.Server = fmt.Sprintf("db%d", r.Intn(10)) // fake 10 - e.LabelsKey = []string{ - fmt.Sprintf("label%d", r.Intn(10)), - fmt.Sprintf("label%d", r.Intn(10)), - fmt.Sprintf("label%d", r.Intn(10)), - } - e.LabelsValue = []string{ - fmt.Sprintf("value%d", r.Intn(100)), - fmt.Sprintf("value%d", r.Intn(100)), - fmt.Sprintf("value%d", r.Intn(100)), - } - - aggregator.AddEvent(e, digest, e.User, e.Host, e.Db, e.Server, fingerprint) - i++ - - // Pass last offset to restart reader when reached out end of slowlog. - logOpt.StartOffset = e.OffsetEnd - - if prewTs.IsZero() { - prewTs = e.Ts - } - - if e.Ts.Sub(prewTs).Seconds() > 59 { - prewTs = e.Ts - periodStart = logStart.Add(time.Duration(periodNumber) * time.Minute) - periodNumber++ - break - } - } - - res := aggregator.Finalize() - - for _, v := range res.Class { - - mb := &qanpb.MetricsBucket{ - Queryid: v.Id, - ExplainFingerprint: v.ExplainFingerprint, - PlaceholdersCount: v.PlaceholdersCount, - Fingerprint: v.Fingerprint, - Database: "", - Schema: v.Db, - Username: v.User, - ClientHost: v.Host, - ServiceName: v.Server, - ReplicationSet: "replication_set1", - Cluster: "cluster1", - ServiceType: "service_type1", - Environment: "environmenti1", - Az: "az1", - Region: "region1", - NodeModel: "node_model1", - ContainerName: "container_name1", - Labels: listsToMap(v.LabelsKey, v.LabelsValue), - Errors: errListsToMap(v.ErrorsCode, v.ErrorsCount), - NumQueriesWithErrors: v.NumQueriesWithErrors, - AgentId: agentID, - AgentType: inventorypb.AgentType_QAN_MYSQL_SLOWLOG_AGENT, - PeriodStartUnixSecs: uint32(periodStart.Truncate(1 * time.Minute).Unix()), - PeriodLengthSecs: uint32(60), - Example: v.Example.Query, - ExampleFormat: 1, - ExampleType: 1, - NumQueries: float32(v.TotalQueries), - } - - // If key has suffix _time or _wait than field is TimeMetrics. - // For Boolean metrics exists only Sum. - // https://www.percona.com/doc/percona-server/5.7/diagnostics/slow_extended.html - // TimeMetrics: query_time, lock_time, rows_sent, innodb_io_r_wait, innodb_rec_lock_wait, innodb_queue_wait. - // NumberMetrics: rows_examined, rows_affected, rows_read, merge_passes, innodb_io_r_ops, innodb_io_r_bytes, - // innodb_pages_distinct, query_length, bytes_sent, tmp_tables, tmp_disk_tables, tmp_table_sizes. - // BooleanMetrics: qc_hit, full_scan, full_join, tmp_table, tmp_table_on_disk, filesort, filesort_on_disk, - // select_full_range_join, select_range, select_range_check, sort_range, sort_rows, sort_scan, - // no_index_used, no_good_index_used. - - // query_time - Query_time - if m, ok := v.Metrics.TimeMetrics["Query_time"]; ok { - mb.MQueryTimeSum = float32(m.Sum) - mb.MQueryTimeMax = float32(*m.Max) - mb.MQueryTimeMin = float32(*m.Min) - mb.MQueryTimeP99 = float32(*m.P99) - } - // lock_time - Lock_time - if m, ok := v.Metrics.TimeMetrics["Lock_time"]; ok { - mb.MLockTimeSum = float32(m.Sum) - mb.MLockTimeMax = float32(*m.Max) - mb.MLockTimeMin = float32(*m.Min) - mb.MLockTimeP99 = float32(*m.P99) - } - // rows_sent - Rows_sent - if m, ok := v.Metrics.NumberMetrics["Rows_sent"]; ok { - mb.MRowsSentSum = float32(m.Sum) - mb.MRowsSentMax = float32(*m.Max) - mb.MRowsSentMin = float32(*m.Min) - mb.MRowsSentP99 = float32(*m.P99) - } - // rows_examined - Rows_examined - if m, ok := v.Metrics.NumberMetrics["Rows_examined"]; ok { - mb.MRowsExaminedSum = float32(m.Sum) - mb.MRowsExaminedMax = float32(*m.Max) - mb.MRowsExaminedMin = float32(*m.Min) - mb.MRowsExaminedP99 = float32(*m.P99) - } - // rows_affected - Rows_affected - if m, ok := v.Metrics.NumberMetrics["Rows_affected"]; ok { - mb.MRowsAffectedSum = float32(m.Sum) - mb.MRowsAffectedMax = float32(*m.Max) - mb.MRowsAffectedMin = float32(*m.Min) - mb.MRowsAffectedP99 = float32(*m.P99) - } - // rows_read - Rows_read - if m, ok := v.Metrics.NumberMetrics["Rows_read"]; ok { - mb.MRowsReadSum = float32(m.Sum) - mb.MRowsReadMax = float32(*m.Max) - mb.MRowsReadMin = float32(*m.Min) - mb.MRowsReadP99 = float32(*m.P99) - } - // merge_passes - Merge_passes - if m, ok := v.Metrics.NumberMetrics["Merge_passes"]; ok { - mb.MMergePassesSum = float32(m.Sum) - mb.MMergePassesMax = float32(*m.Max) - mb.MMergePassesMin = float32(*m.Min) - mb.MMergePassesP99 = float32(*m.P99) - } - // innodb_io_r_ops - InnoDB_IO_r_ops - if m, ok := v.Metrics.NumberMetrics["InnoDB_IO_r_ops"]; ok { - mb.MInnodbIoROpsSum = float32(m.Sum) - mb.MInnodbIoROpsMax = float32(*m.Max) - mb.MInnodbIoROpsMin = float32(*m.Min) - mb.MInnodbIoROpsP99 = float32(*m.P99) - } - // innodb_io_r_bytes - InnoDB_IO_r_bytes - if m, ok := v.Metrics.NumberMetrics["InnoDB_IO_r_bytes"]; ok { - mb.MInnodbIoRBytesSum = float32(m.Sum) - mb.MInnodbIoRBytesMax = float32(*m.Max) - mb.MInnodbIoRBytesMin = float32(*m.Min) - mb.MInnodbIoRBytesP99 = float32(*m.P99) - } - // innodb_io_r_wait - InnoDB_IO_r_wait - if m, ok := v.Metrics.TimeMetrics["InnoDB_IO_r_wait"]; ok { - mb.MInnodbIoRWaitSum = float32(m.Sum) - mb.MInnodbIoRWaitMax = float32(*m.Max) - mb.MInnodbIoRWaitMin = float32(*m.Min) - mb.MInnodbIoRWaitP99 = float32(*m.P99) - } - // innodb_rec_lock_wait - InnoDB_rec_lock_wait - if m, ok := v.Metrics.TimeMetrics["InnoDB_rec_lock_wait"]; ok { - mb.MInnodbRecLockWaitSum = float32(m.Sum) - mb.MInnodbRecLockWaitMax = float32(*m.Max) - mb.MInnodbRecLockWaitMin = float32(*m.Min) - mb.MInnodbRecLockWaitP99 = float32(*m.P99) - } - // innodb_queue_wait - InnoDB_queue_wait - if m, ok := v.Metrics.TimeMetrics["InnoDB_queue_wait"]; ok { - mb.MInnodbQueueWaitSum = float32(m.Sum) - mb.MInnodbQueueWaitMax = float32(*m.Max) - mb.MInnodbQueueWaitMin = float32(*m.Min) - mb.MInnodbQueueWaitP99 = float32(*m.P99) - } - // innodb_pages_distinct - InnoDB_pages_distinct - if m, ok := v.Metrics.NumberMetrics["InnoDB_pages_distinct"]; ok { - mb.MInnodbPagesDistinctSum = float32(m.Sum) - mb.MInnodbPagesDistinctMax = float32(*m.Max) - mb.MInnodbPagesDistinctMin = float32(*m.Min) - mb.MInnodbPagesDistinctP99 = float32(*m.P99) - } - // query_length - Query_length - if m, ok := v.Metrics.NumberMetrics["Query_length"]; ok { - mb.MQueryLengthSum = float32(m.Sum) - mb.MQueryLengthMax = float32(*m.Max) - mb.MQueryLengthMin = float32(*m.Min) - mb.MQueryLengthP99 = float32(*m.P99) - } - // bytes_sent - Bytes_sent - if m, ok := v.Metrics.NumberMetrics["Bytes_sent"]; ok { - mb.MBytesSentSum = float32(m.Sum) - mb.MBytesSentMax = float32(*m.Max) - mb.MBytesSentMin = float32(*m.Min) - mb.MBytesSentP99 = float32(*m.P99) - } - // tmp_tables - Tmp_tables - if m, ok := v.Metrics.NumberMetrics["Tmp_tables"]; ok { - mb.MTmpTablesSum = float32(m.Sum) - mb.MTmpTablesMax = float32(*m.Max) - mb.MTmpTablesMin = float32(*m.Min) - mb.MTmpTablesP99 = float32(*m.P99) - } - // tmp_disk_tables - Tmp_disk_tables - if m, ok := v.Metrics.NumberMetrics["Tmp_disk_tables"]; ok { - mb.MTmpDiskTablesSum = float32(m.Sum) - mb.MTmpDiskTablesMax = float32(*m.Max) - mb.MTmpDiskTablesMin = float32(*m.Min) - mb.MTmpDiskTablesP99 = float32(*m.P99) - } - // tmp_table_sizes - Tmp_table_sizes - if m, ok := v.Metrics.NumberMetrics["Tmp_table_sizes"]; ok { - mb.MTmpTableSizesSum = float32(m.Sum) - mb.MTmpTableSizesMax = float32(*m.Max) - mb.MTmpTableSizesMin = float32(*m.Min) - mb.MTmpTableSizesP99 = float32(*m.P99) - } - // qc_hit - QC_Hit - if m, ok := v.Metrics.BoolMetrics["QC_Hit"]; ok { - mb.MQcHitCnt = float32(m.Cnt) - mb.MQcHitSum = float32(m.Sum) - } - // full_scan - Full_scan - if m, ok := v.Metrics.BoolMetrics["Full_scan"]; ok { - mb.MFullScanCnt = float32(m.Cnt) - mb.MFullScanSum = float32(m.Sum) - } - // full_join - Full_join - if m, ok := v.Metrics.BoolMetrics["Full_join"]; ok { - mb.MFullJoinCnt = float32(m.Cnt) - mb.MFullJoinSum = float32(m.Sum) - } - // tmp_table - Tmp_table - if m, ok := v.Metrics.BoolMetrics["Tmp_table"]; ok { - mb.MTmpTableCnt = float32(m.Cnt) - mb.MTmpTableSum = float32(m.Sum) - } - // tmp_table_on_disk - Tmp_table_on_disk - if m, ok := v.Metrics.BoolMetrics["Tmp_table_on_disk"]; ok { - mb.MTmpTableOnDiskCnt = float32(m.Cnt) - mb.MTmpTableOnDiskSum = float32(m.Sum) - } - // filesort - Filesort - if m, ok := v.Metrics.BoolMetrics["Filesort"]; ok { - mb.MFilesortCnt = float32(m.Cnt) - mb.MFilesortSum = float32(m.Sum) - } - // filesort_on_disk - Filesort_on_disk - if m, ok := v.Metrics.BoolMetrics["Filesort_on_disk"]; ok { - mb.MFilesortOnDiskCnt = float32(m.Cnt) - mb.MFilesortOnDiskSum = float32(m.Sum) - } - // select_full_range_join - Select_full_range_join - if m, ok := v.Metrics.BoolMetrics["Select_full_range_join"]; ok { - mb.MSelectFullRangeJoinCnt = float32(m.Cnt) - mb.MSelectFullRangeJoinSum = float32(m.Sum) - } - // select_range - Select_range - if m, ok := v.Metrics.BoolMetrics["Select_range"]; ok { - mb.MSelectRangeCnt = float32(m.Cnt) - mb.MSelectRangeSum = float32(m.Sum) - } - // select_range_check - Select_range_check - if m, ok := v.Metrics.BoolMetrics["Select_range_check"]; ok { - mb.MSelectRangeCheckCnt = float32(m.Cnt) - mb.MSelectRangeCheckSum = float32(m.Sum) - } - // sort_range - Sort_range - if m, ok := v.Metrics.BoolMetrics["Sort_range"]; ok { - mb.MSortRangeCnt = float32(m.Cnt) - mb.MSortRangeSum = float32(m.Sum) - } - // sort_rows - Sort_rows - if m, ok := v.Metrics.BoolMetrics["Sort_rows"]; ok { - mb.MSortRowsCnt = float32(m.Cnt) - mb.MSortRowsSum = float32(m.Sum) - } - // sort_scan - Sort_scan - if m, ok := v.Metrics.BoolMetrics["Sort_scan"]; ok { - mb.MSortScanCnt = float32(m.Cnt) - mb.MSortScanSum = float32(m.Sum) - } - // no_index_used - No_index_used - if m, ok := v.Metrics.BoolMetrics["No_index_used"]; ok { - mb.MNoIndexUsedCnt = float32(m.Cnt) - mb.MNoIndexUsedSum = float32(m.Sum) - } - // no_good_index_used - No_good_index_used - if m, ok := v.Metrics.BoolMetrics["No_good_index_used"]; ok { - mb.MNoGoodIndexUsedCnt = float32(m.Cnt) - mb.MNoGoodIndexUsedSum = float32(m.Sum) - } - - am.MetricsBucket = append(am.MetricsBucket, mb) - } - - // No new events in slowlog. Nothing to send to API. - if i == 0 { - return closedChannelError{errors.New("closed channel")} - } - // Reached end of slowlog. Send all what we have to API. - return nil - }) - if err != nil { - if _, ok := err.(closedChannelError); !ok { - log.Fatal("transaction error:", err) - } - // Channel is closed when reached end of the slowlog. - // Wait and try read the slowlog again. - time.Sleep(*newEventWait) - events = parseSlowLog(*slowLogPath, logOpt) - } - } -} - -func bulkSend(ctx context.Context, client qanpb.CollectorClient, fn func(*qanpb.CollectRequest) error) error { - am := &qanpb.CollectRequest{} - err := fn(am) - if err != nil { - return err - } - lenMB := len(am.MetricsBucket) - if lenMB > 0 { - resp, err := client.Collect(ctx, am) - 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) //nolint:forbidigo - } - return nil -} - -func parseSlowLog(filename string, o slowlog.Options) <-chan *slowlog.Event { - file, err := os.Open(filepath.Clean(filename)) - if err != nil { - log.Fatal("cannot open slowlog. Use --slow-log=/path/to/slow.log", err) - } - p := parser.NewSlowLogParser(file, o) - go func() { - err = p.Start() - if err != nil { - log.Fatal("cannot start parser", err) - } - }() - return p.EventChan() -} - -func listsToMap(k, v []string) map[string]string { - m := map[string]string{} - for i, e := range k { - m[e] = v[i] - } - return m -} - -func errListsToMap(k, v []uint64) map[uint64]uint64 { - m := map[uint64]uint64{} - for i, e := range k { - m[e] = v[i] - } - return m -} From 705c21f615828bc5a735a27c45a9a5c0862ee61a Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 May 2024 18:02:34 +0000 Subject: [PATCH 27/44] Bump @typescript-eslint/eslint-plugin from 7.8.0 to 7.9.0 in /cli-tests (#2988) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 7.8.0 to 7.9.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.9.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 283 +++++++++++++++++++++++++++++++----- cli-tests/package.json | 2 +- 2 files changed, 248 insertions(+), 37 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 1e0de4e96a..467821d004 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -20,7 +20,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.8.0", + "@typescript-eslint/eslint-plugin": "^7.9.0", "@typescript-eslint/parser": "^7.8.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", @@ -201,12 +201,6 @@ "@types/node": "*" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -244,12 +238,6 @@ "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", "dev": true }, - "node_modules/@types/semver": { - "version": "7.5.8", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", - "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", - "dev": true - }, "node_modules/@types/shelljs": { "version": "0.8.12", "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.12.tgz", @@ -261,21 +249,19 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", - "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz", + "integrity": "sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/type-utils": "7.8.0", - "@typescript-eslint/utils": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4", + "@typescript-eslint/scope-manager": "7.9.0", + "@typescript-eslint/type-utils": "7.9.0", + "@typescript-eslint/utils": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { @@ -295,6 +281,53 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz", + "integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", + "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", + "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", @@ -341,13 +374,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", - "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz", + "integrity": "sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/typescript-estree": "7.9.0", + "@typescript-eslint/utils": "7.9.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -367,6 +400,88 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", + "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz", + "integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", + "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/types": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", @@ -433,18 +548,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.9.0.tgz", + "integrity": "sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" + "@typescript-eslint/scope-manager": "7.9.0", + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/typescript-estree": "7.9.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -457,6 +569,105 @@ "eslint": "^8.56.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz", + "integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", + "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz", + "integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", + "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.9.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "7.8.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index 12e3bf2534..74a7512ccc 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.8.0", + "@typescript-eslint/eslint-plugin": "^7.9.0", "@typescript-eslint/parser": "^7.8.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", From b4a4c6d053fb9fac3ab63c623a0f29ca6a1832ec Mon Sep 17 00:00:00 2001 From: Alex Demidoff Date: Mon, 20 May 2024 23:44:05 +0400 Subject: [PATCH 28/44] PMM-7 fix supervisor install for EL7 (#2997) * PMM-7 fix supervisor install * PMM-7 pass --trusted-host parameter * PMM-7 fix the path to pip executable * PMM-7 add one more trusted python site --- build/ansible/roles/supervisord-init/tasks/main.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/build/ansible/roles/supervisord-init/tasks/main.yml b/build/ansible/roles/supervisord-init/tasks/main.yml index 9dd37bcb05..72d87df658 100644 --- a/build/ansible/roles/supervisord-init/tasks/main.yml +++ b/build/ansible/roles/supervisord-init/tasks/main.yml @@ -1,8 +1,7 @@ --- - name: Install supervisor | EL7 when: ansible_distribution == 'CentOS' and ansible_distribution_major_version == '7' - pip: - name: supervisor==3.4.0 + command: /usr/bin/pip2 install --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org supervisor==3.4.0 - name: Install supervisor | EL9 when: (ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux') and ansible_distribution_major_version == '9' From 44362e6b8e483d6f191485f6335eecb4495bce15 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 12:00:31 +0200 Subject: [PATCH 29/44] --- (#2999) updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 50 ++++++++++++++++++------------------- cli-tests/package.json | 2 +- 2 files changed, 26 insertions(+), 26 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 467821d004..1673af9097 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -21,7 +21,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^7.9.0", - "@typescript-eslint/parser": "^7.8.0", + "@typescript-eslint/parser": "^7.10.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", @@ -329,15 +329,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.10.0.tgz", + "integrity": "sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/typescript-estree": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", "debug": "^4.3.4" }, "engines": { @@ -357,13 +357,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", - "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", + "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0" + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -483,9 +483,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", - "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", + "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -496,13 +496,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", - "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", + "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -669,12 +669,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", - "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", + "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/types": "7.10.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { diff --git a/cli-tests/package.json b/cli-tests/package.json index 74a7512ccc..4bd0c7652c 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -25,7 +25,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^7.9.0", - "@typescript-eslint/parser": "^7.8.0", + "@typescript-eslint/parser": "^7.10.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", From 62005290e058c459f97d7b229a342070b8c6bb63 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 10:08:05 +0000 Subject: [PATCH 30/44] --- (#2998) updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 266 +++--------------------------------- cli-tests/package.json | 2 +- 2 files changed, 20 insertions(+), 248 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 1673af9097..3267186340 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -20,7 +20,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.9.0", + "@typescript-eslint/eslint-plugin": "^7.10.0", "@typescript-eslint/parser": "^7.10.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", @@ -249,16 +249,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz", - "integrity": "sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz", + "integrity": "sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.9.0", - "@typescript-eslint/type-utils": "7.9.0", - "@typescript-eslint/utils": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0", + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/type-utils": "7.10.0", + "@typescript-eslint/utils": "7.10.0", + "@typescript-eslint/visitor-keys": "7.10.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -281,53 +281,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz", - "integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", - "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", - "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.9.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/parser": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.10.0.tgz", @@ -374,13 +327,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz", - "integrity": "sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", + "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.9.0", - "@typescript-eslint/utils": "7.9.0", + "@typescript-eslint/typescript-estree": "7.10.0", + "@typescript-eslint/utils": "7.10.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -400,88 +353,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", - "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz", - "integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", - "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.9.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/types": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", @@ -548,15 +419,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.9.0.tgz", - "integrity": "sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==", + "version": "7.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", + "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.9.0", - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/typescript-estree": "7.9.0" + "@typescript-eslint/scope-manager": "7.10.0", + "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/typescript-estree": "7.10.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -569,105 +440,6 @@ "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz", - "integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", - "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz", - "integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.9.0", - "@typescript-eslint/visitor-keys": "7.9.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.9.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", - "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.9.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index 4bd0c7652c..3252dddf05 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.9.0", + "@typescript-eslint/eslint-plugin": "^7.10.0", "@typescript-eslint/parser": "^7.10.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", From 09f38232e613431363c47a4ef8b07f05b86fa46a Mon Sep 17 00:00:00 2001 From: Artem Gavrilov Date: Wed, 22 May 2024 12:22:47 +0200 Subject: [PATCH 31/44] PMM-12896 Add limit for actions/jobs executed on the same DB at the same time (#2898) * Add limit for actions/jobs executed on the same DB at the same time * PMM-12896 Fix * PMM-12896 Fixes * PMM-12896 Fix * PMM-12896 Fix tests * PMM-12896 Improvements, fixes, comments, tests * PMM-12896 Make per DB capacity configurable * PMM-12896 Fix * PMM-12896 Improve tests * PMM-12896 Linter fixes * PMM-12896 Refactoring * PMM-12896 Fix comment * PMM-12896 Fix DSN method for PT mysql summary action * PMM-12896 Fix bug in local semaphores releasing * PMM-12896 Refactoring * PMM-12896 Refactoring * PMM-12896 Refactoring * PMM-12896 Refactoring * PMM-12896 Fix test * PMM-12896 Fix tests * Revert "PMM-12896 Fix tests" This reverts commit 477790bf9e361fb3287e62c59872ad999fd5e154. * PMM-12896 Fix tests * PMM-12896 Use timeout only for job/action exectuion, not for resources awaiting * PMM-12896 Refactoring * Update agent/config/config.go Co-authored-by: Alex Demidoff * Update agent/runner/actions/mongodb_explain_action.go Co-authored-by: Alex Demidoff * Update agent/runner/actions/postgresql_query_select_action.go Co-authored-by: Alex Demidoff * PMM-12896 Refactoring * PMM-12896 Mute linter --------- Co-authored-by: Alex Demidoff Co-authored-by: Vasyl Yurkovych <59879559+yurkovychv@users.noreply.github.com> --- .../internal/profiler/profiler_test.go | 4 +- agent/client/client.go | 31 +- agent/client/client_test.go | 4 +- agent/commands/run.go | 2 +- agent/config/config.go | 11 +- agent/runner/actions/action.go | 2 + .../runner/actions/mongodb_explain_action.go | 30 +- .../actions/mongodb_explain_action_test.go | 8 +- .../mongodb_query_admincommand_action.go | 38 ++- .../mongodb_query_admincommand_action_test.go | 8 +- agent/runner/actions/mysql_explain_action.go | 39 ++- .../actions/mysql_explain_action_test.go | 53 ++-- .../actions/mysql_query_select_action.go | 5 + .../runner/actions/mysql_query_show_action.go | 5 + .../actions/mysql_show_create_table_action.go | 5 + .../runner/actions/mysql_show_index_action.go | 5 + .../actions/mysql_show_table_status_action.go | 5 + .../actions/postgresql_query_select_action.go | 49 +-- .../postgresql_query_select_action_test.go | 21 +- .../actions/postgresql_query_show_action.go | 32 +- .../postgresql_query_show_action_test.go | 4 +- .../postgresql_show_create_table_action.go | 34 +- ...ostgresql_show_create_table_action_test.go | 18 +- .../actions/postgresql_show_index_action.go | 29 +- .../postgresql_show_index_action_test.go | 8 +- agent/runner/actions/process_action.go | 5 + .../runner/actions/pt_mysql_summary_action.go | 10 + agent/runner/jobs/common.go | 18 +- agent/runner/jobs/job.go | 2 + agent/runner/jobs/mongodb_backup_job.go | 25 +- agent/runner/jobs/mongodb_backup_job_test.go | 5 +- agent/runner/jobs/mongodb_restore_job.go | 11 +- agent/runner/jobs/mysql_backup_job.go | 5 + agent/runner/jobs/mysql_restore_job.go | 5 + agent/runner/jobs/pbm_helpers.go | 52 ++-- agent/runner/jobs/pbm_job_logger.go | 4 +- agent/runner/runner.go | 290 ++++++++++++++---- agent/runner/runner_test.go | 187 +++++++++-- 38 files changed, 753 insertions(+), 316 deletions(-) diff --git a/agent/agents/mongodb/internal/profiler/profiler_test.go b/agent/agents/mongodb/internal/profiler/profiler_test.go index 304d069ada..3d36d276dd 100644 --- a/agent/agents/mongodb/internal/profiler/profiler_test.go +++ b/agent/agents/mongodb/internal/profiler/profiler_test.go @@ -222,7 +222,9 @@ func testProfiler(t *testing.T, url string) { Query: findBucket.Common.Example, } - ex := actions.NewMongoDBExplainAction(id, 5*time.Second, params, os.TempDir()) + ex, err := actions.NewMongoDBExplainAction(id, 5*time.Second, params, os.TempDir()) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), ex.Timeout()) defer cancel() res, err := ex.Run(ctx) diff --git a/agent/client/client.go b/agent/client/client.go index b79eb8e261..8abc6b25af 100644 --- a/agent/client/client.go +++ b/agent/client/client.go @@ -454,9 +454,10 @@ func (c *Client) handleStartActionRequest(p *agentpb.StartActionRequest) error { cfg := c.cfg.Get() var action actions.Action + var err error switch params := p.Params.(type) { case *agentpb.StartActionRequest_MysqlExplainParams: - action = actions.NewMySQLExplainAction(p.ActionId, timeout, params.MysqlExplainParams) + action, err = actions.NewMySQLExplainAction(p.ActionId, timeout, params.MysqlExplainParams) case *agentpb.StartActionRequest_MysqlShowCreateTableParams: action = actions.NewMySQLShowCreateTableAction(p.ActionId, timeout, params.MysqlShowCreateTableParams) @@ -468,13 +469,13 @@ func (c *Client) handleStartActionRequest(p *agentpb.StartActionRequest) error { action = actions.NewMySQLShowIndexAction(p.ActionId, timeout, params.MysqlShowIndexParams) case *agentpb.StartActionRequest_PostgresqlShowCreateTableParams: - action = actions.NewPostgreSQLShowCreateTableAction(p.ActionId, timeout, params.PostgresqlShowCreateTableParams, cfg.Paths.TempDir) + action, err = actions.NewPostgreSQLShowCreateTableAction(p.ActionId, timeout, params.PostgresqlShowCreateTableParams, cfg.Paths.TempDir) case *agentpb.StartActionRequest_PostgresqlShowIndexParams: - action = actions.NewPostgreSQLShowIndexAction(p.ActionId, timeout, params.PostgresqlShowIndexParams, cfg.Paths.TempDir) + action, err = actions.NewPostgreSQLShowIndexAction(p.ActionId, timeout, params.PostgresqlShowIndexParams, cfg.Paths.TempDir) case *agentpb.StartActionRequest_MongodbExplainParams: - action = actions.NewMongoDBExplainAction(p.ActionId, timeout, params.MongodbExplainParams, cfg.Paths.TempDir) + action, err = actions.NewMongoDBExplainAction(p.ActionId, timeout, params.MongodbExplainParams, cfg.Paths.TempDir) case *agentpb.StartActionRequest_MysqlQueryShowParams: action = actions.NewMySQLQueryShowAction(p.ActionId, timeout, params.MysqlQueryShowParams) @@ -483,13 +484,13 @@ func (c *Client) handleStartActionRequest(p *agentpb.StartActionRequest) error { action = actions.NewMySQLQuerySelectAction(p.ActionId, timeout, params.MysqlQuerySelectParams) case *agentpb.StartActionRequest_PostgresqlQueryShowParams: - action = actions.NewPostgreSQLQueryShowAction(p.ActionId, timeout, params.PostgresqlQueryShowParams, cfg.Paths.TempDir) + action, err = actions.NewPostgreSQLQueryShowAction(p.ActionId, timeout, params.PostgresqlQueryShowParams, cfg.Paths.TempDir) case *agentpb.StartActionRequest_PostgresqlQuerySelectParams: - action = actions.NewPostgreSQLQuerySelectAction(p.ActionId, timeout, params.PostgresqlQuerySelectParams, cfg.Paths.TempDir) + action, err = actions.NewPostgreSQLQuerySelectAction(p.ActionId, timeout, params.PostgresqlQuerySelectParams, cfg.Paths.TempDir) case *agentpb.StartActionRequest_MongodbQueryGetparameterParams: - action = actions.NewMongoDBQueryAdmincommandAction( + action, err = actions.NewMongoDBQueryAdmincommandAction( p.ActionId, timeout, params.MongodbQueryGetparameterParams.Dsn, @@ -499,7 +500,7 @@ func (c *Client) handleStartActionRequest(p *agentpb.StartActionRequest) error { cfg.Paths.TempDir) case *agentpb.StartActionRequest_MongodbQueryBuildinfoParams: - action = actions.NewMongoDBQueryAdmincommandAction( + action, err = actions.NewMongoDBQueryAdmincommandAction( p.ActionId, timeout, params.MongodbQueryBuildinfoParams.Dsn, @@ -509,7 +510,7 @@ func (c *Client) handleStartActionRequest(p *agentpb.StartActionRequest) error { cfg.Paths.TempDir) case *agentpb.StartActionRequest_MongodbQueryGetcmdlineoptsParams: - action = actions.NewMongoDBQueryAdmincommandAction( + action, err = actions.NewMongoDBQueryAdmincommandAction( p.ActionId, timeout, params.MongodbQueryGetcmdlineoptsParams.Dsn, @@ -519,7 +520,7 @@ func (c *Client) handleStartActionRequest(p *agentpb.StartActionRequest) error { cfg.Paths.TempDir) case *agentpb.StartActionRequest_MongodbQueryReplsetgetstatusParams: - action = actions.NewMongoDBQueryAdmincommandAction( + action, err = actions.NewMongoDBQueryAdmincommandAction( p.ActionId, timeout, params.MongodbQueryReplsetgetstatusParams.Dsn, @@ -529,7 +530,7 @@ func (c *Client) handleStartActionRequest(p *agentpb.StartActionRequest) error { cfg.Paths.TempDir) case *agentpb.StartActionRequest_MongodbQueryGetdiagnosticdataParams: - action = actions.NewMongoDBQueryAdmincommandAction( + action, err = actions.NewMongoDBQueryAdmincommandAction( p.ActionId, timeout, params.MongodbQueryGetdiagnosticdataParams.Dsn, @@ -565,6 +566,10 @@ func (c *Client) handleStartActionRequest(p *agentpb.StartActionRequest) error { return errors.Wrapf(agenterrors.ErrInvalidArgument, "invalid action type request: %T", params) } + if err != nil { + return errors.Wrap(err, "failed to create action") + } + return c.runner.StartAction(action) } @@ -645,7 +650,7 @@ func (c *Client) handleStartJobRequest(p *agentpb.StartJobRequest) error { return errors.WithStack(err) } - job, err = jobs.NewMongoDBBackupJob(p.JobId, timeout, j.MongodbBackup.Name, &dsn, locationConfig, + job, err = jobs.NewMongoDBBackupJob(p.JobId, timeout, j.MongodbBackup.Name, dsn, locationConfig, j.MongodbBackup.EnablePitr, j.MongodbBackup.DataModel, j.MongodbBackup.Folder) if err != nil { return err @@ -678,7 +683,7 @@ func (c *Client) handleStartJobRequest(p *agentpb.StartJobRequest) error { } job = jobs.NewMongoDBRestoreJob(p.JobId, timeout, j.MongodbRestoreBackup.Name, - j.MongodbRestoreBackup.PitrTimestamp.AsTime(), &dsn, locationConfig, + j.MongodbRestoreBackup.PitrTimestamp.AsTime(), dsn, locationConfig, c.supervisor, j.MongodbRestoreBackup.Folder, j.MongodbRestoreBackup.PbmMetadata.Name) default: return errors.Errorf("unknown job type: %T", j) diff --git a/agent/client/client_test.go b/agent/client/client_test.go index ce987348f8..64fdfa8abf 100644 --- a/agent/client/client_test.go +++ b/agent/client/client_test.go @@ -163,7 +163,7 @@ func TestClient(t *testing.T) { s.On("AgentsList").Return([]*agentlocalpb.AgentInfo{}) s.On("ClearChangesChannel").Return() - r := runner.New(cfgStorage.Get().RunnerCapacity) + r := runner.New(cfgStorage.Get().RunnerCapacity, cfgStorage.Get().RunnerMaxConnectionsPerService) client := New(cfgStorage, &s, r, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) err := client.Run(context.Background()) assert.NoError(t, err) @@ -281,7 +281,7 @@ func TestUnexpectedActionType(t *testing.T) { s.On("AgentsList").Return([]*agentlocalpb.AgentInfo{}) s.On("ClearChangesChannel").Return() - r := runner.New(cfgStorage.Get().RunnerCapacity) + r := runner.New(cfgStorage.Get().RunnerCapacity, cfgStorage.Get().RunnerMaxConnectionsPerService) client := New(cfgStorage, s, r, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) err := client.Run(context.Background()) assert.NoError(t, err) diff --git a/agent/commands/run.go b/agent/commands/run.go index c62fefc664..a2c11d5517 100644 --- a/agent/commands/run.go +++ b/agent/commands/run.go @@ -71,7 +71,7 @@ func Run() { supervisor := supervisor.NewSupervisor(ctx, v, configStorage) connectionChecker := connectionchecker.New(configStorage) serviceInfoBroker := serviceinfobroker.New(configStorage) - r := runner.New(cfg.RunnerCapacity) + r := runner.New(cfg.RunnerCapacity, cfg.RunnerMaxConnectionsPerService) client := client.New(configStorage, supervisor, r, connectionChecker, v, serviceInfoBroker, prepareConnectionService(ctx, cfg), logStore) localServer := agentlocal.NewServer(configStorage, supervisor, client, configFilepath, logStore) diff --git a/agent/config/config.go b/agent/config/config.go index c2ef25e624..8809800733 100644 --- a/agent/config/config.go +++ b/agent/config/config.go @@ -146,10 +146,11 @@ type Setup struct { type Config struct { //nolint:musttag // no config file there - ID string `yaml:"id"` - ListenAddress string `yaml:"listen-address"` - ListenPort uint16 `yaml:"listen-port"` - RunnerCapacity uint16 `yaml:"runner-capacity,omitempty"` + ID string `yaml:"id"` + ListenAddress string `yaml:"listen-address"` + ListenPort uint16 `yaml:"listen-port"` + RunnerCapacity uint16 `yaml:"runner-capacity,omitempty"` + RunnerMaxConnectionsPerService uint16 `yaml:"runner-max-connections-per-service,omitempty"` Server Server `yaml:"server"` Paths Paths `yaml:"paths"` @@ -352,6 +353,8 @@ func Application(cfg *Config) (*kingpin.Application, *string) { Envar("PMM_AGENT_LISTEN_PORT").Uint16Var(&cfg.ListenPort) app.Flag("runner-capacity", "Agent internal actions/jobs runner capacity [PMM_AGENT_RUNNER_CAPACITY]"). Envar("PMM_AGENT_RUNNER_CAPACITY").Uint16Var(&cfg.RunnerCapacity) + app.Flag("runner-max-connections-per-service", "Agent internal action/job runner connection limit per DB instance"). + Envar("PMM_AGENT_RUNNER_MAX_CONNECTIONS_PER_SERVICE").Uint16Var(&cfg.RunnerMaxConnectionsPerService) app.Flag("server-address", "PMM Server address [PMM_AGENT_SERVER_ADDRESS]"). Envar("PMM_AGENT_SERVER_ADDRESS").PlaceHolder("").StringVar(&cfg.Server.Address) diff --git a/agent/runner/actions/action.go b/agent/runner/actions/action.go index 5a9625f9c8..e8dd57d5d3 100644 --- a/agent/runner/actions/action.go +++ b/agent/runner/actions/action.go @@ -29,6 +29,8 @@ type Action interface { Type() string // Timeout returns Job timeout. Timeout() time.Duration + // DSN returns Data Source Name required for the Action. + DSN() string // Run runs an Action and returns output and error. Run(ctx context.Context) ([]byte, error) diff --git a/agent/runner/actions/mongodb_explain_action.go b/agent/runner/actions/mongodb_explain_action.go index 944572ee59..373b04df9f 100644 --- a/agent/runner/actions/mongodb_explain_action.go +++ b/agent/runner/actions/mongodb_explain_action.go @@ -18,7 +18,6 @@ import ( "context" "fmt" "path/filepath" - "strings" "time" "github.com/percona/percona-toolkit/src/go/mongolib/proto" @@ -31,23 +30,30 @@ import ( "github.com/percona/pmm/api/agentpb" ) +const mongoDBExplainActionType = "mongodb-explain" + type mongodbExplainAction struct { id string timeout time.Duration params *agentpb.StartActionRequest_MongoDBExplainParams - tempDir string + dsn string } var errCannotExplain = fmt.Errorf("cannot explain this type of query") // NewMongoDBExplainAction creates a MongoDB EXPLAIN query Action. -func NewMongoDBExplainAction(id string, timeout time.Duration, params *agentpb.StartActionRequest_MongoDBExplainParams, tempDir string) Action { +func NewMongoDBExplainAction(id string, timeout time.Duration, params *agentpb.StartActionRequest_MongoDBExplainParams, tempDir string) (Action, error) { + dsn, err := templates.RenderDSN(params.Dsn, params.TextFiles, filepath.Join(tempDir, mongoDBExplainActionType, id)) + if err != nil { + return nil, errors.WithStack(err) + } + return &mongodbExplainAction{ id: id, timeout: timeout, params: params, - tempDir: tempDir, - } + dsn: dsn, + }, nil } // ID returns an Action ID. @@ -62,17 +68,17 @@ func (a *mongodbExplainAction) Timeout() time.Duration { // Type returns an Action type. func (a *mongodbExplainAction) Type() string { - return "mongodb-explain" + return mongoDBExplainActionType +} + +// DSN returns the DSN for the Action. +func (a *mongodbExplainAction) DSN() string { + return a.dsn } // Run runs an action and returns output and error. func (a *mongodbExplainAction) Run(ctx context.Context) ([]byte, error) { - dsn, err := templates.RenderDSN(a.params.Dsn, a.params.TextFiles, filepath.Join(a.tempDir, strings.ToLower(a.Type()), a.id)) - if err != nil { - return nil, errors.WithStack(err) - } - - opts, err := mongo_fix.ClientOptionsForDSN(dsn) + opts, err := mongo_fix.ClientOptionsForDSN(a.dsn) if err != nil { return nil, errors.WithStack(err) } diff --git a/agent/runner/actions/mongodb_explain_action_test.go b/agent/runner/actions/mongodb_explain_action_test.go index 1ac5fe2764..8e927b71ec 100644 --- a/agent/runner/actions/mongodb_explain_action_test.go +++ b/agent/runner/actions/mongodb_explain_action_test.go @@ -52,7 +52,9 @@ func TestMongoDBExplain(t *testing.T) { Query: `{"ns":"test.coll","op":"query","query":{"k":{"$lte":{"$numberInt":"1"}}}}`, } - ex := NewMongoDBExplainAction(id, 0, params, os.TempDir()) + ex, err := NewMongoDBExplainAction(id, 0, params, os.TempDir()) + require.NoError(t, err) + res, err := ex.Run(ctx) assert.Nil(t, err) @@ -130,7 +132,9 @@ func TestNewMongoDBExplain(t *testing.T) { Query: string(query), } - ex := NewMongoDBExplainAction(id, 0, params, os.TempDir()) + ex, err := NewMongoDBExplainAction(id, 0, params, os.TempDir()) + require.NoError(t, err) + res, err := ex.Run(ctx) assert.NoError(t, err) diff --git a/agent/runner/actions/mongodb_query_admincommand_action.go b/agent/runner/actions/mongodb_query_admincommand_action.go index 2ded20cf5e..b490069542 100644 --- a/agent/runner/actions/mongodb_query_admincommand_action.go +++ b/agent/runner/actions/mongodb_query_admincommand_action.go @@ -17,7 +17,6 @@ package actions import ( "context" "path/filepath" - "strings" "time" "github.com/pkg/errors" @@ -29,27 +28,38 @@ import ( "github.com/percona/pmm/api/agentpb" ) +const mongoDBQueryAdminCommandActionType = "mongodb-query-admincommand" + type mongodbQueryAdmincommandAction struct { id string timeout time.Duration dsn string - files *agentpb.TextFiles command string arg interface{} - tempDir string } // NewMongoDBQueryAdmincommandAction creates a MongoDB adminCommand query action. -func NewMongoDBQueryAdmincommandAction(id string, timeout time.Duration, dsn string, files *agentpb.TextFiles, command string, arg interface{}, tempDir string) Action { +func NewMongoDBQueryAdmincommandAction( + id string, + timeout time.Duration, + dsn string, + files *agentpb.TextFiles, + command string, + arg interface{}, + tempDir string, +) (Action, error) { + dsn, err := templates.RenderDSN(dsn, files, filepath.Join(tempDir, mongoDBQueryAdminCommandActionType, id)) + if err != nil { + return nil, errors.WithStack(err) + } + return &mongodbQueryAdmincommandAction{ id: id, timeout: timeout, dsn: dsn, - files: files, command: command, arg: arg, - tempDir: tempDir, - } + }, nil } // ID returns an action ID. @@ -64,17 +74,17 @@ func (a *mongodbQueryAdmincommandAction) Timeout() time.Duration { // Type returns an action type. func (a *mongodbQueryAdmincommandAction) Type() string { - return "mongodb-query-admincommand" + return mongoDBQueryAdminCommandActionType +} + +// DSN returns a DSN for the Action. +func (a *mongodbQueryAdmincommandAction) DSN() string { + return a.dsn } // Run runs an action and returns output and error. func (a *mongodbQueryAdmincommandAction) Run(ctx context.Context) ([]byte, error) { - dsn, err := templates.RenderDSN(a.dsn, a.files, filepath.Join(a.tempDir, strings.ToLower(a.Type()), a.id)) - if err != nil { - return nil, errors.WithStack(err) - } - - opts, err := mongo_fix.ClientOptionsForDSN(dsn) + opts, err := mongo_fix.ClientOptionsForDSN(a.dsn) if err != nil { return nil, errors.WithStack(err) } diff --git a/agent/runner/actions/mongodb_query_admincommand_action_test.go b/agent/runner/actions/mongodb_query_admincommand_action_test.go index 6318594b5a..ed03fa1cce 100644 --- a/agent/runner/actions/mongodb_query_admincommand_action_test.go +++ b/agent/runner/actions/mongodb_query_admincommand_action_test.go @@ -175,7 +175,9 @@ func TestMongoDBActionsReplWithSSL(t *testing.T) { func runAction(t *testing.T, id string, timeout time.Duration, dsn string, files *agentpb.TextFiles, command string, arg interface{}, tempDir string) []byte { //nolint:unparam t.Helper() - a := NewMongoDBQueryAdmincommandAction(id, timeout, dsn, files, command, arg, tempDir) + a, err := NewMongoDBQueryAdmincommandAction(id, timeout, dsn, files, command, arg, tempDir) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() b, err := a.Run(ctx) @@ -227,7 +229,9 @@ func replSetGetStatusAssertionsReplicated(t *testing.T, b []byte) { //nolint:the } func replSetGetStatusAssertionsStandalone(t *testing.T, id string, timeout time.Duration, dsn string, files *agentpb.TextFiles, command string, arg interface{}, tempDir string) { //nolint:thelper - a := NewMongoDBQueryAdmincommandAction(id, timeout, dsn, files, command, arg, tempDir) + a, err := NewMongoDBQueryAdmincommandAction(id, timeout, dsn, files, command, arg, tempDir) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() b, err := a.Run(ctx) diff --git a/agent/runner/actions/mysql_explain_action.go b/agent/runner/actions/mysql_explain_action.go index 6eb29cb795..7fda097e5f 100644 --- a/agent/runner/actions/mysql_explain_action.go +++ b/agent/runner/actions/mysql_explain_action.go @@ -54,12 +54,27 @@ var errCannotEncodeExplainResponse = errors.New("cannot JSON encode the explain // NewMySQLExplainAction creates MySQL Explain Action. // This is an Action that can run `EXPLAIN` command on MySQL service with given DSN. -func NewMySQLExplainAction(id string, timeout time.Duration, params *agentpb.StartActionRequest_MySQLExplainParams) Action { +func NewMySQLExplainAction(id string, timeout time.Duration, params *agentpb.StartActionRequest_MySQLExplainParams) (Action, error) { + if params.Query == "" { + return nil, errors.New("Query to EXPLAIN is empty") + } + + // You cant run Explain on trimmed queries. + if strings.HasSuffix(params.Query, "...") { + return nil, errors.New("EXPLAIN failed because the query exceeded max length and got trimmed. Set max-query-length to a larger value.") //nolint:revive + } + + // Explain is supported only for DML queries. + // https://dev.mysql.com/doc/refman/8.0/en/using-explain.html + if !isDMLQuery(params.Query) { + return nil, errors.New("EXPLAIN functionality is supported only for DML queries - SELECT, INSERT, UPDATE, DELETE and REPLACE.") //nolint:revive + } + return &mysqlExplainAction{ id: id, timeout: timeout, params: params, - } + }, nil } // ID returns an Action ID. @@ -77,23 +92,13 @@ func (a *mysqlExplainAction) Type() string { return "mysql-explain" } +// DSN returns a DSN for the Action. +func (a *mysqlExplainAction) DSN() string { + return a.params.Dsn +} + // Run runs an Action and returns output and error. func (a *mysqlExplainAction) Run(ctx context.Context) ([]byte, error) { - if a.params.Query == "" { - return nil, errors.New("Query to EXPLAIN is empty") - } - - // You cant run Explain on trimmed queries. - if strings.HasSuffix(a.params.Query, "...") { - return nil, errors.New("EXPLAIN failed because the query was too long and trimmed. Set max-query-length to a larger value.") //nolint:revive - } - - // Explain is supported only for DML queries. - // https://dev.mysql.com/doc/refman/8.0/en/using-explain.html - if !isDMLQuery(a.params.Query) { - return nil, errors.New("Functionality EXPLAIN is supported only for DML queries (SELECT, INSERT, UPDATE, DELETE, REPLACE)") - } - a.params.Query = queryparser.GetMySQLFingerprintFromExplainFingerprint(a.params.Query) // query has a copy of the original params.Query field if the query is a SELECT or the equivalent diff --git a/agent/runner/actions/mysql_explain_action_test.go b/agent/runner/actions/mysql_explain_action_test.go index b8e58f5b9a..ecc628fbe4 100644 --- a/agent/runner/actions/mysql_explain_action_test.go +++ b/agent/runner/actions/mysql_explain_action_test.go @@ -52,7 +52,9 @@ func TestMySQLExplain(t *testing.T) { Query: query, OutputFormat: agentpb.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_DEFAULT, } - a := NewMySQLExplainAction("", time.Second, params) + a, err := NewMySQLExplainAction("", time.Second, params) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), a.Timeout()) defer cancel() @@ -79,7 +81,9 @@ func TestMySQLExplain(t *testing.T) { Query: query, OutputFormat: agentpb.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_JSON, } - a := NewMySQLExplainAction("", time.Second, params) + a, err := NewMySQLExplainAction("", time.Second, params) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), a.Timeout()) defer cancel() @@ -125,7 +129,9 @@ func TestMySQLExplain(t *testing.T) { Query: query, OutputFormat: agentpb.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_TRADITIONAL_JSON, } - a := NewMySQLExplainAction("", time.Second, params) + a, err := NewMySQLExplainAction("", time.Second, params) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), a.Timeout()) defer cancel() @@ -167,13 +173,9 @@ func TestMySQLExplain(t *testing.T) { Dsn: "pmm-agent:pmm-agent-wrong-password@tcp(127.0.0.1:3306)/world", OutputFormat: agentpb.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_DEFAULT, } - a := NewMySQLExplainAction("", time.Second, params) - ctx, cancel := context.WithTimeout(context.Background(), a.Timeout()) - defer cancel() - - _, err := a.Run(ctx) - require.Error(t, err) - assert.Regexp(t, `Query to EXPLAIN is empty`, err.Error()) + a, err := NewMySQLExplainAction("", time.Second, params) + assert.ErrorContains(t, err, `Query to EXPLAIN is empty`) + assert.Nil(t, a) }) t.Run("DML Query Insert", func(t *testing.T) { @@ -184,7 +186,9 @@ func TestMySQLExplain(t *testing.T) { Query: `INSERT INTO city (Name) VALUES ('Rosario')`, OutputFormat: agentpb.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_DEFAULT, } - a := NewMySQLExplainAction("", time.Second, params) + a, err := NewMySQLExplainAction("", time.Second, params) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), a.Timeout()) defer cancel() @@ -205,12 +209,9 @@ func TestMySQLExplain(t *testing.T) { Query: `INSERT INTO city (Name)...`, OutputFormat: agentpb.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_DEFAULT, } - a := NewMySQLExplainAction("", time.Second, params) - ctx, cancel := context.WithTimeout(context.Background(), a.Timeout()) - defer cancel() - - _, err := a.Run(ctx) - require.Error(t, err, "EXPLAIN failed because the query was too long and trimmed. Set max-query-length to a larger value.") + a, err := NewMySQLExplainAction("", time.Second, params) + assert.ErrorContains(t, err, "EXPLAIN failed because the query exceeded max length and got trimmed. Set max-query-length to a larger value.") + assert.Nil(t, a) }) t.Run("LittleBobbyTables", func(t *testing.T) { @@ -233,11 +234,13 @@ func TestMySQLExplain(t *testing.T) { Query: `SELECT 1; DROP TABLE city; --`, OutputFormat: agentpb.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_DEFAULT, } - a := NewMySQLExplainAction("", time.Second, params) + a, err := NewMySQLExplainAction("", time.Second, params) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), a.Timeout()) defer cancel() - _, err := a.Run(ctx) + _, err = a.Run(ctx) expected := "Error 1064 \\(42000\\): You have an error in your SQL syntax; check the manual that corresponds " + "to your (MySQL|MariaDB) server version for the right syntax to use near 'DROP TABLE city; --' at line 1" require.Error(t, err) @@ -253,11 +256,13 @@ func TestMySQLExplain(t *testing.T) { Query: `DELETE FROM city`, OutputFormat: agentpb.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_DEFAULT, } - a := NewMySQLExplainAction("", time.Second, params) + a, err := NewMySQLExplainAction("", time.Second, params) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), a.Timeout()) defer cancel() - _, err := a.Run(ctx) + _, err = a.Run(ctx) require.NoError(t, err) checkCity(t) }) @@ -305,11 +310,13 @@ func TestMySQLExplain(t *testing.T) { Query: `select * from (select cleanup()) as testclean;`, OutputFormat: agentpb.MysqlExplainOutputFormat_MYSQL_EXPLAIN_OUTPUT_FORMAT_DEFAULT, } - a := NewMySQLExplainAction("", time.Second, params) + a, err := NewMySQLExplainAction("", time.Second, params) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), a.Timeout()) defer cancel() - _, err := a.Run(ctx) + _, err = a.Run(ctx) require.NoError(t, err) check(t) }) diff --git a/agent/runner/actions/mysql_query_select_action.go b/agent/runner/actions/mysql_query_select_action.go index 39833e5b11..9db5feed2d 100644 --- a/agent/runner/actions/mysql_query_select_action.go +++ b/agent/runner/actions/mysql_query_select_action.go @@ -55,6 +55,11 @@ func (a *mysqlQuerySelectAction) Type() string { return "mysql-query-select" } +// DSN returns a DSN for the Action. +func (a *mysqlQuerySelectAction) DSN() string { + return a.params.Dsn +} + // Run runs an Action and returns output and error. func (a *mysqlQuerySelectAction) Run(ctx context.Context) ([]byte, error) { db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) diff --git a/agent/runner/actions/mysql_query_show_action.go b/agent/runner/actions/mysql_query_show_action.go index 4081e1898e..cb14cbf309 100644 --- a/agent/runner/actions/mysql_query_show_action.go +++ b/agent/runner/actions/mysql_query_show_action.go @@ -55,6 +55,11 @@ func (a *mysqlQueryShowAction) Type() string { return "mysql-query-show" } +// DSN returns a DSN for the Action. +func (a *mysqlQueryShowAction) DSN() string { + return a.params.Dsn +} + // Run runs an Action and returns output and error. func (a *mysqlQueryShowAction) Run(ctx context.Context) ([]byte, error) { db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) diff --git a/agent/runner/actions/mysql_show_create_table_action.go b/agent/runner/actions/mysql_show_create_table_action.go index 7ca727f2c6..1d98f24c0f 100644 --- a/agent/runner/actions/mysql_show_create_table_action.go +++ b/agent/runner/actions/mysql_show_create_table_action.go @@ -53,6 +53,11 @@ func (a *mysqlShowCreateTableAction) Type() string { return "mysql-show-create-table" } +// DSN returns a DSN for the Action. +func (a *mysqlShowCreateTableAction) DSN() string { + return a.params.Dsn +} + // Run runs an Action and returns output and error. func (a *mysqlShowCreateTableAction) Run(ctx context.Context) ([]byte, error) { db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) diff --git a/agent/runner/actions/mysql_show_index_action.go b/agent/runner/actions/mysql_show_index_action.go index 1a2bc070fe..112c6814b2 100644 --- a/agent/runner/actions/mysql_show_index_action.go +++ b/agent/runner/actions/mysql_show_index_action.go @@ -54,6 +54,11 @@ func (a *mysqlShowIndexAction) Type() string { return "mysql-show-index" } +// DSN returns a DSN for the Action. +func (a *mysqlShowIndexAction) DSN() string { + return a.params.Dsn +} + // Run runs an Action and returns output and error. func (a *mysqlShowIndexAction) Run(ctx context.Context) ([]byte, error) { db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) diff --git a/agent/runner/actions/mysql_show_table_status_action.go b/agent/runner/actions/mysql_show_table_status_action.go index 1d7c5331ae..9056a03600 100644 --- a/agent/runner/actions/mysql_show_table_status_action.go +++ b/agent/runner/actions/mysql_show_table_status_action.go @@ -58,6 +58,11 @@ func (a *mysqlShowTableStatusAction) Type() string { return "mysql-show-table-status" } +// DSN returns a DSN for the Action. +func (a *mysqlShowTableStatusAction) DSN() string { + return a.params.Dsn +} + // Run runs an Action and returns output and error. func (a *mysqlShowTableStatusAction) Run(ctx context.Context) ([]byte, error) { db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) diff --git a/agent/runner/actions/postgresql_query_select_action.go b/agent/runner/actions/postgresql_query_select_action.go index 4e21de6582..196cb6ab02 100644 --- a/agent/runner/actions/postgresql_query_select_action.go +++ b/agent/runner/actions/postgresql_query_select_action.go @@ -29,21 +29,38 @@ import ( "github.com/percona/pmm/utils/sqlrows" ) +const postgreSQLQuerySelectActionType = "postgresql-query-select" + type postgresqlQuerySelectAction struct { id string timeout time.Duration params *agentpb.StartActionRequest_PostgreSQLQuerySelectParams - tempDir string + dsn string } // NewPostgreSQLQuerySelectAction creates PostgreSQL SELECT query Action. -func NewPostgreSQLQuerySelectAction(id string, timeout time.Duration, params *agentpb.StartActionRequest_PostgreSQLQuerySelectParams, tempDir string) Action { +func NewPostgreSQLQuerySelectAction(id string, timeout time.Duration, params *agentpb.StartActionRequest_PostgreSQLQuerySelectParams, tempDir string) (Action, error) { + // A very basic check that there is a single SELECT query. It has oblivious false positives (`SELECT ';'`), + // but PostgreSQL query lexical structure (https://www.postgresql.org/docs/current/sql-syntax-lexical.html) + // does not allow false negatives. + // If we decide to improve it, we could use our existing query parser from pg_stat_statement agent, + // or use a simple hand-made parser similar to + // https://github.com/mc2soft/pq-types/blob/ada769d4011a027a5385b9c4e47976fe327350a6/string_array.go#L82-L116 + if strings.Contains(params.Query, ";") { + return nil, errors.New("query contains ';'") + } + + dsn, err := templates.RenderDSN(params.Dsn, params.TlsFiles, filepath.Join(tempDir, postgreSQLQuerySelectActionType, id)) + if err != nil { + return nil, errors.WithStack(err) + } + return &postgresqlQuerySelectAction{ id: id, timeout: timeout, params: params, - tempDir: tempDir, - } + dsn: dsn, + }, nil } // ID returns an Action ID. @@ -58,33 +75,23 @@ func (a *postgresqlQuerySelectAction) Timeout() time.Duration { // Type returns an Action type. func (a *postgresqlQuerySelectAction) Type() string { - return "postgresql-query-select" + return postgreSQLQuerySelectActionType +} + +// DSN returns the DSN for the Action. +func (a *postgresqlQuerySelectAction) DSN() string { + return a.dsn } // Run runs an Action and returns output and error. func (a *postgresqlQuerySelectAction) Run(ctx context.Context) ([]byte, error) { - dsn, err := templates.RenderDSN(a.params.Dsn, a.params.TlsFiles, filepath.Join(a.tempDir, strings.ToLower(a.Type()), a.id)) - if err != nil { - return nil, errors.WithStack(err) - } - - connector, err := pq.NewConnector(dsn) + connector, err := pq.NewConnector(a.dsn) if err != nil { return nil, errors.WithStack(err) } db := sql.OpenDB(connector) defer db.Close() //nolint:errcheck - // A very basic check that there is a single SELECT query. It has oblivious false positives (`SELECT ';'`), - // but PostgreSQL query lexical structure (https://www.postgresql.org/docs/current/sql-syntax-lexical.html) - // does not allow false negatives. - // If we decide to improve it, we could use our existing query parser from pg_stat_statement agent, - // or use a simple hand-made parser similar to - // https://github.com/mc2soft/pq-types/blob/ada769d4011a027a5385b9c4e47976fe327350a6/string_array.go#L82-L116 - if strings.Contains(a.params.Query, ";") { - return nil, errors.New("query contains ';'") - } - rows, err := db.QueryContext(ctx, "SELECT /* pmm-agent */ "+a.params.Query) //nolint:gosec if err != nil { return nil, errors.WithStack(err) diff --git a/agent/runner/actions/postgresql_query_select_action_test.go b/agent/runner/actions/postgresql_query_select_action_test.go index 3f52823a17..c62f559c82 100644 --- a/agent/runner/actions/postgresql_query_select_action_test.go +++ b/agent/runner/actions/postgresql_query_select_action_test.go @@ -41,7 +41,9 @@ func TestPostgreSQLQuerySelect(t *testing.T) { Dsn: dsn, Query: "* FROM pg_extension", } - a := NewPostgreSQLQuerySelectAction("", 0, params, os.TempDir()) + a, err := NewPostgreSQLQuerySelectAction("", 0, params, os.TempDir()) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() @@ -74,7 +76,9 @@ func TestPostgreSQLQuerySelect(t *testing.T) { Dsn: dsn, Query: `'\x0001feff'::bytea AS bytes`, } - a := NewPostgreSQLQuerySelectAction("", 0, params, os.TempDir()) + a, err := NewPostgreSQLQuerySelectAction("", 0, params, os.TempDir()) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() @@ -98,17 +102,8 @@ func TestPostgreSQLQuerySelect(t *testing.T) { Dsn: dsn, Query: "* FROM city; DROP TABLE city CASCADE; --", } - a := NewPostgreSQLQuerySelectAction("", 0, params, os.TempDir()) - ctx, cancel := context.WithTimeout(context.Background(), time.Second) - defer cancel() - - b, err := a.Run(ctx) + a, err := NewPostgreSQLQuerySelectAction("", 0, params, os.TempDir()) assert.EqualError(t, err, "query contains ';'") - assert.Nil(t, b) - - var count int - err = db.QueryRow("SELECT COUNT(*) FROM city").Scan(&count) - require.NoError(t, err) - assert.Equal(t, 4079, count) + assert.Nil(t, a) }) } diff --git a/agent/runner/actions/postgresql_query_show_action.go b/agent/runner/actions/postgresql_query_show_action.go index c4ab4e2fdb..8e365e160d 100644 --- a/agent/runner/actions/postgresql_query_show_action.go +++ b/agent/runner/actions/postgresql_query_show_action.go @@ -18,7 +18,6 @@ import ( "context" "database/sql" "path/filepath" - "strings" "time" "github.com/lib/pq" @@ -29,21 +28,26 @@ import ( "github.com/percona/pmm/utils/sqlrows" ) +const postgreSQLQueryShowActionType = "postgresql-query-show" + type postgresqlQueryShowAction struct { id string timeout time.Duration - params *agentpb.StartActionRequest_PostgreSQLQueryShowParams - tempDir string + dsn string } // NewPostgreSQLQueryShowAction creates PostgreSQL SHOW query Action. -func NewPostgreSQLQueryShowAction(id string, timeout time.Duration, params *agentpb.StartActionRequest_PostgreSQLQueryShowParams, tempDir string) Action { +func NewPostgreSQLQueryShowAction(id string, timeout time.Duration, params *agentpb.StartActionRequest_PostgreSQLQueryShowParams, tempDir string) (Action, error) { + dsn, err := templates.RenderDSN(params.Dsn, params.TlsFiles, filepath.Join(tempDir, postgreSQLQueryShowActionType, id)) + if err != nil { + return nil, errors.WithStack(err) + } + return &postgresqlQueryShowAction{ id: id, timeout: timeout, - params: params, - tempDir: tempDir, - } + dsn: dsn, + }, nil } // ID returns an Action ID. @@ -58,17 +62,17 @@ func (a *postgresqlQueryShowAction) Timeout() time.Duration { // Type returns an Action type. func (a *postgresqlQueryShowAction) Type() string { - return "postgresql-query-show" + return postgreSQLQueryShowActionType +} + +// DSN returns a DSN for the Action. +func (a *postgresqlQueryShowAction) DSN() string { + return a.dsn } // Run runs an Action and returns output and error. func (a *postgresqlQueryShowAction) Run(ctx context.Context) ([]byte, error) { - dsn, err := templates.RenderDSN(a.params.Dsn, a.params.TlsFiles, filepath.Join(a.tempDir, strings.ToLower(a.Type()), a.id)) - if err != nil { - return nil, errors.WithStack(err) - } - - connector, err := pq.NewConnector(dsn) + connector, err := pq.NewConnector(a.dsn) if err != nil { return nil, errors.WithStack(err) } diff --git a/agent/runner/actions/postgresql_query_show_action_test.go b/agent/runner/actions/postgresql_query_show_action_test.go index afd1196b87..8b0fd5d5f8 100644 --- a/agent/runner/actions/postgresql_query_show_action_test.go +++ b/agent/runner/actions/postgresql_query_show_action_test.go @@ -40,7 +40,9 @@ func TestPostgreSQLQueryShow(t *testing.T) { params := &agentpb.StartActionRequest_PostgreSQLQueryShowParams{ Dsn: dsn, } - a := NewPostgreSQLQueryShowAction("", 0, params, os.TempDir()) + a, err := NewPostgreSQLQueryShowAction("", 0, params, os.TempDir()) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() diff --git a/agent/runner/actions/postgresql_show_create_table_action.go b/agent/runner/actions/postgresql_show_create_table_action.go index ad15129432..7decddedc3 100644 --- a/agent/runner/actions/postgresql_show_create_table_action.go +++ b/agent/runner/actions/postgresql_show_create_table_action.go @@ -34,6 +34,8 @@ import ( "github.com/percona/pmm/api/agentpb" ) +const postgreSQLShowCreateTableActionType = "postgresql-show-create-table" + type columnInfo struct { Attname string FormatType string @@ -66,18 +68,28 @@ type postgresqlShowCreateTableAction struct { id string timeout time.Duration params *agentpb.StartActionRequest_PostgreSQLShowCreateTableParams - tempDir string + dsn string } // NewPostgreSQLShowCreateTableAction creates PostgreSQL SHOW CREATE TABLE Action. // This is an Action that can run `\d+ table` command analog on PostgreSQL service with given DSN. -func NewPostgreSQLShowCreateTableAction(id string, timeout time.Duration, params *agentpb.StartActionRequest_PostgreSQLShowCreateTableParams, tempDir string) Action { +func NewPostgreSQLShowCreateTableAction( + id string, + timeout time.Duration, + params *agentpb.StartActionRequest_PostgreSQLShowCreateTableParams, + tempDir string, +) (Action, error) { + dsn, err := templates.RenderDSN(params.Dsn, params.TlsFiles, filepath.Join(tempDir, postgreSQLShowCreateTableActionType, id)) + if err != nil { + return nil, errors.WithStack(err) + } + return &postgresqlShowCreateTableAction{ id: id, timeout: timeout, params: params, - tempDir: tempDir, - } + dsn: dsn, + }, nil } // ID returns an Action ID. @@ -92,17 +104,17 @@ func (a *postgresqlShowCreateTableAction) Timeout() time.Duration { // Type returns an Action type. func (a *postgresqlShowCreateTableAction) Type() string { - return "postgresql-show-create-table" + return postgreSQLShowCreateTableActionType +} + +// DSN returns a DSN for the Action. +func (a *postgresqlShowCreateTableAction) DSN() string { + return a.dsn } // Run runs an Action and returns output and error. func (a *postgresqlShowCreateTableAction) Run(ctx context.Context) ([]byte, error) { - dsn, err := templates.RenderDSN(a.params.Dsn, a.params.TlsFiles, filepath.Join(a.tempDir, strings.ToLower(a.Type()), a.id)) - if err != nil { - return nil, errors.WithStack(err) - } - - connector, err := pq.NewConnector(dsn) + connector, err := pq.NewConnector(a.dsn) if err != nil { return nil, errors.WithStack(err) } 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 176b70ba9e..af5317e4a5 100644 --- a/agent/runner/actions/postgresql_show_create_table_action_test.go +++ b/agent/runner/actions/postgresql_show_create_table_action_test.go @@ -40,7 +40,9 @@ func TestPostgreSQLShowCreateTable(t *testing.T) { Dsn: dsn, Table: "public.country", } - a := NewPostgreSQLShowCreateTableAction("", 0, params, os.TempDir()) + a, err := NewPostgreSQLShowCreateTableAction("", 0, params, os.TempDir()) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() @@ -83,7 +85,9 @@ Referenced by: Dsn: dsn, Table: "city", } - a := NewPostgreSQLShowCreateTableAction("", 0, params, os.TempDir()) + a, err := NewPostgreSQLShowCreateTableAction("", 0, params, os.TempDir()) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() @@ -112,7 +116,9 @@ Referenced by: Dsn: dsn, Table: "countrylanguage", } - a := NewPostgreSQLShowCreateTableAction("", 0, params, os.TempDir()) + a, err := NewPostgreSQLShowCreateTableAction("", 0, params, os.TempDir()) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() @@ -140,11 +146,13 @@ Foreign-key constraints: Dsn: dsn, Table: `city; DROP TABLE city; --`, } - a := NewPostgreSQLShowCreateTableAction("", 0, params, os.TempDir()) + a, err := NewPostgreSQLShowCreateTableAction("", 0, params, os.TempDir()) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() - _, err := a.Run(ctx) + _, err = a.Run(ctx) expected := "Table not found: sql: no rows in result set" assert.EqualError(t, err, expected) diff --git a/agent/runner/actions/postgresql_show_index_action.go b/agent/runner/actions/postgresql_show_index_action.go index b91d823d96..d93eb8d493 100644 --- a/agent/runner/actions/postgresql_show_index_action.go +++ b/agent/runner/actions/postgresql_show_index_action.go @@ -30,22 +30,29 @@ import ( "github.com/percona/pmm/utils/sqlrows" ) +const postgreSQLShowIndexActionType = "postgresql-show-index" + type postgresqlShowIndexAction struct { id string timeout time.Duration params *agentpb.StartActionRequest_PostgreSQLShowIndexParams - tempDir string + dsn string } // NewPostgreSQLShowIndexAction creates PostgreSQL SHOW INDEX Action. // This is an Action that can run `SHOW INDEX` command on PostgreSQL service with given DSN. -func NewPostgreSQLShowIndexAction(id string, timeout time.Duration, params *agentpb.StartActionRequest_PostgreSQLShowIndexParams, tempDir string) Action { +func NewPostgreSQLShowIndexAction(id string, timeout time.Duration, params *agentpb.StartActionRequest_PostgreSQLShowIndexParams, tempDir string) (Action, error) { + dsn, err := templates.RenderDSN(params.Dsn, params.TlsFiles, filepath.Join(tempDir, postgreSQLShowIndexActionType, id)) + if err != nil { + return nil, errors.WithStack(err) + } + return &postgresqlShowIndexAction{ id: id, timeout: timeout, params: params, - tempDir: tempDir, - } + dsn: dsn, + }, nil } // ID returns an Action ID. @@ -60,17 +67,17 @@ func (a *postgresqlShowIndexAction) Timeout() time.Duration { // Type returns an Action type. func (a *postgresqlShowIndexAction) Type() string { - return "postgresql-show-index" + return postgreSQLShowIndexActionType +} + +// DSN returns a DSN for the Action. +func (a *postgresqlShowIndexAction) DSN() string { + return a.dsn } // Run runs an Action and returns output and error. func (a *postgresqlShowIndexAction) Run(ctx context.Context) ([]byte, error) { - dsn, err := templates.RenderDSN(a.params.Dsn, a.params.TlsFiles, filepath.Join(a.tempDir, strings.ToLower(a.Type()), a.id)) - if err != nil { - return nil, errors.WithStack(err) - } - - connector, err := pq.NewConnector(dsn) + connector, err := pq.NewConnector(a.dsn) if err != nil { return nil, errors.WithStack(err) } diff --git a/agent/runner/actions/postgresql_show_index_action_test.go b/agent/runner/actions/postgresql_show_index_action_test.go index 38516865d1..a80c397cc0 100644 --- a/agent/runner/actions/postgresql_show_index_action_test.go +++ b/agent/runner/actions/postgresql_show_index_action_test.go @@ -42,7 +42,9 @@ func TestPostgreSQLShowIndex(t *testing.T) { Dsn: dsn, Table: "city", } - a := NewPostgreSQLShowIndexAction("", 0, params, os.TempDir()) + a, err := NewPostgreSQLShowIndexAction("", 0, params, os.TempDir()) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() @@ -68,7 +70,9 @@ func TestPostgreSQLShowIndex(t *testing.T) { Dsn: dsn, Table: "public.city", } - a := NewPostgreSQLShowIndexAction("", 0, params, os.TempDir()) + a, err := NewPostgreSQLShowIndexAction("", 0, params, os.TempDir()) + require.NoError(t, err) + ctx, cancel := context.WithTimeout(context.Background(), time.Second) defer cancel() diff --git a/agent/runner/actions/process_action.go b/agent/runner/actions/process_action.go index 2b0d16baa9..5d36242483 100644 --- a/agent/runner/actions/process_action.go +++ b/agent/runner/actions/process_action.go @@ -59,6 +59,11 @@ func (a *processAction) Type() string { return a.command } +// DSN returns a DSN for the Action. +func (a *processAction) DSN() string { + return "" // no DSN for process action +} + // Run runs an Action and returns output and error. func (a *processAction) Run(ctx context.Context) ([]byte, error) { cmd := exec.CommandContext(ctx, a.command, a.arg...) //nolint:gosec diff --git a/agent/runner/actions/pt_mysql_summary_action.go b/agent/runner/actions/pt_mysql_summary_action.go index bce06cc268..43a3e0c18c 100644 --- a/agent/runner/actions/pt_mysql_summary_action.go +++ b/agent/runner/actions/pt_mysql_summary_action.go @@ -17,6 +17,7 @@ package actions import ( "context" "fmt" + "net" "os" "os/exec" "strconv" @@ -63,6 +64,15 @@ func (a *ptMySQLSummaryAction) Type() string { return a.command } +// DSN returns a DSN for the Action. +func (a *ptMySQLSummaryAction) DSN() string { + if a.params.Socket != "" { + return a.params.Socket + } + + return net.JoinHostPort(a.params.Host, strconv.FormatUint(uint64(a.params.Port), 10)) +} + // Run runs an Action and returns output and error. func (a *ptMySQLSummaryAction) Run(ctx context.Context) ([]byte, error) { cmd := exec.CommandContext(ctx, a.command, a.ListFromMySQLParams()...) //nolint:gosec diff --git a/agent/runner/jobs/common.go b/agent/runner/jobs/common.go index f110bd309d..f9802723f0 100644 --- a/agent/runner/jobs/common.go +++ b/agent/runner/jobs/common.go @@ -31,22 +31,22 @@ type DBConnConfig struct { Socket string } -func createDBURL(dbConfig DBConnConfig) *url.URL { +func (c *DBConnConfig) createDBURL() *url.URL { var host string switch { - case dbConfig.Address != "": - if dbConfig.Port > 0 { - host = net.JoinHostPort(dbConfig.Address, strconv.Itoa(dbConfig.Port)) + case c.Address != "": + if c.Port > 0 { + host = net.JoinHostPort(c.Address, strconv.Itoa(c.Port)) } else { - host = dbConfig.Address + host = c.Address } - case dbConfig.Socket != "": - host = dbConfig.Socket + case c.Socket != "": + host = c.Socket } var user *url.Userinfo - if dbConfig.User != "" { - user = url.UserPassword(dbConfig.User, dbConfig.Password) + if c.User != "" { + user = url.UserPassword(c.User, c.Password) } return &url.URL{ diff --git a/agent/runner/jobs/job.go b/agent/runner/jobs/job.go index 6d4c2eabdf..81e76582b1 100644 --- a/agent/runner/jobs/job.go +++ b/agent/runner/jobs/job.go @@ -44,6 +44,8 @@ type Job interface { Type() JobType // Timeout returns Job timeout. Timeout() time.Duration + // DSN returns Data Source Name required for the Action. + DSN() string // Run starts Job execution. Run(ctx context.Context, send Send) error } diff --git a/agent/runner/jobs/mongodb_backup_job.go b/agent/runner/jobs/mongodb_backup_job.go index 7c321844b7..afa68f08f1 100644 --- a/agent/runner/jobs/mongodb_backup_job.go +++ b/agent/runner/jobs/mongodb_backup_job.go @@ -44,7 +44,7 @@ type MongoDBBackupJob struct { timeout time.Duration l logrus.FieldLogger name string - dbURL *string + dsn string locationConfig BackupLocationConfig pitr bool dataModel backuppb.DataModel @@ -57,7 +57,7 @@ func NewMongoDBBackupJob( id string, timeout time.Duration, name string, - dbConfig *string, + dsn string, locationConfig BackupLocationConfig, pitr bool, dataModel backuppb.DataModel, @@ -75,11 +75,11 @@ func NewMongoDBBackupJob( timeout: timeout, l: logrus.WithFields(logrus.Fields{"id": id, "type": "mongodb_backup", "name": name}), name: name, - dbURL: dbConfig, + dsn: dsn, locationConfig: locationConfig, pitr: pitr, dataModel: dataModel, - jobLogger: newPbmJobLogger(id, pbmBackupJob, dbConfig), + jobLogger: newPbmJobLogger(id, pbmBackupJob, dsn), folder: folder, }, nil } @@ -99,6 +99,11 @@ func (j *MongoDBBackupJob) Timeout() time.Duration { return j.timeout } +// DSN returns DSN for the Job. +func (j *MongoDBBackupJob) DSN() string { + return j.dsn +} + // Run starts Job execution. func (j *MongoDBBackupJob) Run(ctx context.Context, send Send) error { defer j.jobLogger.sendLog(send, "", true) @@ -121,14 +126,14 @@ func (j *MongoDBBackupJob) Run(ctx context.Context, send Send) error { configParams := pbmConfigParams{ configFilePath: confFile, forceResync: false, - dbURL: j.dbURL, + dsn: j.dsn, } if err := pbmConfigure(ctx, j.l, configParams); err != nil { return errors.Wrap(err, "failed to configure pbm") } rCtx, cancel := context.WithTimeout(ctx, resyncTimeout) - if err := waitForPBMNoRunningOperations(rCtx, j.l, j.dbURL); err != nil { + if err := waitForPBMNoRunningOperations(rCtx, j.l, j.dsn); err != nil { cancel() return errors.Wrap(err, "failed to wait configuration completion") } @@ -148,17 +153,17 @@ func (j *MongoDBBackupJob) Run(ctx context.Context, send Send) error { } }() - if err := waitForPBMBackup(ctx, j.l, j.dbURL, pbmBackupOut.Name); err != nil { + if err := waitForPBMBackup(ctx, j.l, j.dsn, pbmBackupOut.Name); err != nil { j.jobLogger.sendLog(send, err.Error(), false) return errors.Wrap(err, "failed to wait backup completion") } - sharded, err := isShardedCluster(ctx, j.dbURL) + sharded, err := isShardedCluster(ctx, j.dsn) if err != nil { return err } - backupTimestamp, err := pbmGetSnapshotTimestamp(ctx, j.l, j.dbURL, pbmBackupOut.Name) + backupTimestamp, err := pbmGetSnapshotTimestamp(ctx, j.l, j.dsn, pbmBackupOut.Name) if err != nil { return err } @@ -211,7 +216,7 @@ func (j *MongoDBBackupJob) startBackup(ctx context.Context) (*pbmBackup, error) return nil, errors.Errorf("'%s' is not a supported data model for backups", j.dataModel) } - if err := execPBMCommand(ctx, j.dbURL, &result, pbmArgs...); err != nil { + if err := execPBMCommand(ctx, j.dsn, &result, pbmArgs...); err != nil { return nil, err } diff --git a/agent/runner/jobs/mongodb_backup_job_test.go b/agent/runner/jobs/mongodb_backup_job_test.go index 669b3f6580..2748ec5736 100644 --- a/agent/runner/jobs/mongodb_backup_job_test.go +++ b/agent/runner/jobs/mongodb_backup_job_test.go @@ -72,7 +72,7 @@ func TestCreateDBURL(t *testing.T) { t.Run(test.name, func(t *testing.T) { t.Parallel() - assert.Equal(t, test.url, createDBURL(test.dbConfig).String()) + assert.Equal(t, test.url, test.dbConfig.createDBURL().String()) }) } } @@ -80,7 +80,6 @@ func TestCreateDBURL(t *testing.T) { func TestNewMongoDBBackupJob(t *testing.T) { t.Parallel() testJobDuration := 1 * time.Second - var dbConfig string tests := []struct { name string @@ -115,7 +114,7 @@ func TestNewMongoDBBackupJob(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { t.Parallel() - _, err := NewMongoDBBackupJob(t.Name(), testJobDuration, t.Name(), &dbConfig, BackupLocationConfig{}, tc.pitr, tc.dataModel, "artifact_folder") + _, err := NewMongoDBBackupJob(t.Name(), testJobDuration, t.Name(), "", BackupLocationConfig{}, tc.pitr, tc.dataModel, "artifact_folder") if tc.errMsg == "" { assert.NoError(t, err) } else { diff --git a/agent/runner/jobs/mongodb_restore_job.go b/agent/runner/jobs/mongodb_restore_job.go index c11ae699d5..2d5e22474f 100644 --- a/agent/runner/jobs/mongodb_restore_job.go +++ b/agent/runner/jobs/mongodb_restore_job.go @@ -42,7 +42,7 @@ type MongoDBRestoreJob struct { l *logrus.Entry name string pitrTimestamp time.Time - dbURL *string + dbURL string locationConfig BackupLocationConfig agentsRestarter agentsRestarter jobLogger *pbmJobLogger @@ -56,7 +56,7 @@ func NewMongoDBRestoreJob( timeout time.Duration, name string, pitrTimestamp time.Time, - dbConfig *string, + dbConfig string, locationConfig BackupLocationConfig, restarter agentsRestarter, folder string, @@ -92,6 +92,11 @@ func (j *MongoDBRestoreJob) Timeout() time.Duration { return j.timeout } +// DSN returns DSN required for the Job. +func (j *MongoDBRestoreJob) DSN() string { + return j.dbURL +} + // Run starts Job execution. func (j *MongoDBRestoreJob) Run(ctx context.Context, send Send) error { defer j.jobLogger.sendLog(send, "", true) @@ -121,7 +126,7 @@ func (j *MongoDBRestoreJob) Run(ctx context.Context, send Send) error { configParams := pbmConfigParams{ configFilePath: confFile, forceResync: true, - dbURL: j.dbURL, + dsn: j.dbURL, } if err := pbmConfigure(ctx, j.l, configParams); err != nil { return errors.Wrap(err, "failed to configure pbm") diff --git a/agent/runner/jobs/mysql_backup_job.go b/agent/runner/jobs/mysql_backup_job.go index fd8b613aee..b27e40e5c8 100644 --- a/agent/runner/jobs/mysql_backup_job.go +++ b/agent/runner/jobs/mysql_backup_job.go @@ -76,6 +76,11 @@ func (j *MySQLBackupJob) Timeout() time.Duration { return j.timeout } +// DSN returns DSN for the Job. +func (j *MySQLBackupJob) DSN() string { + return j.connConf.createDBURL().String() +} + // Run starts Job execution. func (j *MySQLBackupJob) Run(ctx context.Context, send Send) error { if err := j.binariesInstalled(); err != nil { diff --git a/agent/runner/jobs/mysql_restore_job.go b/agent/runner/jobs/mysql_restore_job.go index d34e20b802..297ebd55ca 100644 --- a/agent/runner/jobs/mysql_restore_job.go +++ b/agent/runner/jobs/mysql_restore_job.go @@ -82,6 +82,11 @@ func (j *MySQLRestoreJob) Timeout() time.Duration { return j.timeout } +// DSN returns DSN for the Job. +func (j *MySQLRestoreJob) DSN() string { + return "" // not used for MySQL restore +} + // Run executes backup restore steps. func (j *MySQLRestoreJob) Run(ctx context.Context, send Send) error { if j.locationConfig.S3Config == nil { diff --git a/agent/runner/jobs/pbm_helpers.go b/agent/runner/jobs/pbm_helpers.go index 4161c5816a..859c6827ce 100644 --- a/agent/runner/jobs/pbm_helpers.go +++ b/agent/runner/jobs/pbm_helpers.go @@ -173,15 +173,15 @@ type pbmError struct { type pbmConfigParams struct { configFilePath string forceResync bool - dbURL *string + dsn string } -func execPBMCommand(ctx context.Context, dbURL *string, to interface{}, args ...string) error { +func execPBMCommand(ctx context.Context, dsn string, to interface{}, args ...string) error { nCtx, cancel := context.WithTimeout(ctx, cmdTimeout) defer cancel() - args = append(args, "--out=json", "--mongodb-uri="+*dbURL) - cmd := exec.CommandContext(nCtx, pbmBin, args...) // #nosec G204 + args = append(args, "--out=json", "--mongodb-uri="+dsn) //nolint:goconst + cmd := exec.CommandContext(nCtx, pbmBin, args...) // #nosec G204 b, err := cmd.Output() if err != nil { @@ -198,17 +198,17 @@ func execPBMCommand(ctx context.Context, dbURL *string, to interface{}, args ... return json.Unmarshal(b, to) } -func retrieveLogs(ctx context.Context, dbURL *string, event string) ([]pbmLogEntry, error) { +func retrieveLogs(ctx context.Context, dsn string, event string) ([]pbmLogEntry, error) { var logs []pbmLogEntry - if err := execPBMCommand(ctx, dbURL, &logs, "logs", "--event="+event, "--tail=0"); err != nil { + if err := execPBMCommand(ctx, dsn, &logs, "logs", "--event="+event, "--tail=0"); err != nil { return nil, err } return logs, nil } -func waitForPBMNoRunningOperations(ctx context.Context, l logrus.FieldLogger, dbURL *string) error { +func waitForPBMNoRunningOperations(ctx context.Context, l logrus.FieldLogger, dsn string) error { l.Info("Waiting for no running pbm operations.") ticker := time.NewTicker(statusCheckInterval) @@ -217,7 +217,7 @@ func waitForPBMNoRunningOperations(ctx context.Context, l logrus.FieldLogger, db for { select { case <-ticker.C: - status, err := getPBMStatus(ctx, dbURL) + status, err := getPBMStatus(ctx, dsn) if err != nil { return err } @@ -230,8 +230,8 @@ func waitForPBMNoRunningOperations(ctx context.Context, l logrus.FieldLogger, db } } -func isShardedCluster(ctx context.Context, dbURL *string) (bool, error) { - status, err := getPBMStatus(ctx, dbURL) +func isShardedCluster(ctx context.Context, dsn string) (bool, error) { + status, err := getPBMStatus(ctx, dsn) if err != nil { return false, err } @@ -243,15 +243,15 @@ func isShardedCluster(ctx context.Context, dbURL *string) (bool, error) { return false, nil } -func getPBMStatus(ctx context.Context, dbURL *string) (*pbmStatus, error) { +func getPBMStatus(ctx context.Context, dsn string) (*pbmStatus, error) { var status pbmStatus - if err := execPBMCommand(ctx, dbURL, &status, "status"); err != nil { + if err := execPBMCommand(ctx, dsn, &status, "status"); err != nil { return nil, errors.Wrap(err, "pbm status error") } return &status, nil } -func waitForPBMBackup(ctx context.Context, l logrus.FieldLogger, dbURL *string, name string) error { +func waitForPBMBackup(ctx context.Context, l logrus.FieldLogger, dsn string, name string) error { l.Infof("waiting for pbm backup: %s", name) ticker := time.NewTicker(statusCheckInterval) defer ticker.Stop() @@ -262,7 +262,7 @@ func waitForPBMBackup(ctx context.Context, l logrus.FieldLogger, dbURL *string, select { case <-ticker.C: var info describeInfo - err := execPBMCommand(ctx, dbURL, &info, "describe-backup", name) + err := execPBMCommand(ctx, dsn, &info, "describe-backup", name) if err != nil { // for the first couple of seconds after backup process starts describe-backup command may return this error if (strings.HasSuffix(err.Error(), "no such file") || @@ -311,7 +311,7 @@ func findPITRRestore(list []pbmListRestore, restoreInfoPITRTime int64, startedAt return nil } -func findPITRRestoreName(ctx context.Context, dbURL *string, restoreInfo *pbmRestore) (string, error) { +func findPITRRestoreName(ctx context.Context, dsn string, restoreInfo *pbmRestore) (string, error) { restoreInfoPITRTime, err := time.Parse("2006-01-02T15:04:05", restoreInfo.PITR) if err != nil { return "", err @@ -326,7 +326,7 @@ func findPITRRestoreName(ctx context.Context, dbURL *string, restoreInfo *pbmRes case <-ticker.C: checks++ var list []pbmListRestore - if err := execPBMCommand(ctx, dbURL, &list, "list", "--restore"); err != nil { + if err := execPBMCommand(ctx, dsn, &list, "list", "--restore"); err != nil { return "", errors.Wrapf(err, "pbm status error") } entry := findPITRRestore(list, restoreInfoPITRTime.Unix(), restoreInfo.StartedAt) @@ -344,14 +344,14 @@ func findPITRRestoreName(ctx context.Context, dbURL *string, restoreInfo *pbmRes } } -func waitForPBMRestore(ctx context.Context, l logrus.FieldLogger, dbURL *string, restoreInfo *pbmRestore, backupType, confFile string) error { +func waitForPBMRestore(ctx context.Context, l logrus.FieldLogger, dsn string, restoreInfo *pbmRestore, backupType, confFile string) error { l.Infof("Detecting restore name") var name string var err error // @TODO Do like this until https://jira.percona.com/browse/PBM-723 is not done. if restoreInfo.PITR != "" { // TODO add more checks of PBM responses. - name, err = findPITRRestoreName(ctx, dbURL, restoreInfo) + name, err = findPITRRestoreName(ctx, dsn, restoreInfo) if err != nil { return err } @@ -370,9 +370,9 @@ func waitForPBMRestore(ctx context.Context, l logrus.FieldLogger, dbURL *string, case <-ticker.C: var info describeInfo if backupType == "physical" { - err = execPBMCommand(ctx, dbURL, &info, "describe-restore", name, "--config="+confFile) + err = execPBMCommand(ctx, dsn, &info, "describe-restore", name, "--config="+confFile) } else { - err = execPBMCommand(ctx, dbURL, &info, "describe-restore", name) + err = execPBMCommand(ctx, dsn, &info, "describe-restore", name) } if err != nil { if maxRetryCount > 0 { @@ -412,7 +412,7 @@ func pbmConfigure(ctx context.Context, l logrus.FieldLogger, params pbmConfigPar args := []string{ "config", "--out=json", - "--mongodb-uri=" + *params.dbURL, + "--mongodb-uri=" + params.dsn, "--file=" + params.configFilePath, } @@ -425,7 +425,7 @@ func pbmConfigure(ctx context.Context, l logrus.FieldLogger, params pbmConfigPar args := []string{ "config", "--out=json", - "--mongodb-uri=" + *params.dbURL, + "--mongodb-uri=" + params.dsn, "--force-resync", } output, err := exec.CommandContext(nCtx, pbmBin, args...).CombinedOutput() //nolint:gosec @@ -549,8 +549,8 @@ func groupPartlyDoneErrors(info describeInfo) error { } // pbmGetSnapshotTimestamp returns time the backup restores target db to. -func pbmGetSnapshotTimestamp(ctx context.Context, l logrus.FieldLogger, dbURL *string, backupName string) (*time.Time, error) { - snapshots, err := getSnapshots(ctx, l, dbURL) +func pbmGetSnapshotTimestamp(ctx context.Context, l logrus.FieldLogger, dsn string, backupName string) (*time.Time, error) { + snapshots, err := getSnapshots(ctx, l, dsn) if err != nil { return nil, err } @@ -565,7 +565,7 @@ func pbmGetSnapshotTimestamp(ctx context.Context, l logrus.FieldLogger, dbURL *s } // getSnapshots returns all PBM snapshots found in configured location. -func getSnapshots(ctx context.Context, l logrus.FieldLogger, dbURL *string) ([]pbmSnapshot, error) { +func getSnapshots(ctx context.Context, l logrus.FieldLogger, dsn 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() @@ -575,7 +575,7 @@ func getSnapshots(ctx context.Context, l logrus.FieldLogger, dbURL *string) ([]p select { case <-ticker.C: checks++ - status, err := getPBMStatus(ctx, dbURL) + status, err := getPBMStatus(ctx, dsn) if err != nil { return nil, err } diff --git a/agent/runner/jobs/pbm_job_logger.go b/agent/runner/jobs/pbm_job_logger.go index e1a1511018..32b70d58ba 100644 --- a/agent/runner/jobs/pbm_job_logger.go +++ b/agent/runner/jobs/pbm_job_logger.go @@ -34,13 +34,13 @@ const ( ) type pbmJobLogger struct { - dbURL *string + dbURL string jobID string jobType pbmJob logChunkID uint32 } -func newPbmJobLogger(jobID string, jobType pbmJob, mongoURL *string) *pbmJobLogger { +func newPbmJobLogger(jobID string, jobType pbmJob, mongoURL string) *pbmJobLogger { return &pbmJobLogger{ jobID: jobID, jobType: jobType, diff --git a/agent/runner/runner.go b/agent/runner/runner.go index 8b89afe18b..f21d2ff93d 100644 --- a/agent/runner/runner.go +++ b/agent/runner/runner.go @@ -17,8 +17,12 @@ package runner import ( "context" + "crypto/sha256" + "encoding/base64" + "net/url" "runtime/pprof" "sync" + "sync/atomic" "time" "github.com/pkg/errors" @@ -35,7 +39,8 @@ import ( const ( bufferSize = 256 defaultActionTimeout = 10 * time.Second // default timeout for compatibility with an older server - defaultCapacity = 32 + defaultTotalCapacity = 32 // how many concurrent operations are allowed in total + defaultTokenCapacity = 2 // how many concurrent operations on a single resource (usually DB instance) are allowed ) // Runner executes jobs and actions. @@ -48,33 +53,125 @@ type Runner struct { actionsMessages chan agentpb.AgentRequestPayload jobsMessages chan agentpb.AgentResponsePayload - sem *semaphore.Weighted - wg sync.WaitGroup + wg sync.WaitGroup - rw sync.RWMutex - rCancel map[string]context.CancelFunc + // cancels holds cancel functions for running actions and jobs. + cancelsM sync.RWMutex + cancels map[string]context.CancelFunc + + // running holds IDs of running actions and jobs. + runningM sync.RWMutex + running map[string]struct{} + + // gSem is a global semaphore to limit total number of concurrent operations performed by the runner. + gSem *semaphore.Weighted + + // tokenCapacity is a limit of concurrent operations on a single resource, usually database instance. + tokenCapacity uint16 + + // lSems is a map of local semaphores to limit number of concurrent operations on a single database instance. + // Key is a token which is typically is a hash of DSN(only host:port pair), value is a semaphore. + lSemsM sync.Mutex + lSems map[string]*entry +} + +// entry stores local semaphore and its counter. +type entry struct { + count atomic.Int32 + sem *semaphore.Weighted } // New creates new runner. If capacity is 0 then default value is used. -func New(capacity uint16) *Runner { +func New(totalCapacity, tokenCapacity uint16) *Runner { l := logrus.WithField("component", "runner") - if capacity == 0 { - capacity = defaultCapacity + if totalCapacity == 0 { + totalCapacity = defaultTotalCapacity + } + + if tokenCapacity == 0 { + tokenCapacity = defaultTokenCapacity } - l.Infof("Runner capacity set to %d.", capacity) + l.Infof("Runner capacity set to %d, token capacity set to %d", totalCapacity, tokenCapacity) return &Runner{ l: l, actions: make(chan actions.Action, bufferSize), jobs: make(chan jobs.Job, bufferSize), - sem: semaphore.NewWeighted(int64(capacity)), - rCancel: make(map[string]context.CancelFunc), + cancels: make(map[string]context.CancelFunc), + running: make(map[string]struct{}), jobsMessages: make(chan agentpb.AgentResponsePayload), actionsMessages: make(chan agentpb.AgentRequestPayload), + tokenCapacity: tokenCapacity, + gSem: semaphore.NewWeighted(int64(totalCapacity)), + lSems: make(map[string]*entry), + } +} + +// acquire acquires global and local semaphores. +func (r *Runner) acquire(ctx context.Context, token string) error { + if err := r.acquireL(ctx, token); err != nil { + return err + } + + if err := r.gSem.Acquire(ctx, 1); err != nil { + r.releaseL(token) + return err + } + + return nil +} + +// release releases global and local semaphores. +func (r *Runner) release(token string) { + r.gSem.Release(1) + + r.releaseL(token) +} + +// acquireL acquires local semaphore for given token. +func (r *Runner) acquireL(ctx context.Context, token string) error { + if token != "" { + r.lSemsM.Lock() + + e, ok := r.lSems[token] + if !ok { + e = &entry{sem: semaphore.NewWeighted(int64(r.tokenCapacity))} + r.lSems[token] = e + } + r.lSemsM.Unlock() + + if err := e.sem.Acquire(ctx, 1); err != nil { + return err + } + e.count.Add(1) + } + + return nil +} + +// releaseL releases local semaphore for given token. +func (r *Runner) releaseL(token string) { + if token != "" { + r.lSemsM.Lock() + + if e, ok := r.lSems[token]; ok { + e.sem.Release(1) + if v := e.count.Add(-1); v == 0 { + delete(r.lSems, token) + } + } + r.lSemsM.Unlock() } } +// lSemsLen returns number of local semaphores in use. +func (r *Runner) lSemsLen() int { + r.lSemsM.Lock() + defer r.lSemsM.Unlock() + return len(r.lSems) +} + // Run starts jobs execution loop. It reads jobs from the channel and starts them in separate goroutines. func (r *Runner) Run(ctx context.Context) { for { @@ -124,65 +221,100 @@ func (r *Runner) ActionsResults() <-chan agentpb.AgentRequestPayload { // Stop stops running Action or Job. func (r *Runner) Stop(id string) { - r.rw.RLock() - defer r.rw.RUnlock() + r.cancelsM.RLock() + defer r.cancelsM.RUnlock() - // Job removes itself from rCancel map. So here we only invoke cancel. - if cancel, ok := r.rCancel[id]; ok { + // Job removes itself from cancels map. So here we only invoke cancel. + if cancel, ok := r.cancels[id]; ok { cancel() } } // IsRunning returns true if Action or Job with given ID still running. func (r *Runner) IsRunning(id string) bool { - r.rw.RLock() - defer r.rw.RUnlock() - _, ok := r.rCancel[id] + r.runningM.RLock() + defer r.runningM.RUnlock() + _, ok := r.running[id] return ok } +// createTokenFromDSN returns unique database instance id (token) calculated as a hash from host:port part of the DSN. +func createTokenFromDSN(dsn string) (string, error) { + if dsn == "" { + return "", nil + } + u, err := url.Parse(dsn) + if err != nil { + return "", errors.Wrap(err, "failed to parse DSN") + } + + host := u.Host + // If host is empty, use the whole DSN for hash calculation. + // It can give worse granularity, but it's better than nothing. + if host == "" { + host = dsn + } + + h := sha256.New() + h.Write([]byte(host)) + return base64.StdEncoding.EncodeToString(h.Sum(nil)), nil +} + func (r *Runner) handleJob(ctx context.Context, job jobs.Job) { jobID, jobType := job.ID(), job.Type() l := r.l.WithFields(logrus.Fields{"id": jobID, "type": jobType}) - if err := r.sem.Acquire(ctx, 1); err != nil { - l.Errorf("Failed to acquire token for a job: %v", err) - r.sendJobsMessage(&agentpb.JobResult{ - JobId: job.ID(), - Timestamp: timestamppb.Now(), - Result: &agentpb.JobResult_Error_{ - Error: &agentpb.JobResult_Error{ - Message: err.Error(), - }, - }, - }) - return + token, err := createTokenFromDSN(job.DSN()) + if err != nil { + r.l.Warnf("Failed to get token for job: %v", err) } - var nCtx context.Context - var cancel context.CancelFunc - if timeout := job.Timeout(); timeout != 0 { - nCtx, cancel = context.WithTimeout(ctx, timeout) - } else { - nCtx, cancel = context.WithCancel(ctx) - } + ctx, cancel := context.WithCancel(ctx) r.addCancel(jobID, cancel) r.wg.Add(1) run := func(ctx context.Context) { - l.Infof("Job started.") - defer func(start time.Time) { l.WithField("duration", time.Since(start).String()).Info("Job finished.") }(time.Now()) - defer r.sem.Release(1) defer r.wg.Done() defer cancel() defer r.removeCancel(jobID) - err := job.Run(ctx, r.sendJobsMessage) + l.Debug("Acquiring tokens for a job.") + if err := r.acquire(ctx, token); err != nil { + l.Errorf("Failed to acquire token for a job: %v", err) + r.sendJobsMessage(&agentpb.JobResult{ + JobId: job.ID(), + Timestamp: timestamppb.Now(), + Result: &agentpb.JobResult_Error_{ + Error: &agentpb.JobResult_Error{ + Message: err.Error(), + }, + }, + }) + return + } + defer r.release(token) + + var nCtx context.Context + var nCancel context.CancelFunc + if timeout := job.Timeout(); timeout != 0 { + nCtx, nCancel = context.WithTimeout(ctx, timeout) + defer nCancel() + } else { + // If timeout is not provided then use parent context + nCtx = ctx + } + + // Mark job as running. + r.addStarted(jobID) + defer r.removeStarted(jobID) + l.Info("Job started.") + + err := job.Run(nCtx, r.sendJobsMessage) if err != nil { r.sendJobsMessage(&agentpb.JobResult{ JobId: job.ID(), @@ -197,44 +329,56 @@ func (r *Runner) handleJob(ctx context.Context, job jobs.Job) { } } - go pprof.Do(nCtx, pprof.Labels("jobID", jobID, "type", string(jobType)), run) + go pprof.Do(ctx, pprof.Labels("jobID", jobID, "type", string(jobType)), run) } func (r *Runner) handleAction(ctx context.Context, action actions.Action) { actionID, actionType := action.ID(), action.Type() l := r.l.WithFields(logrus.Fields{"id": actionID, "type": actionType}) - if err := r.sem.Acquire(ctx, 1); err != nil { - l.Errorf("Failed to acquire token for an action: %v", err) - r.sendActionsMessage(&agentpb.ActionResultRequest{ - ActionId: actionID, - Done: true, - Error: err.Error(), - }) - return - } - - var timeout time.Duration - if timeout = action.Timeout(); timeout == 0 { - timeout = defaultActionTimeout + instanceID, err := createTokenFromDSN(action.DSN()) + if err != nil { + r.l.Warnf("Failed to get instance ID for action: %v", err) } - nCtx, cancel := context.WithTimeout(ctx, timeout) + ctx, cancel := context.WithCancel(ctx) r.addCancel(actionID, cancel) r.wg.Add(1) - run := func(_ context.Context) { - l.Infof("Action started.") - + run := func(ctx context.Context) { defer func(start time.Time) { l.WithField("duration", time.Since(start).String()).Info("Action finished.") }(time.Now()) - defer r.sem.Release(1) defer r.wg.Done() defer cancel() defer r.removeCancel(actionID) + l.Debug("Acquiring tokens for an action.") + if err := r.acquire(ctx, instanceID); err != nil { + l.Errorf("Failed to acquire token for an action: %v", err) + r.sendActionsMessage(&agentpb.ActionResultRequest{ + ActionId: actionID, + Done: true, + Error: err.Error(), + }) + return + } + defer r.release(instanceID) + + var timeout time.Duration + if timeout = action.Timeout(); timeout == 0 { + timeout = defaultActionTimeout + } + + nCtx, nCancel := context.WithTimeout(ctx, timeout) + defer nCancel() + + // Mark action as running. + r.addStarted(actionID) + defer r.removeStarted(actionID) + l.Infof("Action started.") + output, err := action.Run(nCtx) var errMsg string if err != nil { @@ -249,7 +393,7 @@ func (r *Runner) handleAction(ctx context.Context, action actions.Action) { Error: errMsg, }) } - go pprof.Do(nCtx, pprof.Labels("actionID", actionID, "type", actionType), run) + go pprof.Do(ctx, pprof.Labels("actionID", actionID, "type", actionType), run) } func (r *Runner) sendJobsMessage(payload agentpb.AgentResponsePayload) { @@ -261,13 +405,25 @@ func (r *Runner) sendActionsMessage(payload agentpb.AgentRequestPayload) { } func (r *Runner) addCancel(jobID string, cancel context.CancelFunc) { - r.rw.Lock() - defer r.rw.Unlock() - r.rCancel[jobID] = cancel + r.cancelsM.Lock() + defer r.cancelsM.Unlock() + r.cancels[jobID] = cancel } func (r *Runner) removeCancel(jobID string) { - r.rw.Lock() - defer r.rw.Unlock() - delete(r.rCancel, jobID) + r.cancelsM.Lock() + defer r.cancelsM.Unlock() + delete(r.cancels, jobID) +} + +func (r *Runner) addStarted(actionID string) { + r.runningM.Lock() + defer r.runningM.Unlock() + r.running[actionID] = struct{}{} +} + +func (r *Runner) removeStarted(actionID string) { + r.runningM.Lock() + defer r.runningM.Unlock() + delete(r.running, actionID) } diff --git a/agent/runner/runner_test.go b/agent/runner/runner_test.go index a98f160164..76ba0ad887 100644 --- a/agent/runner/runner_test.go +++ b/agent/runner/runner_test.go @@ -42,7 +42,7 @@ func assertActionResults(t *testing.T, cr *Runner, expected ...*agentpb.ActionRe func TestConcurrentRunnerRun(t *testing.T) { t.Parallel() - cr := New(0) + cr := New(0, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -62,29 +62,33 @@ func TestConcurrentRunnerRun(t *testing.T) { } assertActionResults(t, cr, expected...) cr.wg.Wait() - assert.Empty(t, cr.rCancel) + assert.Empty(t, cr.cancels) } func TestCapacityLimit(t *testing.T) { t.Parallel() - cr := New(2) + cr := New(2, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() go cr.Run(ctx) j1 := testJob{id: "test-1", timeout: time.Second} - j2 := testJob{id: "test-2", timeout: 2 * time.Second} + j2 := testJob{id: "test-2", timeout: time.Second} j3 := testJob{id: "test-3", timeout: 2 * time.Second} - j4 := testJob{id: "test-4", timeout: time.Second} + j4 := testJob{id: "test-4", timeout: 2 * time.Second} require.NoError(t, cr.StartJob(j1)) require.NoError(t, cr.StartJob(j2)) + + // Let first and second jobs start + time.Sleep(200 * time.Millisecond) + require.NoError(t, cr.StartJob(j3)) require.NoError(t, cr.StartJob(j4)) - // Let first jobs start - time.Sleep(500 * time.Millisecond) + // Let third and forth jobs to reach semaphores + time.Sleep(300 * time.Millisecond) // First two jobs are started assert.True(t, cr.IsRunning(j1.ID())) @@ -94,23 +98,15 @@ func TestCapacityLimit(t *testing.T) { time.Sleep(time.Second) - // After second first job terminated and third job started - assert.False(t, cr.IsRunning(j1.ID())) - assert.True(t, cr.IsRunning(j2.ID())) - assert.True(t, cr.IsRunning(j3.ID())) - assert.False(t, cr.IsRunning(j4.ID())) - - time.Sleep(time.Second) - // After one more second job terminated and third started assert.False(t, cr.IsRunning(j1.ID())) assert.False(t, cr.IsRunning(j2.ID())) assert.True(t, cr.IsRunning(j3.ID())) assert.True(t, cr.IsRunning(j4.ID())) - time.Sleep(time.Second) + time.Sleep(2 * time.Second) - // After another second all jobs are terminated + // After two seconds all jobs are terminated assert.False(t, cr.IsRunning(j1.ID())) assert.False(t, cr.IsRunning(j2.ID())) assert.False(t, cr.IsRunning(j3.ID())) @@ -121,28 +117,127 @@ func TestDefaultCapacityLimit(t *testing.T) { t.Parallel() // Use default capacity - cr := New(0) + cr := New(0, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() go cr.Run(ctx) - totalJobs := 2 * defaultCapacity + totalJobs := 2 * defaultTotalCapacity for i := 0; i < totalJobs; i++ { require.NoError(t, cr.StartJob(testJob{id: fmt.Sprintf("test-%d", i), timeout: time.Second})) } - // Let first jobs start + // Let jobs to start time.Sleep(500 * time.Millisecond) + var running int for i := 0; i < totalJobs; i++ { // Check that running jobs amount is not exceeded default capacity. - assert.Equal(t, i < defaultCapacity, cr.IsRunning(fmt.Sprintf("test-%d", i))) + if cr.IsRunning(fmt.Sprintf("test-%d", i)) { + running++ + } } + + assert.Equal(t, defaultTotalCapacity, running) +} + +func TestPerDBInstanceLimit(t *testing.T) { + t.Parallel() + + cr := New(10, 1) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go cr.Run(ctx) + + db1j1 := testJob{id: "test-1", timeout: time.Second, dsn: "postgresql://db1"} + db1j2 := testJob{id: "test-2", timeout: time.Second, dsn: "postgresql://db1"} + db1j3 := testJob{id: "test-3", timeout: time.Second, dsn: "postgresql://db1"} + db2j1 := testJob{id: "test-4", timeout: time.Second, dsn: "postgresql://db2"} + db2j2 := testJob{id: "test-5", timeout: time.Second, dsn: "postgresql://db2"} + db2j3 := testJob{id: "test-6", timeout: time.Second, dsn: "postgresql://db2"} + + require.NoError(t, cr.StartJob(db1j1)) + require.NoError(t, cr.StartJob(db2j1)) + + // Let jobs to start + time.Sleep(200 * time.Millisecond) + + require.NoError(t, cr.StartJob(db1j2)) + require.NoError(t, cr.StartJob(db2j2)) + require.NoError(t, cr.StartJob(db1j3)) + require.NoError(t, cr.StartJob(db2j3)) + + // Let rest jobs to reach semaphores + time.Sleep(300 * time.Millisecond) + + assert.True(t, cr.IsRunning(db1j1.ID())) + assert.True(t, cr.IsRunning(db2j1.ID())) + assert.False(t, cr.IsRunning(db1j2.ID())) + assert.False(t, cr.IsRunning(db2j2.ID())) + assert.False(t, cr.IsRunning(db1j3.ID())) + assert.False(t, cr.IsRunning(db2j3.ID())) + + // Over time all jobs are terminated + time.Sleep(2 * time.Second) + + assert.False(t, cr.IsRunning(db1j1.ID())) + assert.False(t, cr.IsRunning(db2j1.ID())) + assert.False(t, cr.IsRunning(db1j2.ID())) + assert.False(t, cr.IsRunning(db2j2.ID())) + assert.False(t, cr.IsRunning(db1j3.ID())) + assert.False(t, cr.IsRunning(db2j3.ID())) +} + +func TestDefaultPerDBInstanceLimit(t *testing.T) { + t.Parallel() + + cr := New(10, 0) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go cr.Run(ctx) + + db1j1 := testJob{id: "test-1", timeout: time.Second, dsn: "postgresql://db1"} + db1j2 := testJob{id: "test-2", timeout: time.Second, dsn: "postgresql://db1"} + db1j3 := testJob{id: "test-3", timeout: time.Second, dsn: "postgresql://db1"} + db2j1 := testJob{id: "test-4", timeout: time.Second, dsn: "postgresql://db2"} + db2j2 := testJob{id: "test-5", timeout: time.Second, dsn: "postgresql://db2"} + db2j3 := testJob{id: "test-6", timeout: time.Second, dsn: "postgresql://db2"} + + require.NoError(t, cr.StartJob(db1j1)) + require.NoError(t, cr.StartJob(db2j1)) + require.NoError(t, cr.StartJob(db1j2)) + require.NoError(t, cr.StartJob(db2j2)) + + // Let jobs to start + time.Sleep(200 * time.Millisecond) + + require.NoError(t, cr.StartJob(db1j3)) + require.NoError(t, cr.StartJob(db2j3)) + + // Let rest jobs to reach semaphores + time.Sleep(300 * time.Millisecond) + + assert.True(t, cr.IsRunning(db1j1.ID())) + assert.True(t, cr.IsRunning(db2j1.ID())) + assert.True(t, cr.IsRunning(db1j2.ID())) + assert.True(t, cr.IsRunning(db2j2.ID())) + assert.False(t, cr.IsRunning(db1j3.ID())) + assert.False(t, cr.IsRunning(db2j3.ID())) + + // Over time all jobs are terminated + time.Sleep(2 * time.Second) + + assert.False(t, cr.IsRunning(db1j1.ID())) + assert.False(t, cr.IsRunning(db2j1.ID())) + assert.False(t, cr.IsRunning(db1j2.ID())) + assert.False(t, cr.IsRunning(db2j2.ID())) + assert.False(t, cr.IsRunning(db1j3.ID())) + assert.False(t, cr.IsRunning(db2j3.ID())) } func TestConcurrentRunnerTimeout(t *testing.T) { t.Parallel() - cr := New(0) + cr := New(0, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -163,12 +258,12 @@ func TestConcurrentRunnerTimeout(t *testing.T) { } assertActionResults(t, cr, expected...) cr.wg.Wait() - assert.Empty(t, cr.rCancel) + assert.Empty(t, cr.cancels) } func TestConcurrentRunnerStop(t *testing.T) { t.Parallel() - cr := New(0) + cr := New(0, 0) ctx, cancel := context.WithCancel(context.Background()) defer cancel() @@ -194,12 +289,12 @@ func TestConcurrentRunnerStop(t *testing.T) { } assertActionResults(t, cr, expected...) cr.wg.Wait() - assert.Empty(t, cr.rCancel) + assert.Empty(t, cr.cancels) } func TestConcurrentRunnerCancel(t *testing.T) { t.Parallel() - cr := New(0) + cr := New(0, 0) ctx, cancel := context.WithCancel(context.Background()) go cr.Run(ctx) @@ -231,12 +326,46 @@ func TestConcurrentRunnerCancel(t *testing.T) { assert.Contains(t, []string{"signal: killed", context.Canceled.Error()}, expected[0].(*agentpb.ActionResultRequest).Error) assert.True(t, expected[1].(*agentpb.ActionResultRequest).Done) cr.wg.Wait() - assert.Empty(t, cr.rCancel) + assert.Empty(t, cr.cancels) +} + +func TestSemaphoresReleasing(t *testing.T) { + t.Parallel() + cr := New(1, 1) + err := cr.gSem.Acquire(context.TODO(), 1) // Acquire global semaphore to block all jobs + require.NoError(t, err) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + go cr.Run(ctx) + + j := testJob{id: "test-1", timeout: time.Second, dsn: "test"} + + require.NoError(t, cr.StartJob(j)) + + // Let job to start + time.Sleep(200 * time.Millisecond) + + // Check that job is started and local semaphore was acquired + assert.Equal(t, cr.lSemsLen(), 1) + + // Check that job is not running, because it's waiting for global semaphore to be acquired + assert.False(t, cr.IsRunning(j.ID())) + + // Cancel context to stop job + cancel() + + // Let job to start and release resources + time.Sleep(200 * time.Millisecond) + + // Check that local samaphore was released + assert.Equal(t, cr.lSemsLen(), 0) } type testJob struct { id string timeout time.Duration + dsn string } func (t testJob) ID() string { @@ -251,6 +380,10 @@ func (t testJob) Timeout() time.Duration { return t.timeout } +func (t testJob) DSN() string { + return t.dsn +} + func (t testJob) Run(ctx context.Context, send jobs.Send) error { //nolint:revive <-ctx.Done() return nil From 4bf51d1561d5bd0c271ab815f193b2043679d420 Mon Sep 17 00:00:00 2001 From: Artem Gavrilov Date: Mon, 27 May 2024 12:37:55 +0200 Subject: [PATCH 32/44] PMM-12895 Add metrics resolutions configuration to agents (#2882) * PMM-12895 Add metrics resolutions configuration to agents * PMM-12895 Fix linter warnings * Update api-tests/inventory/agents_test.go * PMM-12895 Add tests * PMM-12895 Fix linter * PMM-12895 Fix linter * PMM-12895 Fix API tests * PMM-12895 Revert breaking changes * Revert "PMM-12895 Fix API tests" This reverts commit 54dda0b436a19a86563189818608e8a2d05526ea. * PMM-12895 Don't retrun empty metrics resoutions object --- api-tests/inventory/agents_test.go | 160 + api/common/metrics_resolutions.pb.go | 188 + api/common/metrics_resolutions.pb.validate.go | 225 + api/common/metrics_resolutions.proto | 15 + api/inventorypb/agents.pb.go | 4620 +++++++++-------- api/inventorypb/agents.pb.validate.go | 261 + api/inventorypb/agents.proto | 19 + .../add_azure_database_exporter_responses.go | 95 +- .../agents/add_external_exporter_responses.go | 100 +- .../agents/add_mongo_db_exporter_responses.go | 95 +- .../add_my_s_q_ld_exporter_responses.go | 95 +- .../agents/add_node_exporter_responses.go | 95 +- .../agents/add_postgres_exporter_responses.go | 95 +- .../add_proxy_sql_exporter_responses.go | 95 +- .../agents/add_rds_exporter_responses.go | 95 +- ...hange_azure_database_exporter_responses.go | 195 +- .../change_external_exporter_responses.go | 200 +- .../change_mongo_db_exporter_responses.go | 195 +- .../change_my_s_q_ld_exporter_responses.go | 195 +- .../agents/change_node_exporter_responses.go | 195 +- .../change_postgres_exporter_responses.go | 195 +- .../change_proxy_sql_exporter_responses.go | 195 +- ...e_qan_mongo_db_profiler_agent_responses.go | 100 +- ..._qan_my_sql_perf_schema_agent_responses.go | 100 +- ...ange_qan_my_sql_slowlog_agent_responses.go | 100 +- ...gre_sql_pg_stat_monitor_agent_responses.go | 100 +- ...stgre_sql_pg_statements_agent_responses.go | 100 +- .../agents/change_rds_exporter_responses.go | 195 +- .../json/client/agents/get_agent_responses.go | 765 ++- .../client/agents/list_agents_responses.go | 765 ++- api/inventorypb/json/inventorypb.json | 990 ++++ .../client/external/add_external_responses.go | 100 +- .../client/ha_proxy/add_ha_proxy_responses.go | 100 +- .../client/mongo_db/add_mongo_db_responses.go | 95 +- .../client/my_sql/add_my_sql_responses.go | 95 +- .../postgre_sql/add_postgre_sql_responses.go | 95 +- .../proxy_sql/add_proxy_sql_responses.go | 95 +- .../json/client/rds/add_rds_responses.go | 285 +- api/managementpb/json/managementpb.json | 198 + api/swagger/swagger-dev.json | 1206 ++++- api/swagger/swagger.json | 1206 ++++- managed/models/agent_helpers.go | 28 + managed/models/agent_helpers_test.go | 10 + managed/models/agent_model.go | 9 +- managed/models/agent_model_reform.go | 17 +- managed/models/database.go | 3 + managed/models/settings.go | 7 + managed/services/converters.go | 28 + managed/services/inventory/agents.go | 14 + managed/services/inventory/agents_test.go | 9 + .../services/victoriametrics/prometheus.go | 120 +- .../victoriametrics/scrape_configs.go | 64 +- .../victoriametrics/scrape_configs_test.go | 167 +- .../victoriametrics/victoriametrics.go | 16 +- 54 files changed, 12320 insertions(+), 2485 deletions(-) create mode 100644 api/common/metrics_resolutions.pb.go create mode 100644 api/common/metrics_resolutions.pb.validate.go create mode 100644 api/common/metrics_resolutions.proto diff --git a/api-tests/inventory/agents_test.go b/api-tests/inventory/agents_test.go index 5c785b77e5..a8f1a6350b 100644 --- a/api-tests/inventory/agents_test.go +++ b/api-tests/inventory/agents_test.go @@ -1198,3 +1198,163 @@ func TestPGStatMonitorQanAgent(t *testing.T) { } }) } + +func TestMetricsResolutionsChange(t *testing.T) { + t.Parallel() + + genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID + require.NotEmpty(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) + + node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) + nodeID := node.Remote.NodeID + defer pmmapitests.RemoveNodes(t, nodeID) + + service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ + NodeID: genericNodeID, + Address: "localhost", + Port: 5432, + ServiceName: pmmapitests.TestString(t, "PostgreSQL Service for PostgresExporter test"), + }) + serviceID := service.Postgresql.ServiceID + defer pmmapitests.RemoveServices(t, serviceID) + + pmmAgent := pmmapitests.AddPMMAgent(t, nodeID) + pmmAgentID := pmmAgent.PMMAgent.AgentID + defer pmmapitests.RemoveAgents(t, pmmAgentID) + + PostgresExporter := addPostgresExporter(t, agents.AddPostgresExporterBody{ + ServiceID: serviceID, + Username: "username", + Password: "password", + PMMAgentID: pmmAgentID, + CustomLabels: map[string]string{ + "custom_label_postgres_exporter": "postgres_exporter", + }, + + SkipConnectionCheck: true, + }) + agentID := PostgresExporter.PostgresExporter.AgentID + defer pmmapitests.RemoveAgents(t, agentID) + + getAgentRes, err := client.Default.Agents.GetAgent(&agents.GetAgentParams{ + Body: agents.GetAgentBody{AgentID: agentID}, + Context: pmmapitests.Context, + }) + require.NoError(t, err) + assert.Equal(t, &agents.GetAgentOK{ + Payload: &agents.GetAgentOKBody{ + PostgresExporter: &agents.GetAgentOKBodyPostgresExporter{ + AgentID: agentID, + ServiceID: serviceID, + Username: "username", + PMMAgentID: pmmAgentID, + CustomLabels: map[string]string{ + "custom_label_postgres_exporter": "postgres_exporter", + }, + Status: &AgentStatusUnknown, + }, + }, + }, getAgentRes) + + // Change metrics resolutions + changePostgresExporterOK, err := client.Default.Agents.ChangePostgresExporter(&agents.ChangePostgresExporterParams{ + Body: agents.ChangePostgresExporterBody{ + AgentID: agentID, + Common: &agents.ChangePostgresExporterParamsBodyCommon{ + MetricsResolutions: &agents.ChangePostgresExporterParamsBodyCommonMetricsResolutions{ + Hr: "600s", + Mr: "300s", + Lr: "100s", + }, + }, + }, + Context: pmmapitests.Context, + }) + require.NoError(t, err) + assert.Equal(t, &agents.ChangePostgresExporterOK{ + Payload: &agents.ChangePostgresExporterOKBody{ + PostgresExporter: &agents.ChangePostgresExporterOKBodyPostgresExporter{ + AgentID: agentID, + ServiceID: serviceID, + Username: "username", + PMMAgentID: pmmAgentID, + CustomLabels: map[string]string{ + "custom_label_postgres_exporter": "postgres_exporter", + }, + Status: &AgentStatusUnknown, + MetricsResolutions: &agents.ChangePostgresExporterOKBodyPostgresExporterMetricsResolutions{ + Hr: "600s", + Mr: "300s", + Lr: "100s", + }, + }, + }, + }, changePostgresExporterOK) + + // Reset part of metrics resolutions + changePostgresExporterOK, err = client.Default.Agents.ChangePostgresExporter(&agents.ChangePostgresExporterParams{ + Body: agents.ChangePostgresExporterBody{ + AgentID: agentID, + Common: &agents.ChangePostgresExporterParamsBodyCommon{ + MetricsResolutions: &agents.ChangePostgresExporterParamsBodyCommonMetricsResolutions{ + Hr: "600s", + Mr: "300s", + Lr: "0s", + }, + }, + }, + Context: pmmapitests.Context, + }) + require.NoError(t, err) + assert.Equal(t, &agents.ChangePostgresExporterOK{ + Payload: &agents.ChangePostgresExporterOKBody{ + PostgresExporter: &agents.ChangePostgresExporterOKBodyPostgresExporter{ + AgentID: agentID, + ServiceID: serviceID, + Username: "username", + PMMAgentID: pmmAgentID, + CustomLabels: map[string]string{ + "custom_label_postgres_exporter": "postgres_exporter", + }, + Status: &AgentStatusUnknown, + MetricsResolutions: &agents.ChangePostgresExporterOKBodyPostgresExporterMetricsResolutions{ + Hr: "600s", + Mr: "300s", + }, + }, + }, + }, changePostgresExporterOK) + + // Change part of metrics resolutions + changePostgresExporterOK, err = client.Default.Agents.ChangePostgresExporter(&agents.ChangePostgresExporterParams{ + Body: agents.ChangePostgresExporterBody{ + AgentID: agentID, + Common: &agents.ChangePostgresExporterParamsBodyCommon{ + MetricsResolutions: &agents.ChangePostgresExporterParamsBodyCommonMetricsResolutions{ + Hr: "500s", + }, + }, + }, + Context: pmmapitests.Context, + }) + require.NoError(t, err) + assert.Equal(t, &agents.ChangePostgresExporterOK{ + Payload: &agents.ChangePostgresExporterOKBody{ + PostgresExporter: &agents.ChangePostgresExporterOKBodyPostgresExporter{ + AgentID: agentID, + ServiceID: serviceID, + Username: "username", + PMMAgentID: pmmAgentID, + CustomLabels: map[string]string{ + "custom_label_postgres_exporter": "postgres_exporter", + }, + Status: &AgentStatusUnknown, + MetricsResolutions: &agents.ChangePostgresExporterOKBodyPostgresExporterMetricsResolutions{ + Hr: "500s", + Mr: "300s", + }, + }, + }, + }, changePostgresExporterOK) +} diff --git a/api/common/metrics_resolutions.pb.go b/api/common/metrics_resolutions.pb.go new file mode 100644 index 0000000000..a17152bf1e --- /dev/null +++ b/api/common/metrics_resolutions.pb.go @@ -0,0 +1,188 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.32.0 +// protoc (unknown) +// source: common/metrics_resolutions.proto + +package common + +import ( + reflect "reflect" + sync "sync" + + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// MetricsResolutions represents Prometheus exporters metrics resolutions. +type MetricsResolutions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr *durationpb.Duration `protobuf:"bytes,1,opt,name=hr,proto3" json:"hr,omitempty"` + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr *durationpb.Duration `protobuf:"bytes,2,opt,name=mr,proto3" json:"mr,omitempty"` + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr *durationpb.Duration `protobuf:"bytes,3,opt,name=lr,proto3" json:"lr,omitempty"` +} + +func (x *MetricsResolutions) Reset() { + *x = MetricsResolutions{} + if protoimpl.UnsafeEnabled { + mi := &file_common_metrics_resolutions_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MetricsResolutions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MetricsResolutions) ProtoMessage() {} + +func (x *MetricsResolutions) ProtoReflect() protoreflect.Message { + mi := &file_common_metrics_resolutions_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MetricsResolutions.ProtoReflect.Descriptor instead. +func (*MetricsResolutions) Descriptor() ([]byte, []int) { + return file_common_metrics_resolutions_proto_rawDescGZIP(), []int{0} +} + +func (x *MetricsResolutions) GetHr() *durationpb.Duration { + if x != nil { + return x.Hr + } + return nil +} + +func (x *MetricsResolutions) GetMr() *durationpb.Duration { + if x != nil { + return x.Mr + } + return nil +} + +func (x *MetricsResolutions) GetLr() *durationpb.Duration { + if x != nil { + return x.Lr + } + return nil +} + +var File_common_metrics_resolutions_proto protoreflect.FileDescriptor + +var file_common_metrics_resolutions_proto_rawDesc = []byte{ + 0x0a, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x12, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x95, 0x01, 0x0a, 0x12, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x29, 0x0a, 0x02, 0x68, 0x72, 0x18, 0x01, 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, 0x02, 0x68, 0x72, 0x12, 0x29, 0x0a, 0x02, + 0x6d, 0x72, 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, 0x02, 0x6d, 0x72, 0x12, 0x29, 0x0a, 0x02, 0x6c, 0x72, 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, 0x02, + 0x6c, 0x72, 0x42, 0x80, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x42, 0x17, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x21, 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, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0xa2, + 0x02, 0x03, 0x43, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0xca, 0x02, + 0x06, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0xe2, 0x02, 0x12, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x06, 0x43, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_common_metrics_resolutions_proto_rawDescOnce sync.Once + file_common_metrics_resolutions_proto_rawDescData = file_common_metrics_resolutions_proto_rawDesc +) + +func file_common_metrics_resolutions_proto_rawDescGZIP() []byte { + file_common_metrics_resolutions_proto_rawDescOnce.Do(func() { + file_common_metrics_resolutions_proto_rawDescData = protoimpl.X.CompressGZIP(file_common_metrics_resolutions_proto_rawDescData) + }) + return file_common_metrics_resolutions_proto_rawDescData +} + +var ( + file_common_metrics_resolutions_proto_msgTypes = make([]protoimpl.MessageInfo, 1) + file_common_metrics_resolutions_proto_goTypes = []interface{}{ + (*MetricsResolutions)(nil), // 0: common.MetricsResolutions + (*durationpb.Duration)(nil), // 1: google.protobuf.Duration + } +) + +var file_common_metrics_resolutions_proto_depIdxs = []int32{ + 1, // 0: common.MetricsResolutions.hr:type_name -> google.protobuf.Duration + 1, // 1: common.MetricsResolutions.mr:type_name -> google.protobuf.Duration + 1, // 2: common.MetricsResolutions.lr:type_name -> google.protobuf.Duration + 3, // [3:3] is the sub-list for method output_type + 3, // [3:3] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name +} + +func init() { file_common_metrics_resolutions_proto_init() } +func file_common_metrics_resolutions_proto_init() { + if File_common_metrics_resolutions_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_common_metrics_resolutions_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MetricsResolutions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_common_metrics_resolutions_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_common_metrics_resolutions_proto_goTypes, + DependencyIndexes: file_common_metrics_resolutions_proto_depIdxs, + MessageInfos: file_common_metrics_resolutions_proto_msgTypes, + }.Build() + File_common_metrics_resolutions_proto = out.File + file_common_metrics_resolutions_proto_rawDesc = nil + file_common_metrics_resolutions_proto_goTypes = nil + file_common_metrics_resolutions_proto_depIdxs = nil +} diff --git a/api/common/metrics_resolutions.pb.validate.go b/api/common/metrics_resolutions.pb.validate.go new file mode 100644 index 0000000000..3f17783cdc --- /dev/null +++ b/api/common/metrics_resolutions.pb.validate.go @@ -0,0 +1,225 @@ +// Code generated by protoc-gen-validate. DO NOT EDIT. +// source: common/metrics_resolutions.proto + +package common + +import ( + "bytes" + "errors" + "fmt" + "net" + "net/mail" + "net/url" + "regexp" + "sort" + "strings" + "time" + "unicode/utf8" + + "google.golang.org/protobuf/types/known/anypb" +) + +// ensure the imports are used +var ( + _ = bytes.MinRead + _ = errors.New("") + _ = fmt.Print + _ = utf8.UTFMax + _ = (*regexp.Regexp)(nil) + _ = (*strings.Reader)(nil) + _ = net.IPv4len + _ = time.Duration(0) + _ = (*url.URL)(nil) + _ = (*mail.Address)(nil) + _ = anypb.Any{} + _ = sort.Sort +) + +// Validate checks the field values on MetricsResolutions with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *MetricsResolutions) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on MetricsResolutions with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// MetricsResolutionsMultiError, or nil if none found. +func (m *MetricsResolutions) ValidateAll() error { + return m.validate(true) +} + +func (m *MetricsResolutions) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if all { + switch v := interface{}(m.GetHr()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsResolutionsValidationError{ + field: "Hr", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsResolutionsValidationError{ + field: "Hr", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetHr()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsResolutionsValidationError{ + field: "Hr", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetMr()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsResolutionsValidationError{ + field: "Mr", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsResolutionsValidationError{ + field: "Mr", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMr()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsResolutionsValidationError{ + field: "Mr", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetLr()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MetricsResolutionsValidationError{ + field: "Lr", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MetricsResolutionsValidationError{ + field: "Lr", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetLr()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MetricsResolutionsValidationError{ + field: "Lr", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return MetricsResolutionsMultiError(errors) + } + + return nil +} + +// MetricsResolutionsMultiError is an error wrapping multiple validation errors +// returned by MetricsResolutions.ValidateAll() if the designated constraints +// aren't met. +type MetricsResolutionsMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m MetricsResolutionsMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m MetricsResolutionsMultiError) AllErrors() []error { return m } + +// MetricsResolutionsValidationError is the validation error returned by +// MetricsResolutions.Validate if the designated constraints aren't met. +type MetricsResolutionsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e MetricsResolutionsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e MetricsResolutionsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e MetricsResolutionsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e MetricsResolutionsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e MetricsResolutionsValidationError) ErrorName() string { + return "MetricsResolutionsValidationError" +} + +// Error satisfies the builtin error interface +func (e MetricsResolutionsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sMetricsResolutions.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = MetricsResolutionsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = MetricsResolutionsValidationError{} diff --git a/api/common/metrics_resolutions.proto b/api/common/metrics_resolutions.proto new file mode 100644 index 0000000000..4c77fd58ff --- /dev/null +++ b/api/common/metrics_resolutions.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +package common; + +import "google/protobuf/duration.proto"; + +// MetricsResolutions represents Prometheus exporters metrics resolutions. +message MetricsResolutions { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + google.protobuf.Duration hr = 1; + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + google.protobuf.Duration mr = 2; + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + google.protobuf.Duration lr = 3; +} diff --git a/api/inventorypb/agents.pb.go b/api/inventorypb/agents.pb.go index d29379c84a..301d6f469f 100644 --- a/api/inventorypb/agents.pb.go +++ b/api/inventorypb/agents.pb.go @@ -15,6 +15,8 @@ import ( _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + + common "github.com/percona/pmm/api/common" ) const ( @@ -313,6 +315,8 @@ type NodeExporter struct { LogLevel LogLevel `protobuf:"varint,10,opt,name=log_level,json=logLevel,proto3,enum=inventory.LogLevel" json:"log_level,omitempty"` // Optionally expose the exporter process on all public interfaces ExposeExporter bool `protobuf:"varint,11,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` + // Metrics resolution for this agent. + MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,12,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` } func (x *NodeExporter) Reset() { @@ -424,6 +428,13 @@ func (x *NodeExporter) GetExposeExporter() bool { return false } +func (x *NodeExporter) GetMetricsResolutions() *common.MetricsResolutions { + if x != nil { + return x.MetricsResolutions + } + return nil +} + // MySQLdExporter runs on Generic or Container Node and exposes MySQL Service metrics. type MySQLdExporter struct { state protoimpl.MessageState @@ -472,6 +483,8 @@ type MySQLdExporter struct { LogLevel LogLevel `protobuf:"varint,19,opt,name=log_level,json=logLevel,proto3,enum=inventory.LogLevel" json:"log_level,omitempty"` // Optionally expose the exporter process on all public interfaces ExposeExporter bool `protobuf:"varint,20,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` + // Metrics resolution for this agent. + MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,21,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` } func (x *MySQLdExporter) Reset() { @@ -646,6 +659,13 @@ func (x *MySQLdExporter) GetExposeExporter() bool { return false } +func (x *MySQLdExporter) GetMetricsResolutions() *common.MetricsResolutions { + if x != nil { + return x.MetricsResolutions + } + return nil +} + // MongoDBExporter runs on Generic or Container Node and exposes MongoDB Service metrics. type MongoDBExporter struct { state protoimpl.MessageState @@ -689,6 +709,8 @@ type MongoDBExporter struct { LogLevel LogLevel `protobuf:"varint,17,opt,name=log_level,json=logLevel,proto3,enum=inventory.LogLevel" json:"log_level,omitempty"` // Optionally expose the exporter process on all public interfaces ExposeExporter bool `protobuf:"varint,18,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` + // Metrics resolution for this agent. + MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,19,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` } func (x *MongoDBExporter) Reset() { @@ -849,6 +871,13 @@ func (x *MongoDBExporter) GetExposeExporter() bool { return false } +func (x *MongoDBExporter) GetMetricsResolutions() *common.MetricsResolutions { + if x != nil { + return x.MetricsResolutions + } + return nil +} + // PostgresExporter runs on Generic or Container Node and exposes PostgreSQL Service metrics. type PostgresExporter struct { state protoimpl.MessageState @@ -889,6 +918,8 @@ type PostgresExporter struct { ExposeExporter bool `protobuf:"varint,16,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `protobuf:"varint,17,opt,name=max_exporter_connections,json=maxExporterConnections,proto3" json:"max_exporter_connections,omitempty"` + // Metrics resolution for this agent. + MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,18,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` } func (x *PostgresExporter) Reset() { @@ -1042,6 +1073,13 @@ func (x *PostgresExporter) GetMaxExporterConnections() int32 { return 0 } +func (x *PostgresExporter) GetMetricsResolutions() *common.MetricsResolutions { + if x != nil { + return x.MetricsResolutions + } + return nil +} + // ProxySQLExporter runs on Generic or Container Node and exposes ProxySQL Service metrics. type ProxySQLExporter struct { state protoimpl.MessageState @@ -1078,6 +1116,8 @@ type ProxySQLExporter struct { LogLevel LogLevel `protobuf:"varint,14,opt,name=log_level,json=logLevel,proto3,enum=inventory.LogLevel" json:"log_level,omitempty"` // Optionally expose the exporter process on all public interfaces ExposeExporter bool `protobuf:"varint,15,opt,name=expose_exporter,json=exposeExporter,proto3" json:"expose_exporter,omitempty"` + // Metrics resolution for this agent. + MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,16,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` } func (x *ProxySQLExporter) Reset() { @@ -1217,6 +1257,13 @@ func (x *ProxySQLExporter) GetExposeExporter() bool { return false } +func (x *ProxySQLExporter) GetMetricsResolutions() *common.MetricsResolutions { + if x != nil { + return x.MetricsResolutions + } + return nil +} + // QANMySQLPerfSchemaAgent runs within pmm-agent and sends MySQL Query Analytics data to the PMM Server. type QANMySQLPerfSchemaAgent struct { state protoimpl.MessageState @@ -2117,6 +2164,8 @@ type RDSExporter struct { LogLevel LogLevel `protobuf:"varint,13,opt,name=log_level,json=logLevel,proto3,enum=inventory.LogLevel" json:"log_level,omitempty"` // Limit of databases for auto-discovery. AutoDiscoveryLimit int32 `protobuf:"varint,14,opt,name=auto_discovery_limit,json=autoDiscoveryLimit,proto3" json:"auto_discovery_limit,omitempty"` + // Metrics resolution for this agent. + MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,15,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` } func (x *RDSExporter) Reset() { @@ -2249,6 +2298,13 @@ func (x *RDSExporter) GetAutoDiscoveryLimit() int32 { return 0 } +func (x *RDSExporter) GetMetricsResolutions() *common.MetricsResolutions { + if x != nil { + return x.MetricsResolutions + } + return nil +} + // ExternalExporter runs on any Node type, including Remote Node. type ExternalExporter struct { state protoimpl.MessageState @@ -2277,6 +2333,8 @@ type ExternalExporter struct { PushMetricsEnabled bool `protobuf:"varint,11,opt,name=push_metrics_enabled,json=pushMetricsEnabled,proto3" json:"push_metrics_enabled,omitempty"` // Path to exec process. ProcessExecPath string `protobuf:"bytes,12,opt,name=process_exec_path,json=processExecPath,proto3" json:"process_exec_path,omitempty"` + // Metrics resolution for this agent. + MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,13,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` } func (x *ExternalExporter) Reset() { @@ -2388,6 +2446,13 @@ func (x *ExternalExporter) GetProcessExecPath() string { return "" } +func (x *ExternalExporter) GetMetricsResolutions() *common.MetricsResolutions { + if x != nil { + return x.MetricsResolutions + } + return nil +} + // AzureDatabaseExporter runs on Generic or Container Node and exposes RemoteAzure Node metrics. type AzureDatabaseExporter struct { state protoimpl.MessageState @@ -2418,6 +2483,8 @@ type AzureDatabaseExporter struct { ProcessExecPath string `protobuf:"bytes,11,opt,name=process_exec_path,json=processExecPath,proto3" json:"process_exec_path,omitempty"` // Log level for exporter. LogLevel LogLevel `protobuf:"varint,12,opt,name=log_level,json=logLevel,proto3,enum=inventory.LogLevel" json:"log_level,omitempty"` + // Metrics resolution for this agent. + MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,13,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` } func (x *AzureDatabaseExporter) Reset() { @@ -2536,6 +2603,13 @@ func (x *AzureDatabaseExporter) GetLogLevel() LogLevel { return LogLevel_auto } +func (x *AzureDatabaseExporter) GetMetricsResolutions() *common.MetricsResolutions { + if x != nil { + return x.MetricsResolutions + } + return nil +} + // ChangeCommonAgentParams contains parameters that can be changed for all Agents. type ChangeCommonAgentParams struct { state protoimpl.MessageState @@ -2555,6 +2629,8 @@ type ChangeCommonAgentParams struct { EnablePushMetrics bool `protobuf:"varint,5,opt,name=enable_push_metrics,json=enablePushMetrics,proto3" json:"enable_push_metrics,omitempty"` // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `protobuf:"varint,6,opt,name=disable_push_metrics,json=disablePushMetrics,proto3" json:"disable_push_metrics,omitempty"` + // Metrics resolution for this agent. + MetricsResolutions *common.MetricsResolutions `protobuf:"bytes,7,opt,name=metrics_resolutions,json=metricsResolutions,proto3" json:"metrics_resolutions,omitempty"` } func (x *ChangeCommonAgentParams) Reset() { @@ -2631,6 +2707,13 @@ func (x *ChangeCommonAgentParams) GetDisablePushMetrics() bool { return false } +func (x *ChangeCommonAgentParams) GetMetricsResolutions() *common.MetricsResolutions { + if x != nil { + return x.MetricsResolutions + } + return nil +} + type ListAgentsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -7575,285 +7658,208 @@ var File_inventorypb_agents_proto protoreflect.FileDescriptor var file_inventorypb_agents_proto_rawDesc = []byte{ 0x0a, 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, 0x12, 0x09, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, - 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x70, 0x62, - 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x70, 0x62, - 0x2f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 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, 0xa3, 0x02, 0x0a, 0x08, 0x50, 0x4d, - 0x4d, 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, 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, 0x4a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x4d, 0x4d, 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, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, - 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 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, - 0xc3, 0x01, 0x0a, 0x07, 0x56, 0x4d, 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, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x05, 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, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, 0x65, 0x63, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, - 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x22, 0xb3, 0x04, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 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, - 0x4e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x4e, 0x6f, 0x64, 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, - 0x30, 0x0a, 0x14, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 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, 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 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, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, - 0x6f, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, - 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 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, 0x0a, 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, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, - 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 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, 0xf4, 0x06, 0x0a, 0x0e, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 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, 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, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, - 0x73, 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, - 0x10, 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, 0x11, 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, 0x0b, 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, 0x50, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2b, 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, 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, 0x70, 0x75, - 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x0d, 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, 0x2f, 0x0a, 0x13, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 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, 0x1f, 0x0a, - 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x3a, - 0x0a, 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x17, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x44, 0x69, 0x73, 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, - 0x12, 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, 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, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, - 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 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, 0xbc, 0x06, 0x0a, 0x0f, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 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, - 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, 0x51, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 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, 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, 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, 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x1a, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2f, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x70, 0x62, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x70, 0x62, 0x2f, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 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, 0xa3, 0x02, 0x0a, 0x08, + 0x50, 0x4d, 0x4d, 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, 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, 0x4a, 0x0a, 0x0d, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x4d, + 0x4d, 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, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x05, 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, 0xc3, 0x01, 0x0a, 0x07, 0x56, 0x4d, 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, 0x2e, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 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, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, - 0x74, 0x61, 0x74, 0x73, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x0d, 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, 0x0e, 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, 0x0f, - 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, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x10, + 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, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x45, 0x78, + 0x65, 0x63, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x80, 0x05, 0x0a, 0x0c, 0x4e, 0x6f, 0x64, 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, 0x4e, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4e, 0x6f, 0x64, 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, 0x30, 0x0a, 0x14, 0x70, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x07, 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, 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, + 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, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x09, 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, 0x0a, + 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, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, + 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x13, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 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, 0xc1, 0x07, 0x0a, 0x0e, 0x4d, + 0x79, 0x53, 0x51, 0x4c, 0x64, 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, 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, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6c, 0x73, + 0x43, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6c, 0x73, 0x5f, 0x63, 0x65, 0x72, 0x74, 0x18, 0x10, + 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, 0x11, 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, 0x0b, 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, 0x50, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, + 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, 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, 0x70, 0x75, 0x73, + 0x68, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x18, 0x0d, 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, 0x2f, 0x0a, 0x13, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 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, 0x1f, 0x0a, 0x0b, + 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x3a, 0x0a, + 0x19, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x17, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x74, 0x61, 0x74, 0x73, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x44, 0x69, 0x73, 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, 0x12, 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, 0x11, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 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, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, - 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, + 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 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, 0x9c, 0x06, 0x0a, 0x10, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 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, - 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, 0x52, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 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, 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, 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, 0x2f, 0x0a, 0x13, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 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, 0x1f, 0x0a, 0x0b, 0x6c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x11, - 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x0d, 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, 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, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x75, - 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x75, 0x74, 0x6f, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x27, 0x0a, 0x0f, - 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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, 0xb0, 0x05, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 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, 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, 0x52, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 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, 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, 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, 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 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, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x70, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x18, 0x0d, 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, 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, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, - 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 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, 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, + 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, + 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 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, 0x89, + 0x07, 0x0a, 0x0f, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 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, 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, 0x51, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 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, 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, 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, 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 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, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x74, 0x61, 0x74, 0x73, + 0x5f, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 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, 0x0e, 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, 0x0f, 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, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x10, 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, 0x11, + 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, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, + 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x13, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, + 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 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, 0xe9, 0x06, 0x0a, 0x10, 0x50, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 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, @@ -7866,92 +7872,97 @@ var file_inventorypb_agents_proto_rawDesc = []byte{ 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, 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, 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, + 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x12, 0x52, 0x0a, + 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 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, 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, 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, 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, + 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x12, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 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, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, + 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x65, 0x78, 0x65, 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0d, 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, 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, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x12, 0x61, 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, + 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x38, + 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x16, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 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, 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, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xfd, 0x05, 0x0a, 0x10, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x53, 0x51, 0x4c, 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, 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, 0x52, 0x0a, 0x0d, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2d, 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, 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, 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, + 0x2f, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 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, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x65, 0x78, 0x65, + 0x63, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x0d, 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, 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, 0x12, + 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 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, 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, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, @@ -7965,161 +7976,264 @@ var file_inventorypb_agents_proto_rawDesc = []byte{ 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, 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, 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, + 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, 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, + 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, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, + 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, - 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, 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, 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, 0xba, 0x05, 0x0a, 0x0b, 0x52, - 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x67, + 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, 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, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x12, 0x61, 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, - 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 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, 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, 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, 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, + 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, 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, + 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, 0x87, 0x06, + 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, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x5f, + 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 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, 0xc7, 0x04, 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, @@ -8142,318 +8256,488 @@ var file_inventorypb_agents_proto_rawDesc = []byte{ 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, + 0x61, 0x74, 0x68, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, + 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 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, 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, 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, + 0x01, 0x22, 0xd7, 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, 0x12, 0x4b, 0x0a, + 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 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, 0xc8, 0x03, 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, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 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, 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, + 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, 0x79, 0x0a, 0x22, 0x71, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 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, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, + 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, 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, 0x8b, 0x03, - 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, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, - 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, + 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, 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, 0x57, 0x0a, 0x17, 0x41, - 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, + 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, 0x8b, 0x03, 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, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, + 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 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, 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, 0x99, 0x06, - 0x0a, 0x18, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x72, 0x74, 0x65, 0x72, 0x22, 0x99, 0x06, 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, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 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, 0xe5, 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, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, + 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 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, 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, 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, 0xc8, 0x06, 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, @@ -8467,508 +8751,426 @@ var file_inventorypb_agents_proto_rawDesc = []byte{ 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, 0x12, - 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 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, - 0xe5, 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, 0x12, 0x27, 0x0a, - 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 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, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, + 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, + 0x12, 0x30, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, + 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, + 0x61, 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, + 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x18, 0x6d, + 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6d, + 0x61, 0x78, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 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, 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, 0x91, 0x05, 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, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 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, 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, 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, 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, 0xc8, 0x06, 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, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x75, 0x74, - 0x6f, 0x5f, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x75, 0x74, 0x6f, 0x44, 0x69, 0x73, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x65, - 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x65, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 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, - 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, 0x91, 0x05, 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, 0x12, - 0x27, 0x0a, 0x0f, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, + 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, 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, 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, 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, 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, + 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, 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, 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, + 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, - 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, + 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, 0x09, 0x20, 0x01, + 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, 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, + 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, - 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, + 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, 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, 0x0a, 0x20, 0x01, 0x28, 0x08, + 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, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 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, - 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, - 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, + 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, 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, 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, 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, + 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, 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, @@ -8981,812 +9183,738 @@ var file_inventorypb_agents_proto_rawDesc = []byte{ 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, + 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, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x45, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 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, 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, + 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, 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, 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, 0xa5, 0x01, 0x0a, 0x2a, 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, 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, + 0x61, 0x74, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x01, 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, 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, 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, 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, 0xa5, 0x01, 0x0a, 0x2a, 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x01, 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, 0x22, 0x8e, 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, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x08, 0x61, 0x67, 0x65, + 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, 0x22, + 0x8e, 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, 0x4d, 0x6f, 0x6e, + 0x69, 0x74, 0x6f, 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, 0xa8, 0x01, 0x0a, 0x2d, 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, 0x4d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 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, 0x01, 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, 0x22, 0xc1, 0x04, 0x0a, 0x15, + 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 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, 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, 0xa8, 0x01, 0x0a, 0x2d, 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, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x01, 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, 0x22, 0xc1, 0x04, 0x0a, 0x15, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 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, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, - 0x02, 0x10, 0x01, 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, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, - 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x57, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 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, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x61, 0x77, 0x73, 0x41, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, + 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x61, 0x77, 0x73, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x57, + 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 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, 0x06, 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, 0x32, 0x0a, 0x15, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x42, 0x61, 0x73, 0x69, 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, + 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x68, 0x61, 0x6e, + 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x68, 0x61, 0x6e, 0x63, + 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 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, 0x30, 0x0a, 0x09, + 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0a, 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, + 0x53, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x72, 0x64, 0x73, + 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 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, 0x22, 0x7a, 0x0a, 0x18, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 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, 0x06, 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, 0x32, 0x0a, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, - 0x62, 0x61, 0x73, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x13, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x61, 0x73, 0x69, - 0x63, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x64, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x45, 0x6e, 0x68, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 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, 0x30, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x18, 0x0a, 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, 0x53, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x52, - 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x18, 0x01, 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, 0x22, 0x7a, 0x0a, - 0x18, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 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, 0x56, 0x0a, 0x19, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 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, 0x22, 0xce, 0x03, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x2e, 0x0a, 0x0f, 0x72, 0x75, 0x6e, 0x73, 0x5f, 0x6f, 0x6e, 0x5f, 0x6e, 0x6f, 0x64, 0x65, + 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, 0x56, 0x0a, 0x19, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, + 0x0c, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x18, 0x01, 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, 0x22, 0xce, 0x03, 0x0a, 0x1a, 0x41, 0x64, 0x64, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 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, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 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, 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, 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, 0x2c, 0x0a, 0x0b, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0b, + 0xfa, 0x42, 0x08, 0x2a, 0x06, 0x10, 0x80, 0x80, 0x04, 0x20, 0x00, 0x52, 0x0a, 0x6c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x5c, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 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, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 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, 0x67, 0x0a, 0x1b, 0x41, 0x64, 0x64, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 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, + 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, 0x22, 0x7f, 0x0a, 0x1d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 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, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 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, 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, 0x22, + 0xcb, 0x05, 0x0a, 0x1f, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 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, 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, 0x02, - 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, 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, 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, 0x2c, 0x0a, 0x0b, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x5f, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x2a, 0x06, 0x10, 0x80, - 0x80, 0x04, 0x20, 0x00, 0x52, 0x0a, 0x6c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x5c, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 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, 0x0b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 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, 0x67, 0x0a, 0x1b, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x48, 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 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, 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, 0x22, 0x7f, 0x0a, 0x1d, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 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, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, - 0x0a, 0x11, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 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, 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, 0x22, 0xcb, 0x05, 0x0a, 0x1f, 0x41, 0x64, 0x64, - 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 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, 0x20, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, - 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x7a, 0x75, - 0x72, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x61, 0x7a, 0x75, 0x72, 0x65, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x65, 0x6e, 0x61, 0x6e, - 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x7a, 0x75, 0x72, - 0x65, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x61, 0x7a, 0x75, - 0x72, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x53, - 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, - 0x14, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x7a, 0x75, - 0x72, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, - 0x48, 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, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 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, 0x61, 0x0a, 0x0d, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x3c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, - 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 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, 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, 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, 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, 0x7c, 0x0a, 0x20, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, - 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x01, 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, 0x52, 0x15, 0x61, - 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x22, 0x84, 0x01, 0x0a, 0x22, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, + 0x10, 0x01, 0x52, 0x0a, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x20, + 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, + 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x7a, 0x75, 0x72, 0x65, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x7a, 0x75, 0x72, + 0x65, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x7a, 0x75, 0x72, + 0x65, 0x5f, 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x54, 0x65, 0x6e, 0x61, 0x6e, 0x74, 0x49, 0x64, + 0x12, 0x32, 0x0a, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x75, 0x62, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x48, 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, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 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, 0x61, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, + 0x62, 0x61, 0x73, 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, 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, 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, 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, 0x7c, 0x0a, + 0x20, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, + 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 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, 0x01, 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, 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, 0x7f, 0x0a, 0x23, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, - 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 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, 0x01, 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, 0x52, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x22, 0x4e, 0x0a, 0x12, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 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, 0x84, 0x01, 0x0a, 0x22, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 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, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x15, 0x0a, 0x13, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2a, 0x9e, 0x03, 0x0a, 0x09, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x4d, 0x4d, - 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x56, 0x4d, 0x5f, 0x41, - 0x47, 0x45, 0x4e, 0x54, 0x10, 0x0e, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x45, - 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x59, 0x53, - 0x51, 0x4c, 0x44, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x03, 0x12, 0x14, - 0x0a, 0x10, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, - 0x45, 0x52, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, - 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x50, - 0x52, 0x4f, 0x58, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, - 0x10, 0x06, 0x12, 0x1e, 0x0a, 0x1a, 0x51, 0x41, 0x4e, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, - 0x50, 0x45, 0x52, 0x46, 0x53, 0x43, 0x48, 0x45, 0x4d, 0x41, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, - 0x10, 0x07, 0x12, 0x1b, 0x0a, 0x17, 0x51, 0x41, 0x4e, 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, - 0x53, 0x4c, 0x4f, 0x57, 0x4c, 0x4f, 0x47, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x08, 0x12, - 0x1e, 0x0a, 0x1a, 0x51, 0x41, 0x4e, 0x5f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x50, - 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x52, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x09, 0x12, - 0x25, 0x0a, 0x21, 0x51, 0x41, 0x4e, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, - 0x4c, 0x5f, 0x50, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x41, - 0x47, 0x45, 0x4e, 0x54, 0x10, 0x0a, 0x12, 0x26, 0x0a, 0x22, 0x51, 0x41, 0x4e, 0x5f, 0x50, 0x4f, - 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x47, 0x53, 0x54, 0x41, 0x54, 0x4d, - 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x0d, 0x12, 0x10, - 0x0a, 0x0c, 0x52, 0x44, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x0b, - 0x12, 0x15, 0x0a, 0x11, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x58, 0x50, - 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x0c, 0x12, 0x1b, 0x0a, 0x17, 0x41, 0x5a, 0x55, 0x52, 0x45, - 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, - 0x45, 0x52, 0x10, 0x0f, 0x32, 0xc8, 0x38, 0x0a, 0x06, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x9e, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1c, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x92, 0x41, 0x2c, - 0x12, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x1d, 0x52, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, - 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x95, 0x01, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, 0x92, 0x41, 0x2a, 0x12, 0x09, 0x47, 0x65, 0x74, - 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x1d, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, - 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x62, - 0x79, 0x20, 0x49, 0x44, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, - 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x12, 0xa6, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, - 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0x92, 0x41, 0x2b, 0x12, - 0x0e, 0x47, 0x65, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x1a, - 0x19, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x6c, - 0x6f, 0x67, 0x73, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, - 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, - 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x12, 0x1d, 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, - 0x1a, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, - 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x4e, 0x92, 0x41, 0x20, 0x12, 0x0d, 0x41, 0x64, 0x64, 0x20, 0x50, 0x4d, 0x4d, 0x20, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x41, 0x64, 0x64, 0x73, 0x20, 0x50, 0x4d, 0x4d, 0x20, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, + 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, 0x7f, 0x0a, 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, + 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x01, 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, 0x52, 0x15, 0x61, 0x7a, + 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x22, 0x4e, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 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, 0x14, 0x0a, + 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x9e, 0x03, 0x0a, 0x09, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x47, 0x45, 0x4e, + 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, + 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x4d, 0x4d, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x01, 0x12, + 0x0c, 0x0a, 0x08, 0x56, 0x4d, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x0e, 0x12, 0x11, 0x0a, + 0x0d, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x02, + 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x44, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, + 0x54, 0x45, 0x52, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, + 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x50, + 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, + 0x10, 0x05, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, + 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x06, 0x12, 0x1e, 0x0a, 0x1a, 0x51, 0x41, 0x4e, + 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x45, 0x52, 0x46, 0x53, 0x43, 0x48, 0x45, 0x4d, + 0x41, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x07, 0x12, 0x1b, 0x0a, 0x17, 0x51, 0x41, 0x4e, + 0x5f, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x4c, 0x4f, 0x57, 0x4c, 0x4f, 0x47, 0x5f, 0x41, + 0x47, 0x45, 0x4e, 0x54, 0x10, 0x08, 0x12, 0x1e, 0x0a, 0x1a, 0x51, 0x41, 0x4e, 0x5f, 0x4d, 0x4f, + 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x52, 0x5f, 0x41, + 0x47, 0x45, 0x4e, 0x54, 0x10, 0x09, 0x12, 0x25, 0x0a, 0x21, 0x51, 0x41, 0x4e, 0x5f, 0x50, 0x4f, + 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x5f, 0x50, 0x47, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x10, 0x0a, 0x12, 0x26, 0x0a, + 0x22, 0x51, 0x41, 0x4e, 0x5f, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x5f, + 0x50, 0x47, 0x53, 0x54, 0x41, 0x54, 0x4d, 0x4f, 0x4e, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x41, 0x47, + 0x45, 0x4e, 0x54, 0x10, 0x0d, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x44, 0x53, 0x5f, 0x45, 0x58, 0x50, + 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x0b, 0x12, 0x15, 0x0a, 0x11, 0x45, 0x58, 0x54, 0x45, 0x52, + 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x0c, 0x12, 0x1b, + 0x0a, 0x17, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x42, 0x41, 0x53, 0x45, + 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x45, 0x52, 0x10, 0x0f, 0x32, 0xc8, 0x38, 0x0a, 0x06, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x9e, 0x01, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x53, 0x92, 0x41, 0x2c, 0x12, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x1d, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x76, + 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x95, 0x01, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, 0x92, + 0x41, 0x2a, 0x12, 0x09, 0x47, 0x65, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x1d, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, 0x2e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x12, + 0xa6, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, + 0x12, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x55, 0x92, 0x41, 0x2b, 0x12, 0x0e, 0x47, 0x65, 0x74, 0x20, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x19, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x20, 0x6c, 0x6f, 0x67, 0x73, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x31, 0x2f, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x0b, 0x41, 0x64, 0x64, + 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1d, 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, 0x1a, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4e, 0x92, 0x41, 0x20, 0x12, 0x0d, 0x41, 0x64, + 0x64, 0x20, 0x50, 0x4d, 0x4d, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x41, 0x64, 0x64, + 0x73, 0x20, 0x50, 0x4d, 0x4d, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x25, 0x3a, 0x01, 0x2a, 0x22, 0x20, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x50, + 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0xba, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x21, 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, 0x1a, 0x22, + 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, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x60, 0x92, 0x41, 0x2e, 0x12, 0x11, 0x41, 0x64, 0x64, 0x20, 0x4e, 0x6f, 0x64, + 0x65, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x19, 0x41, 0x64, 0x64, 0x73, + 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x12, 0xba, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x21, 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, 0x1a, 0x22, 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x60, 0x92, 0x41, 0x2e, - 0x12, 0x11, 0x41, 0x64, 0x64, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x1a, 0x19, 0x41, 0x64, 0x64, 0x73, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x29, 0x3a, 0x01, 0x2a, 0x22, 0x24, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, - 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xcc, 0x01, - 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 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, 0x1a, 0x25, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x22, 0x69, 0x92, 0x41, 0x34, 0x12, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x4e, - 0x6f, 0x64, 0x65, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x1c, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, - 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xc6, 0x01, 0x0a, - 0x11, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x12, 0x23, 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, 0x1a, 0x24, 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x66, 0x92, - 0x41, 0x32, 0x12, 0x13, 0x41, 0x64, 0x64, 0x20, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x20, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x1b, 0x41, 0x64, 0x64, 0x73, 0x20, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, - 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xd8, 0x01, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x26, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x1a, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 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, 0x22, - 0x6f, 0x92, 0x41, 0x38, 0x12, 0x16, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x64, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x1e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2e, 0x3a, 0x01, 0x2a, 0x22, 0x29, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x12, 0xcc, 0x01, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x24, 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, 0x1a, 0x25, 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, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x92, 0x41, 0x34, 0x12, 0x14, 0x41, 0x64, 0x64, 0x20, 0x4d, - 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, - 0x1c, 0x41, 0x64, 0x64, 0x73, 0x20, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, 0x64, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, - 0xde, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, - 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x1a, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x22, 0x72, 0x92, 0x41, - 0x3a, 0x12, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, - 0x42, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x1f, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x20, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x12, 0xcc, 0x01, 0x0a, 0x12, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x24, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x1a, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x22, 0x69, 0x92, 0x41, 0x34, 0x12, 0x14, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x1a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x76, 0x31, 0x2f, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, + 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0xc6, 0x01, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x23, 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, 0x1a, 0x24, + 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, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x66, 0x92, 0x41, 0x32, 0x12, 0x13, 0x41, 0x64, 0x64, 0x20, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x64, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x1b, + 0x41, 0x64, 0x64, 0x73, 0x20, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xd8, 0x01, 0x0a, + 0x14, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 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, 0x1a, 0x27, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x22, 0x6f, 0x92, 0x41, 0x38, 0x12, 0x16, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x20, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x1a, 0x1e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x6d, 0x79, 0x73, + 0x71, 0x6c, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x3a, 0x01, 0x2a, 0x22, 0x29, 0x2f, 0x76, + 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xcc, 0x01, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x24, + 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, 0x1a, 0x25, 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x92, 0x41, 0x34, + 0x12, 0x14, 0x41, 0x64, 0x64, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x1c, 0x41, 0x64, 0x64, 0x73, 0x20, 0x6d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, + 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xde, 0x01, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x12, 0xd2, 0x01, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x25, 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, 0x1a, - 0x26, 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x92, 0x41, 0x36, 0x12, 0x15, 0x41, 0x64, - 0x64, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x1a, 0x1d, 0x41, 0x64, 0x64, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, - 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, + 0x12, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x1a, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x22, 0x72, 0x92, 0x41, 0x3a, 0x12, 0x17, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x1a, 0x1f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x3a, 0x01, 0x2a, 0x22, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xe4, 0x01, 0x0a, 0x16, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x12, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, + 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xd2, 0x01, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x50, + 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x25, 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, 0x1a, 0x26, 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, + 0x92, 0x41, 0x36, 0x12, 0x15, 0x41, 0x64, 0x64, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x73, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x1d, 0x41, 0x64, 0x64, 0x73, + 0x20, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, + 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, + 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xe4, 0x01, 0x0a, + 0x16, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 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, 0x1a, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x22, 0x75, 0x92, 0x41, + 0x3c, 0x12, 0x18, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, + 0x65, 0x73, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x20, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x20, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x30, 0x3a, 0x01, 0x2a, 0x22, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 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, 0x1a, 0x29, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x22, 0x75, 0x92, 0x41, 0x3c, 0x12, 0x18, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x20, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x1a, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x3a, 0x01, 0x2a, 0x22, - 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x73, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xd2, 0x01, 0x0a, - 0x13, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x12, 0x25, 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, 0x1a, 0x26, 0x2e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x12, 0xd2, 0x01, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x25, 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, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x92, 0x41, 0x36, 0x12, 0x15, 0x41, 0x64, 0x64, 0x20, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, - 0x1d, 0x41, 0x64, 0x64, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, - 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x12, 0xe4, 0x01, 0x0a, 0x16, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, - 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x28, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x1a, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 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, 0x22, 0x75, 0x92, 0x41, 0x3c, 0x12, 0x18, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x1a, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, - 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x3a, 0x01, 0x2a, 0x22, 0x2b, 0x2f, 0x76, 0x31, - 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x8b, 0x02, 0x0a, 0x1a, 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, 0x12, 0x2c, 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, 0x1a, 0x2d, 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, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8f, 0x01, 0x92, 0x41, 0x52, 0x12, 0x20, 0x41, 0x64, 0x64, 0x20, - 0x27, 0x51, 0x41, 0x4e, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x50, 0x65, 0x72, 0x66, 0x53, - 0x63, 0x68, 0x65, 0x6d, 0x61, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x2e, 0x41, 0x64, - 0x64, 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, - 0x69, 0x63, 0x73, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x34, 0x3a, 0x01, 0x2a, 0x22, 0x2f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 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, 0x12, 0x9d, 0x02, 0x0a, 0x1d, 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, 0x12, 0x2f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x1a, 0x30, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, + 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x26, 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x92, 0x41, 0x36, 0x12, + 0x15, 0x41, 0x64, 0x64, 0x20, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x1d, 0x41, 0x64, 0x64, 0x73, 0x20, 0x70, 0x72, 0x6f, + 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, + 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xe4, 0x01, 0x0a, 0x16, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x12, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 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, 0x1a, 0x29, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x22, 0x75, 0x92, 0x41, 0x3c, 0x12, 0x18, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x20, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x3a, + 0x01, 0x2a, 0x22, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, + 0x8b, 0x02, 0x0a, 0x1a, 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, 0x12, 0x2c, + 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, 0x1a, 0x2d, 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x98, 0x01, 0x92, 0x41, - 0x58, 0x12, 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x20, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x27, - 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x31, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, - 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, - 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, - 0x61, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x3a, - 0x01, 0x2a, 0x22, 0x32, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 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, 0x12, 0xf9, 0x01, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x51, 0x41, - 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x29, 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, 0x1a, 0x2a, 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x86, 0x01, 0x92, 0x41, 0x4c, 0x12, - 0x1d, 0x41, 0x64, 0x64, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, - 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x2b, - 0x41, 0x64, 0x64, 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, - 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x6c, 0x6f, 0x77, - 0x6c, 0x6f, 0x67, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x31, 0x3a, 0x01, 0x2a, 0x22, 0x2c, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x51, 0x41, - 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x8b, 0x02, 0x0a, 0x1a, 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, 0x12, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x1a, - 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x22, 0x8f, - 0x01, 0x92, 0x41, 0x52, 0x12, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x27, 0x51, 0x41, - 0x4e, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x27, - 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, - 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8f, 0x01, 0x92, 0x41, + 0x52, 0x12, 0x20, 0x41, 0x64, 0x64, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, 0x4d, 0x79, 0x53, 0x51, + 0x4c, 0x20, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x27, 0x20, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x1a, 0x2e, 0x41, 0x64, 0x64, 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x20, 0x50, 0x65, 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x27, 0x20, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x3a, 0x01, 0x2a, 0x22, 0x2f, 0x2f, 0x76, + 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 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, 0x12, 0x9d, 0x02, + 0x0a, 0x1d, 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, 0x12, + 0x2f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, + 0x1a, 0x30, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x22, 0x98, 0x01, 0x92, 0x41, 0x58, 0x12, 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x50, 0x65, 0x72, 0x66, + 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x31, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, + 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x50, 0x65, + 0x72, 0x66, 0x53, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x3a, 0x01, 0x2a, 0x22, 0x32, 0x2f, 0x76, 0x31, 0x2f, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 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, 0x12, 0xf9, 0x01, + 0x0a, 0x17, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, + 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x29, 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, 0x1a, 0x2a, 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x86, 0x01, 0x92, 0x41, 0x4c, 0x12, 0x1d, 0x41, 0x64, 0x64, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x27, 0x20, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x3a, 0x01, 0x2a, 0x22, - 0x2f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 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, - 0x12, 0x8b, 0x02, 0x0a, 0x1a, 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, 0x12, - 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x51, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x2b, 0x41, 0x64, 0x64, 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x4d, 0x79, 0x53, + 0x51, 0x4c, 0x20, 0x53, 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x3a, 0x01, 0x2a, 0x22, 0x2c, 0x2f, 0x76, 0x31, + 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x73, 0x2f, 0x41, 0x64, 0x64, 0x51, 0x41, 0x4e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x6c, 0x6f, + 0x77, 0x6c, 0x6f, 0x67, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x8b, 0x02, 0x0a, 0x1a, 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, 0x12, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x1a, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 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, 0x22, 0x8f, 0x01, 0x92, 0x41, 0x52, 0x12, 0x20, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, + 0x6c, 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, + 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x6c, + 0x6f, 0x77, 0x6c, 0x6f, 0x67, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x34, 0x3a, 0x01, 0x2a, 0x22, 0x2f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 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, 0x12, 0x8b, 0x02, 0x0a, 0x1a, 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, 0x1a, 0x2d, 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8f, 0x01, 0x92, - 0x41, 0x52, 0x12, 0x20, 0x41, 0x64, 0x64, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x44, 0x42, 0x20, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x27, 0x20, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x2e, 0x41, 0x64, 0x64, 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x44, 0x42, 0x20, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x27, 0x20, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x3a, 0x01, 0x2a, 0x22, 0x2f, 0x2f, - 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 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, 0x12, 0x9d, - 0x02, 0x0a, 0x1d, 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, - 0x12, 0x2f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x1a, 0x30, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x50, 0x72, + 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x2c, 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, 0x1a, 0x2d, 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, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x98, 0x01, 0x92, 0x41, 0x58, 0x12, 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x31, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, - 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, - 0x20, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x3a, 0x01, 0x2a, 0x22, 0x32, 0x2f, 0x76, 0x31, 0x2f, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 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, 0x12, 0xc1, - 0x02, 0x0a, 0x21, 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, 0x12, 0x33, 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, 0x1a, 0x34, 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0xb0, 0x01, 0x92, 0x41, 0x6c, 0x12, 0x2d, 0x41, 0x64, 0x64, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x70, 0x67, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x27, 0x20, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x3b, 0x41, 0x64, 0x64, 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x3a, 0x01, 0x2a, 0x22, 0x36, 0x2f, 0x76, 0x31, 0x2f, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, - 0x2f, 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, 0x12, 0xd3, 0x02, 0x0a, 0x24, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x51, 0x41, 0x4e, + 0x6e, 0x73, 0x65, 0x22, 0x8f, 0x01, 0x92, 0x41, 0x52, 0x12, 0x20, 0x41, 0x64, 0x64, 0x20, 0x27, + 0x51, 0x41, 0x4e, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x72, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x2e, 0x41, 0x64, 0x64, + 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, + 0x63, 0x73, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x72, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x34, 0x3a, 0x01, 0x2a, 0x22, 0x2f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 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, 0x12, 0x9d, 0x02, 0x0a, 0x1d, 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, 0x12, 0x2f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 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, 0x1a, 0x30, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x22, 0x98, 0x01, 0x92, 0x41, 0x58, + 0x12, 0x23, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, 0x27, 0x20, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x31, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x27, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x72, + 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x3a, 0x01, + 0x2a, 0x22, 0x32, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 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, 0x12, 0xc1, 0x02, 0x0a, 0x21, 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, 0x12, 0x36, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 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, 0x22, 0xb9, 0x01, 0x92, - 0x41, 0x72, 0x12, 0x30, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x70, 0x67, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x27, 0x20, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x3e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x27, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x50, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x27, 0x20, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x3a, 0x01, 0x2a, 0x22, 0x39, 0x2f, - 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 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, 0x12, 0xbf, 0x02, 0x0a, 0x22, 0x41, 0x64, 0x64, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x33, 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, + 0x1a, 0x34, 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, 0x12, - 0x34, 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, 0x1a, 0x35, 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, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xab, 0x01, 0x92, - 0x41, 0x66, 0x12, 0x2a, 0x41, 0x64, 0x64, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, 0x50, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, - 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x38, - 0x41, 0x64, 0x64, 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, - 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, - 0x20, 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x3a, 0x01, - 0x2a, 0x22, 0x37, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb0, 0x01, 0x92, 0x41, 0x6c, 0x12, 0x2d, 0x41, 0x64, + 0x64, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, + 0x4c, 0x20, 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x3b, 0x41, 0x64, 0x64, + 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, + 0x63, 0x73, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x70, 0x67, + 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x3a, 0x01, + 0x2a, 0x22, 0x36, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 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, 0x12, 0xd1, 0x02, 0x0a, 0x25, 0x43, + 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, 0xd3, 0x02, 0x0a, 0x24, 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, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 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, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x22, 0xb9, 0x01, 0x92, 0x41, 0x72, 0x12, 0x30, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, + 0x4c, 0x20, 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x3e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, + 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x20, 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x3e, 0x3a, 0x01, 0x2a, 0x22, 0x39, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 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, 0x12, + 0xbf, 0x02, 0x0a, 0x22, 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, 0x12, 0x34, 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, 0x1a, 0x35, 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, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0xab, 0x01, 0x92, 0x41, 0x66, 0x12, 0x2a, 0x41, 0x64, 0x64, 0x20, 0x27, + 0x51, 0x41, 0x4e, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x70, + 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x27, 0x20, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x38, 0x41, 0x64, 0x64, 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x50, 0x6f, 0x73, + 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, + 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x3a, 0x01, 0x2a, 0x22, 0x37, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 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, 0x12, 0xd1, 0x02, 0x0a, 0x25, 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, 0x4d, + 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x37, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 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, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb4, 0x01, 0x92, 0x41, 0x6c, 0x12, 0x2d, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x27, 0x51, 0x41, 0x4e, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x6d, 0x6f, - 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x3b, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, - 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, - 0x4c, 0x20, 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x3a, - 0x01, 0x2a, 0x22, 0x3a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 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, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0xb4, - 0x01, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, - 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5d, 0x92, 0x41, 0x2c, 0x12, 0x10, 0x41, 0x64, 0x64, - 0x20, 0x52, 0x44, 0x53, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x18, 0x41, - 0x64, 0x64, 0x73, 0x20, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x3a, 0x01, 0x2a, - 0x22, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xc6, 0x01, 0x0a, 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, - 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x66, 0x92, 0x41, 0x32, 0x12, 0x13, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x20, 0x52, 0x44, 0x53, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x1a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xd2, - 0x01, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x92, 0x41, 0x36, 0x12, 0x15, 0x41, 0x64, 0x64, 0x20, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x1a, 0x1d, 0x41, 0x64, 0x64, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x69, + 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb4, + 0x01, 0x92, 0x41, 0x6c, 0x12, 0x2d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x27, 0x51, 0x41, + 0x4e, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x70, 0x67, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x27, 0x20, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x1a, 0x3b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x27, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x20, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x74, 0x69, 0x63, 0x73, 0x20, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x5f, 0x6d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x27, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x3a, 0x01, 0x2a, 0x22, 0x3a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x72, 0x12, 0xe4, 0x01, 0x0a, 0x16, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x28, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x75, 0x92, 0x41, 0x3c, 0x12, 0x18, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x1a, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x3a, 0x01, 0x2a, 0x22, 0x2b, 0x2f, + 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, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0xb4, 0x01, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5d, 0x92, + 0x41, 0x2c, 0x12, 0x10, 0x41, 0x64, 0x64, 0x20, 0x52, 0x44, 0x53, 0x20, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x1a, 0x18, 0x41, 0x64, 0x64, 0x73, 0x20, 0x72, 0x64, 0x73, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x28, 0x3a, 0x01, 0x2a, 0x22, 0x23, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, + 0x64, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xc6, 0x01, 0x0a, + 0x11, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x12, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x66, 0x92, + 0x41, 0x32, 0x12, 0x13, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x52, 0x44, 0x53, 0x20, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x20, 0x72, 0x64, 0x73, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2b, 0x3a, 0x01, 0x2a, 0x22, 0x26, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xf2, 0x01, 0x0a, 0x18, 0x41, - 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x2a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, - 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, - 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x7d, 0x92, 0x41, 0x42, 0x12, 0x1b, 0x41, 0x64, 0x64, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, - 0x20, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x72, 0x1a, 0x23, 0x41, 0x64, 0x64, 0x73, 0x20, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, - 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x32, 0x3a, 0x01, 0x2a, - 0x22, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, - 0x85, 0x02, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, - 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, - 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x44, 0x53, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xd2, 0x01, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x25, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x92, 0x41, + 0x36, 0x12, 0x15, 0x41, 0x64, 0x64, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x1d, 0x41, 0x64, 0x64, 0x73, 0x20, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, + 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, + 0x22, 0x28, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0xe4, 0x01, 0x0a, 0x16, 0x43, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, + 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x75, 0x92, 0x41, 0x3c, 0x12, + 0x18, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x20, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x20, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x65, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x30, 0x3a, 0x01, 0x2a, 0x22, 0x2b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, + 0x72, 0x12, 0xf2, 0x01, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x2a, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x7a, + 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, + 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7d, 0x92, 0x41, 0x42, 0x12, 0x1b, 0x41, 0x64, + 0x64, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, + 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x23, 0x41, 0x64, 0x64, 0x73, 0x20, + 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x32, 0x3a, 0x01, 0x2a, 0x22, 0x2d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x41, 0x64, + 0x64, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x85, 0x02, 0x0a, 0x1b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x86, - 0x01, 0x92, 0x41, 0x48, 0x12, 0x1e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x41, 0x7a, 0x75, - 0x72, 0x65, 0x20, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x20, 0x45, 0x78, 0x70, 0x6f, - 0x72, 0x74, 0x65, 0x72, 0x1a, 0x26, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x61, 0x7a, - 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x35, 0x3a, 0x01, 0x2a, 0x22, 0x30, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, - 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x95, 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x92, 0x41, 0x1e, 0x12, 0x0c, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x1a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x73, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, - 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, - 0x88, 0x01, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x42, 0x0b, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x26, 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, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x49, 0x58, 0x58, 0xaa, 0x02, - 0x09, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0xca, 0x02, 0x09, 0x49, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0xe2, 0x02, 0x15, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, - 0x09, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x2d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, 0x74, + 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x86, 0x01, 0x92, 0x41, 0x48, 0x12, 0x1e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x20, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x20, 0x44, 0x61, 0x74, 0x61, 0x62, 0x61, + 0x73, 0x65, 0x20, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x1a, 0x26, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x20, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x20, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x3a, 0x01, 0x2a, 0x22, 0x30, 0x2f, 0x76, + 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x44, 0x61, + 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x12, 0x95, + 0x01, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x1d, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x92, + 0x41, 0x1e, 0x12, 0x0c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x1a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x2f, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x42, 0x88, 0x01, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x0b, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x26, 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, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x70, 0x62, 0xa2, + 0x02, 0x03, 0x49, 0x58, 0x58, 0xaa, 0x02, 0x09, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0xca, 0x02, 0x09, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0xe2, 0x02, 0x15, + 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x09, 0x49, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -9915,6 +10043,7 @@ var ( nil, // 107: inventory.AddAzureDatabaseExporterRequest.CustomLabelsEntry (AgentStatus)(0), // 108: inventory.AgentStatus (LogLevel)(0), // 109: inventory.LogLevel + (*common.MetricsResolutions)(nil), // 110: common.MetricsResolutions } ) @@ -9924,205 +10053,214 @@ var file_inventorypb_agents_proto_depIdxs = []int32{ 80, // 2: inventory.NodeExporter.custom_labels:type_name -> inventory.NodeExporter.CustomLabelsEntry 108, // 3: inventory.NodeExporter.status:type_name -> inventory.AgentStatus 109, // 4: inventory.NodeExporter.log_level:type_name -> inventory.LogLevel - 81, // 5: inventory.MySQLdExporter.custom_labels:type_name -> inventory.MySQLdExporter.CustomLabelsEntry - 108, // 6: inventory.MySQLdExporter.status:type_name -> inventory.AgentStatus - 109, // 7: inventory.MySQLdExporter.log_level:type_name -> inventory.LogLevel - 82, // 8: inventory.MongoDBExporter.custom_labels:type_name -> inventory.MongoDBExporter.CustomLabelsEntry - 108, // 9: inventory.MongoDBExporter.status:type_name -> inventory.AgentStatus - 109, // 10: inventory.MongoDBExporter.log_level:type_name -> inventory.LogLevel - 83, // 11: inventory.PostgresExporter.custom_labels:type_name -> inventory.PostgresExporter.CustomLabelsEntry - 108, // 12: inventory.PostgresExporter.status:type_name -> inventory.AgentStatus - 109, // 13: inventory.PostgresExporter.log_level:type_name -> inventory.LogLevel - 84, // 14: inventory.ProxySQLExporter.custom_labels:type_name -> inventory.ProxySQLExporter.CustomLabelsEntry - 108, // 15: inventory.ProxySQLExporter.status:type_name -> inventory.AgentStatus - 109, // 16: inventory.ProxySQLExporter.log_level:type_name -> inventory.LogLevel - 85, // 17: inventory.QANMySQLPerfSchemaAgent.custom_labels:type_name -> inventory.QANMySQLPerfSchemaAgent.CustomLabelsEntry - 108, // 18: inventory.QANMySQLPerfSchemaAgent.status:type_name -> inventory.AgentStatus - 109, // 19: inventory.QANMySQLPerfSchemaAgent.log_level:type_name -> inventory.LogLevel - 86, // 20: inventory.QANMySQLSlowlogAgent.custom_labels:type_name -> inventory.QANMySQLSlowlogAgent.CustomLabelsEntry - 108, // 21: inventory.QANMySQLSlowlogAgent.status:type_name -> inventory.AgentStatus - 109, // 22: inventory.QANMySQLSlowlogAgent.log_level:type_name -> inventory.LogLevel - 87, // 23: inventory.QANMongoDBProfilerAgent.custom_labels:type_name -> inventory.QANMongoDBProfilerAgent.CustomLabelsEntry - 108, // 24: inventory.QANMongoDBProfilerAgent.status:type_name -> inventory.AgentStatus - 109, // 25: inventory.QANMongoDBProfilerAgent.log_level:type_name -> inventory.LogLevel - 88, // 26: inventory.QANPostgreSQLPgStatementsAgent.custom_labels:type_name -> inventory.QANPostgreSQLPgStatementsAgent.CustomLabelsEntry - 108, // 27: inventory.QANPostgreSQLPgStatementsAgent.status:type_name -> inventory.AgentStatus - 109, // 28: inventory.QANPostgreSQLPgStatementsAgent.log_level:type_name -> inventory.LogLevel - 89, // 29: inventory.QANPostgreSQLPgStatMonitorAgent.custom_labels:type_name -> inventory.QANPostgreSQLPgStatMonitorAgent.CustomLabelsEntry - 108, // 30: inventory.QANPostgreSQLPgStatMonitorAgent.status:type_name -> inventory.AgentStatus - 109, // 31: inventory.QANPostgreSQLPgStatMonitorAgent.log_level:type_name -> inventory.LogLevel - 90, // 32: inventory.RDSExporter.custom_labels:type_name -> inventory.RDSExporter.CustomLabelsEntry - 108, // 33: inventory.RDSExporter.status:type_name -> inventory.AgentStatus - 109, // 34: inventory.RDSExporter.log_level:type_name -> inventory.LogLevel - 91, // 35: inventory.ExternalExporter.custom_labels:type_name -> inventory.ExternalExporter.CustomLabelsEntry - 92, // 36: inventory.AzureDatabaseExporter.custom_labels:type_name -> inventory.AzureDatabaseExporter.CustomLabelsEntry - 108, // 37: inventory.AzureDatabaseExporter.status:type_name -> inventory.AgentStatus - 109, // 38: inventory.AzureDatabaseExporter.log_level:type_name -> inventory.LogLevel - 93, // 39: inventory.ChangeCommonAgentParams.custom_labels:type_name -> inventory.ChangeCommonAgentParams.CustomLabelsEntry - 0, // 40: inventory.ListAgentsRequest.agent_type:type_name -> inventory.AgentType - 1, // 41: inventory.ListAgentsResponse.pmm_agent:type_name -> inventory.PMMAgent - 2, // 42: inventory.ListAgentsResponse.vm_agent:type_name -> inventory.VMAgent - 3, // 43: inventory.ListAgentsResponse.node_exporter:type_name -> inventory.NodeExporter - 4, // 44: inventory.ListAgentsResponse.mysqld_exporter:type_name -> inventory.MySQLdExporter - 5, // 45: inventory.ListAgentsResponse.mongodb_exporter:type_name -> inventory.MongoDBExporter - 6, // 46: inventory.ListAgentsResponse.postgres_exporter:type_name -> inventory.PostgresExporter - 7, // 47: inventory.ListAgentsResponse.proxysql_exporter:type_name -> inventory.ProxySQLExporter - 8, // 48: inventory.ListAgentsResponse.qan_mysql_perfschema_agent:type_name -> inventory.QANMySQLPerfSchemaAgent - 9, // 49: inventory.ListAgentsResponse.qan_mysql_slowlog_agent:type_name -> inventory.QANMySQLSlowlogAgent - 10, // 50: inventory.ListAgentsResponse.qan_mongodb_profiler_agent:type_name -> inventory.QANMongoDBProfilerAgent - 11, // 51: inventory.ListAgentsResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.QANPostgreSQLPgStatementsAgent - 12, // 52: inventory.ListAgentsResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.QANPostgreSQLPgStatMonitorAgent - 13, // 53: inventory.ListAgentsResponse.rds_exporter:type_name -> inventory.RDSExporter - 14, // 54: inventory.ListAgentsResponse.external_exporter:type_name -> inventory.ExternalExporter - 15, // 55: inventory.ListAgentsResponse.azure_database_exporter:type_name -> inventory.AzureDatabaseExporter - 1, // 56: inventory.GetAgentResponse.pmm_agent:type_name -> inventory.PMMAgent - 2, // 57: inventory.GetAgentResponse.vmagent:type_name -> inventory.VMAgent - 3, // 58: inventory.GetAgentResponse.node_exporter:type_name -> inventory.NodeExporter - 4, // 59: inventory.GetAgentResponse.mysqld_exporter:type_name -> inventory.MySQLdExporter - 5, // 60: inventory.GetAgentResponse.mongodb_exporter:type_name -> inventory.MongoDBExporter - 6, // 61: inventory.GetAgentResponse.postgres_exporter:type_name -> inventory.PostgresExporter - 7, // 62: inventory.GetAgentResponse.proxysql_exporter:type_name -> inventory.ProxySQLExporter - 8, // 63: inventory.GetAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.QANMySQLPerfSchemaAgent - 9, // 64: inventory.GetAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.QANMySQLSlowlogAgent - 10, // 65: inventory.GetAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.QANMongoDBProfilerAgent - 11, // 66: inventory.GetAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.QANPostgreSQLPgStatementsAgent - 12, // 67: inventory.GetAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.QANPostgreSQLPgStatMonitorAgent - 13, // 68: inventory.GetAgentResponse.rds_exporter:type_name -> inventory.RDSExporter - 14, // 69: inventory.GetAgentResponse.external_exporter:type_name -> inventory.ExternalExporter - 15, // 70: inventory.GetAgentResponse.azure_database_exporter:type_name -> inventory.AzureDatabaseExporter - 94, // 71: inventory.AddPMMAgentRequest.custom_labels:type_name -> inventory.AddPMMAgentRequest.CustomLabelsEntry - 1, // 72: inventory.AddPMMAgentResponse.pmm_agent:type_name -> inventory.PMMAgent - 95, // 73: inventory.AddNodeExporterRequest.custom_labels:type_name -> inventory.AddNodeExporterRequest.CustomLabelsEntry - 109, // 74: inventory.AddNodeExporterRequest.log_level:type_name -> inventory.LogLevel - 3, // 75: inventory.AddNodeExporterResponse.node_exporter:type_name -> inventory.NodeExporter - 16, // 76: inventory.ChangeNodeExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams - 3, // 77: inventory.ChangeNodeExporterResponse.node_exporter:type_name -> inventory.NodeExporter - 96, // 78: inventory.AddMySQLdExporterRequest.custom_labels:type_name -> inventory.AddMySQLdExporterRequest.CustomLabelsEntry - 109, // 79: inventory.AddMySQLdExporterRequest.log_level:type_name -> inventory.LogLevel - 4, // 80: inventory.AddMySQLdExporterResponse.mysqld_exporter:type_name -> inventory.MySQLdExporter - 16, // 81: inventory.ChangeMySQLdExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams - 4, // 82: inventory.ChangeMySQLdExporterResponse.mysqld_exporter:type_name -> inventory.MySQLdExporter - 97, // 83: inventory.AddMongoDBExporterRequest.custom_labels:type_name -> inventory.AddMongoDBExporterRequest.CustomLabelsEntry - 109, // 84: inventory.AddMongoDBExporterRequest.log_level:type_name -> inventory.LogLevel - 5, // 85: inventory.AddMongoDBExporterResponse.mongodb_exporter:type_name -> inventory.MongoDBExporter - 16, // 86: inventory.ChangeMongoDBExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams - 5, // 87: inventory.ChangeMongoDBExporterResponse.mongodb_exporter:type_name -> inventory.MongoDBExporter - 98, // 88: inventory.AddPostgresExporterRequest.custom_labels:type_name -> inventory.AddPostgresExporterRequest.CustomLabelsEntry - 109, // 89: inventory.AddPostgresExporterRequest.log_level:type_name -> inventory.LogLevel - 6, // 90: inventory.AddPostgresExporterResponse.postgres_exporter:type_name -> inventory.PostgresExporter - 16, // 91: inventory.ChangePostgresExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams - 6, // 92: inventory.ChangePostgresExporterResponse.postgres_exporter:type_name -> inventory.PostgresExporter - 99, // 93: inventory.AddProxySQLExporterRequest.custom_labels:type_name -> inventory.AddProxySQLExporterRequest.CustomLabelsEntry - 109, // 94: inventory.AddProxySQLExporterRequest.log_level:type_name -> inventory.LogLevel - 7, // 95: inventory.AddProxySQLExporterResponse.proxysql_exporter:type_name -> inventory.ProxySQLExporter - 16, // 96: inventory.ChangeProxySQLExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams - 7, // 97: inventory.ChangeProxySQLExporterResponse.proxysql_exporter:type_name -> inventory.ProxySQLExporter - 100, // 98: inventory.AddQANMySQLPerfSchemaAgentRequest.custom_labels:type_name -> inventory.AddQANMySQLPerfSchemaAgentRequest.CustomLabelsEntry - 109, // 99: inventory.AddQANMySQLPerfSchemaAgentRequest.log_level:type_name -> inventory.LogLevel - 8, // 100: inventory.AddQANMySQLPerfSchemaAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.QANMySQLPerfSchemaAgent - 16, // 101: inventory.ChangeQANMySQLPerfSchemaAgentRequest.common:type_name -> inventory.ChangeCommonAgentParams - 8, // 102: inventory.ChangeQANMySQLPerfSchemaAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.QANMySQLPerfSchemaAgent - 101, // 103: inventory.AddQANMySQLSlowlogAgentRequest.custom_labels:type_name -> inventory.AddQANMySQLSlowlogAgentRequest.CustomLabelsEntry - 109, // 104: inventory.AddQANMySQLSlowlogAgentRequest.log_level:type_name -> inventory.LogLevel - 9, // 105: inventory.AddQANMySQLSlowlogAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.QANMySQLSlowlogAgent - 16, // 106: inventory.ChangeQANMySQLSlowlogAgentRequest.common:type_name -> inventory.ChangeCommonAgentParams - 9, // 107: inventory.ChangeQANMySQLSlowlogAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.QANMySQLSlowlogAgent - 102, // 108: inventory.AddQANMongoDBProfilerAgentRequest.custom_labels:type_name -> inventory.AddQANMongoDBProfilerAgentRequest.CustomLabelsEntry - 109, // 109: inventory.AddQANMongoDBProfilerAgentRequest.log_level:type_name -> inventory.LogLevel - 10, // 110: inventory.AddQANMongoDBProfilerAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.QANMongoDBProfilerAgent - 16, // 111: inventory.ChangeQANMongoDBProfilerAgentRequest.common:type_name -> inventory.ChangeCommonAgentParams - 10, // 112: inventory.ChangeQANMongoDBProfilerAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.QANMongoDBProfilerAgent - 103, // 113: inventory.AddQANPostgreSQLPgStatementsAgentRequest.custom_labels:type_name -> inventory.AddQANPostgreSQLPgStatementsAgentRequest.CustomLabelsEntry - 109, // 114: inventory.AddQANPostgreSQLPgStatementsAgentRequest.log_level:type_name -> inventory.LogLevel - 11, // 115: inventory.AddQANPostgreSQLPgStatementsAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.QANPostgreSQLPgStatementsAgent - 16, // 116: inventory.ChangeQANPostgreSQLPgStatementsAgentRequest.common:type_name -> inventory.ChangeCommonAgentParams - 11, // 117: inventory.ChangeQANPostgreSQLPgStatementsAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.QANPostgreSQLPgStatementsAgent - 104, // 118: inventory.AddQANPostgreSQLPgStatMonitorAgentRequest.custom_labels:type_name -> inventory.AddQANPostgreSQLPgStatMonitorAgentRequest.CustomLabelsEntry - 109, // 119: inventory.AddQANPostgreSQLPgStatMonitorAgentRequest.log_level:type_name -> inventory.LogLevel - 12, // 120: inventory.AddQANPostgreSQLPgStatMonitorAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.QANPostgreSQLPgStatMonitorAgent - 16, // 121: inventory.ChangeQANPostgreSQLPgStatMonitorAgentRequest.common:type_name -> inventory.ChangeCommonAgentParams - 12, // 122: inventory.ChangeQANPostgreSQLPgStatMonitorAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.QANPostgreSQLPgStatMonitorAgent - 105, // 123: inventory.AddRDSExporterRequest.custom_labels:type_name -> inventory.AddRDSExporterRequest.CustomLabelsEntry - 109, // 124: inventory.AddRDSExporterRequest.log_level:type_name -> inventory.LogLevel - 13, // 125: inventory.AddRDSExporterResponse.rds_exporter:type_name -> inventory.RDSExporter - 16, // 126: inventory.ChangeRDSExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams - 13, // 127: inventory.ChangeRDSExporterResponse.rds_exporter:type_name -> inventory.RDSExporter - 106, // 128: inventory.AddExternalExporterRequest.custom_labels:type_name -> inventory.AddExternalExporterRequest.CustomLabelsEntry - 14, // 129: inventory.AddExternalExporterResponse.external_exporter:type_name -> inventory.ExternalExporter - 16, // 130: inventory.ChangeExternalExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams - 14, // 131: inventory.ChangeExternalExporterResponse.external_exporter:type_name -> inventory.ExternalExporter - 107, // 132: inventory.AddAzureDatabaseExporterRequest.custom_labels:type_name -> inventory.AddAzureDatabaseExporterRequest.CustomLabelsEntry - 109, // 133: inventory.AddAzureDatabaseExporterRequest.log_level:type_name -> inventory.LogLevel - 15, // 134: inventory.AddAzureDatabaseExporterResponse.azure_database_exporter:type_name -> inventory.AzureDatabaseExporter - 16, // 135: inventory.ChangeAzureDatabaseExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams - 15, // 136: inventory.ChangeAzureDatabaseExporterResponse.azure_database_exporter:type_name -> inventory.AzureDatabaseExporter - 17, // 137: inventory.Agents.ListAgents:input_type -> inventory.ListAgentsRequest - 19, // 138: inventory.Agents.GetAgent:input_type -> inventory.GetAgentRequest - 21, // 139: inventory.Agents.GetAgentLogs:input_type -> inventory.GetAgentLogsRequest - 23, // 140: inventory.Agents.AddPMMAgent:input_type -> inventory.AddPMMAgentRequest - 25, // 141: inventory.Agents.AddNodeExporter:input_type -> inventory.AddNodeExporterRequest - 27, // 142: inventory.Agents.ChangeNodeExporter:input_type -> inventory.ChangeNodeExporterRequest - 29, // 143: inventory.Agents.AddMySQLdExporter:input_type -> inventory.AddMySQLdExporterRequest - 31, // 144: inventory.Agents.ChangeMySQLdExporter:input_type -> inventory.ChangeMySQLdExporterRequest - 33, // 145: inventory.Agents.AddMongoDBExporter:input_type -> inventory.AddMongoDBExporterRequest - 35, // 146: inventory.Agents.ChangeMongoDBExporter:input_type -> inventory.ChangeMongoDBExporterRequest - 37, // 147: inventory.Agents.AddPostgresExporter:input_type -> inventory.AddPostgresExporterRequest - 39, // 148: inventory.Agents.ChangePostgresExporter:input_type -> inventory.ChangePostgresExporterRequest - 41, // 149: inventory.Agents.AddProxySQLExporter:input_type -> inventory.AddProxySQLExporterRequest - 43, // 150: inventory.Agents.ChangeProxySQLExporter:input_type -> inventory.ChangeProxySQLExporterRequest - 45, // 151: inventory.Agents.AddQANMySQLPerfSchemaAgent:input_type -> inventory.AddQANMySQLPerfSchemaAgentRequest - 47, // 152: inventory.Agents.ChangeQANMySQLPerfSchemaAgent:input_type -> inventory.ChangeQANMySQLPerfSchemaAgentRequest - 49, // 153: inventory.Agents.AddQANMySQLSlowlogAgent:input_type -> inventory.AddQANMySQLSlowlogAgentRequest - 51, // 154: inventory.Agents.ChangeQANMySQLSlowlogAgent:input_type -> inventory.ChangeQANMySQLSlowlogAgentRequest - 53, // 155: inventory.Agents.AddQANMongoDBProfilerAgent:input_type -> inventory.AddQANMongoDBProfilerAgentRequest - 55, // 156: inventory.Agents.ChangeQANMongoDBProfilerAgent:input_type -> inventory.ChangeQANMongoDBProfilerAgentRequest - 57, // 157: inventory.Agents.AddQANPostgreSQLPgStatementsAgent:input_type -> inventory.AddQANPostgreSQLPgStatementsAgentRequest - 59, // 158: inventory.Agents.ChangeQANPostgreSQLPgStatementsAgent:input_type -> inventory.ChangeQANPostgreSQLPgStatementsAgentRequest - 61, // 159: inventory.Agents.AddQANPostgreSQLPgStatMonitorAgent:input_type -> inventory.AddQANPostgreSQLPgStatMonitorAgentRequest - 63, // 160: inventory.Agents.ChangeQANPostgreSQLPgStatMonitorAgent:input_type -> inventory.ChangeQANPostgreSQLPgStatMonitorAgentRequest - 65, // 161: inventory.Agents.AddRDSExporter:input_type -> inventory.AddRDSExporterRequest - 67, // 162: inventory.Agents.ChangeRDSExporter:input_type -> inventory.ChangeRDSExporterRequest - 69, // 163: inventory.Agents.AddExternalExporter:input_type -> inventory.AddExternalExporterRequest - 71, // 164: inventory.Agents.ChangeExternalExporter:input_type -> inventory.ChangeExternalExporterRequest - 73, // 165: inventory.Agents.AddAzureDatabaseExporter:input_type -> inventory.AddAzureDatabaseExporterRequest - 75, // 166: inventory.Agents.ChangeAzureDatabaseExporter:input_type -> inventory.ChangeAzureDatabaseExporterRequest - 77, // 167: inventory.Agents.RemoveAgent:input_type -> inventory.RemoveAgentRequest - 18, // 168: inventory.Agents.ListAgents:output_type -> inventory.ListAgentsResponse - 20, // 169: inventory.Agents.GetAgent:output_type -> inventory.GetAgentResponse - 22, // 170: inventory.Agents.GetAgentLogs:output_type -> inventory.GetAgentLogsResponse - 24, // 171: inventory.Agents.AddPMMAgent:output_type -> inventory.AddPMMAgentResponse - 26, // 172: inventory.Agents.AddNodeExporter:output_type -> inventory.AddNodeExporterResponse - 28, // 173: inventory.Agents.ChangeNodeExporter:output_type -> inventory.ChangeNodeExporterResponse - 30, // 174: inventory.Agents.AddMySQLdExporter:output_type -> inventory.AddMySQLdExporterResponse - 32, // 175: inventory.Agents.ChangeMySQLdExporter:output_type -> inventory.ChangeMySQLdExporterResponse - 34, // 176: inventory.Agents.AddMongoDBExporter:output_type -> inventory.AddMongoDBExporterResponse - 36, // 177: inventory.Agents.ChangeMongoDBExporter:output_type -> inventory.ChangeMongoDBExporterResponse - 38, // 178: inventory.Agents.AddPostgresExporter:output_type -> inventory.AddPostgresExporterResponse - 40, // 179: inventory.Agents.ChangePostgresExporter:output_type -> inventory.ChangePostgresExporterResponse - 42, // 180: inventory.Agents.AddProxySQLExporter:output_type -> inventory.AddProxySQLExporterResponse - 44, // 181: inventory.Agents.ChangeProxySQLExporter:output_type -> inventory.ChangeProxySQLExporterResponse - 46, // 182: inventory.Agents.AddQANMySQLPerfSchemaAgent:output_type -> inventory.AddQANMySQLPerfSchemaAgentResponse - 48, // 183: inventory.Agents.ChangeQANMySQLPerfSchemaAgent:output_type -> inventory.ChangeQANMySQLPerfSchemaAgentResponse - 50, // 184: inventory.Agents.AddQANMySQLSlowlogAgent:output_type -> inventory.AddQANMySQLSlowlogAgentResponse - 52, // 185: inventory.Agents.ChangeQANMySQLSlowlogAgent:output_type -> inventory.ChangeQANMySQLSlowlogAgentResponse - 54, // 186: inventory.Agents.AddQANMongoDBProfilerAgent:output_type -> inventory.AddQANMongoDBProfilerAgentResponse - 56, // 187: inventory.Agents.ChangeQANMongoDBProfilerAgent:output_type -> inventory.ChangeQANMongoDBProfilerAgentResponse - 58, // 188: inventory.Agents.AddQANPostgreSQLPgStatementsAgent:output_type -> inventory.AddQANPostgreSQLPgStatementsAgentResponse - 60, // 189: inventory.Agents.ChangeQANPostgreSQLPgStatementsAgent:output_type -> inventory.ChangeQANPostgreSQLPgStatementsAgentResponse - 62, // 190: inventory.Agents.AddQANPostgreSQLPgStatMonitorAgent:output_type -> inventory.AddQANPostgreSQLPgStatMonitorAgentResponse - 64, // 191: inventory.Agents.ChangeQANPostgreSQLPgStatMonitorAgent:output_type -> inventory.ChangeQANPostgreSQLPgStatMonitorAgentResponse - 66, // 192: inventory.Agents.AddRDSExporter:output_type -> inventory.AddRDSExporterResponse - 68, // 193: inventory.Agents.ChangeRDSExporter:output_type -> inventory.ChangeRDSExporterResponse - 70, // 194: inventory.Agents.AddExternalExporter:output_type -> inventory.AddExternalExporterResponse - 72, // 195: inventory.Agents.ChangeExternalExporter:output_type -> inventory.ChangeExternalExporterResponse - 74, // 196: inventory.Agents.AddAzureDatabaseExporter:output_type -> inventory.AddAzureDatabaseExporterResponse - 76, // 197: inventory.Agents.ChangeAzureDatabaseExporter:output_type -> inventory.ChangeAzureDatabaseExporterResponse - 78, // 198: inventory.Agents.RemoveAgent:output_type -> inventory.RemoveAgentResponse - 168, // [168:199] is the sub-list for method output_type - 137, // [137:168] is the sub-list for method input_type - 137, // [137:137] is the sub-list for extension type_name - 137, // [137:137] is the sub-list for extension extendee - 0, // [0:137] is the sub-list for field type_name + 110, // 5: inventory.NodeExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 81, // 6: inventory.MySQLdExporter.custom_labels:type_name -> inventory.MySQLdExporter.CustomLabelsEntry + 108, // 7: inventory.MySQLdExporter.status:type_name -> inventory.AgentStatus + 109, // 8: inventory.MySQLdExporter.log_level:type_name -> inventory.LogLevel + 110, // 9: inventory.MySQLdExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 82, // 10: inventory.MongoDBExporter.custom_labels:type_name -> inventory.MongoDBExporter.CustomLabelsEntry + 108, // 11: inventory.MongoDBExporter.status:type_name -> inventory.AgentStatus + 109, // 12: inventory.MongoDBExporter.log_level:type_name -> inventory.LogLevel + 110, // 13: inventory.MongoDBExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 83, // 14: inventory.PostgresExporter.custom_labels:type_name -> inventory.PostgresExporter.CustomLabelsEntry + 108, // 15: inventory.PostgresExporter.status:type_name -> inventory.AgentStatus + 109, // 16: inventory.PostgresExporter.log_level:type_name -> inventory.LogLevel + 110, // 17: inventory.PostgresExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 84, // 18: inventory.ProxySQLExporter.custom_labels:type_name -> inventory.ProxySQLExporter.CustomLabelsEntry + 108, // 19: inventory.ProxySQLExporter.status:type_name -> inventory.AgentStatus + 109, // 20: inventory.ProxySQLExporter.log_level:type_name -> inventory.LogLevel + 110, // 21: inventory.ProxySQLExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 85, // 22: inventory.QANMySQLPerfSchemaAgent.custom_labels:type_name -> inventory.QANMySQLPerfSchemaAgent.CustomLabelsEntry + 108, // 23: inventory.QANMySQLPerfSchemaAgent.status:type_name -> inventory.AgentStatus + 109, // 24: inventory.QANMySQLPerfSchemaAgent.log_level:type_name -> inventory.LogLevel + 86, // 25: inventory.QANMySQLSlowlogAgent.custom_labels:type_name -> inventory.QANMySQLSlowlogAgent.CustomLabelsEntry + 108, // 26: inventory.QANMySQLSlowlogAgent.status:type_name -> inventory.AgentStatus + 109, // 27: inventory.QANMySQLSlowlogAgent.log_level:type_name -> inventory.LogLevel + 87, // 28: inventory.QANMongoDBProfilerAgent.custom_labels:type_name -> inventory.QANMongoDBProfilerAgent.CustomLabelsEntry + 108, // 29: inventory.QANMongoDBProfilerAgent.status:type_name -> inventory.AgentStatus + 109, // 30: inventory.QANMongoDBProfilerAgent.log_level:type_name -> inventory.LogLevel + 88, // 31: inventory.QANPostgreSQLPgStatementsAgent.custom_labels:type_name -> inventory.QANPostgreSQLPgStatementsAgent.CustomLabelsEntry + 108, // 32: inventory.QANPostgreSQLPgStatementsAgent.status:type_name -> inventory.AgentStatus + 109, // 33: inventory.QANPostgreSQLPgStatementsAgent.log_level:type_name -> inventory.LogLevel + 89, // 34: inventory.QANPostgreSQLPgStatMonitorAgent.custom_labels:type_name -> inventory.QANPostgreSQLPgStatMonitorAgent.CustomLabelsEntry + 108, // 35: inventory.QANPostgreSQLPgStatMonitorAgent.status:type_name -> inventory.AgentStatus + 109, // 36: inventory.QANPostgreSQLPgStatMonitorAgent.log_level:type_name -> inventory.LogLevel + 90, // 37: inventory.RDSExporter.custom_labels:type_name -> inventory.RDSExporter.CustomLabelsEntry + 108, // 38: inventory.RDSExporter.status:type_name -> inventory.AgentStatus + 109, // 39: inventory.RDSExporter.log_level:type_name -> inventory.LogLevel + 110, // 40: inventory.RDSExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 91, // 41: inventory.ExternalExporter.custom_labels:type_name -> inventory.ExternalExporter.CustomLabelsEntry + 110, // 42: inventory.ExternalExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 92, // 43: inventory.AzureDatabaseExporter.custom_labels:type_name -> inventory.AzureDatabaseExporter.CustomLabelsEntry + 108, // 44: inventory.AzureDatabaseExporter.status:type_name -> inventory.AgentStatus + 109, // 45: inventory.AzureDatabaseExporter.log_level:type_name -> inventory.LogLevel + 110, // 46: inventory.AzureDatabaseExporter.metrics_resolutions:type_name -> common.MetricsResolutions + 93, // 47: inventory.ChangeCommonAgentParams.custom_labels:type_name -> inventory.ChangeCommonAgentParams.CustomLabelsEntry + 110, // 48: inventory.ChangeCommonAgentParams.metrics_resolutions:type_name -> common.MetricsResolutions + 0, // 49: inventory.ListAgentsRequest.agent_type:type_name -> inventory.AgentType + 1, // 50: inventory.ListAgentsResponse.pmm_agent:type_name -> inventory.PMMAgent + 2, // 51: inventory.ListAgentsResponse.vm_agent:type_name -> inventory.VMAgent + 3, // 52: inventory.ListAgentsResponse.node_exporter:type_name -> inventory.NodeExporter + 4, // 53: inventory.ListAgentsResponse.mysqld_exporter:type_name -> inventory.MySQLdExporter + 5, // 54: inventory.ListAgentsResponse.mongodb_exporter:type_name -> inventory.MongoDBExporter + 6, // 55: inventory.ListAgentsResponse.postgres_exporter:type_name -> inventory.PostgresExporter + 7, // 56: inventory.ListAgentsResponse.proxysql_exporter:type_name -> inventory.ProxySQLExporter + 8, // 57: inventory.ListAgentsResponse.qan_mysql_perfschema_agent:type_name -> inventory.QANMySQLPerfSchemaAgent + 9, // 58: inventory.ListAgentsResponse.qan_mysql_slowlog_agent:type_name -> inventory.QANMySQLSlowlogAgent + 10, // 59: inventory.ListAgentsResponse.qan_mongodb_profiler_agent:type_name -> inventory.QANMongoDBProfilerAgent + 11, // 60: inventory.ListAgentsResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.QANPostgreSQLPgStatementsAgent + 12, // 61: inventory.ListAgentsResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.QANPostgreSQLPgStatMonitorAgent + 13, // 62: inventory.ListAgentsResponse.rds_exporter:type_name -> inventory.RDSExporter + 14, // 63: inventory.ListAgentsResponse.external_exporter:type_name -> inventory.ExternalExporter + 15, // 64: inventory.ListAgentsResponse.azure_database_exporter:type_name -> inventory.AzureDatabaseExporter + 1, // 65: inventory.GetAgentResponse.pmm_agent:type_name -> inventory.PMMAgent + 2, // 66: inventory.GetAgentResponse.vmagent:type_name -> inventory.VMAgent + 3, // 67: inventory.GetAgentResponse.node_exporter:type_name -> inventory.NodeExporter + 4, // 68: inventory.GetAgentResponse.mysqld_exporter:type_name -> inventory.MySQLdExporter + 5, // 69: inventory.GetAgentResponse.mongodb_exporter:type_name -> inventory.MongoDBExporter + 6, // 70: inventory.GetAgentResponse.postgres_exporter:type_name -> inventory.PostgresExporter + 7, // 71: inventory.GetAgentResponse.proxysql_exporter:type_name -> inventory.ProxySQLExporter + 8, // 72: inventory.GetAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.QANMySQLPerfSchemaAgent + 9, // 73: inventory.GetAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.QANMySQLSlowlogAgent + 10, // 74: inventory.GetAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.QANMongoDBProfilerAgent + 11, // 75: inventory.GetAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.QANPostgreSQLPgStatementsAgent + 12, // 76: inventory.GetAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.QANPostgreSQLPgStatMonitorAgent + 13, // 77: inventory.GetAgentResponse.rds_exporter:type_name -> inventory.RDSExporter + 14, // 78: inventory.GetAgentResponse.external_exporter:type_name -> inventory.ExternalExporter + 15, // 79: inventory.GetAgentResponse.azure_database_exporter:type_name -> inventory.AzureDatabaseExporter + 94, // 80: inventory.AddPMMAgentRequest.custom_labels:type_name -> inventory.AddPMMAgentRequest.CustomLabelsEntry + 1, // 81: inventory.AddPMMAgentResponse.pmm_agent:type_name -> inventory.PMMAgent + 95, // 82: inventory.AddNodeExporterRequest.custom_labels:type_name -> inventory.AddNodeExporterRequest.CustomLabelsEntry + 109, // 83: inventory.AddNodeExporterRequest.log_level:type_name -> inventory.LogLevel + 3, // 84: inventory.AddNodeExporterResponse.node_exporter:type_name -> inventory.NodeExporter + 16, // 85: inventory.ChangeNodeExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams + 3, // 86: inventory.ChangeNodeExporterResponse.node_exporter:type_name -> inventory.NodeExporter + 96, // 87: inventory.AddMySQLdExporterRequest.custom_labels:type_name -> inventory.AddMySQLdExporterRequest.CustomLabelsEntry + 109, // 88: inventory.AddMySQLdExporterRequest.log_level:type_name -> inventory.LogLevel + 4, // 89: inventory.AddMySQLdExporterResponse.mysqld_exporter:type_name -> inventory.MySQLdExporter + 16, // 90: inventory.ChangeMySQLdExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams + 4, // 91: inventory.ChangeMySQLdExporterResponse.mysqld_exporter:type_name -> inventory.MySQLdExporter + 97, // 92: inventory.AddMongoDBExporterRequest.custom_labels:type_name -> inventory.AddMongoDBExporterRequest.CustomLabelsEntry + 109, // 93: inventory.AddMongoDBExporterRequest.log_level:type_name -> inventory.LogLevel + 5, // 94: inventory.AddMongoDBExporterResponse.mongodb_exporter:type_name -> inventory.MongoDBExporter + 16, // 95: inventory.ChangeMongoDBExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams + 5, // 96: inventory.ChangeMongoDBExporterResponse.mongodb_exporter:type_name -> inventory.MongoDBExporter + 98, // 97: inventory.AddPostgresExporterRequest.custom_labels:type_name -> inventory.AddPostgresExporterRequest.CustomLabelsEntry + 109, // 98: inventory.AddPostgresExporterRequest.log_level:type_name -> inventory.LogLevel + 6, // 99: inventory.AddPostgresExporterResponse.postgres_exporter:type_name -> inventory.PostgresExporter + 16, // 100: inventory.ChangePostgresExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams + 6, // 101: inventory.ChangePostgresExporterResponse.postgres_exporter:type_name -> inventory.PostgresExporter + 99, // 102: inventory.AddProxySQLExporterRequest.custom_labels:type_name -> inventory.AddProxySQLExporterRequest.CustomLabelsEntry + 109, // 103: inventory.AddProxySQLExporterRequest.log_level:type_name -> inventory.LogLevel + 7, // 104: inventory.AddProxySQLExporterResponse.proxysql_exporter:type_name -> inventory.ProxySQLExporter + 16, // 105: inventory.ChangeProxySQLExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams + 7, // 106: inventory.ChangeProxySQLExporterResponse.proxysql_exporter:type_name -> inventory.ProxySQLExporter + 100, // 107: inventory.AddQANMySQLPerfSchemaAgentRequest.custom_labels:type_name -> inventory.AddQANMySQLPerfSchemaAgentRequest.CustomLabelsEntry + 109, // 108: inventory.AddQANMySQLPerfSchemaAgentRequest.log_level:type_name -> inventory.LogLevel + 8, // 109: inventory.AddQANMySQLPerfSchemaAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.QANMySQLPerfSchemaAgent + 16, // 110: inventory.ChangeQANMySQLPerfSchemaAgentRequest.common:type_name -> inventory.ChangeCommonAgentParams + 8, // 111: inventory.ChangeQANMySQLPerfSchemaAgentResponse.qan_mysql_perfschema_agent:type_name -> inventory.QANMySQLPerfSchemaAgent + 101, // 112: inventory.AddQANMySQLSlowlogAgentRequest.custom_labels:type_name -> inventory.AddQANMySQLSlowlogAgentRequest.CustomLabelsEntry + 109, // 113: inventory.AddQANMySQLSlowlogAgentRequest.log_level:type_name -> inventory.LogLevel + 9, // 114: inventory.AddQANMySQLSlowlogAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.QANMySQLSlowlogAgent + 16, // 115: inventory.ChangeQANMySQLSlowlogAgentRequest.common:type_name -> inventory.ChangeCommonAgentParams + 9, // 116: inventory.ChangeQANMySQLSlowlogAgentResponse.qan_mysql_slowlog_agent:type_name -> inventory.QANMySQLSlowlogAgent + 102, // 117: inventory.AddQANMongoDBProfilerAgentRequest.custom_labels:type_name -> inventory.AddQANMongoDBProfilerAgentRequest.CustomLabelsEntry + 109, // 118: inventory.AddQANMongoDBProfilerAgentRequest.log_level:type_name -> inventory.LogLevel + 10, // 119: inventory.AddQANMongoDBProfilerAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.QANMongoDBProfilerAgent + 16, // 120: inventory.ChangeQANMongoDBProfilerAgentRequest.common:type_name -> inventory.ChangeCommonAgentParams + 10, // 121: inventory.ChangeQANMongoDBProfilerAgentResponse.qan_mongodb_profiler_agent:type_name -> inventory.QANMongoDBProfilerAgent + 103, // 122: inventory.AddQANPostgreSQLPgStatementsAgentRequest.custom_labels:type_name -> inventory.AddQANPostgreSQLPgStatementsAgentRequest.CustomLabelsEntry + 109, // 123: inventory.AddQANPostgreSQLPgStatementsAgentRequest.log_level:type_name -> inventory.LogLevel + 11, // 124: inventory.AddQANPostgreSQLPgStatementsAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.QANPostgreSQLPgStatementsAgent + 16, // 125: inventory.ChangeQANPostgreSQLPgStatementsAgentRequest.common:type_name -> inventory.ChangeCommonAgentParams + 11, // 126: inventory.ChangeQANPostgreSQLPgStatementsAgentResponse.qan_postgresql_pgstatements_agent:type_name -> inventory.QANPostgreSQLPgStatementsAgent + 104, // 127: inventory.AddQANPostgreSQLPgStatMonitorAgentRequest.custom_labels:type_name -> inventory.AddQANPostgreSQLPgStatMonitorAgentRequest.CustomLabelsEntry + 109, // 128: inventory.AddQANPostgreSQLPgStatMonitorAgentRequest.log_level:type_name -> inventory.LogLevel + 12, // 129: inventory.AddQANPostgreSQLPgStatMonitorAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.QANPostgreSQLPgStatMonitorAgent + 16, // 130: inventory.ChangeQANPostgreSQLPgStatMonitorAgentRequest.common:type_name -> inventory.ChangeCommonAgentParams + 12, // 131: inventory.ChangeQANPostgreSQLPgStatMonitorAgentResponse.qan_postgresql_pgstatmonitor_agent:type_name -> inventory.QANPostgreSQLPgStatMonitorAgent + 105, // 132: inventory.AddRDSExporterRequest.custom_labels:type_name -> inventory.AddRDSExporterRequest.CustomLabelsEntry + 109, // 133: inventory.AddRDSExporterRequest.log_level:type_name -> inventory.LogLevel + 13, // 134: inventory.AddRDSExporterResponse.rds_exporter:type_name -> inventory.RDSExporter + 16, // 135: inventory.ChangeRDSExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams + 13, // 136: inventory.ChangeRDSExporterResponse.rds_exporter:type_name -> inventory.RDSExporter + 106, // 137: inventory.AddExternalExporterRequest.custom_labels:type_name -> inventory.AddExternalExporterRequest.CustomLabelsEntry + 14, // 138: inventory.AddExternalExporterResponse.external_exporter:type_name -> inventory.ExternalExporter + 16, // 139: inventory.ChangeExternalExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams + 14, // 140: inventory.ChangeExternalExporterResponse.external_exporter:type_name -> inventory.ExternalExporter + 107, // 141: inventory.AddAzureDatabaseExporterRequest.custom_labels:type_name -> inventory.AddAzureDatabaseExporterRequest.CustomLabelsEntry + 109, // 142: inventory.AddAzureDatabaseExporterRequest.log_level:type_name -> inventory.LogLevel + 15, // 143: inventory.AddAzureDatabaseExporterResponse.azure_database_exporter:type_name -> inventory.AzureDatabaseExporter + 16, // 144: inventory.ChangeAzureDatabaseExporterRequest.common:type_name -> inventory.ChangeCommonAgentParams + 15, // 145: inventory.ChangeAzureDatabaseExporterResponse.azure_database_exporter:type_name -> inventory.AzureDatabaseExporter + 17, // 146: inventory.Agents.ListAgents:input_type -> inventory.ListAgentsRequest + 19, // 147: inventory.Agents.GetAgent:input_type -> inventory.GetAgentRequest + 21, // 148: inventory.Agents.GetAgentLogs:input_type -> inventory.GetAgentLogsRequest + 23, // 149: inventory.Agents.AddPMMAgent:input_type -> inventory.AddPMMAgentRequest + 25, // 150: inventory.Agents.AddNodeExporter:input_type -> inventory.AddNodeExporterRequest + 27, // 151: inventory.Agents.ChangeNodeExporter:input_type -> inventory.ChangeNodeExporterRequest + 29, // 152: inventory.Agents.AddMySQLdExporter:input_type -> inventory.AddMySQLdExporterRequest + 31, // 153: inventory.Agents.ChangeMySQLdExporter:input_type -> inventory.ChangeMySQLdExporterRequest + 33, // 154: inventory.Agents.AddMongoDBExporter:input_type -> inventory.AddMongoDBExporterRequest + 35, // 155: inventory.Agents.ChangeMongoDBExporter:input_type -> inventory.ChangeMongoDBExporterRequest + 37, // 156: inventory.Agents.AddPostgresExporter:input_type -> inventory.AddPostgresExporterRequest + 39, // 157: inventory.Agents.ChangePostgresExporter:input_type -> inventory.ChangePostgresExporterRequest + 41, // 158: inventory.Agents.AddProxySQLExporter:input_type -> inventory.AddProxySQLExporterRequest + 43, // 159: inventory.Agents.ChangeProxySQLExporter:input_type -> inventory.ChangeProxySQLExporterRequest + 45, // 160: inventory.Agents.AddQANMySQLPerfSchemaAgent:input_type -> inventory.AddQANMySQLPerfSchemaAgentRequest + 47, // 161: inventory.Agents.ChangeQANMySQLPerfSchemaAgent:input_type -> inventory.ChangeQANMySQLPerfSchemaAgentRequest + 49, // 162: inventory.Agents.AddQANMySQLSlowlogAgent:input_type -> inventory.AddQANMySQLSlowlogAgentRequest + 51, // 163: inventory.Agents.ChangeQANMySQLSlowlogAgent:input_type -> inventory.ChangeQANMySQLSlowlogAgentRequest + 53, // 164: inventory.Agents.AddQANMongoDBProfilerAgent:input_type -> inventory.AddQANMongoDBProfilerAgentRequest + 55, // 165: inventory.Agents.ChangeQANMongoDBProfilerAgent:input_type -> inventory.ChangeQANMongoDBProfilerAgentRequest + 57, // 166: inventory.Agents.AddQANPostgreSQLPgStatementsAgent:input_type -> inventory.AddQANPostgreSQLPgStatementsAgentRequest + 59, // 167: inventory.Agents.ChangeQANPostgreSQLPgStatementsAgent:input_type -> inventory.ChangeQANPostgreSQLPgStatementsAgentRequest + 61, // 168: inventory.Agents.AddQANPostgreSQLPgStatMonitorAgent:input_type -> inventory.AddQANPostgreSQLPgStatMonitorAgentRequest + 63, // 169: inventory.Agents.ChangeQANPostgreSQLPgStatMonitorAgent:input_type -> inventory.ChangeQANPostgreSQLPgStatMonitorAgentRequest + 65, // 170: inventory.Agents.AddRDSExporter:input_type -> inventory.AddRDSExporterRequest + 67, // 171: inventory.Agents.ChangeRDSExporter:input_type -> inventory.ChangeRDSExporterRequest + 69, // 172: inventory.Agents.AddExternalExporter:input_type -> inventory.AddExternalExporterRequest + 71, // 173: inventory.Agents.ChangeExternalExporter:input_type -> inventory.ChangeExternalExporterRequest + 73, // 174: inventory.Agents.AddAzureDatabaseExporter:input_type -> inventory.AddAzureDatabaseExporterRequest + 75, // 175: inventory.Agents.ChangeAzureDatabaseExporter:input_type -> inventory.ChangeAzureDatabaseExporterRequest + 77, // 176: inventory.Agents.RemoveAgent:input_type -> inventory.RemoveAgentRequest + 18, // 177: inventory.Agents.ListAgents:output_type -> inventory.ListAgentsResponse + 20, // 178: inventory.Agents.GetAgent:output_type -> inventory.GetAgentResponse + 22, // 179: inventory.Agents.GetAgentLogs:output_type -> inventory.GetAgentLogsResponse + 24, // 180: inventory.Agents.AddPMMAgent:output_type -> inventory.AddPMMAgentResponse + 26, // 181: inventory.Agents.AddNodeExporter:output_type -> inventory.AddNodeExporterResponse + 28, // 182: inventory.Agents.ChangeNodeExporter:output_type -> inventory.ChangeNodeExporterResponse + 30, // 183: inventory.Agents.AddMySQLdExporter:output_type -> inventory.AddMySQLdExporterResponse + 32, // 184: inventory.Agents.ChangeMySQLdExporter:output_type -> inventory.ChangeMySQLdExporterResponse + 34, // 185: inventory.Agents.AddMongoDBExporter:output_type -> inventory.AddMongoDBExporterResponse + 36, // 186: inventory.Agents.ChangeMongoDBExporter:output_type -> inventory.ChangeMongoDBExporterResponse + 38, // 187: inventory.Agents.AddPostgresExporter:output_type -> inventory.AddPostgresExporterResponse + 40, // 188: inventory.Agents.ChangePostgresExporter:output_type -> inventory.ChangePostgresExporterResponse + 42, // 189: inventory.Agents.AddProxySQLExporter:output_type -> inventory.AddProxySQLExporterResponse + 44, // 190: inventory.Agents.ChangeProxySQLExporter:output_type -> inventory.ChangeProxySQLExporterResponse + 46, // 191: inventory.Agents.AddQANMySQLPerfSchemaAgent:output_type -> inventory.AddQANMySQLPerfSchemaAgentResponse + 48, // 192: inventory.Agents.ChangeQANMySQLPerfSchemaAgent:output_type -> inventory.ChangeQANMySQLPerfSchemaAgentResponse + 50, // 193: inventory.Agents.AddQANMySQLSlowlogAgent:output_type -> inventory.AddQANMySQLSlowlogAgentResponse + 52, // 194: inventory.Agents.ChangeQANMySQLSlowlogAgent:output_type -> inventory.ChangeQANMySQLSlowlogAgentResponse + 54, // 195: inventory.Agents.AddQANMongoDBProfilerAgent:output_type -> inventory.AddQANMongoDBProfilerAgentResponse + 56, // 196: inventory.Agents.ChangeQANMongoDBProfilerAgent:output_type -> inventory.ChangeQANMongoDBProfilerAgentResponse + 58, // 197: inventory.Agents.AddQANPostgreSQLPgStatementsAgent:output_type -> inventory.AddQANPostgreSQLPgStatementsAgentResponse + 60, // 198: inventory.Agents.ChangeQANPostgreSQLPgStatementsAgent:output_type -> inventory.ChangeQANPostgreSQLPgStatementsAgentResponse + 62, // 199: inventory.Agents.AddQANPostgreSQLPgStatMonitorAgent:output_type -> inventory.AddQANPostgreSQLPgStatMonitorAgentResponse + 64, // 200: inventory.Agents.ChangeQANPostgreSQLPgStatMonitorAgent:output_type -> inventory.ChangeQANPostgreSQLPgStatMonitorAgentResponse + 66, // 201: inventory.Agents.AddRDSExporter:output_type -> inventory.AddRDSExporterResponse + 68, // 202: inventory.Agents.ChangeRDSExporter:output_type -> inventory.ChangeRDSExporterResponse + 70, // 203: inventory.Agents.AddExternalExporter:output_type -> inventory.AddExternalExporterResponse + 72, // 204: inventory.Agents.ChangeExternalExporter:output_type -> inventory.ChangeExternalExporterResponse + 74, // 205: inventory.Agents.AddAzureDatabaseExporter:output_type -> inventory.AddAzureDatabaseExporterResponse + 76, // 206: inventory.Agents.ChangeAzureDatabaseExporter:output_type -> inventory.ChangeAzureDatabaseExporterResponse + 78, // 207: inventory.Agents.RemoveAgent:output_type -> inventory.RemoveAgentResponse + 177, // [177:208] is the sub-list for method output_type + 146, // [146:177] is the sub-list for method input_type + 146, // [146:146] is the sub-list for extension type_name + 146, // [146:146] is the sub-list for extension extendee + 0, // [0:146] is the sub-list for field type_name } func init() { file_inventorypb_agents_proto_init() } diff --git a/api/inventorypb/agents.pb.validate.go b/api/inventorypb/agents.pb.validate.go index ec5a9c028d..ec09dda3c8 100644 --- a/api/inventorypb/agents.pb.validate.go +++ b/api/inventorypb/agents.pb.validate.go @@ -294,6 +294,35 @@ func (m *NodeExporter) validate(all bool) error { // no validation rules for ExposeExporter + if all { + switch v := interface{}(m.GetMetricsResolutions()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, NodeExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, NodeExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsResolutions()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return NodeExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return NodeExporterMultiError(errors) } @@ -431,6 +460,35 @@ func (m *MySQLdExporter) validate(all bool) error { // no validation rules for ExposeExporter + if all { + switch v := interface{}(m.GetMetricsResolutions()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MySQLdExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MySQLdExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsResolutions()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MySQLdExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return MySQLdExporterMultiError(errors) } @@ -563,6 +621,35 @@ func (m *MongoDBExporter) validate(all bool) error { // no validation rules for ExposeExporter + if all { + switch v := interface{}(m.GetMetricsResolutions()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, MongoDBExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, MongoDBExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsResolutions()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return MongoDBExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return MongoDBExporterMultiError(errors) } @@ -695,6 +782,35 @@ func (m *PostgresExporter) validate(all bool) error { // no validation rules for MaxExporterConnections + if all { + switch v := interface{}(m.GetMetricsResolutions()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, PostgresExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, PostgresExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsResolutions()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return PostgresExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return PostgresExporterMultiError(errors) } @@ -823,6 +939,35 @@ func (m *ProxySQLExporter) validate(all bool) error { // no validation rules for ExposeExporter + if all { + switch v := interface{}(m.GetMetricsResolutions()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ProxySQLExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ProxySQLExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsResolutions()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ProxySQLExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return ProxySQLExporterMultiError(errors) } @@ -1611,6 +1756,35 @@ func (m *RDSExporter) validate(all bool) error { // no validation rules for AutoDiscoveryLimit + if all { + switch v := interface{}(m.GetMetricsResolutions()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RDSExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RDSExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsResolutions()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RDSExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return RDSExporterMultiError(errors) } @@ -1732,6 +1906,35 @@ func (m *ExternalExporter) validate(all bool) error { // no validation rules for ProcessExecPath + if all { + switch v := interface{}(m.GetMetricsResolutions()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ExternalExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ExternalExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsResolutions()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ExternalExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return ExternalExporterMultiError(errors) } @@ -1856,6 +2059,35 @@ func (m *AzureDatabaseExporter) validate(all bool) error { // no validation rules for LogLevel + if all { + switch v := interface{}(m.GetMetricsResolutions()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, AzureDatabaseExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, AzureDatabaseExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsResolutions()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return AzureDatabaseExporterValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return AzureDatabaseExporterMultiError(errors) } @@ -1970,6 +2202,35 @@ func (m *ChangeCommonAgentParams) validate(all bool) error { // no validation rules for DisablePushMetrics + if all { + switch v := interface{}(m.GetMetricsResolutions()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ChangeCommonAgentParamsValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ChangeCommonAgentParamsValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetMetricsResolutions()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ChangeCommonAgentParamsValidationError{ + field: "MetricsResolutions", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return ChangeCommonAgentParamsMultiError(errors) } diff --git a/api/inventorypb/agents.proto b/api/inventorypb/agents.proto index 948c8d27b0..9f5c467795 100644 --- a/api/inventorypb/agents.proto +++ b/api/inventorypb/agents.proto @@ -2,6 +2,7 @@ syntax = "proto3"; package inventory; +import "common/metrics_resolutions.proto"; import "google/api/annotations.proto"; import "inventorypb/agent_status.proto"; import "inventorypb/log_level.proto"; @@ -97,6 +98,8 @@ message NodeExporter { // Optionally expose the exporter process on all public interfaces bool expose_exporter = 11; + // Metrics resolution for this agent. + common.MetricsResolutions metrics_resolutions = 12; } // MySQLdExporter runs on Generic or Container Node and exposes MySQL Service metrics. @@ -147,6 +150,8 @@ message MySQLdExporter { LogLevel log_level = 19; // Optionally expose the exporter process on all public interfaces bool expose_exporter = 20; + // Metrics resolution for this agent. + common.MetricsResolutions metrics_resolutions = 21; } // MongoDBExporter runs on Generic or Container Node and exposes MongoDB Service metrics. @@ -192,6 +197,8 @@ message MongoDBExporter { LogLevel log_level = 17; // Optionally expose the exporter process on all public interfaces bool expose_exporter = 18; + // Metrics resolution for this agent. + common.MetricsResolutions metrics_resolutions = 19; } // PostgresExporter runs on Generic or Container Node and exposes PostgreSQL Service metrics. @@ -230,6 +237,8 @@ message PostgresExporter { bool expose_exporter = 16; // Maximum number of connections that exporter can open to the database instance. int32 max_exporter_connections = 17; + // Metrics resolution for this agent. + common.MetricsResolutions metrics_resolutions = 18; } // ProxySQLExporter runs on Generic or Container Node and exposes ProxySQL Service metrics. @@ -268,6 +277,8 @@ message ProxySQLExporter { LogLevel log_level = 14; // Optionally expose the exporter process on all public interfaces bool expose_exporter = 15; + // Metrics resolution for this agent. + common.MetricsResolutions metrics_resolutions = 16; } // QANMySQLPerfSchemaAgent runs within pmm-agent and sends MySQL Query Analytics data to the PMM Server. @@ -499,6 +510,8 @@ message RDSExporter { LogLevel log_level = 13; // Limit of databases for auto-discovery. int32 auto_discovery_limit = 14; + // Metrics resolution for this agent. + common.MetricsResolutions metrics_resolutions = 15; } // ExternalExporter runs on any Node type, including Remote Node. @@ -525,6 +538,8 @@ message ExternalExporter { bool push_metrics_enabled = 11; // Path to exec process. string process_exec_path = 12; + // Metrics resolution for this agent. + common.MetricsResolutions metrics_resolutions = 13; } // AzureDatabaseExporter runs on Generic or Container Node and exposes RemoteAzure Node metrics. @@ -557,6 +572,8 @@ message AzureDatabaseExporter { string process_exec_path = 11; // Log level for exporter. LogLevel log_level = 12; + // Metrics resolution for this agent. + common.MetricsResolutions metrics_resolutions = 13; } // ChangeCommonAgentParams contains parameters that can be changed for all Agents. @@ -574,6 +591,8 @@ message ChangeCommonAgentParams { bool enable_push_metrics = 5; // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. bool disable_push_metrics = 6; + // Metrics resolution for this agent. + common.MetricsResolutions metrics_resolutions = 7; } // List diff --git a/api/inventorypb/json/client/agents/add_azure_database_exporter_responses.go b/api/inventorypb/json/client/agents/add_azure_database_exporter_responses.go index a131a16a3c..8b53ba84c9 100644 --- a/api/inventorypb/json/client/agents/add_azure_database_exporter_responses.go +++ b/api/inventorypb/json/client/agents/add_azure_database_exporter_responses.go @@ -535,6 +535,9 @@ type AddAzureDatabaseExporterOKBodyAzureDatabaseExporter struct { // Log level for exporters // Enum: [auto fatal error warn info debug] LogLevel *string `json:"log_level,omitempty"` + + // metrics resolutions + MetricsResolutions *AddAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add azure database exporter OK body azure database exporter @@ -549,6 +552,10 @@ func (o *AddAzureDatabaseExporterOKBodyAzureDatabaseExporter) Validate(formats s res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -666,8 +673,51 @@ func (o *AddAzureDatabaseExporterOKBodyAzureDatabaseExporter) validateLogLevel(f return nil } -// ContextValidate validates this add azure database exporter OK body azure database exporter based on context it is used +func (o *AddAzureDatabaseExporterOKBodyAzureDatabaseExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addAzureDatabaseExporterOk" + "." + "azure_database_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addAzureDatabaseExporterOk" + "." + "azure_database_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add azure database exporter OK body azure database exporter based on the context it is used func (o *AddAzureDatabaseExporterOKBodyAzureDatabaseExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddAzureDatabaseExporterOKBodyAzureDatabaseExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addAzureDatabaseExporterOk" + "." + "azure_database_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addAzureDatabaseExporterOk" + "." + "azure_database_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -688,3 +738,46 @@ func (o *AddAzureDatabaseExporterOKBodyAzureDatabaseExporter) UnmarshalBinary(b *o = res return nil } + +/* +AddAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions +*/ +type AddAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add azure database exporter OK body azure database exporter metrics resolutions +func (o *AddAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add azure database exporter OK body azure database exporter metrics resolutions based on context it is used +func (o *AddAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/add_external_exporter_responses.go b/api/inventorypb/json/client/agents/add_external_exporter_responses.go index 33a3d17e6e..9619283736 100644 --- a/api/inventorypb/json/client/agents/add_external_exporter_responses.go +++ b/api/inventorypb/json/client/agents/add_external_exporter_responses.go @@ -446,15 +446,70 @@ type AddExternalExporterOKBodyExternalExporter struct { // Path to exec process. ProcessExecPath string `json:"process_exec_path,omitempty"` + + // metrics resolutions + MetricsResolutions *AddExternalExporterOKBodyExternalExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add external exporter OK body external exporter func (o *AddExternalExporterOKBodyExternalExporter) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddExternalExporterOKBodyExternalExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addExternalExporterOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addExternalExporterOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this add external exporter OK body external exporter based on context it is used +// ContextValidate validate this add external exporter OK body external exporter based on the context it is used func (o *AddExternalExporterOKBodyExternalExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddExternalExporterOKBodyExternalExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addExternalExporterOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addExternalExporterOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -475,3 +530,46 @@ func (o *AddExternalExporterOKBodyExternalExporter) UnmarshalBinary(b []byte) er *o = res return nil } + +/* +AddExternalExporterOKBodyExternalExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddExternalExporterOKBodyExternalExporterMetricsResolutions +*/ +type AddExternalExporterOKBodyExternalExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add external exporter OK body external exporter metrics resolutions +func (o *AddExternalExporterOKBodyExternalExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add external exporter OK body external exporter metrics resolutions based on context it is used +func (o *AddExternalExporterOKBodyExternalExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddExternalExporterOKBodyExternalExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddExternalExporterOKBodyExternalExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddExternalExporterOKBodyExternalExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/add_mongo_db_exporter_responses.go b/api/inventorypb/json/client/agents/add_mongo_db_exporter_responses.go index e425c85af2..0d2ac71bdc 100644 --- a/api/inventorypb/json/client/agents/add_mongo_db_exporter_responses.go +++ b/api/inventorypb/json/client/agents/add_mongo_db_exporter_responses.go @@ -581,6 +581,9 @@ type AddMongoDBExporterOKBodyMongodbExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *AddMongoDBExporterOKBodyMongodbExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add mongo DB exporter OK body mongodb exporter @@ -595,6 +598,10 @@ func (o *AddMongoDBExporterOKBodyMongodbExporter) Validate(formats strfmt.Regist res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -712,8 +719,51 @@ func (o *AddMongoDBExporterOKBodyMongodbExporter) validateLogLevel(formats strfm return nil } -// ContextValidate validates this add mongo DB exporter OK body mongodb exporter based on context it is used +func (o *AddMongoDBExporterOKBodyMongodbExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addMongoDbExporterOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addMongoDbExporterOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add mongo DB exporter OK body mongodb exporter based on the context it is used func (o *AddMongoDBExporterOKBodyMongodbExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddMongoDBExporterOKBodyMongodbExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addMongoDbExporterOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addMongoDbExporterOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -734,3 +784,46 @@ func (o *AddMongoDBExporterOKBodyMongodbExporter) UnmarshalBinary(b []byte) erro *o = res return nil } + +/* +AddMongoDBExporterOKBodyMongodbExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddMongoDBExporterOKBodyMongodbExporterMetricsResolutions +*/ +type AddMongoDBExporterOKBodyMongodbExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add mongo DB exporter OK body mongodb exporter metrics resolutions +func (o *AddMongoDBExporterOKBodyMongodbExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add mongo DB exporter OK body mongodb exporter metrics resolutions based on context it is used +func (o *AddMongoDBExporterOKBodyMongodbExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddMongoDBExporterOKBodyMongodbExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddMongoDBExporterOKBodyMongodbExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddMongoDBExporterOKBodyMongodbExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/add_my_s_q_ld_exporter_responses.go b/api/inventorypb/json/client/agents/add_my_s_q_ld_exporter_responses.go index 21492d0223..c7cca95742 100644 --- a/api/inventorypb/json/client/agents/add_my_s_q_ld_exporter_responses.go +++ b/api/inventorypb/json/client/agents/add_my_s_q_ld_exporter_responses.go @@ -581,6 +581,9 @@ type AddMySQLdExporterOKBodyMysqldExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *AddMySQLdExporterOKBodyMysqldExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add my s q ld exporter OK body mysqld exporter @@ -595,6 +598,10 @@ func (o *AddMySQLdExporterOKBodyMysqldExporter) Validate(formats strfmt.Registry res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -712,8 +719,51 @@ func (o *AddMySQLdExporterOKBodyMysqldExporter) validateLogLevel(formats strfmt. return nil } -// ContextValidate validates this add my s q ld exporter OK body mysqld exporter based on context it is used +func (o *AddMySQLdExporterOKBodyMysqldExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addMySQLdExporterOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addMySQLdExporterOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add my s q ld exporter OK body mysqld exporter based on the context it is used func (o *AddMySQLdExporterOKBodyMysqldExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddMySQLdExporterOKBodyMysqldExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addMySQLdExporterOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addMySQLdExporterOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -734,3 +784,46 @@ func (o *AddMySQLdExporterOKBodyMysqldExporter) UnmarshalBinary(b []byte) error *o = res return nil } + +/* +AddMySQLdExporterOKBodyMysqldExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddMySQLdExporterOKBodyMysqldExporterMetricsResolutions +*/ +type AddMySQLdExporterOKBodyMysqldExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add my s q ld exporter OK body mysqld exporter metrics resolutions +func (o *AddMySQLdExporterOKBodyMysqldExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add my s q ld exporter OK body mysqld exporter metrics resolutions based on context it is used +func (o *AddMySQLdExporterOKBodyMysqldExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddMySQLdExporterOKBodyMysqldExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddMySQLdExporterOKBodyMysqldExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddMySQLdExporterOKBodyMysqldExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/add_node_exporter_responses.go b/api/inventorypb/json/client/agents/add_node_exporter_responses.go index 1cbeb5d283..3997ae2ed3 100644 --- a/api/inventorypb/json/client/agents/add_node_exporter_responses.go +++ b/api/inventorypb/json/client/agents/add_node_exporter_responses.go @@ -514,6 +514,9 @@ type AddNodeExporterOKBodyNodeExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *AddNodeExporterOKBodyNodeExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add node exporter OK body node exporter @@ -528,6 +531,10 @@ func (o *AddNodeExporterOKBodyNodeExporter) Validate(formats strfmt.Registry) er res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -645,8 +652,51 @@ func (o *AddNodeExporterOKBodyNodeExporter) validateLogLevel(formats strfmt.Regi return nil } -// ContextValidate validates this add node exporter OK body node exporter based on context it is used +func (o *AddNodeExporterOKBodyNodeExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addNodeExporterOk" + "." + "node_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addNodeExporterOk" + "." + "node_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add node exporter OK body node exporter based on the context it is used func (o *AddNodeExporterOKBodyNodeExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddNodeExporterOKBodyNodeExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addNodeExporterOk" + "." + "node_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addNodeExporterOk" + "." + "node_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -667,3 +717,46 @@ func (o *AddNodeExporterOKBodyNodeExporter) UnmarshalBinary(b []byte) error { *o = res return nil } + +/* +AddNodeExporterOKBodyNodeExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddNodeExporterOKBodyNodeExporterMetricsResolutions +*/ +type AddNodeExporterOKBodyNodeExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add node exporter OK body node exporter metrics resolutions +func (o *AddNodeExporterOKBodyNodeExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add node exporter OK body node exporter metrics resolutions based on context it is used +func (o *AddNodeExporterOKBodyNodeExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddNodeExporterOKBodyNodeExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddNodeExporterOKBodyNodeExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddNodeExporterOKBodyNodeExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/add_postgres_exporter_responses.go b/api/inventorypb/json/client/agents/add_postgres_exporter_responses.go index 162f9e9a06..9db1f37463 100644 --- a/api/inventorypb/json/client/agents/add_postgres_exporter_responses.go +++ b/api/inventorypb/json/client/agents/add_postgres_exporter_responses.go @@ -566,6 +566,9 @@ type AddPostgresExporterOKBodyPostgresExporter struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + + // metrics resolutions + MetricsResolutions *AddPostgresExporterOKBodyPostgresExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add postgres exporter OK body postgres exporter @@ -580,6 +583,10 @@ func (o *AddPostgresExporterOKBodyPostgresExporter) Validate(formats strfmt.Regi res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -697,8 +704,51 @@ func (o *AddPostgresExporterOKBodyPostgresExporter) validateLogLevel(formats str return nil } -// ContextValidate validates this add postgres exporter OK body postgres exporter based on context it is used +func (o *AddPostgresExporterOKBodyPostgresExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addPostgresExporterOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addPostgresExporterOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add postgres exporter OK body postgres exporter based on the context it is used func (o *AddPostgresExporterOKBodyPostgresExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddPostgresExporterOKBodyPostgresExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addPostgresExporterOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addPostgresExporterOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -719,3 +769,46 @@ func (o *AddPostgresExporterOKBodyPostgresExporter) UnmarshalBinary(b []byte) er *o = res return nil } + +/* +AddPostgresExporterOKBodyPostgresExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddPostgresExporterOKBodyPostgresExporterMetricsResolutions +*/ +type AddPostgresExporterOKBodyPostgresExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add postgres exporter OK body postgres exporter metrics resolutions +func (o *AddPostgresExporterOKBodyPostgresExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add postgres exporter OK body postgres exporter metrics resolutions based on context it is used +func (o *AddPostgresExporterOKBodyPostgresExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddPostgresExporterOKBodyPostgresExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddPostgresExporterOKBodyPostgresExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddPostgresExporterOKBodyPostgresExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/add_proxy_sql_exporter_responses.go b/api/inventorypb/json/client/agents/add_proxy_sql_exporter_responses.go index 6b93a0200f..9cda125580 100644 --- a/api/inventorypb/json/client/agents/add_proxy_sql_exporter_responses.go +++ b/api/inventorypb/json/client/agents/add_proxy_sql_exporter_responses.go @@ -547,6 +547,9 @@ type AddProxySQLExporterOKBodyProxysqlExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *AddProxySQLExporterOKBodyProxysqlExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add proxy SQL exporter OK body proxysql exporter @@ -561,6 +564,10 @@ func (o *AddProxySQLExporterOKBodyProxysqlExporter) Validate(formats strfmt.Regi res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -678,8 +685,51 @@ func (o *AddProxySQLExporterOKBodyProxysqlExporter) validateLogLevel(formats str return nil } -// ContextValidate validates this add proxy SQL exporter OK body proxysql exporter based on context it is used +func (o *AddProxySQLExporterOKBodyProxysqlExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addProxySqlExporterOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addProxySqlExporterOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add proxy SQL exporter OK body proxysql exporter based on the context it is used func (o *AddProxySQLExporterOKBodyProxysqlExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddProxySQLExporterOKBodyProxysqlExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addProxySqlExporterOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addProxySqlExporterOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -700,3 +750,46 @@ func (o *AddProxySQLExporterOKBodyProxysqlExporter) UnmarshalBinary(b []byte) er *o = res return nil } + +/* +AddProxySQLExporterOKBodyProxysqlExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddProxySQLExporterOKBodyProxysqlExporterMetricsResolutions +*/ +type AddProxySQLExporterOKBodyProxysqlExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add proxy SQL exporter OK body proxysql exporter metrics resolutions +func (o *AddProxySQLExporterOKBodyProxysqlExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add proxy SQL exporter OK body proxysql exporter metrics resolutions based on context it is used +func (o *AddProxySQLExporterOKBodyProxysqlExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddProxySQLExporterOKBodyProxysqlExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddProxySQLExporterOKBodyProxysqlExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddProxySQLExporterOKBodyProxysqlExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/add_rds_exporter_responses.go b/api/inventorypb/json/client/agents/add_rds_exporter_responses.go index 85f4e6214a..38129477b1 100644 --- a/api/inventorypb/json/client/agents/add_rds_exporter_responses.go +++ b/api/inventorypb/json/client/agents/add_rds_exporter_responses.go @@ -537,6 +537,9 @@ type AddRDSExporterOKBodyRDSExporter struct { // Limit of databases for auto-discovery. AutoDiscoveryLimit int32 `json:"auto_discovery_limit,omitempty"` + + // metrics resolutions + MetricsResolutions *AddRDSExporterOKBodyRDSExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add RDS exporter OK body RDS exporter @@ -551,6 +554,10 @@ func (o *AddRDSExporterOKBodyRDSExporter) Validate(formats strfmt.Registry) erro res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -668,8 +675,51 @@ func (o *AddRDSExporterOKBodyRDSExporter) validateLogLevel(formats strfmt.Regist return nil } -// ContextValidate validates this add RDS exporter OK body RDS exporter based on context it is used +func (o *AddRDSExporterOKBodyRDSExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addRdsExporterOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addRdsExporterOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add RDS exporter OK body RDS exporter based on the context it is used func (o *AddRDSExporterOKBodyRDSExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddRDSExporterOKBodyRDSExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addRdsExporterOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addRdsExporterOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -690,3 +740,46 @@ func (o *AddRDSExporterOKBodyRDSExporter) UnmarshalBinary(b []byte) error { *o = res return nil } + +/* +AddRDSExporterOKBodyRDSExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddRDSExporterOKBodyRDSExporterMetricsResolutions +*/ +type AddRDSExporterOKBodyRDSExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add RDS exporter OK body RDS exporter metrics resolutions +func (o *AddRDSExporterOKBodyRDSExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add RDS exporter OK body RDS exporter metrics resolutions based on context it is used +func (o *AddRDSExporterOKBodyRDSExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddRDSExporterOKBodyRDSExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddRDSExporterOKBodyRDSExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddRDSExporterOKBodyRDSExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/change_azure_database_exporter_responses.go b/api/inventorypb/json/client/agents/change_azure_database_exporter_responses.go index 130d919287..9aa5bf084f 100644 --- a/api/inventorypb/json/client/agents/change_azure_database_exporter_responses.go +++ b/api/inventorypb/json/client/agents/change_azure_database_exporter_responses.go @@ -493,6 +493,9 @@ type ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporter struct { // Log level for exporters // Enum: [auto fatal error warn info debug] LogLevel *string `json:"log_level,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change azure database exporter OK body azure database exporter @@ -507,6 +510,10 @@ func (o *ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporter) Validate(format res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -624,8 +631,51 @@ func (o *ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporter) validateLogLeve return nil } -// ContextValidate validates this change azure database exporter OK body azure database exporter based on context it is used +func (o *ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeAzureDatabaseExporterOk" + "." + "azure_database_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeAzureDatabaseExporterOk" + "." + "azure_database_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this change azure database exporter OK body azure database exporter based on the context it is used func (o *ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeAzureDatabaseExporterOk" + "." + "azure_database_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeAzureDatabaseExporterOk" + "." + "azure_database_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -647,6 +697,49 @@ func (o *ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporter) UnmarshalBinary return nil } +/* +ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions +*/ +type ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change azure database exporter OK body azure database exporter metrics resolutions +func (o *ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change azure database exporter OK body azure database exporter metrics resolutions based on context it is used +func (o *ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeAzureDatabaseExporterOKBodyAzureDatabaseExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ChangeAzureDatabaseExporterParamsBodyCommon ChangeCommonAgentParams contains parameters that can be changed for all Agents. swagger:model ChangeAzureDatabaseExporterParamsBodyCommon @@ -670,15 +763,70 @@ type ChangeAzureDatabaseExporterParamsBodyCommon struct { // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `json:"disable_push_metrics,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeAzureDatabaseExporterParamsBodyCommonMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change azure database exporter params body common func (o *ChangeAzureDatabaseExporterParamsBodyCommon) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeAzureDatabaseExporterParamsBodyCommon) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change azure database exporter params body common based on context it is used +// ContextValidate validate this change azure database exporter params body common based on the context it is used func (o *ChangeAzureDatabaseExporterParamsBodyCommon) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeAzureDatabaseExporterParamsBodyCommon) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -699,3 +847,46 @@ func (o *ChangeAzureDatabaseExporterParamsBodyCommon) UnmarshalBinary(b []byte) *o = res return nil } + +/* +ChangeAzureDatabaseExporterParamsBodyCommonMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeAzureDatabaseExporterParamsBodyCommonMetricsResolutions +*/ +type ChangeAzureDatabaseExporterParamsBodyCommonMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change azure database exporter params body common metrics resolutions +func (o *ChangeAzureDatabaseExporterParamsBodyCommonMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change azure database exporter params body common metrics resolutions based on context it is used +func (o *ChangeAzureDatabaseExporterParamsBodyCommonMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeAzureDatabaseExporterParamsBodyCommonMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeAzureDatabaseExporterParamsBodyCommonMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeAzureDatabaseExporterParamsBodyCommonMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/change_external_exporter_responses.go b/api/inventorypb/json/client/agents/change_external_exporter_responses.go index 15dc5e5a58..211673585f 100644 --- a/api/inventorypb/json/client/agents/change_external_exporter_responses.go +++ b/api/inventorypb/json/client/agents/change_external_exporter_responses.go @@ -477,15 +477,70 @@ type ChangeExternalExporterOKBodyExternalExporter struct { // Path to exec process. ProcessExecPath string `json:"process_exec_path,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeExternalExporterOKBodyExternalExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change external exporter OK body external exporter func (o *ChangeExternalExporterOKBodyExternalExporter) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeExternalExporterOKBodyExternalExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeExternalExporterOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeExternalExporterOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change external exporter OK body external exporter based on context it is used +// ContextValidate validate this change external exporter OK body external exporter based on the context it is used func (o *ChangeExternalExporterOKBodyExternalExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeExternalExporterOKBodyExternalExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeExternalExporterOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeExternalExporterOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -507,6 +562,49 @@ func (o *ChangeExternalExporterOKBodyExternalExporter) UnmarshalBinary(b []byte) return nil } +/* +ChangeExternalExporterOKBodyExternalExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeExternalExporterOKBodyExternalExporterMetricsResolutions +*/ +type ChangeExternalExporterOKBodyExternalExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change external exporter OK body external exporter metrics resolutions +func (o *ChangeExternalExporterOKBodyExternalExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change external exporter OK body external exporter metrics resolutions based on context it is used +func (o *ChangeExternalExporterOKBodyExternalExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeExternalExporterOKBodyExternalExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeExternalExporterOKBodyExternalExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeExternalExporterOKBodyExternalExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ChangeExternalExporterParamsBodyCommon ChangeCommonAgentParams contains parameters that can be changed for all Agents. swagger:model ChangeExternalExporterParamsBodyCommon @@ -530,15 +628,70 @@ type ChangeExternalExporterParamsBodyCommon struct { // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `json:"disable_push_metrics,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeExternalExporterParamsBodyCommonMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change external exporter params body common func (o *ChangeExternalExporterParamsBodyCommon) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeExternalExporterParamsBodyCommon) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change external exporter params body common based on context it is used +// ContextValidate validate this change external exporter params body common based on the context it is used func (o *ChangeExternalExporterParamsBodyCommon) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeExternalExporterParamsBodyCommon) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -559,3 +712,46 @@ func (o *ChangeExternalExporterParamsBodyCommon) UnmarshalBinary(b []byte) error *o = res return nil } + +/* +ChangeExternalExporterParamsBodyCommonMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeExternalExporterParamsBodyCommonMetricsResolutions +*/ +type ChangeExternalExporterParamsBodyCommonMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change external exporter params body common metrics resolutions +func (o *ChangeExternalExporterParamsBodyCommonMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change external exporter params body common metrics resolutions based on context it is used +func (o *ChangeExternalExporterParamsBodyCommonMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeExternalExporterParamsBodyCommonMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeExternalExporterParamsBodyCommonMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeExternalExporterParamsBodyCommonMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/change_mongo_db_exporter_responses.go b/api/inventorypb/json/client/agents/change_mongo_db_exporter_responses.go index d2f0fe2212..d87f533bf5 100644 --- a/api/inventorypb/json/client/agents/change_mongo_db_exporter_responses.go +++ b/api/inventorypb/json/client/agents/change_mongo_db_exporter_responses.go @@ -512,6 +512,9 @@ type ChangeMongoDBExporterOKBodyMongodbExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeMongoDBExporterOKBodyMongodbExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change mongo DB exporter OK body mongodb exporter @@ -526,6 +529,10 @@ func (o *ChangeMongoDBExporterOKBodyMongodbExporter) Validate(formats strfmt.Reg res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -643,8 +650,51 @@ func (o *ChangeMongoDBExporterOKBodyMongodbExporter) validateLogLevel(formats st return nil } -// ContextValidate validates this change mongo DB exporter OK body mongodb exporter based on context it is used +func (o *ChangeMongoDBExporterOKBodyMongodbExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeMongoDbExporterOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeMongoDbExporterOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this change mongo DB exporter OK body mongodb exporter based on the context it is used func (o *ChangeMongoDBExporterOKBodyMongodbExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeMongoDBExporterOKBodyMongodbExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeMongoDbExporterOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeMongoDbExporterOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -666,6 +716,49 @@ func (o *ChangeMongoDBExporterOKBodyMongodbExporter) UnmarshalBinary(b []byte) e return nil } +/* +ChangeMongoDBExporterOKBodyMongodbExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeMongoDBExporterOKBodyMongodbExporterMetricsResolutions +*/ +type ChangeMongoDBExporterOKBodyMongodbExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change mongo DB exporter OK body mongodb exporter metrics resolutions +func (o *ChangeMongoDBExporterOKBodyMongodbExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change mongo DB exporter OK body mongodb exporter metrics resolutions based on context it is used +func (o *ChangeMongoDBExporterOKBodyMongodbExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeMongoDBExporterOKBodyMongodbExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeMongoDBExporterOKBodyMongodbExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeMongoDBExporterOKBodyMongodbExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ChangeMongoDBExporterParamsBodyCommon ChangeCommonAgentParams contains parameters that can be changed for all Agents. swagger:model ChangeMongoDBExporterParamsBodyCommon @@ -689,15 +782,70 @@ type ChangeMongoDBExporterParamsBodyCommon struct { // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `json:"disable_push_metrics,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeMongoDBExporterParamsBodyCommonMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change mongo DB exporter params body common func (o *ChangeMongoDBExporterParamsBodyCommon) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeMongoDBExporterParamsBodyCommon) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change mongo DB exporter params body common based on context it is used +// ContextValidate validate this change mongo DB exporter params body common based on the context it is used func (o *ChangeMongoDBExporterParamsBodyCommon) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeMongoDBExporterParamsBodyCommon) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -718,3 +866,46 @@ func (o *ChangeMongoDBExporterParamsBodyCommon) UnmarshalBinary(b []byte) error *o = res return nil } + +/* +ChangeMongoDBExporterParamsBodyCommonMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeMongoDBExporterParamsBodyCommonMetricsResolutions +*/ +type ChangeMongoDBExporterParamsBodyCommonMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change mongo DB exporter params body common metrics resolutions +func (o *ChangeMongoDBExporterParamsBodyCommonMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change mongo DB exporter params body common metrics resolutions based on context it is used +func (o *ChangeMongoDBExporterParamsBodyCommonMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeMongoDBExporterParamsBodyCommonMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeMongoDBExporterParamsBodyCommonMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeMongoDBExporterParamsBodyCommonMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/change_my_s_q_ld_exporter_responses.go b/api/inventorypb/json/client/agents/change_my_s_q_ld_exporter_responses.go index 55e8e24660..ea95a7e05a 100644 --- a/api/inventorypb/json/client/agents/change_my_s_q_ld_exporter_responses.go +++ b/api/inventorypb/json/client/agents/change_my_s_q_ld_exporter_responses.go @@ -519,6 +519,9 @@ type ChangeMySQLdExporterOKBodyMysqldExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeMySQLdExporterOKBodyMysqldExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change my s q ld exporter OK body mysqld exporter @@ -533,6 +536,10 @@ func (o *ChangeMySQLdExporterOKBodyMysqldExporter) Validate(formats strfmt.Regis res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -650,8 +657,51 @@ func (o *ChangeMySQLdExporterOKBodyMysqldExporter) validateLogLevel(formats strf return nil } -// ContextValidate validates this change my s q ld exporter OK body mysqld exporter based on context it is used +func (o *ChangeMySQLdExporterOKBodyMysqldExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeMySQLdExporterOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeMySQLdExporterOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this change my s q ld exporter OK body mysqld exporter based on the context it is used func (o *ChangeMySQLdExporterOKBodyMysqldExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeMySQLdExporterOKBodyMysqldExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeMySQLdExporterOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeMySQLdExporterOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -673,6 +723,49 @@ func (o *ChangeMySQLdExporterOKBodyMysqldExporter) UnmarshalBinary(b []byte) err return nil } +/* +ChangeMySQLdExporterOKBodyMysqldExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeMySQLdExporterOKBodyMysqldExporterMetricsResolutions +*/ +type ChangeMySQLdExporterOKBodyMysqldExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change my s q ld exporter OK body mysqld exporter metrics resolutions +func (o *ChangeMySQLdExporterOKBodyMysqldExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change my s q ld exporter OK body mysqld exporter metrics resolutions based on context it is used +func (o *ChangeMySQLdExporterOKBodyMysqldExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeMySQLdExporterOKBodyMysqldExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeMySQLdExporterOKBodyMysqldExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeMySQLdExporterOKBodyMysqldExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ChangeMySQLdExporterParamsBodyCommon ChangeCommonAgentParams contains parameters that can be changed for all Agents. swagger:model ChangeMySQLdExporterParamsBodyCommon @@ -696,15 +789,70 @@ type ChangeMySQLdExporterParamsBodyCommon struct { // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `json:"disable_push_metrics,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeMySQLdExporterParamsBodyCommonMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change my s q ld exporter params body common func (o *ChangeMySQLdExporterParamsBodyCommon) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeMySQLdExporterParamsBodyCommon) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change my s q ld exporter params body common based on context it is used +// ContextValidate validate this change my s q ld exporter params body common based on the context it is used func (o *ChangeMySQLdExporterParamsBodyCommon) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeMySQLdExporterParamsBodyCommon) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -725,3 +873,46 @@ func (o *ChangeMySQLdExporterParamsBodyCommon) UnmarshalBinary(b []byte) error { *o = res return nil } + +/* +ChangeMySQLdExporterParamsBodyCommonMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeMySQLdExporterParamsBodyCommonMetricsResolutions +*/ +type ChangeMySQLdExporterParamsBodyCommonMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change my s q ld exporter params body common metrics resolutions +func (o *ChangeMySQLdExporterParamsBodyCommonMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change my s q ld exporter params body common metrics resolutions based on context it is used +func (o *ChangeMySQLdExporterParamsBodyCommonMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeMySQLdExporterParamsBodyCommonMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeMySQLdExporterParamsBodyCommonMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeMySQLdExporterParamsBodyCommonMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/change_node_exporter_responses.go b/api/inventorypb/json/client/agents/change_node_exporter_responses.go index 7dc9618203..8a079d0065 100644 --- a/api/inventorypb/json/client/agents/change_node_exporter_responses.go +++ b/api/inventorypb/json/client/agents/change_node_exporter_responses.go @@ -490,6 +490,9 @@ type ChangeNodeExporterOKBodyNodeExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeNodeExporterOKBodyNodeExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change node exporter OK body node exporter @@ -504,6 +507,10 @@ func (o *ChangeNodeExporterOKBodyNodeExporter) Validate(formats strfmt.Registry) res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -621,8 +628,51 @@ func (o *ChangeNodeExporterOKBodyNodeExporter) validateLogLevel(formats strfmt.R return nil } -// ContextValidate validates this change node exporter OK body node exporter based on context it is used +func (o *ChangeNodeExporterOKBodyNodeExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeNodeExporterOk" + "." + "node_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeNodeExporterOk" + "." + "node_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this change node exporter OK body node exporter based on the context it is used func (o *ChangeNodeExporterOKBodyNodeExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeNodeExporterOKBodyNodeExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeNodeExporterOk" + "." + "node_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeNodeExporterOk" + "." + "node_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -644,6 +694,49 @@ func (o *ChangeNodeExporterOKBodyNodeExporter) UnmarshalBinary(b []byte) error { return nil } +/* +ChangeNodeExporterOKBodyNodeExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeNodeExporterOKBodyNodeExporterMetricsResolutions +*/ +type ChangeNodeExporterOKBodyNodeExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change node exporter OK body node exporter metrics resolutions +func (o *ChangeNodeExporterOKBodyNodeExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change node exporter OK body node exporter metrics resolutions based on context it is used +func (o *ChangeNodeExporterOKBodyNodeExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeNodeExporterOKBodyNodeExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeNodeExporterOKBodyNodeExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeNodeExporterOKBodyNodeExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ChangeNodeExporterParamsBodyCommon ChangeCommonAgentParams contains parameters that can be changed for all Agents. swagger:model ChangeNodeExporterParamsBodyCommon @@ -667,15 +760,70 @@ type ChangeNodeExporterParamsBodyCommon struct { // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `json:"disable_push_metrics,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeNodeExporterParamsBodyCommonMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change node exporter params body common func (o *ChangeNodeExporterParamsBodyCommon) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeNodeExporterParamsBodyCommon) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change node exporter params body common based on context it is used +// ContextValidate validate this change node exporter params body common based on the context it is used func (o *ChangeNodeExporterParamsBodyCommon) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeNodeExporterParamsBodyCommon) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -696,3 +844,46 @@ func (o *ChangeNodeExporterParamsBodyCommon) UnmarshalBinary(b []byte) error { *o = res return nil } + +/* +ChangeNodeExporterParamsBodyCommonMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeNodeExporterParamsBodyCommonMetricsResolutions +*/ +type ChangeNodeExporterParamsBodyCommonMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change node exporter params body common metrics resolutions +func (o *ChangeNodeExporterParamsBodyCommonMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change node exporter params body common metrics resolutions based on context it is used +func (o *ChangeNodeExporterParamsBodyCommonMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeNodeExporterParamsBodyCommonMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeNodeExporterParamsBodyCommonMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeNodeExporterParamsBodyCommonMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/change_postgres_exporter_responses.go b/api/inventorypb/json/client/agents/change_postgres_exporter_responses.go index 7e2f30d8be..300eae8025 100644 --- a/api/inventorypb/json/client/agents/change_postgres_exporter_responses.go +++ b/api/inventorypb/json/client/agents/change_postgres_exporter_responses.go @@ -506,6 +506,9 @@ type ChangePostgresExporterOKBodyPostgresExporter struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangePostgresExporterOKBodyPostgresExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change postgres exporter OK body postgres exporter @@ -520,6 +523,10 @@ func (o *ChangePostgresExporterOKBodyPostgresExporter) Validate(formats strfmt.R res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -637,8 +644,51 @@ func (o *ChangePostgresExporterOKBodyPostgresExporter) validateLogLevel(formats return nil } -// ContextValidate validates this change postgres exporter OK body postgres exporter based on context it is used +func (o *ChangePostgresExporterOKBodyPostgresExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changePostgresExporterOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changePostgresExporterOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this change postgres exporter OK body postgres exporter based on the context it is used func (o *ChangePostgresExporterOKBodyPostgresExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangePostgresExporterOKBodyPostgresExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changePostgresExporterOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changePostgresExporterOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -660,6 +710,49 @@ func (o *ChangePostgresExporterOKBodyPostgresExporter) UnmarshalBinary(b []byte) return nil } +/* +ChangePostgresExporterOKBodyPostgresExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangePostgresExporterOKBodyPostgresExporterMetricsResolutions +*/ +type ChangePostgresExporterOKBodyPostgresExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change postgres exporter OK body postgres exporter metrics resolutions +func (o *ChangePostgresExporterOKBodyPostgresExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change postgres exporter OK body postgres exporter metrics resolutions based on context it is used +func (o *ChangePostgresExporterOKBodyPostgresExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangePostgresExporterOKBodyPostgresExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangePostgresExporterOKBodyPostgresExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangePostgresExporterOKBodyPostgresExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ChangePostgresExporterParamsBodyCommon ChangeCommonAgentParams contains parameters that can be changed for all Agents. swagger:model ChangePostgresExporterParamsBodyCommon @@ -683,15 +776,70 @@ type ChangePostgresExporterParamsBodyCommon struct { // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `json:"disable_push_metrics,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangePostgresExporterParamsBodyCommonMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change postgres exporter params body common func (o *ChangePostgresExporterParamsBodyCommon) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangePostgresExporterParamsBodyCommon) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change postgres exporter params body common based on context it is used +// ContextValidate validate this change postgres exporter params body common based on the context it is used func (o *ChangePostgresExporterParamsBodyCommon) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangePostgresExporterParamsBodyCommon) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -712,3 +860,46 @@ func (o *ChangePostgresExporterParamsBodyCommon) UnmarshalBinary(b []byte) error *o = res return nil } + +/* +ChangePostgresExporterParamsBodyCommonMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangePostgresExporterParamsBodyCommonMetricsResolutions +*/ +type ChangePostgresExporterParamsBodyCommonMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change postgres exporter params body common metrics resolutions +func (o *ChangePostgresExporterParamsBodyCommonMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change postgres exporter params body common metrics resolutions based on context it is used +func (o *ChangePostgresExporterParamsBodyCommonMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangePostgresExporterParamsBodyCommonMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangePostgresExporterParamsBodyCommonMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangePostgresExporterParamsBodyCommonMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/change_proxy_sql_exporter_responses.go b/api/inventorypb/json/client/agents/change_proxy_sql_exporter_responses.go index 7bbbcdf5e7..788e77980f 100644 --- a/api/inventorypb/json/client/agents/change_proxy_sql_exporter_responses.go +++ b/api/inventorypb/json/client/agents/change_proxy_sql_exporter_responses.go @@ -502,6 +502,9 @@ type ChangeProxySQLExporterOKBodyProxysqlExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeProxySQLExporterOKBodyProxysqlExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change proxy SQL exporter OK body proxysql exporter @@ -516,6 +519,10 @@ func (o *ChangeProxySQLExporterOKBodyProxysqlExporter) Validate(formats strfmt.R res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -633,8 +640,51 @@ func (o *ChangeProxySQLExporterOKBodyProxysqlExporter) validateLogLevel(formats return nil } -// ContextValidate validates this change proxy SQL exporter OK body proxysql exporter based on context it is used +func (o *ChangeProxySQLExporterOKBodyProxysqlExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeProxySqlExporterOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeProxySqlExporterOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this change proxy SQL exporter OK body proxysql exporter based on the context it is used func (o *ChangeProxySQLExporterOKBodyProxysqlExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeProxySQLExporterOKBodyProxysqlExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeProxySqlExporterOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeProxySqlExporterOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -656,6 +706,49 @@ func (o *ChangeProxySQLExporterOKBodyProxysqlExporter) UnmarshalBinary(b []byte) return nil } +/* +ChangeProxySQLExporterOKBodyProxysqlExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeProxySQLExporterOKBodyProxysqlExporterMetricsResolutions +*/ +type ChangeProxySQLExporterOKBodyProxysqlExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change proxy SQL exporter OK body proxysql exporter metrics resolutions +func (o *ChangeProxySQLExporterOKBodyProxysqlExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change proxy SQL exporter OK body proxysql exporter metrics resolutions based on context it is used +func (o *ChangeProxySQLExporterOKBodyProxysqlExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeProxySQLExporterOKBodyProxysqlExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeProxySQLExporterOKBodyProxysqlExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeProxySQLExporterOKBodyProxysqlExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ChangeProxySQLExporterParamsBodyCommon ChangeCommonAgentParams contains parameters that can be changed for all Agents. swagger:model ChangeProxySQLExporterParamsBodyCommon @@ -679,15 +772,70 @@ type ChangeProxySQLExporterParamsBodyCommon struct { // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `json:"disable_push_metrics,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeProxySQLExporterParamsBodyCommonMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change proxy SQL exporter params body common func (o *ChangeProxySQLExporterParamsBodyCommon) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeProxySQLExporterParamsBodyCommon) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change proxy SQL exporter params body common based on context it is used +// ContextValidate validate this change proxy SQL exporter params body common based on the context it is used func (o *ChangeProxySQLExporterParamsBodyCommon) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeProxySQLExporterParamsBodyCommon) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -708,3 +856,46 @@ func (o *ChangeProxySQLExporterParamsBodyCommon) UnmarshalBinary(b []byte) error *o = res return nil } + +/* +ChangeProxySQLExporterParamsBodyCommonMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeProxySQLExporterParamsBodyCommonMetricsResolutions +*/ +type ChangeProxySQLExporterParamsBodyCommonMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change proxy SQL exporter params body common metrics resolutions +func (o *ChangeProxySQLExporterParamsBodyCommonMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change proxy SQL exporter params body common metrics resolutions based on context it is used +func (o *ChangeProxySQLExporterParamsBodyCommonMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeProxySQLExporterParamsBodyCommonMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeProxySQLExporterParamsBodyCommonMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeProxySQLExporterParamsBodyCommonMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/change_qan_mongo_db_profiler_agent_responses.go b/api/inventorypb/json/client/agents/change_qan_mongo_db_profiler_agent_responses.go index e047e5873b..97a20193a8 100644 --- a/api/inventorypb/json/client/agents/change_qan_mongo_db_profiler_agent_responses.go +++ b/api/inventorypb/json/client/agents/change_qan_mongo_db_profiler_agent_responses.go @@ -673,15 +673,70 @@ type ChangeQANMongoDBProfilerAgentParamsBodyCommon struct { // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `json:"disable_push_metrics,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeQANMongoDBProfilerAgentParamsBodyCommonMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change QAN mongo DB profiler agent params body common func (o *ChangeQANMongoDBProfilerAgentParamsBodyCommon) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeQANMongoDBProfilerAgentParamsBodyCommon) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change QAN mongo DB profiler agent params body common based on context it is used +// ContextValidate validate this change QAN mongo DB profiler agent params body common based on the context it is used func (o *ChangeQANMongoDBProfilerAgentParamsBodyCommon) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeQANMongoDBProfilerAgentParamsBodyCommon) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -702,3 +757,46 @@ func (o *ChangeQANMongoDBProfilerAgentParamsBodyCommon) UnmarshalBinary(b []byte *o = res return nil } + +/* +ChangeQANMongoDBProfilerAgentParamsBodyCommonMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeQANMongoDBProfilerAgentParamsBodyCommonMetricsResolutions +*/ +type ChangeQANMongoDBProfilerAgentParamsBodyCommonMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change QAN mongo DB profiler agent params body common metrics resolutions +func (o *ChangeQANMongoDBProfilerAgentParamsBodyCommonMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change QAN mongo DB profiler agent params body common metrics resolutions based on context it is used +func (o *ChangeQANMongoDBProfilerAgentParamsBodyCommonMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeQANMongoDBProfilerAgentParamsBodyCommonMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeQANMongoDBProfilerAgentParamsBodyCommonMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeQANMongoDBProfilerAgentParamsBodyCommonMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} 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 f4d4b364d0..947f4738c5 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 @@ -685,15 +685,70 @@ type ChangeQANMySQLPerfSchemaAgentParamsBodyCommon struct { // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `json:"disable_push_metrics,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeQANMySQLPerfSchemaAgentParamsBodyCommonMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change QAN my SQL perf schema agent params body common func (o *ChangeQANMySQLPerfSchemaAgentParamsBodyCommon) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeQANMySQLPerfSchemaAgentParamsBodyCommon) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change QAN my SQL perf schema agent params body common based on context it is used +// ContextValidate validate this change QAN my SQL perf schema agent params body common based on the context it is used func (o *ChangeQANMySQLPerfSchemaAgentParamsBodyCommon) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeQANMySQLPerfSchemaAgentParamsBodyCommon) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -714,3 +769,46 @@ func (o *ChangeQANMySQLPerfSchemaAgentParamsBodyCommon) UnmarshalBinary(b []byte *o = res return nil } + +/* +ChangeQANMySQLPerfSchemaAgentParamsBodyCommonMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeQANMySQLPerfSchemaAgentParamsBodyCommonMetricsResolutions +*/ +type ChangeQANMySQLPerfSchemaAgentParamsBodyCommonMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change QAN my SQL perf schema agent params body common metrics resolutions +func (o *ChangeQANMySQLPerfSchemaAgentParamsBodyCommonMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change QAN my SQL perf schema agent params body common metrics resolutions based on context it is used +func (o *ChangeQANMySQLPerfSchemaAgentParamsBodyCommonMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeQANMySQLPerfSchemaAgentParamsBodyCommonMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeQANMySQLPerfSchemaAgentParamsBodyCommonMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeQANMySQLPerfSchemaAgentParamsBodyCommonMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} 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 8f33720634..ec6105f066 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 @@ -688,15 +688,70 @@ type ChangeQANMySQLSlowlogAgentParamsBodyCommon struct { // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `json:"disable_push_metrics,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeQANMySQLSlowlogAgentParamsBodyCommonMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change QAN my SQL slowlog agent params body common func (o *ChangeQANMySQLSlowlogAgentParamsBodyCommon) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeQANMySQLSlowlogAgentParamsBodyCommon) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change QAN my SQL slowlog agent params body common based on context it is used +// ContextValidate validate this change QAN my SQL slowlog agent params body common based on the context it is used func (o *ChangeQANMySQLSlowlogAgentParamsBodyCommon) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeQANMySQLSlowlogAgentParamsBodyCommon) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -717,3 +772,46 @@ func (o *ChangeQANMySQLSlowlogAgentParamsBodyCommon) UnmarshalBinary(b []byte) e *o = res return nil } + +/* +ChangeQANMySQLSlowlogAgentParamsBodyCommonMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeQANMySQLSlowlogAgentParamsBodyCommonMetricsResolutions +*/ +type ChangeQANMySQLSlowlogAgentParamsBodyCommonMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change QAN my SQL slowlog agent params body common metrics resolutions +func (o *ChangeQANMySQLSlowlogAgentParamsBodyCommonMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change QAN my SQL slowlog agent params body common metrics resolutions based on context it is used +func (o *ChangeQANMySQLSlowlogAgentParamsBodyCommonMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeQANMySQLSlowlogAgentParamsBodyCommonMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeQANMySQLSlowlogAgentParamsBodyCommonMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeQANMySQLSlowlogAgentParamsBodyCommonMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} 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 5c9f510ed7..d4f2a77bff 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 @@ -676,15 +676,70 @@ type ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommon struct { // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `json:"disable_push_metrics,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommonMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change QAN postgre SQL pg stat monitor agent params body common func (o *ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommon) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommon) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change QAN postgre SQL pg stat monitor agent params body common based on context it is used +// ContextValidate validate this change QAN postgre SQL pg stat monitor agent params body common based on the context it is used func (o *ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommon) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommon) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -705,3 +760,46 @@ func (o *ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommon) UnmarshalBinary( *o = res return nil } + +/* +ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommonMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommonMetricsResolutions +*/ +type ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommonMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change QAN postgre SQL pg stat monitor agent params body common metrics resolutions +func (o *ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommonMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change QAN postgre SQL pg stat monitor agent params body common metrics resolutions based on context it is used +func (o *ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommonMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommonMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommonMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeQANPostgreSQLPgStatMonitorAgentParamsBodyCommonMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} 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 23398c5633..fee46e441a 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 @@ -673,15 +673,70 @@ type ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommon struct { // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `json:"disable_push_metrics,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommonMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change QAN postgre SQL pg statements agent params body common func (o *ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommon) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommon) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change QAN postgre SQL pg statements agent params body common based on context it is used +// ContextValidate validate this change QAN postgre SQL pg statements agent params body common based on the context it is used func (o *ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommon) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommon) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -702,3 +757,46 @@ func (o *ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommon) UnmarshalBinary(b *o = res return nil } + +/* +ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommonMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommonMetricsResolutions +*/ +type ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommonMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change QAN postgre SQL pg statements agent params body common metrics resolutions +func (o *ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommonMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change QAN postgre SQL pg statements agent params body common metrics resolutions based on context it is used +func (o *ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommonMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommonMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommonMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeQANPostgreSQLPgStatementsAgentParamsBodyCommonMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/change_rds_exporter_responses.go b/api/inventorypb/json/client/agents/change_rds_exporter_responses.go index 3854ca9773..edb44a701c 100644 --- a/api/inventorypb/json/client/agents/change_rds_exporter_responses.go +++ b/api/inventorypb/json/client/agents/change_rds_exporter_responses.go @@ -501,6 +501,9 @@ type ChangeRDSExporterOKBodyRDSExporter struct { // Limit of databases for auto-discovery. AutoDiscoveryLimit int32 `json:"auto_discovery_limit,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeRDSExporterOKBodyRDSExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change RDS exporter OK body RDS exporter @@ -515,6 +518,10 @@ func (o *ChangeRDSExporterOKBodyRDSExporter) Validate(formats strfmt.Registry) e res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -632,8 +639,51 @@ func (o *ChangeRDSExporterOKBodyRDSExporter) validateLogLevel(formats strfmt.Reg return nil } -// ContextValidate validates this change RDS exporter OK body RDS exporter based on context it is used +func (o *ChangeRDSExporterOKBodyRDSExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeRdsExporterOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeRdsExporterOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this change RDS exporter OK body RDS exporter based on the context it is used func (o *ChangeRDSExporterOKBodyRDSExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeRDSExporterOKBodyRDSExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("changeRdsExporterOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("changeRdsExporterOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -655,6 +705,49 @@ func (o *ChangeRDSExporterOKBodyRDSExporter) UnmarshalBinary(b []byte) error { return nil } +/* +ChangeRDSExporterOKBodyRDSExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeRDSExporterOKBodyRDSExporterMetricsResolutions +*/ +type ChangeRDSExporterOKBodyRDSExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change RDS exporter OK body RDS exporter metrics resolutions +func (o *ChangeRDSExporterOKBodyRDSExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change RDS exporter OK body RDS exporter metrics resolutions based on context it is used +func (o *ChangeRDSExporterOKBodyRDSExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeRDSExporterOKBodyRDSExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeRDSExporterOKBodyRDSExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeRDSExporterOKBodyRDSExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ChangeRDSExporterParamsBodyCommon ChangeCommonAgentParams contains parameters that can be changed for all Agents. swagger:model ChangeRDSExporterParamsBodyCommon @@ -678,15 +771,70 @@ type ChangeRDSExporterParamsBodyCommon struct { // Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics. DisablePushMetrics bool `json:"disable_push_metrics,omitempty"` + + // metrics resolutions + MetricsResolutions *ChangeRDSExporterParamsBodyCommonMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this change RDS exporter params body common func (o *ChangeRDSExporterParamsBodyCommon) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeRDSExporterParamsBodyCommon) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this change RDS exporter params body common based on context it is used +// ContextValidate validate this change RDS exporter params body common based on the context it is used func (o *ChangeRDSExporterParamsBodyCommon) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ChangeRDSExporterParamsBodyCommon) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("body" + "." + "common" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -707,3 +855,46 @@ func (o *ChangeRDSExporterParamsBodyCommon) UnmarshalBinary(b []byte) error { *o = res return nil } + +/* +ChangeRDSExporterParamsBodyCommonMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ChangeRDSExporterParamsBodyCommonMetricsResolutions +*/ +type ChangeRDSExporterParamsBodyCommonMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this change RDS exporter params body common metrics resolutions +func (o *ChangeRDSExporterParamsBodyCommonMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this change RDS exporter params body common metrics resolutions based on context it is used +func (o *ChangeRDSExporterParamsBodyCommonMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ChangeRDSExporterParamsBodyCommonMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ChangeRDSExporterParamsBodyCommonMetricsResolutions) UnmarshalBinary(b []byte) error { + var res ChangeRDSExporterParamsBodyCommonMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/inventorypb/json/client/agents/get_agent_responses.go b/api/inventorypb/json/client/agents/get_agent_responses.go index 0020826601..ecedefd767 100644 --- a/api/inventorypb/json/client/agents/get_agent_responses.go +++ b/api/inventorypb/json/client/agents/get_agent_responses.go @@ -1068,6 +1068,9 @@ type GetAgentOKBodyAzureDatabaseExporter struct { // Log level for exporters // Enum: [auto fatal error warn info debug] LogLevel *string `json:"log_level,omitempty"` + + // metrics resolutions + MetricsResolutions *GetAgentOKBodyAzureDatabaseExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this get agent OK body azure database exporter @@ -1082,6 +1085,10 @@ func (o *GetAgentOKBodyAzureDatabaseExporter) Validate(formats strfmt.Registry) res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -1199,8 +1206,51 @@ func (o *GetAgentOKBodyAzureDatabaseExporter) validateLogLevel(formats strfmt.Re return nil } -// ContextValidate validates this get agent OK body azure database exporter based on context it is used +func (o *GetAgentOKBodyAzureDatabaseExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "azure_database_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "azure_database_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this get agent OK body azure database exporter based on the context it is used func (o *GetAgentOKBodyAzureDatabaseExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetAgentOKBodyAzureDatabaseExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "azure_database_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "azure_database_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -1222,6 +1272,49 @@ func (o *GetAgentOKBodyAzureDatabaseExporter) UnmarshalBinary(b []byte) error { return nil } +/* +GetAgentOKBodyAzureDatabaseExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model GetAgentOKBodyAzureDatabaseExporterMetricsResolutions +*/ +type GetAgentOKBodyAzureDatabaseExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this get agent OK body azure database exporter metrics resolutions +func (o *GetAgentOKBodyAzureDatabaseExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this get agent OK body azure database exporter metrics resolutions based on context it is used +func (o *GetAgentOKBodyAzureDatabaseExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *GetAgentOKBodyAzureDatabaseExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *GetAgentOKBodyAzureDatabaseExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res GetAgentOKBodyAzureDatabaseExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* GetAgentOKBodyExternalExporter ExternalExporter runs on any Node type, including Remote Node. swagger:model GetAgentOKBodyExternalExporter @@ -1259,15 +1352,70 @@ type GetAgentOKBodyExternalExporter struct { // Path to exec process. ProcessExecPath string `json:"process_exec_path,omitempty"` + + // metrics resolutions + MetricsResolutions *GetAgentOKBodyExternalExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this get agent OK body external exporter func (o *GetAgentOKBodyExternalExporter) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetAgentOKBodyExternalExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this get agent OK body external exporter based on context it is used +// ContextValidate validate this get agent OK body external exporter based on the context it is used func (o *GetAgentOKBodyExternalExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetAgentOKBodyExternalExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -1289,6 +1437,49 @@ func (o *GetAgentOKBodyExternalExporter) UnmarshalBinary(b []byte) error { return nil } +/* +GetAgentOKBodyExternalExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model GetAgentOKBodyExternalExporterMetricsResolutions +*/ +type GetAgentOKBodyExternalExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this get agent OK body external exporter metrics resolutions +func (o *GetAgentOKBodyExternalExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this get agent OK body external exporter metrics resolutions based on context it is used +func (o *GetAgentOKBodyExternalExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *GetAgentOKBodyExternalExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *GetAgentOKBodyExternalExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res GetAgentOKBodyExternalExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* GetAgentOKBodyMongodbExporter MongoDBExporter runs on Generic or Container Node and exposes MongoDB Service metrics. swagger:model GetAgentOKBodyMongodbExporter @@ -1359,6 +1550,9 @@ type GetAgentOKBodyMongodbExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *GetAgentOKBodyMongodbExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this get agent OK body mongodb exporter @@ -1373,6 +1567,10 @@ func (o *GetAgentOKBodyMongodbExporter) Validate(formats strfmt.Registry) error res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -1490,8 +1688,51 @@ func (o *GetAgentOKBodyMongodbExporter) validateLogLevel(formats strfmt.Registry return nil } -// ContextValidate validates this get agent OK body mongodb exporter based on context it is used +func (o *GetAgentOKBodyMongodbExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this get agent OK body mongodb exporter based on the context it is used func (o *GetAgentOKBodyMongodbExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetAgentOKBodyMongodbExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -1513,6 +1754,49 @@ func (o *GetAgentOKBodyMongodbExporter) UnmarshalBinary(b []byte) error { return nil } +/* +GetAgentOKBodyMongodbExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model GetAgentOKBodyMongodbExporterMetricsResolutions +*/ +type GetAgentOKBodyMongodbExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this get agent OK body mongodb exporter metrics resolutions +func (o *GetAgentOKBodyMongodbExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this get agent OK body mongodb exporter metrics resolutions based on context it is used +func (o *GetAgentOKBodyMongodbExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *GetAgentOKBodyMongodbExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *GetAgentOKBodyMongodbExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res GetAgentOKBodyMongodbExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* GetAgentOKBodyMysqldExporter MySQLdExporter runs on Generic or Container Node and exposes MySQL Service metrics. swagger:model GetAgentOKBodyMysqldExporter @@ -1590,6 +1874,9 @@ type GetAgentOKBodyMysqldExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *GetAgentOKBodyMysqldExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this get agent OK body mysqld exporter @@ -1604,6 +1891,10 @@ func (o *GetAgentOKBodyMysqldExporter) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -1721,8 +2012,51 @@ func (o *GetAgentOKBodyMysqldExporter) validateLogLevel(formats strfmt.Registry) return nil } -// ContextValidate validates this get agent OK body mysqld exporter based on context it is used +func (o *GetAgentOKBodyMysqldExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this get agent OK body mysqld exporter based on the context it is used func (o *GetAgentOKBodyMysqldExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetAgentOKBodyMysqldExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -1744,6 +2078,49 @@ func (o *GetAgentOKBodyMysqldExporter) UnmarshalBinary(b []byte) error { return nil } +/* +GetAgentOKBodyMysqldExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model GetAgentOKBodyMysqldExporterMetricsResolutions +*/ +type GetAgentOKBodyMysqldExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this get agent OK body mysqld exporter metrics resolutions +func (o *GetAgentOKBodyMysqldExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this get agent OK body mysqld exporter metrics resolutions based on context it is used +func (o *GetAgentOKBodyMysqldExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *GetAgentOKBodyMysqldExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *GetAgentOKBodyMysqldExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res GetAgentOKBodyMysqldExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* GetAgentOKBodyNodeExporter NodeExporter runs on Generic or Container Node and exposes its metrics. swagger:model GetAgentOKBodyNodeExporter @@ -1792,6 +2169,9 @@ type GetAgentOKBodyNodeExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *GetAgentOKBodyNodeExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this get agent OK body node exporter @@ -1806,6 +2186,10 @@ func (o *GetAgentOKBodyNodeExporter) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -1923,8 +2307,51 @@ func (o *GetAgentOKBodyNodeExporter) validateLogLevel(formats strfmt.Registry) e return nil } -// ContextValidate validates this get agent OK body node exporter based on context it is used +func (o *GetAgentOKBodyNodeExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "node_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "node_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this get agent OK body node exporter based on the context it is used func (o *GetAgentOKBodyNodeExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetAgentOKBodyNodeExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "node_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "node_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -1946,6 +2373,49 @@ func (o *GetAgentOKBodyNodeExporter) UnmarshalBinary(b []byte) error { return nil } +/* +GetAgentOKBodyNodeExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model GetAgentOKBodyNodeExporterMetricsResolutions +*/ +type GetAgentOKBodyNodeExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this get agent OK body node exporter metrics resolutions +func (o *GetAgentOKBodyNodeExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this get agent OK body node exporter metrics resolutions based on context it is used +func (o *GetAgentOKBodyNodeExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *GetAgentOKBodyNodeExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *GetAgentOKBodyNodeExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res GetAgentOKBodyNodeExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* GetAgentOKBodyPMMAgent PMMAgent runs on Generic or Container Node. swagger:model GetAgentOKBodyPMMAgent @@ -2061,6 +2531,9 @@ type GetAgentOKBodyPostgresExporter struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + + // metrics resolutions + MetricsResolutions *GetAgentOKBodyPostgresExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this get agent OK body postgres exporter @@ -2075,6 +2548,10 @@ func (o *GetAgentOKBodyPostgresExporter) Validate(formats strfmt.Registry) error res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -2192,8 +2669,51 @@ func (o *GetAgentOKBodyPostgresExporter) validateLogLevel(formats strfmt.Registr return nil } -// ContextValidate validates this get agent OK body postgres exporter based on context it is used +func (o *GetAgentOKBodyPostgresExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this get agent OK body postgres exporter based on the context it is used func (o *GetAgentOKBodyPostgresExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetAgentOKBodyPostgresExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -2215,6 +2735,49 @@ func (o *GetAgentOKBodyPostgresExporter) UnmarshalBinary(b []byte) error { return nil } +/* +GetAgentOKBodyPostgresExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model GetAgentOKBodyPostgresExporterMetricsResolutions +*/ +type GetAgentOKBodyPostgresExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this get agent OK body postgres exporter metrics resolutions +func (o *GetAgentOKBodyPostgresExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this get agent OK body postgres exporter metrics resolutions based on context it is used +func (o *GetAgentOKBodyPostgresExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *GetAgentOKBodyPostgresExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *GetAgentOKBodyPostgresExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res GetAgentOKBodyPostgresExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* GetAgentOKBodyProxysqlExporter ProxySQLExporter runs on Generic or Container Node and exposes ProxySQL Service metrics. swagger:model GetAgentOKBodyProxysqlExporter @@ -2275,6 +2838,9 @@ type GetAgentOKBodyProxysqlExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *GetAgentOKBodyProxysqlExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this get agent OK body proxysql exporter @@ -2289,6 +2855,10 @@ func (o *GetAgentOKBodyProxysqlExporter) Validate(formats strfmt.Registry) error res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -2406,8 +2976,51 @@ func (o *GetAgentOKBodyProxysqlExporter) validateLogLevel(formats strfmt.Registr return nil } -// ContextValidate validates this get agent OK body proxysql exporter based on context it is used +func (o *GetAgentOKBodyProxysqlExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this get agent OK body proxysql exporter based on the context it is used func (o *GetAgentOKBodyProxysqlExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetAgentOKBodyProxysqlExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -2429,6 +3042,49 @@ func (o *GetAgentOKBodyProxysqlExporter) UnmarshalBinary(b []byte) error { return nil } +/* +GetAgentOKBodyProxysqlExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model GetAgentOKBodyProxysqlExporterMetricsResolutions +*/ +type GetAgentOKBodyProxysqlExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this get agent OK body proxysql exporter metrics resolutions +func (o *GetAgentOKBodyProxysqlExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this get agent OK body proxysql exporter metrics resolutions based on context it is used +func (o *GetAgentOKBodyProxysqlExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *GetAgentOKBodyProxysqlExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *GetAgentOKBodyProxysqlExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res GetAgentOKBodyProxysqlExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* GetAgentOKBodyQANMongodbProfilerAgent QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. swagger:model GetAgentOKBodyQANMongodbProfilerAgent @@ -3558,6 +4214,9 @@ type GetAgentOKBodyRDSExporter struct { // Limit of databases for auto-discovery. AutoDiscoveryLimit int32 `json:"auto_discovery_limit,omitempty"` + + // metrics resolutions + MetricsResolutions *GetAgentOKBodyRDSExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this get agent OK body RDS exporter @@ -3572,6 +4231,10 @@ func (o *GetAgentOKBodyRDSExporter) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -3689,8 +4352,51 @@ func (o *GetAgentOKBodyRDSExporter) validateLogLevel(formats strfmt.Registry) er return nil } -// ContextValidate validates this get agent OK body RDS exporter based on context it is used +func (o *GetAgentOKBodyRDSExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this get agent OK body RDS exporter based on the context it is used func (o *GetAgentOKBodyRDSExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *GetAgentOKBodyRDSExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("getAgentOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("getAgentOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -3712,6 +4418,49 @@ func (o *GetAgentOKBodyRDSExporter) UnmarshalBinary(b []byte) error { return nil } +/* +GetAgentOKBodyRDSExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model GetAgentOKBodyRDSExporterMetricsResolutions +*/ +type GetAgentOKBodyRDSExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this get agent OK body RDS exporter metrics resolutions +func (o *GetAgentOKBodyRDSExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this get agent OK body RDS exporter metrics resolutions based on context it is used +func (o *GetAgentOKBodyRDSExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *GetAgentOKBodyRDSExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *GetAgentOKBodyRDSExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res GetAgentOKBodyRDSExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* GetAgentOKBodyVmagent VMAgent runs on Generic or Container Node alongside pmm-agent. // It scrapes other exporter Agents that are configured with push_metrics_enabled diff --git a/api/inventorypb/json/client/agents/list_agents_responses.go b/api/inventorypb/json/client/agents/list_agents_responses.go index 188e969ca4..8acd19b0e9 100644 --- a/api/inventorypb/json/client/agents/list_agents_responses.go +++ b/api/inventorypb/json/client/agents/list_agents_responses.go @@ -1309,6 +1309,9 @@ type ListAgentsOKBodyAzureDatabaseExporterItems0 struct { // Log level for exporters // Enum: [auto fatal error warn info debug] LogLevel *string `json:"log_level,omitempty"` + + // metrics resolutions + MetricsResolutions *ListAgentsOKBodyAzureDatabaseExporterItems0MetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this list agents OK body azure database exporter items0 @@ -1323,6 +1326,10 @@ func (o *ListAgentsOKBodyAzureDatabaseExporterItems0) Validate(formats strfmt.Re res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -1440,8 +1447,51 @@ func (o *ListAgentsOKBodyAzureDatabaseExporterItems0) validateLogLevel(formats s return nil } -// ContextValidate validates this list agents OK body azure database exporter items0 based on context it is used +func (o *ListAgentsOKBodyAzureDatabaseExporterItems0) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this list agents OK body azure database exporter items0 based on the context it is used func (o *ListAgentsOKBodyAzureDatabaseExporterItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ListAgentsOKBodyAzureDatabaseExporterItems0) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + return nil } @@ -1463,6 +1513,49 @@ func (o *ListAgentsOKBodyAzureDatabaseExporterItems0) UnmarshalBinary(b []byte) return nil } +/* +ListAgentsOKBodyAzureDatabaseExporterItems0MetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ListAgentsOKBodyAzureDatabaseExporterItems0MetricsResolutions +*/ +type ListAgentsOKBodyAzureDatabaseExporterItems0MetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this list agents OK body azure database exporter items0 metrics resolutions +func (o *ListAgentsOKBodyAzureDatabaseExporterItems0MetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this list agents OK body azure database exporter items0 metrics resolutions based on context it is used +func (o *ListAgentsOKBodyAzureDatabaseExporterItems0MetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ListAgentsOKBodyAzureDatabaseExporterItems0MetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ListAgentsOKBodyAzureDatabaseExporterItems0MetricsResolutions) UnmarshalBinary(b []byte) error { + var res ListAgentsOKBodyAzureDatabaseExporterItems0MetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ListAgentsOKBodyExternalExporterItems0 ExternalExporter runs on any Node type, including Remote Node. swagger:model ListAgentsOKBodyExternalExporterItems0 @@ -1500,15 +1593,70 @@ type ListAgentsOKBodyExternalExporterItems0 struct { // Path to exec process. ProcessExecPath string `json:"process_exec_path,omitempty"` + + // metrics resolutions + MetricsResolutions *ListAgentsOKBodyExternalExporterItems0MetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this list agents OK body external exporter items0 func (o *ListAgentsOKBodyExternalExporterItems0) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } return nil } -// ContextValidate validates this list agents OK body external exporter items0 based on context it is used +func (o *ListAgentsOKBodyExternalExporterItems0) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this list agents OK body external exporter items0 based on the context it is used func (o *ListAgentsOKBodyExternalExporterItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ListAgentsOKBodyExternalExporterItems0) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + return nil } @@ -1530,6 +1678,49 @@ func (o *ListAgentsOKBodyExternalExporterItems0) UnmarshalBinary(b []byte) error return nil } +/* +ListAgentsOKBodyExternalExporterItems0MetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ListAgentsOKBodyExternalExporterItems0MetricsResolutions +*/ +type ListAgentsOKBodyExternalExporterItems0MetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this list agents OK body external exporter items0 metrics resolutions +func (o *ListAgentsOKBodyExternalExporterItems0MetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this list agents OK body external exporter items0 metrics resolutions based on context it is used +func (o *ListAgentsOKBodyExternalExporterItems0MetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ListAgentsOKBodyExternalExporterItems0MetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ListAgentsOKBodyExternalExporterItems0MetricsResolutions) UnmarshalBinary(b []byte) error { + var res ListAgentsOKBodyExternalExporterItems0MetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ListAgentsOKBodyMongodbExporterItems0 MongoDBExporter runs on Generic or Container Node and exposes MongoDB Service metrics. swagger:model ListAgentsOKBodyMongodbExporterItems0 @@ -1600,6 +1791,9 @@ type ListAgentsOKBodyMongodbExporterItems0 struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *ListAgentsOKBodyMongodbExporterItems0MetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this list agents OK body mongodb exporter items0 @@ -1614,6 +1808,10 @@ func (o *ListAgentsOKBodyMongodbExporterItems0) Validate(formats strfmt.Registry res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -1731,8 +1929,51 @@ func (o *ListAgentsOKBodyMongodbExporterItems0) validateLogLevel(formats strfmt. return nil } -// ContextValidate validates this list agents OK body mongodb exporter items0 based on context it is used +func (o *ListAgentsOKBodyMongodbExporterItems0) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this list agents OK body mongodb exporter items0 based on the context it is used func (o *ListAgentsOKBodyMongodbExporterItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ListAgentsOKBodyMongodbExporterItems0) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + return nil } @@ -1754,6 +1995,49 @@ func (o *ListAgentsOKBodyMongodbExporterItems0) UnmarshalBinary(b []byte) error return nil } +/* +ListAgentsOKBodyMongodbExporterItems0MetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ListAgentsOKBodyMongodbExporterItems0MetricsResolutions +*/ +type ListAgentsOKBodyMongodbExporterItems0MetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this list agents OK body mongodb exporter items0 metrics resolutions +func (o *ListAgentsOKBodyMongodbExporterItems0MetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this list agents OK body mongodb exporter items0 metrics resolutions based on context it is used +func (o *ListAgentsOKBodyMongodbExporterItems0MetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ListAgentsOKBodyMongodbExporterItems0MetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ListAgentsOKBodyMongodbExporterItems0MetricsResolutions) UnmarshalBinary(b []byte) error { + var res ListAgentsOKBodyMongodbExporterItems0MetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ListAgentsOKBodyMysqldExporterItems0 MySQLdExporter runs on Generic or Container Node and exposes MySQL Service metrics. swagger:model ListAgentsOKBodyMysqldExporterItems0 @@ -1831,6 +2115,9 @@ type ListAgentsOKBodyMysqldExporterItems0 struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *ListAgentsOKBodyMysqldExporterItems0MetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this list agents OK body mysqld exporter items0 @@ -1845,6 +2132,10 @@ func (o *ListAgentsOKBodyMysqldExporterItems0) Validate(formats strfmt.Registry) res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -1962,8 +2253,51 @@ func (o *ListAgentsOKBodyMysqldExporterItems0) validateLogLevel(formats strfmt.R return nil } -// ContextValidate validates this list agents OK body mysqld exporter items0 based on context it is used +func (o *ListAgentsOKBodyMysqldExporterItems0) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this list agents OK body mysqld exporter items0 based on the context it is used func (o *ListAgentsOKBodyMysqldExporterItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ListAgentsOKBodyMysqldExporterItems0) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + return nil } @@ -1985,6 +2319,49 @@ func (o *ListAgentsOKBodyMysqldExporterItems0) UnmarshalBinary(b []byte) error { return nil } +/* +ListAgentsOKBodyMysqldExporterItems0MetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ListAgentsOKBodyMysqldExporterItems0MetricsResolutions +*/ +type ListAgentsOKBodyMysqldExporterItems0MetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this list agents OK body mysqld exporter items0 metrics resolutions +func (o *ListAgentsOKBodyMysqldExporterItems0MetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this list agents OK body mysqld exporter items0 metrics resolutions based on context it is used +func (o *ListAgentsOKBodyMysqldExporterItems0MetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ListAgentsOKBodyMysqldExporterItems0MetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ListAgentsOKBodyMysqldExporterItems0MetricsResolutions) UnmarshalBinary(b []byte) error { + var res ListAgentsOKBodyMysqldExporterItems0MetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ListAgentsOKBodyNodeExporterItems0 NodeExporter runs on Generic or Container Node and exposes its metrics. swagger:model ListAgentsOKBodyNodeExporterItems0 @@ -2033,6 +2410,9 @@ type ListAgentsOKBodyNodeExporterItems0 struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *ListAgentsOKBodyNodeExporterItems0MetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this list agents OK body node exporter items0 @@ -2047,6 +2427,10 @@ func (o *ListAgentsOKBodyNodeExporterItems0) Validate(formats strfmt.Registry) e res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -2164,8 +2548,51 @@ func (o *ListAgentsOKBodyNodeExporterItems0) validateLogLevel(formats strfmt.Reg return nil } -// ContextValidate validates this list agents OK body node exporter items0 based on context it is used +func (o *ListAgentsOKBodyNodeExporterItems0) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this list agents OK body node exporter items0 based on the context it is used func (o *ListAgentsOKBodyNodeExporterItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ListAgentsOKBodyNodeExporterItems0) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + return nil } @@ -2187,6 +2614,49 @@ func (o *ListAgentsOKBodyNodeExporterItems0) UnmarshalBinary(b []byte) error { return nil } +/* +ListAgentsOKBodyNodeExporterItems0MetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ListAgentsOKBodyNodeExporterItems0MetricsResolutions +*/ +type ListAgentsOKBodyNodeExporterItems0MetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this list agents OK body node exporter items0 metrics resolutions +func (o *ListAgentsOKBodyNodeExporterItems0MetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this list agents OK body node exporter items0 metrics resolutions based on context it is used +func (o *ListAgentsOKBodyNodeExporterItems0MetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ListAgentsOKBodyNodeExporterItems0MetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ListAgentsOKBodyNodeExporterItems0MetricsResolutions) UnmarshalBinary(b []byte) error { + var res ListAgentsOKBodyNodeExporterItems0MetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ListAgentsOKBodyPMMAgentItems0 PMMAgent runs on Generic or Container Node. swagger:model ListAgentsOKBodyPMMAgentItems0 @@ -2302,6 +2772,9 @@ type ListAgentsOKBodyPostgresExporterItems0 struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + + // metrics resolutions + MetricsResolutions *ListAgentsOKBodyPostgresExporterItems0MetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this list agents OK body postgres exporter items0 @@ -2316,6 +2789,10 @@ func (o *ListAgentsOKBodyPostgresExporterItems0) Validate(formats strfmt.Registr res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -2433,8 +2910,51 @@ func (o *ListAgentsOKBodyPostgresExporterItems0) validateLogLevel(formats strfmt return nil } -// ContextValidate validates this list agents OK body postgres exporter items0 based on context it is used +func (o *ListAgentsOKBodyPostgresExporterItems0) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this list agents OK body postgres exporter items0 based on the context it is used func (o *ListAgentsOKBodyPostgresExporterItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ListAgentsOKBodyPostgresExporterItems0) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + return nil } @@ -2456,6 +2976,49 @@ func (o *ListAgentsOKBodyPostgresExporterItems0) UnmarshalBinary(b []byte) error return nil } +/* +ListAgentsOKBodyPostgresExporterItems0MetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ListAgentsOKBodyPostgresExporterItems0MetricsResolutions +*/ +type ListAgentsOKBodyPostgresExporterItems0MetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this list agents OK body postgres exporter items0 metrics resolutions +func (o *ListAgentsOKBodyPostgresExporterItems0MetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this list agents OK body postgres exporter items0 metrics resolutions based on context it is used +func (o *ListAgentsOKBodyPostgresExporterItems0MetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ListAgentsOKBodyPostgresExporterItems0MetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ListAgentsOKBodyPostgresExporterItems0MetricsResolutions) UnmarshalBinary(b []byte) error { + var res ListAgentsOKBodyPostgresExporterItems0MetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ListAgentsOKBodyProxysqlExporterItems0 ProxySQLExporter runs on Generic or Container Node and exposes ProxySQL Service metrics. swagger:model ListAgentsOKBodyProxysqlExporterItems0 @@ -2516,6 +3079,9 @@ type ListAgentsOKBodyProxysqlExporterItems0 struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *ListAgentsOKBodyProxysqlExporterItems0MetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this list agents OK body proxysql exporter items0 @@ -2530,6 +3096,10 @@ func (o *ListAgentsOKBodyProxysqlExporterItems0) Validate(formats strfmt.Registr res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -2647,8 +3217,51 @@ func (o *ListAgentsOKBodyProxysqlExporterItems0) validateLogLevel(formats strfmt return nil } -// ContextValidate validates this list agents OK body proxysql exporter items0 based on context it is used +func (o *ListAgentsOKBodyProxysqlExporterItems0) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this list agents OK body proxysql exporter items0 based on the context it is used func (o *ListAgentsOKBodyProxysqlExporterItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ListAgentsOKBodyProxysqlExporterItems0) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + return nil } @@ -2670,6 +3283,49 @@ func (o *ListAgentsOKBodyProxysqlExporterItems0) UnmarshalBinary(b []byte) error return nil } +/* +ListAgentsOKBodyProxysqlExporterItems0MetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ListAgentsOKBodyProxysqlExporterItems0MetricsResolutions +*/ +type ListAgentsOKBodyProxysqlExporterItems0MetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this list agents OK body proxysql exporter items0 metrics resolutions +func (o *ListAgentsOKBodyProxysqlExporterItems0MetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this list agents OK body proxysql exporter items0 metrics resolutions based on context it is used +func (o *ListAgentsOKBodyProxysqlExporterItems0MetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ListAgentsOKBodyProxysqlExporterItems0MetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ListAgentsOKBodyProxysqlExporterItems0MetricsResolutions) UnmarshalBinary(b []byte) error { + var res ListAgentsOKBodyProxysqlExporterItems0MetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ListAgentsOKBodyQANMongodbProfilerAgentItems0 QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. swagger:model ListAgentsOKBodyQANMongodbProfilerAgentItems0 @@ -3799,6 +4455,9 @@ type ListAgentsOKBodyRDSExporterItems0 struct { // Limit of databases for auto-discovery. AutoDiscoveryLimit int32 `json:"auto_discovery_limit,omitempty"` + + // metrics resolutions + MetricsResolutions *ListAgentsOKBodyRDSExporterItems0MetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this list agents OK body RDS exporter items0 @@ -3813,6 +4472,10 @@ func (o *ListAgentsOKBodyRDSExporterItems0) Validate(formats strfmt.Registry) er res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -3930,8 +4593,51 @@ func (o *ListAgentsOKBodyRDSExporterItems0) validateLogLevel(formats strfmt.Regi return nil } -// ContextValidate validates this list agents OK body RDS exporter items0 based on context it is used +func (o *ListAgentsOKBodyRDSExporterItems0) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this list agents OK body RDS exporter items0 based on the context it is used func (o *ListAgentsOKBodyRDSExporterItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *ListAgentsOKBodyRDSExporterItems0) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("metrics_resolutions") + } + return err + } + } + return nil } @@ -3953,6 +4659,49 @@ func (o *ListAgentsOKBodyRDSExporterItems0) UnmarshalBinary(b []byte) error { return nil } +/* +ListAgentsOKBodyRDSExporterItems0MetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model ListAgentsOKBodyRDSExporterItems0MetricsResolutions +*/ +type ListAgentsOKBodyRDSExporterItems0MetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this list agents OK body RDS exporter items0 metrics resolutions +func (o *ListAgentsOKBodyRDSExporterItems0MetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this list agents OK body RDS exporter items0 metrics resolutions based on context it is used +func (o *ListAgentsOKBodyRDSExporterItems0MetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *ListAgentsOKBodyRDSExporterItems0MetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *ListAgentsOKBodyRDSExporterItems0MetricsResolutions) UnmarshalBinary(b []byte) error { + var res ListAgentsOKBodyRDSExporterItems0MetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* ListAgentsOKBodyVMAgentItems0 VMAgent runs on Generic or Container Node alongside pmm-agent. // It scrapes other exporter Agents that are configured with push_metrics_enabled diff --git a/api/inventorypb/json/inventorypb.json b/api/inventorypb/json/inventorypb.json index f60f079eae..fb7356a92c 100644 --- a/api/inventorypb/json/inventorypb.json +++ b/api/inventorypb/json/inventorypb.json @@ -165,6 +165,28 @@ ], "x-order": 11 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 12 + }, "node_id": { "description": "Node identifier.", "type": "string", @@ -348,6 +370,28 @@ "type": "string", "x-order": 6 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 11 + }, "process_exec_path": { "description": "Path to exec process.", "type": "string", @@ -629,6 +673,28 @@ ], "x-order": 16 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 18 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -909,6 +975,28 @@ ], "x-order": 18 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 20 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -1157,6 +1245,28 @@ ], "x-order": 9 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 11 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -1538,6 +1648,28 @@ "format": "int32", "x-order": 16 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 17 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -1789,6 +1921,28 @@ ], "x-order": 13 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 15 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -3307,6 +3461,28 @@ ], "x-order": 12 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 14 + }, "node_id": { "description": "Node identifier.", "type": "string", @@ -3434,6 +3610,28 @@ "type": "boolean", "x-order": 4 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 6 + }, "remove_custom_labels": { "description": "Remove all custom user-assigned labels.", "type": "boolean", @@ -3504,6 +3702,28 @@ ], "x-order": 11 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 12 + }, "node_id": { "description": "Node identifier.", "type": "string", @@ -3631,6 +3851,28 @@ "type": "boolean", "x-order": 4 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 6 + }, "remove_custom_labels": { "description": "Remove all custom user-assigned labels.", "type": "boolean", @@ -3682,6 +3924,28 @@ "type": "string", "x-order": 6 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 11 + }, "process_exec_path": { "description": "Path to exec process.", "type": "string", @@ -3804,6 +4068,28 @@ "type": "boolean", "x-order": 4 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 6 + }, "remove_custom_labels": { "description": "Remove all custom user-assigned labels.", "type": "boolean", @@ -3888,6 +4174,28 @@ ], "x-order": 16 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 18 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -4038,6 +4346,28 @@ "type": "boolean", "x-order": 4 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 6 + }, "remove_custom_labels": { "description": "Remove all custom user-assigned labels.", "type": "boolean", @@ -4111,6 +4441,28 @@ ], "x-order": 18 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 20 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -4279,6 +4631,28 @@ "type": "boolean", "x-order": 4 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 6 + }, "remove_custom_labels": { "description": "Remove all custom user-assigned labels.", "type": "boolean", @@ -4352,6 +4726,28 @@ ], "x-order": 9 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 11 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -4474,6 +4870,28 @@ "type": "boolean", "x-order": 4 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 6 + }, "remove_custom_labels": { "description": "Remove all custom user-assigned labels.", "type": "boolean", @@ -4559,6 +4977,28 @@ "format": "int32", "x-order": 16 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 17 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -4701,6 +5141,28 @@ "type": "boolean", "x-order": 4 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 6 + }, "remove_custom_labels": { "description": "Remove all custom user-assigned labels.", "type": "boolean", @@ -4774,6 +5236,28 @@ ], "x-order": 13 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 15 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -4916,6 +5400,28 @@ "type": "boolean", "x-order": 4 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 6 + }, "remove_custom_labels": { "description": "Remove all custom user-assigned labels.", "type": "boolean", @@ -5113,6 +5619,28 @@ "type": "boolean", "x-order": 4 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 6 + }, "remove_custom_labels": { "description": "Remove all custom user-assigned labels.", "type": "boolean", @@ -5335,6 +5863,28 @@ "type": "boolean", "x-order": 4 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 6 + }, "remove_custom_labels": { "description": "Remove all custom user-assigned labels.", "type": "boolean", @@ -5563,6 +6113,28 @@ "type": "boolean", "x-order": 4 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 6 + }, "remove_custom_labels": { "description": "Remove all custom user-assigned labels.", "type": "boolean", @@ -5770,6 +6342,28 @@ "type": "boolean", "x-order": 4 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 6 + }, "remove_custom_labels": { "description": "Remove all custom user-assigned labels.", "type": "boolean", @@ -5972,6 +6566,28 @@ "type": "boolean", "x-order": 4 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 6 + }, "remove_custom_labels": { "description": "Remove all custom user-assigned labels.", "type": "boolean", @@ -6053,6 +6669,28 @@ ], "x-order": 12 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 14 + }, "node_id": { "description": "Node identifier.", "type": "string", @@ -6211,6 +6849,28 @@ ], "x-order": 11 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 12 + }, "node_id": { "description": "Node identifier.", "type": "string", @@ -6282,6 +6942,28 @@ "type": "string", "x-order": 6 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 11 + }, "process_exec_path": { "description": "Path to exec process.", "type": "string", @@ -6381,6 +7063,28 @@ ], "x-order": 16 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 18 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -6497,6 +7201,28 @@ ], "x-order": 18 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 20 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -6631,6 +7357,28 @@ ], "x-order": 9 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 11 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -6766,6 +7514,28 @@ "format": "int32", "x-order": 16 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 17 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -6874,6 +7644,28 @@ ], "x-order": 13 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 15 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -7511,6 +8303,28 @@ ], "x-order": 12 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 14 + }, "node_id": { "description": "Node identifier.", "type": "string", @@ -7834,6 +8648,28 @@ ], "x-order": 11 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 12 + }, "node_id": { "description": "Node identifier.", "type": "string", @@ -7908,6 +8744,28 @@ "type": "string", "x-order": 6 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 11 + }, "process_exec_path": { "description": "Path to exec process.", "type": "string", @@ -8010,6 +8868,28 @@ ], "x-order": 16 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 18 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -8129,6 +9009,28 @@ ], "x-order": 18 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 20 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -8266,6 +9168,28 @@ ], "x-order": 9 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 11 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -8407,6 +9331,28 @@ "format": "int32", "x-order": 16 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 17 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -8518,6 +9464,28 @@ ], "x-order": 13 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 15 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -9173,6 +10141,28 @@ ], "x-order": 12 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 14 + }, "node_id": { "description": "Node identifier.", "type": "string", diff --git a/api/managementpb/json/client/external/add_external_responses.go b/api/managementpb/json/client/external/add_external_responses.go index 3fa642bb18..8a58ab6c98 100644 --- a/api/managementpb/json/client/external/add_external_responses.go +++ b/api/managementpb/json/client/external/add_external_responses.go @@ -628,15 +628,70 @@ type AddExternalOKBodyExternalExporter struct { // Path to exec process. ProcessExecPath string `json:"process_exec_path,omitempty"` + + // metrics resolutions + MetricsResolutions *AddExternalOKBodyExternalExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add external OK body external exporter func (o *AddExternalOKBodyExternalExporter) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddExternalOKBodyExternalExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addExternalOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addExternalOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this add external OK body external exporter based on context it is used +// ContextValidate validate this add external OK body external exporter based on the context it is used func (o *AddExternalOKBodyExternalExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddExternalOKBodyExternalExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addExternalOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addExternalOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -658,6 +713,49 @@ func (o *AddExternalOKBodyExternalExporter) UnmarshalBinary(b []byte) error { return nil } +/* +AddExternalOKBodyExternalExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddExternalOKBodyExternalExporterMetricsResolutions +*/ +type AddExternalOKBodyExternalExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add external OK body external exporter metrics resolutions +func (o *AddExternalOKBodyExternalExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add external OK body external exporter metrics resolutions based on context it is used +func (o *AddExternalOKBodyExternalExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddExternalOKBodyExternalExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddExternalOKBodyExternalExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddExternalOKBodyExternalExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* AddExternalOKBodyService ExternalService represents a generic External service instance. swagger:model AddExternalOKBodyService diff --git a/api/managementpb/json/client/ha_proxy/add_ha_proxy_responses.go b/api/managementpb/json/client/ha_proxy/add_ha_proxy_responses.go index b32ca5d114..9a246bd475 100644 --- a/api/managementpb/json/client/ha_proxy/add_ha_proxy_responses.go +++ b/api/managementpb/json/client/ha_proxy/add_ha_proxy_responses.go @@ -620,15 +620,70 @@ type AddHAProxyOKBodyExternalExporter struct { // Path to exec process. ProcessExecPath string `json:"process_exec_path,omitempty"` + + // metrics resolutions + MetricsResolutions *AddHAProxyOKBodyExternalExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add HA proxy OK body external exporter func (o *AddHAProxyOKBodyExternalExporter) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddHAProxyOKBodyExternalExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addHaProxyOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addHaProxyOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } -// ContextValidate validates this add HA proxy OK body external exporter based on context it is used +// ContextValidate validate this add HA proxy OK body external exporter based on the context it is used func (o *AddHAProxyOKBodyExternalExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddHAProxyOKBodyExternalExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addHaProxyOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addHaProxyOk" + "." + "external_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -650,6 +705,49 @@ func (o *AddHAProxyOKBodyExternalExporter) UnmarshalBinary(b []byte) error { return nil } +/* +AddHAProxyOKBodyExternalExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddHAProxyOKBodyExternalExporterMetricsResolutions +*/ +type AddHAProxyOKBodyExternalExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add HA proxy OK body external exporter metrics resolutions +func (o *AddHAProxyOKBodyExternalExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add HA proxy OK body external exporter metrics resolutions based on context it is used +func (o *AddHAProxyOKBodyExternalExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddHAProxyOKBodyExternalExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddHAProxyOKBodyExternalExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddHAProxyOKBodyExternalExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* AddHAProxyOKBodyService HAProxyService represents a generic HAProxy service instance. swagger:model AddHAProxyOKBodyService diff --git a/api/managementpb/json/client/mongo_db/add_mongo_db_responses.go b/api/managementpb/json/client/mongo_db/add_mongo_db_responses.go index 6f39f24943..af793cc018 100644 --- a/api/managementpb/json/client/mongo_db/add_mongo_db_responses.go +++ b/api/managementpb/json/client/mongo_db/add_mongo_db_responses.go @@ -813,6 +813,9 @@ type AddMongoDBOKBodyMongodbExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *AddMongoDBOKBodyMongodbExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add mongo DB OK body mongodb exporter @@ -827,6 +830,10 @@ func (o *AddMongoDBOKBodyMongodbExporter) Validate(formats strfmt.Registry) erro res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -944,8 +951,51 @@ func (o *AddMongoDBOKBodyMongodbExporter) validateLogLevel(formats strfmt.Regist return nil } -// ContextValidate validates this add mongo DB OK body mongodb exporter based on context it is used +func (o *AddMongoDBOKBodyMongodbExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addMongoDbOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addMongoDbOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add mongo DB OK body mongodb exporter based on the context it is used func (o *AddMongoDBOKBodyMongodbExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddMongoDBOKBodyMongodbExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addMongoDbOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addMongoDbOk" + "." + "mongodb_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -967,6 +1017,49 @@ func (o *AddMongoDBOKBodyMongodbExporter) UnmarshalBinary(b []byte) error { return nil } +/* +AddMongoDBOKBodyMongodbExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddMongoDBOKBodyMongodbExporterMetricsResolutions +*/ +type AddMongoDBOKBodyMongodbExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add mongo DB OK body mongodb exporter metrics resolutions +func (o *AddMongoDBOKBodyMongodbExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add mongo DB OK body mongodb exporter metrics resolutions based on context it is used +func (o *AddMongoDBOKBodyMongodbExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddMongoDBOKBodyMongodbExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddMongoDBOKBodyMongodbExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddMongoDBOKBodyMongodbExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* AddMongoDBOKBodyQANMongodbProfiler QANMongoDBProfilerAgent runs within pmm-agent and sends MongoDB Query Analytics data to the PMM Server. swagger:model AddMongoDBOKBodyQANMongodbProfiler 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 e3c6a6f534..6d878c40fe 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 @@ -866,6 +866,9 @@ type AddMySQLOKBodyMysqldExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *AddMySQLOKBodyMysqldExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add my SQL OK body mysqld exporter @@ -880,6 +883,10 @@ func (o *AddMySQLOKBodyMysqldExporter) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -997,8 +1004,51 @@ func (o *AddMySQLOKBodyMysqldExporter) validateLogLevel(formats strfmt.Registry) return nil } -// ContextValidate validates this add my SQL OK body mysqld exporter based on context it is used +func (o *AddMySQLOKBodyMysqldExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addMySqlOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addMySqlOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add my SQL OK body mysqld exporter based on the context it is used func (o *AddMySQLOKBodyMysqldExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddMySQLOKBodyMysqldExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addMySqlOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addMySqlOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -1020,6 +1070,49 @@ func (o *AddMySQLOKBodyMysqldExporter) UnmarshalBinary(b []byte) error { return nil } +/* +AddMySQLOKBodyMysqldExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddMySQLOKBodyMysqldExporterMetricsResolutions +*/ +type AddMySQLOKBodyMysqldExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add my SQL OK body mysqld exporter metrics resolutions +func (o *AddMySQLOKBodyMysqldExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add my SQL OK body mysqld exporter metrics resolutions based on context it is used +func (o *AddMySQLOKBodyMysqldExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddMySQLOKBodyMysqldExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddMySQLOKBodyMysqldExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddMySQLOKBodyMysqldExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* AddMySQLOKBodyQANMysqlPerfschema QANMySQLPerfSchemaAgent runs within pmm-agent and sends MySQL Query Analytics data to the PMM Server. swagger:model AddMySQLOKBodyQANMysqlPerfschema 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 925862d2d9..cce23864dc 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 @@ -852,6 +852,9 @@ type AddPostgreSQLOKBodyPostgresExporter struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + + // metrics resolutions + MetricsResolutions *AddPostgreSQLOKBodyPostgresExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add postgre SQL OK body postgres exporter @@ -866,6 +869,10 @@ func (o *AddPostgreSQLOKBodyPostgresExporter) Validate(formats strfmt.Registry) res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -983,8 +990,51 @@ func (o *AddPostgreSQLOKBodyPostgresExporter) validateLogLevel(formats strfmt.Re return nil } -// ContextValidate validates this add postgre SQL OK body postgres exporter based on context it is used +func (o *AddPostgreSQLOKBodyPostgresExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addPostgreSqlOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addPostgreSqlOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add postgre SQL OK body postgres exporter based on the context it is used func (o *AddPostgreSQLOKBodyPostgresExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddPostgreSQLOKBodyPostgresExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addPostgreSqlOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addPostgreSqlOk" + "." + "postgres_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -1006,6 +1056,49 @@ func (o *AddPostgreSQLOKBodyPostgresExporter) UnmarshalBinary(b []byte) error { return nil } +/* +AddPostgreSQLOKBodyPostgresExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddPostgreSQLOKBodyPostgresExporterMetricsResolutions +*/ +type AddPostgreSQLOKBodyPostgresExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add postgre SQL OK body postgres exporter metrics resolutions +func (o *AddPostgreSQLOKBodyPostgresExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add postgre SQL OK body postgres exporter metrics resolutions based on context it is used +func (o *AddPostgreSQLOKBodyPostgresExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddPostgreSQLOKBodyPostgresExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddPostgreSQLOKBodyPostgresExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddPostgreSQLOKBodyPostgresExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* AddPostgreSQLOKBodyQANPostgresqlPgstatementsAgent QANPostgreSQLPgStatementsAgent runs within pmm-agent and sends PostgreSQL Query Analytics data to the PMM Server. swagger:model AddPostgreSQLOKBodyQANPostgresqlPgstatementsAgent diff --git a/api/managementpb/json/client/proxy_sql/add_proxy_sql_responses.go b/api/managementpb/json/client/proxy_sql/add_proxy_sql_responses.go index 24472aabfa..91e79ebfcd 100644 --- a/api/managementpb/json/client/proxy_sql/add_proxy_sql_responses.go +++ b/api/managementpb/json/client/proxy_sql/add_proxy_sql_responses.go @@ -722,6 +722,9 @@ type AddProxySQLOKBodyProxysqlExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *AddProxySQLOKBodyProxysqlExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add proxy SQL OK body proxysql exporter @@ -736,6 +739,10 @@ func (o *AddProxySQLOKBodyProxysqlExporter) Validate(formats strfmt.Registry) er res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -853,8 +860,51 @@ func (o *AddProxySQLOKBodyProxysqlExporter) validateLogLevel(formats strfmt.Regi return nil } -// ContextValidate validates this add proxy SQL OK body proxysql exporter based on context it is used +func (o *AddProxySQLOKBodyProxysqlExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addProxySqlOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addProxySqlOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add proxy SQL OK body proxysql exporter based on the context it is used func (o *AddProxySQLOKBodyProxysqlExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddProxySQLOKBodyProxysqlExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addProxySqlOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addProxySqlOk" + "." + "proxysql_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -876,6 +926,49 @@ func (o *AddProxySQLOKBodyProxysqlExporter) UnmarshalBinary(b []byte) error { return nil } +/* +AddProxySQLOKBodyProxysqlExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddProxySQLOKBodyProxysqlExporterMetricsResolutions +*/ +type AddProxySQLOKBodyProxysqlExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add proxy SQL OK body proxysql exporter metrics resolutions +func (o *AddProxySQLOKBodyProxysqlExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add proxy SQL OK body proxysql exporter metrics resolutions based on context it is used +func (o *AddProxySQLOKBodyProxysqlExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddProxySQLOKBodyProxysqlExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddProxySQLOKBodyProxysqlExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddProxySQLOKBodyProxysqlExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* AddProxySQLOKBodyService ProxySQLService represents a generic ProxySQL instance. swagger:model AddProxySQLOKBodyService diff --git a/api/managementpb/json/client/rds/add_rds_responses.go b/api/managementpb/json/client/rds/add_rds_responses.go index 2c5602fcaf..56f638a87d 100644 --- a/api/managementpb/json/client/rds/add_rds_responses.go +++ b/api/managementpb/json/client/rds/add_rds_responses.go @@ -1056,6 +1056,9 @@ type AddRDSOKBodyMysqldExporter struct { // Optionally expose the exporter process on all public interfaces ExposeExporter bool `json:"expose_exporter,omitempty"` + + // metrics resolutions + MetricsResolutions *AddRDSOKBodyMysqldExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add RDS OK body mysqld exporter @@ -1070,6 +1073,10 @@ func (o *AddRDSOKBodyMysqldExporter) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -1187,8 +1194,51 @@ func (o *AddRDSOKBodyMysqldExporter) validateLogLevel(formats strfmt.Registry) e return nil } -// ContextValidate validates this add RDS OK body mysqld exporter based on context it is used +func (o *AddRDSOKBodyMysqldExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addRdsOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addRdsOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add RDS OK body mysqld exporter based on the context it is used func (o *AddRDSOKBodyMysqldExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddRDSOKBodyMysqldExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addRdsOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addRdsOk" + "." + "mysqld_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -1210,6 +1260,49 @@ func (o *AddRDSOKBodyMysqldExporter) UnmarshalBinary(b []byte) error { return nil } +/* +AddRDSOKBodyMysqldExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddRDSOKBodyMysqldExporterMetricsResolutions +*/ +type AddRDSOKBodyMysqldExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add RDS OK body mysqld exporter metrics resolutions +func (o *AddRDSOKBodyMysqldExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add RDS OK body mysqld exporter metrics resolutions based on context it is used +func (o *AddRDSOKBodyMysqldExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddRDSOKBodyMysqldExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddRDSOKBodyMysqldExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddRDSOKBodyMysqldExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* AddRDSOKBodyNode RemoteRDSNode represents remote RDS Node. Agents can't run on Remote RDS Nodes. swagger:model AddRDSOKBodyNode @@ -1405,6 +1498,9 @@ type AddRDSOKBodyPostgresqlExporter struct { // Maximum number of connections that exporter can open to the database instance. MaxExporterConnections int32 `json:"max_exporter_connections,omitempty"` + + // metrics resolutions + MetricsResolutions *AddRDSOKBodyPostgresqlExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add RDS OK body postgresql exporter @@ -1419,6 +1515,10 @@ func (o *AddRDSOKBodyPostgresqlExporter) Validate(formats strfmt.Registry) error res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -1536,8 +1636,51 @@ func (o *AddRDSOKBodyPostgresqlExporter) validateLogLevel(formats strfmt.Registr return nil } -// ContextValidate validates this add RDS OK body postgresql exporter based on context it is used +func (o *AddRDSOKBodyPostgresqlExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addRdsOk" + "." + "postgresql_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addRdsOk" + "." + "postgresql_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add RDS OK body postgresql exporter based on the context it is used func (o *AddRDSOKBodyPostgresqlExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddRDSOKBodyPostgresqlExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addRdsOk" + "." + "postgresql_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addRdsOk" + "." + "postgresql_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -1559,6 +1702,49 @@ func (o *AddRDSOKBodyPostgresqlExporter) UnmarshalBinary(b []byte) error { return nil } +/* +AddRDSOKBodyPostgresqlExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddRDSOKBodyPostgresqlExporterMetricsResolutions +*/ +type AddRDSOKBodyPostgresqlExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add RDS OK body postgresql exporter metrics resolutions +func (o *AddRDSOKBodyPostgresqlExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add RDS OK body postgresql exporter metrics resolutions based on context it is used +func (o *AddRDSOKBodyPostgresqlExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddRDSOKBodyPostgresqlExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddRDSOKBodyPostgresqlExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddRDSOKBodyPostgresqlExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* AddRDSOKBodyQANMysqlPerfschema QANMySQLPerfSchemaAgent runs within pmm-agent and sends MySQL Query Analytics data to the PMM Server. swagger:model AddRDSOKBodyQANMysqlPerfschema @@ -2046,6 +2232,9 @@ type AddRDSOKBodyRDSExporter struct { // Limit of databases for auto-discovery. AutoDiscoveryLimit int32 `json:"auto_discovery_limit,omitempty"` + + // metrics resolutions + MetricsResolutions *AddRDSOKBodyRDSExporterMetricsResolutions `json:"metrics_resolutions,omitempty"` } // Validate validates this add RDS OK body RDS exporter @@ -2060,6 +2249,10 @@ func (o *AddRDSOKBodyRDSExporter) Validate(formats strfmt.Registry) error { res = append(res, err) } + if err := o.validateMetricsResolutions(formats); err != nil { + res = append(res, err) + } + if len(res) > 0 { return errors.CompositeValidationError(res...) } @@ -2177,8 +2370,51 @@ func (o *AddRDSOKBodyRDSExporter) validateLogLevel(formats strfmt.Registry) erro return nil } -// ContextValidate validates this add RDS OK body RDS exporter based on context it is used +func (o *AddRDSOKBodyRDSExporter) validateMetricsResolutions(formats strfmt.Registry) error { + if swag.IsZero(o.MetricsResolutions) { // not required + return nil + } + + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addRdsOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addRdsOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } + return err + } + } + + return nil +} + +// ContextValidate validate this add RDS OK body RDS exporter based on the context it is used func (o *AddRDSOKBodyRDSExporter) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateMetricsResolutions(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *AddRDSOKBodyRDSExporter) contextValidateMetricsResolutions(ctx context.Context, formats strfmt.Registry) error { + if o.MetricsResolutions != nil { + if err := o.MetricsResolutions.ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("addRdsOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("addRdsOk" + "." + "rds_exporter" + "." + "metrics_resolutions") + } + return err + } + } + return nil } @@ -2199,3 +2435,46 @@ func (o *AddRDSOKBodyRDSExporter) UnmarshalBinary(b []byte) error { *o = res return nil } + +/* +AddRDSOKBodyRDSExporterMetricsResolutions MetricsResolutions represents Prometheus exporters metrics resolutions. +swagger:model AddRDSOKBodyRDSExporterMetricsResolutions +*/ +type AddRDSOKBodyRDSExporterMetricsResolutions struct { + // High resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Hr string `json:"hr,omitempty"` + + // Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Mr string `json:"mr,omitempty"` + + // Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix. + Lr string `json:"lr,omitempty"` +} + +// Validate validates this add RDS OK body RDS exporter metrics resolutions +func (o *AddRDSOKBodyRDSExporterMetricsResolutions) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this add RDS OK body RDS exporter metrics resolutions based on context it is used +func (o *AddRDSOKBodyRDSExporterMetricsResolutions) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *AddRDSOKBodyRDSExporterMetricsResolutions) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *AddRDSOKBodyRDSExporterMetricsResolutions) UnmarshalBinary(b []byte) error { + var res AddRDSOKBodyRDSExporterMetricsResolutions + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/managementpb/json/managementpb.json b/api/managementpb/json/managementpb.json index d2494b0f92..c1caad8511 100644 --- a/api/managementpb/json/managementpb.json +++ b/api/managementpb/json/managementpb.json @@ -1844,6 +1844,28 @@ "type": "string", "x-order": 6 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 11 + }, "process_exec_path": { "description": "Path to exec process.", "type": "string", @@ -2177,6 +2199,28 @@ "type": "string", "x-order": 6 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 11 + }, "process_exec_path": { "description": "Path to exec process.", "type": "string", @@ -2635,6 +2679,28 @@ ], "x-order": 16 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 18 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -3219,6 +3285,28 @@ ], "x-order": 18 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 20 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -4314,6 +4402,28 @@ "format": "int32", "x-order": 16 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 17 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -4958,6 +5068,28 @@ ], "x-order": 13 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 15 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -5445,6 +5577,28 @@ ], "x-order": 18 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 20 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -5713,6 +5867,28 @@ "format": "int32", "x-order": 16 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 17 + }, "pmm_agent_id": { "description": "The pmm-agent identifier which runs this instance.", "type": "string", @@ -6039,6 +6215,28 @@ ], "x-order": 12 }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + } + }, + "x-order": 14 + }, "node_id": { "description": "Node identifier.", "type": "string", diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 400ca16e48..6e10715828 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -4350,6 +4350,28 @@ "debug" ], "x-order": 11 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 12 } }, "x-order": 0 @@ -4528,6 +4550,28 @@ "description": "Path to exec process.", "type": "string", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 0 @@ -4837,6 +4881,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 17 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 18 } }, "x-order": 0 @@ -5135,6 +5201,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 19 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 20 } }, "x-order": 0 @@ -5337,6 +5425,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 0 @@ -5738,6 +5848,28 @@ "type": "integer", "format": "int32", "x-order": 16 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 17 } }, "x-order": 0 @@ -5989,6 +6121,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 14 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 15 } }, "x-order": 0 @@ -7492,6 +7646,28 @@ "type": "integer", "format": "int32", "x-order": 13 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 14 } }, "x-order": 0 @@ -7589,6 +7765,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -7689,6 +7887,28 @@ "debug" ], "x-order": 11 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 12 } }, "x-order": 0 @@ -7786,6 +8006,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -7862,6 +8104,28 @@ "description": "Path to exec process.", "type": "string", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 0 @@ -7959,6 +8223,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -8096,15 +8382,37 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 17 - } - }, - "x-order": 0 - } - } - } - }, - "default": { - "description": "An unexpected error response.", + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 18 + } + }, + "x-order": 0 + } + } + } + }, + "default": { + "description": "An unexpected error response.", "schema": { "type": "object", "properties": { @@ -8193,6 +8501,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -8337,6 +8667,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 19 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 20 } }, "x-order": 0 @@ -8434,6 +8786,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -8532,6 +8906,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 0 @@ -8629,6 +9025,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -8759,6 +9177,28 @@ "type": "integer", "format": "int32", "x-order": 16 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 17 } }, "x-order": 0 @@ -8856,6 +9296,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -8974,6 +9436,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 14 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 15 } }, "x-order": 0 @@ -9071,6 +9555,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -9268,6 +9774,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -9490,6 +10018,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -9718,6 +10268,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -9925,6 +10497,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -10127,6 +10721,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -10238,6 +10854,28 @@ "type": "integer", "format": "int32", "x-order": 13 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 14 } }, "x-order": 0 @@ -10472,6 +11110,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 2 @@ -10606,6 +11266,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 19 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 20 } }, "x-order": 3 @@ -10733,6 +11415,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 17 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 18 } }, "x-order": 4 @@ -10853,6 +11557,28 @@ "type": "integer", "format": "int32", "x-order": 16 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 17 } }, "x-order": 5 @@ -10961,6 +11687,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 14 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 15 } }, "x-order": 6 @@ -11583,6 +12331,28 @@ "type": "integer", "format": "int32", "x-order": 13 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 14 } }, "x-order": 12 @@ -11649,6 +12419,28 @@ "description": "Path to exec process.", "type": "string", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 13 @@ -11739,6 +12531,28 @@ "debug" ], "x-order": 11 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 12 } }, "x-order": 14 @@ -12101,6 +12915,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } } }, @@ -12238,6 +13074,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 19 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 20 } } }, @@ -12368,6 +13226,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 17 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 18 } } }, @@ -12491,6 +13371,28 @@ "type": "integer", "format": "int32", "x-order": 16 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 17 } } }, @@ -12602,6 +13504,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 14 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 15 } } }, @@ -13242,6 +14166,28 @@ "type": "integer", "format": "int32", "x-order": 13 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 14 } } }, @@ -13311,6 +14257,28 @@ "description": "Path to exec process.", "type": "string", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } } }, @@ -13404,6 +14372,28 @@ "debug" ], "x-order": 11 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 12 } } }, @@ -25357,6 +26347,28 @@ "description": "Path to exec process.", "type": "string", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 1 @@ -25685,6 +26697,28 @@ "description": "Path to exec process.", "type": "string", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 1 @@ -26192,6 +27226,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 17 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 18 } }, "x-order": 1 @@ -26794,6 +27850,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 19 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 20 } }, "x-order": 1 @@ -28320,6 +29398,28 @@ "type": "integer", "format": "int32", "x-order": 16 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 17 } }, "x-order": 1 @@ -28953,6 +30053,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 14 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 15 } }, "x-order": 1 @@ -29346,6 +30468,28 @@ "type": "integer", "format": "int32", "x-order": 13 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 14 } }, "x-order": 1 @@ -29546,6 +30690,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 19 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 20 } }, "x-order": 3 @@ -29864,6 +31030,28 @@ "type": "integer", "format": "int32", "x-order": 16 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 17 } }, "x-order": 7 diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index 80d89caa28..3ce02bed10 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -1506,6 +1506,28 @@ "debug" ], "x-order": 11 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 12 } }, "x-order": 0 @@ -1684,6 +1706,28 @@ "description": "Path to exec process.", "type": "string", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 0 @@ -1993,6 +2037,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 17 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 18 } }, "x-order": 0 @@ -2291,6 +2357,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 19 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 20 } }, "x-order": 0 @@ -2493,6 +2581,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 0 @@ -2894,6 +3004,28 @@ "type": "integer", "format": "int32", "x-order": 16 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 17 } }, "x-order": 0 @@ -3145,6 +3277,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 14 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 15 } }, "x-order": 0 @@ -4648,6 +4802,28 @@ "type": "integer", "format": "int32", "x-order": 13 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 14 } }, "x-order": 0 @@ -4745,6 +4921,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -4845,6 +5043,28 @@ "debug" ], "x-order": 11 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 12 } }, "x-order": 0 @@ -4942,6 +5162,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -5018,6 +5260,28 @@ "description": "Path to exec process.", "type": "string", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 0 @@ -5115,6 +5379,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -5252,15 +5538,37 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 17 - } - }, - "x-order": 0 - } - } - } - }, - "default": { - "description": "An unexpected error response.", + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 18 + } + }, + "x-order": 0 + } + } + } + }, + "default": { + "description": "An unexpected error response.", "schema": { "type": "object", "properties": { @@ -5349,6 +5657,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -5493,6 +5823,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 19 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 20 } }, "x-order": 0 @@ -5590,6 +5942,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -5688,6 +6062,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 0 @@ -5785,6 +6181,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -5915,6 +6333,28 @@ "type": "integer", "format": "int32", "x-order": 16 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 17 } }, "x-order": 0 @@ -6012,6 +6452,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -6130,6 +6592,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 14 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 15 } }, "x-order": 0 @@ -6227,6 +6711,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -6424,6 +6930,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -6646,6 +7174,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -6874,6 +7424,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -7081,6 +7653,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -7283,6 +7877,28 @@ "description": "Disables push metrics, pmm-server starts to pull it, can't be used with enable_push_metrics.", "type": "boolean", "x-order": 5 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 6 } }, "x-order": 1 @@ -7394,6 +8010,28 @@ "type": "integer", "format": "int32", "x-order": 13 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 14 } }, "x-order": 0 @@ -7628,6 +8266,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 2 @@ -7762,6 +8422,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 19 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 20 } }, "x-order": 3 @@ -7889,6 +8571,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 17 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 18 } }, "x-order": 4 @@ -8009,6 +8713,28 @@ "type": "integer", "format": "int32", "x-order": 16 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 17 } }, "x-order": 5 @@ -8117,6 +8843,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 14 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 15 } }, "x-order": 6 @@ -8739,6 +9487,28 @@ "type": "integer", "format": "int32", "x-order": 13 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 14 } }, "x-order": 12 @@ -8805,6 +9575,28 @@ "description": "Path to exec process.", "type": "string", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 13 @@ -8895,6 +9687,28 @@ "debug" ], "x-order": 11 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 12 } }, "x-order": 14 @@ -9257,6 +10071,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } } }, @@ -9394,6 +10230,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 19 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 20 } } }, @@ -9524,6 +10382,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 17 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 18 } } }, @@ -9647,6 +10527,28 @@ "type": "integer", "format": "int32", "x-order": 16 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 17 } } }, @@ -9758,6 +10660,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 14 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 15 } } }, @@ -10398,6 +11322,28 @@ "type": "integer", "format": "int32", "x-order": 13 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 14 } } }, @@ -10467,6 +11413,28 @@ "description": "Path to exec process.", "type": "string", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } } }, @@ -10560,6 +11528,28 @@ "debug" ], "x-order": 11 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 12 } } }, @@ -16980,6 +17970,28 @@ "description": "Path to exec process.", "type": "string", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 1 @@ -17308,6 +18320,28 @@ "description": "Path to exec process.", "type": "string", "x-order": 10 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 11 } }, "x-order": 1 @@ -17815,6 +18849,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 17 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 18 } }, "x-order": 1 @@ -18417,6 +19473,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 19 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 20 } }, "x-order": 1 @@ -19497,6 +20575,28 @@ "type": "integer", "format": "int32", "x-order": 16 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 17 } }, "x-order": 1 @@ -20130,6 +21230,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 14 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 15 } }, "x-order": 1 @@ -20523,6 +21645,28 @@ "type": "integer", "format": "int32", "x-order": 13 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 14 } }, "x-order": 1 @@ -20723,6 +21867,28 @@ "type": "boolean", "title": "Optionally expose the exporter process on all public interfaces", "x-order": 19 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 20 } }, "x-order": 3 @@ -21041,6 +22207,28 @@ "type": "integer", "format": "int32", "x-order": 16 + }, + "metrics_resolutions": { + "description": "MetricsResolutions represents Prometheus exporters metrics resolutions.", + "type": "object", + "properties": { + "hr": { + "description": "High resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 0 + }, + "mr": { + "description": "Medium resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 1 + }, + "lr": { + "description": "Low resolution. In JSON should be represented as a string with number of seconds with `s` suffix.", + "type": "string", + "x-order": 2 + } + }, + "x-order": 17 } }, "x-order": 7 diff --git a/managed/models/agent_helpers.go b/managed/models/agent_helpers.go index 50abea21a0..d509bdf435 100644 --- a/managed/models/agent_helpers.go +++ b/managed/models/agent_helpers.go @@ -18,6 +18,7 @@ package models import ( "fmt" "strings" + "time" "github.com/AlekSi/pointer" "github.com/google/uuid" @@ -741,6 +742,7 @@ type CreateAgentParams struct { ExposeExporter bool DisableCollectors []string LogLevel string + MetricsResolutions *MetricsResolutions } func compatibleNodeAndAgent(nodeType NodeType, agentType AgentType) bool { @@ -909,6 +911,14 @@ type ChangeCommonAgentParams struct { CustomLabels map[string]string RemoveCustomLabels bool DisablePushMetrics *bool + MetricsResolutions ChangeMetricsResolutionsParams +} + +// ChangeMetricsResolutionsParams contains metrics resolutions for change. +type ChangeMetricsResolutionsParams struct { + HR *time.Duration + MR *time.Duration + LR *time.Duration } // ChangeAgent changes common parameters for given Agent. @@ -945,6 +955,24 @@ func ChangeAgent(q *reform.Querier, agentID string, params *ChangeCommonAgentPar } } + if row.MetricsResolutions == nil { + row.MetricsResolutions = &MetricsResolutions{} + } + if params.MetricsResolutions.LR != nil { + row.MetricsResolutions.LR = *params.MetricsResolutions.LR + } + if params.MetricsResolutions.MR != nil { + row.MetricsResolutions.MR = *params.MetricsResolutions.MR + } + if params.MetricsResolutions.HR != nil { + row.MetricsResolutions.HR = *params.MetricsResolutions.HR + } + + // If all resolutions are empty, then drop whole MetricsResolution field. + if row.MetricsResolutions.HR == 0 && row.MetricsResolutions.MR == 0 && row.MetricsResolutions.LR == 0 { + row.MetricsResolutions = nil + } + if err = q.Update(row); err != nil { return nil, errors.WithStack(err) } diff --git a/managed/models/agent_helpers_test.go b/managed/models/agent_helpers_test.go index 55652f3384..0285a76485 100644 --- a/managed/models/agent_helpers_test.go +++ b/managed/models/agent_helpers_test.go @@ -130,6 +130,11 @@ func TestAgentHelpers(t *testing.T) { SSLCert: "ssl_cert", SSLKey: "ssl_key", }, + MetricsResolutions: &models.MetricsResolutions{ + HR: 1 * time.Minute, + MR: 5 * time.Minute, + LR: 15 * time.Minute, + }, }, &models.Agent{ AgentID: "A8", @@ -243,6 +248,11 @@ func TestAgentHelpers(t *testing.T) { SSLCert: "ssl_cert", SSLKey: "ssl_key", }, + MetricsResolutions: &models.MetricsResolutions{ + HR: 1 * time.Minute, + MR: 5 * time.Minute, + LR: 15 * time.Minute, + }, }, { AgentID: "A8", diff --git a/managed/models/agent_model.go b/managed/models/agent_model.go index f4dbfdbde1..9c97d43c7e 100644 --- a/managed/models/agent_model.go +++ b/managed/models/agent_model.go @@ -191,10 +191,11 @@ type Agent struct { MetricsPath *string `reform:"metrics_path"` MetricsScheme *string `reform:"metrics_scheme"` - RDSBasicMetricsDisabled bool `reform:"rds_basic_metrics_disabled"` - RDSEnhancedMetricsDisabled bool `reform:"rds_enhanced_metrics_disabled"` - PushMetrics bool `reform:"push_metrics"` - DisabledCollectors pq.StringArray `reform:"disabled_collectors"` + RDSBasicMetricsDisabled bool `reform:"rds_basic_metrics_disabled"` + RDSEnhancedMetricsDisabled bool `reform:"rds_enhanced_metrics_disabled"` + PushMetrics bool `reform:"push_metrics"` + DisabledCollectors pq.StringArray `reform:"disabled_collectors"` + MetricsResolutions *MetricsResolutions `reform:"metrics_resolutions"` MySQLOptions *MySQLOptions `reform:"mysql_options"` MongoDBOptions *MongoDBOptions `reform:"mongo_db_tls_options"` diff --git a/managed/models/agent_model_reform.go b/managed/models/agent_model_reform.go index cfd12634d7..0f6c88c440 100644 --- a/managed/models/agent_model_reform.go +++ b/managed/models/agent_model_reform.go @@ -62,6 +62,7 @@ func (v *agentTableType) Columns() []string { "rds_enhanced_metrics_disabled", "push_metrics", "disabled_collectors", + "metrics_resolutions", "mysql_options", "mongo_db_tls_options", "postgresql_options", @@ -125,6 +126,7 @@ var AgentTable = &agentTableType{ {Name: "RDSEnhancedMetricsDisabled", Type: "bool", Column: "rds_enhanced_metrics_disabled"}, {Name: "PushMetrics", Type: "bool", Column: "push_metrics"}, {Name: "DisabledCollectors", Type: "pq.StringArray", Column: "disabled_collectors"}, + {Name: "MetricsResolutions", Type: "*MetricsResolutions", Column: "metrics_resolutions"}, {Name: "MySQLOptions", Type: "*MySQLOptions", Column: "mysql_options"}, {Name: "MongoDBOptions", Type: "*MongoDBOptions", Column: "mongo_db_tls_options"}, {Name: "PostgreSQLOptions", Type: "*PostgreSQLOptions", Column: "postgresql_options"}, @@ -138,7 +140,7 @@ var AgentTable = &agentTableType{ // String returns a string representation of this struct or record. func (s Agent) String() string { - res := make([]string, 39) + res := make([]string, 40) res[0] = "AgentID: " + reform.Inspect(s.AgentID, true) res[1] = "AgentType: " + reform.Inspect(s.AgentType, true) res[2] = "RunsOnNodeID: " + reform.Inspect(s.RunsOnNodeID, true) @@ -173,11 +175,12 @@ func (s Agent) String() string { 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) - res[38] = "ExposeExporter: " + reform.Inspect(s.ExposeExporter, true) + res[34] = "MetricsResolutions: " + reform.Inspect(s.MetricsResolutions, true) + res[35] = "MySQLOptions: " + reform.Inspect(s.MySQLOptions, true) + res[36] = "MongoDBOptions: " + reform.Inspect(s.MongoDBOptions, true) + res[37] = "PostgreSQLOptions: " + reform.Inspect(s.PostgreSQLOptions, true) + res[38] = "LogLevel: " + reform.Inspect(s.LogLevel, true) + res[39] = "ExposeExporter: " + reform.Inspect(s.ExposeExporter, true) return strings.Join(res, ", ") } @@ -219,6 +222,7 @@ func (s *Agent) Values() []interface{} { s.RDSEnhancedMetricsDisabled, s.PushMetrics, s.DisabledCollectors, + s.MetricsResolutions, s.MySQLOptions, s.MongoDBOptions, s.PostgreSQLOptions, @@ -265,6 +269,7 @@ func (s *Agent) Pointers() []interface{} { &s.RDSEnhancedMetricsDisabled, &s.PushMetrics, &s.DisabledCollectors, + &s.MetricsResolutions, &s.MySQLOptions, &s.MongoDBOptions, &s.PostgreSQLOptions, diff --git a/managed/models/database.go b/managed/models/database.go index 84cc025285..01d3be9dd4 100644 --- a/managed/models/database.go +++ b/managed/models/database.go @@ -953,6 +953,9 @@ var databaseSchema = [][]string{ PRIMARY KEY (dump_id, chunk_id) )`, }, + 88: { + `ALTER TABLE agents ADD COLUMN metrics_resolutions JSONB`, + }, } // ^^^ Avoid default values in schema definition. ^^^ diff --git a/managed/models/settings.go b/managed/models/settings.go index 981f2fee9c..32051fce05 100644 --- a/managed/models/settings.go +++ b/managed/models/settings.go @@ -16,6 +16,7 @@ package models import ( + "database/sql/driver" "time" "github.com/asaskevich/govalidator" @@ -30,6 +31,12 @@ type MetricsResolutions struct { LR time.Duration `json:"lr"` } +// Value implements database/sql/driver.Valuer interface. Should be defined on the value. +func (r MetricsResolutions) Value() (driver.Value, error) { return jsonValue(r) } + +// Scan implements database/sql.Scanner interface. Should be defined on the pointer. +func (r *MetricsResolutions) Scan(src interface{}) error { return jsonScan(r, src) } + // SaaS contains settings related to the SaaS platform. type SaaS struct { // Advisor checks disabled, false by default. diff --git a/managed/services/converters.go b/managed/services/converters.go index 722dc62a70..60bcad9107 100644 --- a/managed/services/converters.go +++ b/managed/services/converters.go @@ -21,8 +21,10 @@ import ( "github.com/AlekSi/pointer" "github.com/pkg/errors" + "google.golang.org/protobuf/types/known/durationpb" "gopkg.in/reform.v1" + "github.com/percona/pmm/api/common" "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/managed/models" ) @@ -238,6 +240,7 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventorypb.Agent, erro ProcessExecPath: processExecPath, LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), ExposeExporter: agent.ExposeExporter, + MetricsResolutions: ConvertMetricsResolutions(agent.MetricsResolutions), }, nil case models.MySQLdExporterType: @@ -259,6 +262,7 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventorypb.Agent, erro ProcessExecPath: processExecPath, LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), ExposeExporter: agent.ExposeExporter, + MetricsResolutions: ConvertMetricsResolutions(agent.MetricsResolutions), }, nil case models.MongoDBExporterType: @@ -278,6 +282,7 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventorypb.Agent, erro ProcessExecPath: processExecPath, LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), ExposeExporter: agent.ExposeExporter, + MetricsResolutions: ConvertMetricsResolutions(agent.MetricsResolutions), } if agent.MongoDBOptions != nil { exporter.StatsCollections = agent.MongoDBOptions.StatsCollections @@ -303,6 +308,7 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventorypb.Agent, erro ProcessExecPath: processExecPath, LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), ExposeExporter: agent.ExposeExporter, + MetricsResolutions: ConvertMetricsResolutions(agent.MetricsResolutions), } if agent.PostgreSQLOptions != nil { exporter.AutoDiscoveryLimit = agent.PostgreSQLOptions.AutoDiscoveryLimit @@ -379,6 +385,7 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventorypb.Agent, erro ProcessExecPath: processExecPath, LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), ExposeExporter: agent.ExposeExporter, + MetricsResolutions: ConvertMetricsResolutions(agent.MetricsResolutions), }, nil case models.QANPostgreSQLPgStatementsAgentType: @@ -431,6 +438,7 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventorypb.Agent, erro PushMetricsEnabled: agent.PushMetrics, ProcessExecPath: processExecPath, LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), + MetricsResolutions: ConvertMetricsResolutions(agent.MetricsResolutions), }, nil case models.ExternalExporterType: @@ -453,6 +461,7 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventorypb.Agent, erro CustomLabels: labels, PushMetricsEnabled: agent.PushMetrics, ProcessExecPath: processExecPath, + MetricsResolutions: ConvertMetricsResolutions(agent.MetricsResolutions), }, nil case models.AzureDatabaseExporterType: @@ -467,6 +476,7 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventorypb.Agent, erro CustomLabels: labels, ProcessExecPath: processExecPath, LogLevel: inventorypb.LogLevel(inventorypb.LogLevel_value[pointer.GetString(agent.LogLevel)]), + MetricsResolutions: ConvertMetricsResolutions(agent.MetricsResolutions), }, nil case models.VMAgentType: @@ -483,6 +493,24 @@ func ToAPIAgent(q *reform.Querier, agent *models.Agent) (inventorypb.Agent, erro } } +// ConvertMetricsResolutions converts MetricsResolutions from model to API. +func ConvertMetricsResolutions(resolutions *models.MetricsResolutions) *common.MetricsResolutions { + if resolutions == nil { + return nil + } + var res common.MetricsResolutions + if resolutions.HR != 0 { + res.Hr = durationpb.New(resolutions.HR) + } + if resolutions.MR != 0 { + res.Mr = durationpb.New(resolutions.MR) + } + if resolutions.LR != 0 { + res.Lr = durationpb.New(resolutions.LR) + } + return &res +} + // SpecifyLogLevel - convert proto enum to string // mysqld_exporter, node_exporter and postgres_exporter don't support --log.level=fatal. func SpecifyLogLevel(variant, minLogLevel inventorypb.LogLevel) string { diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 15ad1709f4..d681c96bc7 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -100,6 +100,20 @@ func (as *AgentsService) changeAgent(agentID string, common *inventorypb.ChangeC return status.Errorf(codes.InvalidArgument, "expected one of param: enable_push_metrics or disable_push_metrics") } + if common.MetricsResolutions != nil { + if hr := common.MetricsResolutions.GetHr(); hr != nil { + params.MetricsResolutions.HR = pointer.ToDuration(hr.AsDuration()) + } + + if mr := common.MetricsResolutions.GetMr(); mr != nil { + params.MetricsResolutions.MR = pointer.ToDuration(mr.AsDuration()) + } + + if lr := common.MetricsResolutions.GetLr(); lr != nil { + params.MetricsResolutions.LR = pointer.ToDuration(lr.AsDuration()) + } + } + row, err := models.ChangeAgent(tx.Querier, agentID, params) if err != nil { return err diff --git a/managed/services/inventory/agents_test.go b/managed/services/inventory/agents_test.go index 0b27c9a19e..24dd2e2bb3 100644 --- a/managed/services/inventory/agents_test.go +++ b/managed/services/inventory/agents_test.go @@ -18,6 +18,7 @@ package inventory import ( "reflect" "testing" + "time" "github.com/AlekSi/pointer" "github.com/stretchr/testify/assert" @@ -25,8 +26,10 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" + "google.golang.org/protobuf/types/known/durationpb" "gopkg.in/reform.v1" + "github.com/percona/pmm/api/common" "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/utils/tests" @@ -82,6 +85,9 @@ func TestAgents(t *testing.T) { AgentId: "/agent_id/00000000-0000-4000-8000-000000000006", Common: &inventorypb.ChangeCommonAgentParams{ Disable: true, + MetricsResolutions: &common.MetricsResolutions{ + Hr: durationpb.New(10 * time.Second), + }, }, }) require.NoError(t, err) @@ -90,6 +96,9 @@ func TestAgents(t *testing.T) { PmmAgentId: "/agent_id/00000000-0000-4000-8000-000000000005", Disabled: true, Status: inventorypb.AgentStatus_UNKNOWN, + MetricsResolutions: &common.MetricsResolutions{ + Hr: durationpb.New(10 * time.Second), + }, } assert.Equal(t, expectedNodeExporter, actualNodeExporter) diff --git a/managed/services/victoriametrics/prometheus.go b/managed/services/victoriametrics/prometheus.go index 15fc1a55b0..242c54fa15 100644 --- a/managed/services/victoriametrics/prometheus.go +++ b/managed/services/victoriametrics/prometheus.go @@ -28,7 +28,9 @@ import ( // AddScrapeConfigs - adds agents scrape configuration to given scrape config, // pmm_agent_id and push_metrics used for filtering. -func AddScrapeConfigs(l *logrus.Entry, cfg *config.Config, q *reform.Querier, s *models.MetricsResolutions, pmmAgentID *string, pushMetrics bool) error { //nolint:cyclop +func AddScrapeConfigs(l *logrus.Entry, cfg *config.Config, q *reform.Querier, //nolint:cyclop,maintidx + globalResolutions *models.MetricsResolutions, pmmAgentID *string, pushMetrics bool, +) error { agents, err := models.FindAgentsForScrapeConfig(q, pmmAgentID, pushMetrics) if err != nil { return errors.WithStack(err) @@ -102,48 +104,66 @@ func AddScrapeConfigs(l *logrus.Entry, cfg *config.Config, q *reform.Querier, s continue } + mr := *globalResolutions // copy global resolutions + if agent.MetricsResolutions != nil { + if agent.MetricsResolutions.MR != 0 { + mr.MR = agent.MetricsResolutions.MR + } + if agent.MetricsResolutions.HR != 0 { + mr.HR = agent.MetricsResolutions.HR + } + if agent.MetricsResolutions.LR != 0 { + mr.LR = agent.MetricsResolutions.LR + } + } + var scfgs []*config.ScrapeConfig switch agent.AgentType { case models.NodeExporterType: - scfgs, err = scrapeConfigsForNodeExporter(s, &scrapeConfigParams{ - host: paramsHost, - node: paramsNode, - service: nil, - agent: agent, + scfgs, err = scrapeConfigsForNodeExporter(&scrapeConfigParams{ + host: paramsHost, + node: paramsNode, + service: nil, + agent: agent, + metricsResolution: &mr, }) case models.MySQLdExporterType: - scfgs, err = scrapeConfigsForMySQLdExporter(s, &scrapeConfigParams{ - host: paramsHost, - node: paramsNode, - service: paramsService, - agent: agent, + scfgs, err = scrapeConfigsForMySQLdExporter(&scrapeConfigParams{ + host: paramsHost, + node: paramsNode, + service: paramsService, + agent: agent, + metricsResolution: &mr, }) case models.MongoDBExporterType: - scfgs, err = scrapeConfigsForMongoDBExporter(s, &scrapeConfigParams{ - host: paramsHost, - node: paramsNode, - service: paramsService, - agent: agent, - pmmAgentVersion: paramPMMAgentVersion, + scfgs, err = scrapeConfigsForMongoDBExporter(&scrapeConfigParams{ + host: paramsHost, + node: paramsNode, + service: paramsService, + agent: agent, + pmmAgentVersion: paramPMMAgentVersion, + metricsResolution: &mr, }) case models.PostgresExporterType: - scfgs, err = scrapeConfigsForPostgresExporter(s, &scrapeConfigParams{ - host: paramsHost, - node: paramsNode, - service: paramsService, - agent: agent, - streamParse: true, + scfgs, err = scrapeConfigsForPostgresExporter(&scrapeConfigParams{ + host: paramsHost, + node: paramsNode, + service: paramsService, + agent: agent, + streamParse: true, + metricsResolution: &mr, }) case models.ProxySQLExporterType: - scfgs, err = scrapeConfigsForProxySQLExporter(s, &scrapeConfigParams{ - host: paramsHost, - node: paramsNode, - service: paramsService, - agent: agent, + scfgs, err = scrapeConfigsForProxySQLExporter(&scrapeConfigParams{ + host: paramsHost, + node: paramsNode, + service: paramsService, + agent: agent, + metricsResolution: &mr, }) case models.QANMySQLPerfSchemaAgentType, models.QANMySQLSlowlogAgentType: @@ -155,35 +175,39 @@ func AddScrapeConfigs(l *logrus.Entry, cfg *config.Config, q *reform.Querier, s case models.RDSExporterType: rdsParams = append(rdsParams, &scrapeConfigParams{ - host: paramsHost, - node: paramsNode, - service: paramsService, - agent: agent, + host: paramsHost, + node: paramsNode, + service: paramsService, + agent: agent, + metricsResolution: &mr, }) continue case models.ExternalExporterType: - scfgs, err = scrapeConfigsForExternalExporter(s, &scrapeConfigParams{ - host: paramsHost, - node: paramsNode, - service: paramsService, - agent: agent, + scfgs, err = scrapeConfigsForExternalExporter(&mr, &scrapeConfigParams{ + host: paramsHost, + node: paramsNode, + service: paramsService, + agent: agent, + metricsResolution: &mr, }) case models.VMAgentType: - scfgs, err = scrapeConfigsForVMAgent(s, &scrapeConfigParams{ - host: paramsHost, - node: paramsNode, - service: nil, - agent: agent, + scfgs, err = scrapeConfigsForVMAgent(&mr, &scrapeConfigParams{ + host: paramsHost, + node: paramsNode, + service: nil, + agent: agent, + metricsResolution: &mr, }) case models.AzureDatabaseExporterType: - scfgs, err = scrapeConfigsForAzureDatabase(s, &scrapeConfigParams{ - host: paramsHost, - node: paramsNode, - service: paramsService, - agent: agent, + scfgs, err = scrapeConfigsForAzureDatabase(&mr, &scrapeConfigParams{ + host: paramsHost, + node: paramsNode, + service: paramsService, + agent: agent, + metricsResolution: &mr, }) default: @@ -197,7 +221,7 @@ func AddScrapeConfigs(l *logrus.Entry, cfg *config.Config, q *reform.Querier, s cfg.ScrapeConfigs = append(cfg.ScrapeConfigs, scfgs...) } - scfgs := scrapeConfigsForRDSExporter(s, rdsParams) + scfgs := scrapeConfigsForRDSExporter(rdsParams) cfg.ScrapeConfigs = append(cfg.ScrapeConfigs, scfgs...) return nil diff --git a/managed/services/victoriametrics/scrape_configs.go b/managed/services/victoriametrics/scrape_configs.go index fc54b785eb..e41968f116 100644 --- a/managed/services/victoriametrics/scrape_configs.go +++ b/managed/services/victoriametrics/scrape_configs.go @@ -172,12 +172,13 @@ func httpClientConfig(agent *models.Agent) config.HTTPClientConfig { } type scrapeConfigParams struct { - host string // Node address where pmm-agent runs - node *models.Node - service *models.Service - agent *models.Agent - pmmAgentVersion *version.Parsed - streamParse bool + host string // Node address where pmm-agent runs + node *models.Node + service *models.Service + agent *models.Agent + pmmAgentVersion *version.Parsed + streamParse bool + metricsResolution *models.MetricsResolutions } // scrapeConfigForStandardExporter returns scrape config for endpoint with given parameters. @@ -233,7 +234,7 @@ func scrapeConfigForRDSExporter(intervalName string, interval time.Duration, hos } } -func scrapeConfigsForNodeExporter(s *models.MetricsResolutions, params *scrapeConfigParams) ([]*config.ScrapeConfig, error) { +func scrapeConfigsForNodeExporter(params *scrapeConfigParams) ([]*config.ScrapeConfig, error) { var hr, mr, lr *config.ScrapeConfig var err error var hrCollect []string @@ -244,7 +245,7 @@ func scrapeConfigsForNodeExporter(s *models.MetricsResolutions, params *scrapeCo "textfile.mr", } mrCollect = collectors.FilterOutCollectors("", mrCollect, params.agent.DisabledCollectors) - mr, err = scrapeConfigForStandardExporter("mr", s.MR, params, mrCollect) + mr, err = scrapeConfigForStandardExporter("mr", params.metricsResolution.MR, params, mrCollect) if err != nil { return nil, err } @@ -257,7 +258,7 @@ func scrapeConfigsForNodeExporter(s *models.MetricsResolutions, params *scrapeCo "os", } lrCollect = collectors.FilterOutCollectors("", lrCollect, params.agent.DisabledCollectors) - lr, err = scrapeConfigForStandardExporter("lr", s.LR, params, lrCollect) + lr, err = scrapeConfigForStandardExporter("lr", params.metricsResolution.LR, params, lrCollect) if err != nil { return nil, err } @@ -286,7 +287,7 @@ func scrapeConfigsForNodeExporter(s *models.MetricsResolutions, params *scrapeCo "time") hrCollect = collectors.FilterOutCollectors("", hrCollect, params.agent.DisabledCollectors) - hr, err = scrapeConfigForStandardExporter("hr", s.HR, params, hrCollect) + hr, err = scrapeConfigForStandardExporter("hr", params.metricsResolution.HR, params, hrCollect) if err != nil { return nil, err } @@ -305,7 +306,7 @@ func scrapeConfigsForNodeExporter(s *models.MetricsResolutions, params *scrapeCo } // scrapeConfigsForMySQLdExporter returns scrape config for mysqld_exporter. -func scrapeConfigsForMySQLdExporter(s *models.MetricsResolutions, params *scrapeConfigParams) ([]*config.ScrapeConfig, error) { +func scrapeConfigsForMySQLdExporter(params *scrapeConfigParams) ([]*config.ScrapeConfig, error) { // keep in sync with mysqld_exporter Agent flags generator hrOptions := []string{ "global_status", @@ -316,7 +317,7 @@ func scrapeConfigsForMySQLdExporter(s *models.MetricsResolutions, params *scrape } hrOptions = collectors.FilterOutCollectors("", hrOptions, params.agent.DisabledCollectors) - hr, err := scrapeConfigForStandardExporter("hr", s.HR, params, hrOptions) + hr, err := scrapeConfigForStandardExporter("hr", params.metricsResolution.HR, params, hrOptions) if err != nil { return nil, err } @@ -337,7 +338,7 @@ func scrapeConfigsForMySQLdExporter(s *models.MetricsResolutions, params *scrape } mrOptions = collectors.FilterOutCollectors("", mrOptions, params.agent.DisabledCollectors) - mr, err := scrapeConfigForStandardExporter("mr", s.MR, params, mrOptions) + mr, err := scrapeConfigForStandardExporter("mr", params.metricsResolution.MR, params, mrOptions) if err != nil { return nil, err } @@ -366,7 +367,7 @@ func scrapeConfigsForMySQLdExporter(s *models.MetricsResolutions, params *scrape lrOptions = collectors.FilterOutCollectors("", lrOptions, params.agent.DisabledCollectors) - lr, err := scrapeConfigForStandardExporter("lr", s.LR, params, lrOptions) + lr, err := scrapeConfigForStandardExporter("lr", params.metricsResolution.LR, params, lrOptions) if err != nil { return nil, err } @@ -384,11 +385,11 @@ func scrapeConfigsForMySQLdExporter(s *models.MetricsResolutions, params *scrape return r, nil } -func scrapeConfigsForMongoDBExporter(s *models.MetricsResolutions, params *scrapeConfigParams) ([]*config.ScrapeConfig, error) { +func scrapeConfigsForMongoDBExporter(params *scrapeConfigParams) ([]*config.ScrapeConfig, error) { // Old pmm-agents doesn't have support of multiple resolution, // so requesting mongodb_exporter metrics in two resolutions increases CPU and Memory usage. if params.pmmAgentVersion == nil || params.pmmAgentVersion.Less(version.MustParse("2.25.99")) { - hr, err := scrapeConfigForStandardExporter("hr", s.HR, params, nil) + hr, err := scrapeConfigForStandardExporter("hr", params.metricsResolution.HR, params, nil) if err != nil { return nil, err } @@ -399,7 +400,7 @@ func scrapeConfigsForMongoDBExporter(s *models.MetricsResolutions, params *scrap } return r, nil } - hr, err := scrapeConfigForStandardExporter("hr", s.HR, params, []string{ + hr, err := scrapeConfigForStandardExporter("hr", params.metricsResolution.HR, params, []string{ "diagnosticdata", "replicasetstatus", "topmetrics", @@ -422,7 +423,7 @@ func scrapeConfigsForMongoDBExporter(s *models.MetricsResolutions, params *scrap defaultCollectors = append(defaultCollectors, "shards") } - lr, err := scrapeConfigForStandardExporter("lr", s.LR, params, defaultCollectors) + lr, err := scrapeConfigForStandardExporter("lr", params.metricsResolution.LR, params, defaultCollectors) if err != nil { return nil, err } @@ -434,7 +435,7 @@ func scrapeConfigsForMongoDBExporter(s *models.MetricsResolutions, params *scrap return r, nil } -func scrapeConfigsForPostgresExporter(s *models.MetricsResolutions, params *scrapeConfigParams) ([]*config.ScrapeConfig, error) { +func scrapeConfigsForPostgresExporter(params *scrapeConfigParams) ([]*config.ScrapeConfig, error) { hrOptions := []string{ "exporter", "custom_query.hr", @@ -443,7 +444,7 @@ func scrapeConfigsForPostgresExporter(s *models.MetricsResolutions, params *scra "postgres", } hrOptions = collectors.FilterOutCollectors("", hrOptions, params.agent.DisabledCollectors) - hr, err := scrapeConfigForStandardExporter("hr", s.HR, params, hrOptions) + hr, err := scrapeConfigForStandardExporter("hr", params.metricsResolution.HR, params, hrOptions) if err != nil { return nil, err } @@ -452,7 +453,7 @@ func scrapeConfigsForPostgresExporter(s *models.MetricsResolutions, params *scra "custom_query.mr", } mrOptions = collectors.FilterOutCollectors("", mrOptions, params.agent.DisabledCollectors) - mr, err := scrapeConfigForStandardExporter("mr", s.MR, params, mrOptions) + mr, err := scrapeConfigForStandardExporter("mr", params.metricsResolution.MR, params, mrOptions) if err != nil { return nil, err } @@ -461,7 +462,7 @@ func scrapeConfigsForPostgresExporter(s *models.MetricsResolutions, params *scra "custom_query.lr", } lrOptions = collectors.FilterOutCollectors("", lrOptions, params.agent.DisabledCollectors) - lr, err := scrapeConfigForStandardExporter("lr", s.LR, params, lrOptions) + lr, err := scrapeConfigForStandardExporter("lr", params.metricsResolution.LR, params, lrOptions) if err != nil { return nil, err } @@ -479,8 +480,8 @@ func scrapeConfigsForPostgresExporter(s *models.MetricsResolutions, params *scra return r, nil } -func scrapeConfigsForProxySQLExporter(s *models.MetricsResolutions, params *scrapeConfigParams) ([]*config.ScrapeConfig, error) { - hr, err := scrapeConfigForStandardExporter("hr", s.HR, params, nil) // TODO https://jira.percona.com/browse/PMM-4619 +func scrapeConfigsForProxySQLExporter(params *scrapeConfigParams) ([]*config.ScrapeConfig, error) { + hr, err := scrapeConfigForStandardExporter("hr", params.metricsResolution.HR, params, nil) // TODO https://jira.percona.com/browse/PMM-4619 if err != nil { return nil, err } @@ -492,24 +493,25 @@ func scrapeConfigsForProxySQLExporter(s *models.MetricsResolutions, params *scra return r, nil } -func scrapeConfigsForRDSExporter(s *models.MetricsResolutions, params []*scrapeConfigParams) []*config.ScrapeConfig { - hostportSet := make(map[string]struct{}, len(params)) +func scrapeConfigsForRDSExporter(params []*scrapeConfigParams) []*config.ScrapeConfig { + hostportMap := make(map[string]*models.MetricsResolutions, len(params)) for _, p := range params { port := int(*p.agent.ListenPort) hostport := net.JoinHostPort(p.host, strconv.Itoa(port)) - hostportSet[hostport] = struct{}{} + hostportMap[hostport] = p.metricsResolution } - hostports := make([]string, 0, len(hostportSet)) - for hostport := range hostportSet { + hostports := make([]string, 0, len(hostportMap)) + for hostport := range hostportMap { hostports = append(hostports, hostport) } sort.Strings(hostports) r := make([]*config.ScrapeConfig, 0, len(hostports)*2) for _, hostport := range hostports { - mr := scrapeConfigForRDSExporter("mr", s.MR, hostport, "/enhanced") - lr := scrapeConfigForRDSExporter("lr", s.LR, hostport, "/basic") + metricsResolutions := hostportMap[hostport] + mr := scrapeConfigForRDSExporter("mr", metricsResolutions.MR, hostport, "/enhanced") + lr := scrapeConfigForRDSExporter("lr", metricsResolutions.LR, hostport, "/basic") r = append(r, mr, lr) } diff --git a/managed/services/victoriametrics/scrape_configs_test.go b/managed/services/victoriametrics/scrape_configs_test.go index c8ac503da9..d09afa1988 100644 --- a/managed/services/victoriametrics/scrape_configs_test.go +++ b/managed/services/victoriametrics/scrape_configs_test.go @@ -159,10 +159,11 @@ func TestScrapeConfig(t *testing.T) { }}, }} - actual, err := scrapeConfigsForNodeExporter(s, &scrapeConfigParams{ - host: "1.2.3.4", - node: node, - agent: agent, + actual, err := scrapeConfigsForNodeExporter(&scrapeConfigParams{ + host: "1.2.3.4", + node: node, + agent: agent, + metricsResolution: s, }) require.NoError(t, err) @@ -222,10 +223,11 @@ func TestScrapeConfig(t *testing.T) { }}, }} - actual, err := scrapeConfigsForNodeExporter(s, &scrapeConfigParams{ - host: "1.2.3.4", - node: node, - agent: agent, + actual, err := scrapeConfigsForNodeExporter(&scrapeConfigParams{ + host: "1.2.3.4", + node: node, + agent: agent, + metricsResolution: s, }) require.NoError(t, err) @@ -377,11 +379,12 @@ func TestScrapeConfig(t *testing.T) { }}, }} - actual, err := scrapeConfigsForMySQLdExporter(s, &scrapeConfigParams{ - host: "4.5.6.7", - node: node, - service: service, - agent: agent, + actual, err := scrapeConfigsForMySQLdExporter(&scrapeConfigParams{ + host: "4.5.6.7", + node: node, + service: service, + agent: agent, + metricsResolution: s, }) require.NoError(t, err) require.Len(t, actual, len(expected)) @@ -526,11 +529,12 @@ func TestScrapeConfig(t *testing.T) { }}, }} - actual, err := scrapeConfigsForMySQLdExporter(s, &scrapeConfigParams{ - host: "4.5.6.7", - node: node, - service: service, - agent: agent, + actual, err := scrapeConfigsForMySQLdExporter(&scrapeConfigParams{ + host: "4.5.6.7", + node: node, + service: service, + agent: agent, + metricsResolution: s, }) require.NoError(t, err) require.Len(t, actual, len(expected)) @@ -662,11 +666,12 @@ func TestScrapeConfig(t *testing.T) { }}, }} - actual, err := scrapeConfigsForMySQLdExporter(s, &scrapeConfigParams{ - host: "4.5.6.7", - node: node, - service: service, - agent: agent, + actual, err := scrapeConfigsForMySQLdExporter(&scrapeConfigParams{ + host: "4.5.6.7", + node: node, + service: service, + agent: agent, + metricsResolution: s, }) require.NoError(t, err) require.Len(t, actual, len(expected)) @@ -683,11 +688,12 @@ func TestScrapeConfig(t *testing.T) { ListenPort: pointer.ToUint16(12345), } - _, err := scrapeConfigsForMySQLdExporter(s, &scrapeConfigParams{ - host: "4.5.6.7", - node: node, - service: service, - agent: agent, + _, err := scrapeConfigsForMySQLdExporter(&scrapeConfigParams{ + host: "4.5.6.7", + node: node, + service: service, + agent: agent, + metricsResolution: s, }) require.EqualError(t, err, "failed to decode custom labels: unexpected end of JSON input") }) @@ -779,12 +785,13 @@ func TestScrapeConfig(t *testing.T) { }, } - actual, err := scrapeConfigsForMongoDBExporter(s, &scrapeConfigParams{ - host: "4.5.6.7", - node: node, - service: service, - agent: agent, - pmmAgentVersion: version.MustParse("2.41.1"), + actual, err := scrapeConfigsForMongoDBExporter(&scrapeConfigParams{ + host: "4.5.6.7", + node: node, + service: service, + agent: agent, + pmmAgentVersion: version.MustParse("2.41.1"), + metricsResolution: s, }) require.NoError(t, err) require.Len(t, actual, len(expected)) @@ -801,12 +808,13 @@ func TestScrapeConfig(t *testing.T) { ListenPort: pointer.ToUint16(12345), } - _, err := scrapeConfigsForMongoDBExporter(s, &scrapeConfigParams{ - host: "4.5.6.7", - node: node, - service: service, - agent: agent, - pmmAgentVersion: version.MustParse("2.26.0"), + _, err := scrapeConfigsForMongoDBExporter(&scrapeConfigParams{ + host: "4.5.6.7", + node: node, + service: service, + agent: agent, + pmmAgentVersion: version.MustParse("2.26.0"), + metricsResolution: s, }) require.EqualError(t, err, "failed to decode custom labels: unexpected end of JSON input") }) @@ -927,11 +935,12 @@ func TestScrapeConfig(t *testing.T) { Params: nil, }} - actual, err := scrapeConfigsForPostgresExporter(s, &scrapeConfigParams{ - host: "4.5.6.7", - node: node, - service: service, - agent: agent, + actual, err := scrapeConfigsForPostgresExporter(&scrapeConfigParams{ + host: "4.5.6.7", + node: node, + service: service, + agent: agent, + metricsResolution: s, }) require.NoError(t, err) require.Len(t, actual, len(expected)) @@ -948,11 +957,12 @@ func TestScrapeConfig(t *testing.T) { ListenPort: pointer.ToUint16(12345), } - _, err := scrapeConfigsForPostgresExporter(s, &scrapeConfigParams{ - host: "4.5.6.7", - node: node, - service: service, - agent: agent, + _, err := scrapeConfigsForPostgresExporter(&scrapeConfigParams{ + host: "4.5.6.7", + node: node, + service: service, + agent: agent, + metricsResolution: s, }) require.EqualError(t, err, "failed to decode custom labels: unexpected end of JSON input") }) @@ -1008,11 +1018,12 @@ func TestScrapeConfig(t *testing.T) { }, }} - actual, err := scrapeConfigsForProxySQLExporter(s, &scrapeConfigParams{ - host: "4.5.6.7", - node: node, - service: service, - agent: agent, + actual, err := scrapeConfigsForProxySQLExporter(&scrapeConfigParams{ + host: "4.5.6.7", + node: node, + service: service, + agent: agent, + metricsResolution: s, }) require.NoError(t, err) require.Len(t, actual, len(expected)) @@ -1029,11 +1040,12 @@ func TestScrapeConfig(t *testing.T) { ListenPort: pointer.ToUint16(12345), } - _, err := scrapeConfigsForProxySQLExporter(s, &scrapeConfigParams{ - host: "4.5.6.7", - node: node, - service: service, - agent: agent, + _, err := scrapeConfigsForProxySQLExporter(&scrapeConfigParams{ + host: "4.5.6.7", + node: node, + service: service, + agent: agent, + metricsResolution: s, }) require.EqualError(t, err, "failed to decode custom labels: unexpected end of JSON input") }) @@ -1044,22 +1056,26 @@ func TestScrapeConfig(t *testing.T) { params := []*scrapeConfigParams{ // two RDS configs on the same host/port combination: single pmm-agent, single rds_exporter process { - host: "1.1.1.1", - agent: &models.Agent{ListenPort: pointer.ToUint16(12345)}, + host: "1.1.1.1", + agent: &models.Agent{ListenPort: pointer.ToUint16(12345)}, + metricsResolution: s, }, { - host: "1.1.1.1", - agent: &models.Agent{ListenPort: pointer.ToUint16(12345)}, + host: "1.1.1.1", + agent: &models.Agent{ListenPort: pointer.ToUint16(12345)}, + metricsResolution: s, }, // two RDS configs on the same host, different ports: two pmm-agents, two rds_exporter processes { - host: "2.2.2.2", - agent: &models.Agent{ListenPort: pointer.ToUint16(12345)}, + host: "2.2.2.2", + agent: &models.Agent{ListenPort: pointer.ToUint16(12345)}, + metricsResolution: s, }, { - host: "2.2.2.2", - agent: &models.Agent{ListenPort: pointer.ToUint16(12346)}, + host: "2.2.2.2", + agent: &models.Agent{ListenPort: pointer.ToUint16(12346)}, + metricsResolution: s, }, } @@ -1131,7 +1147,7 @@ func TestScrapeConfig(t *testing.T) { }, }} - actual := scrapeConfigsForRDSExporter(s, params) + actual := scrapeConfigsForRDSExporter(params) require.Len(t, actual, len(expected)) for i := 0; i < len(expected); i++ { assertScrapeConfigsEqual(t, expected[i], actual[i]) @@ -1259,12 +1275,13 @@ func TestScrapeConfig(t *testing.T) { ListenPort: pointer.ToUint16(12345), } - _, err := scrapeConfigsForMongoDBExporter(s, &scrapeConfigParams{ - host: "4.5.6.7", - node: node, - service: service, - agent: agent, - pmmAgentVersion: version.MustParse("2.26.0"), + _, err := scrapeConfigsForMongoDBExporter(&scrapeConfigParams{ + host: "4.5.6.7", + node: node, + service: service, + agent: agent, + pmmAgentVersion: version.MustParse("2.26.0"), + metricsResolution: s, }) require.EqualError(t, err, "failed to decode custom labels: unexpected end of JSON input") }) diff --git a/managed/services/victoriametrics/victoriametrics.go b/managed/services/victoriametrics/victoriametrics.go index 46ca0e3455..2ee61f7c71 100644 --- a/managed/services/victoriametrics/victoriametrics.go +++ b/managed/services/victoriametrics/victoriametrics.go @@ -326,20 +326,20 @@ func (svc *Service) populateConfig(cfg *config.Config) error { if err != nil { return err } - s := settings.MetricsResolutions + globalResoulutions := settings.MetricsResolutions if cfg.GlobalConfig.ScrapeInterval == 0 { - cfg.GlobalConfig.ScrapeInterval = config.Duration(s.LR) + cfg.GlobalConfig.ScrapeInterval = config.Duration(globalResoulutions.LR) } if cfg.GlobalConfig.ScrapeTimeout == 0 { - cfg.GlobalConfig.ScrapeTimeout = ScrapeTimeout(s.LR) + cfg.GlobalConfig.ScrapeTimeout = ScrapeTimeout(globalResoulutions.LR) } - cfg.ScrapeConfigs = append(cfg.ScrapeConfigs, scrapeConfigForVictoriaMetrics(svc.l, s.HR, svc.params)) + cfg.ScrapeConfigs = append(cfg.ScrapeConfigs, scrapeConfigForVictoriaMetrics(svc.l, globalResoulutions.HR, svc.params)) if svc.params.ExternalVM() { - cfg.ScrapeConfigs = append(cfg.ScrapeConfigs, scrapeConfigForInternalVMAgent(s.HR, svc.baseURL.Host)) + cfg.ScrapeConfigs = append(cfg.ScrapeConfigs, scrapeConfigForInternalVMAgent(globalResoulutions.HR, svc.baseURL.Host)) } - cfg.ScrapeConfigs = append(cfg.ScrapeConfigs, scrapeConfigForVMAlert(s.HR)) - AddInternalServicesToScrape(cfg, s, settings.DBaaS.Enabled) - return AddScrapeConfigs(svc.l, cfg, tx.Querier, &s, nil, false) + cfg.ScrapeConfigs = append(cfg.ScrapeConfigs, scrapeConfigForVMAlert(globalResoulutions.HR)) + AddInternalServicesToScrape(cfg, globalResoulutions, settings.DBaaS.Enabled) + return AddScrapeConfigs(svc.l, cfg, tx.Querier, &globalResoulutions, nil, false) }) } From 574aa41a2bee7e1235799b9be06d07921f8c29ae Mon Sep 17 00:00:00 2001 From: PMM Jenkins Date: Mon, 27 May 2024 10:59:43 +0000 Subject: [PATCH 33/44] Update descriptors --- descriptor.bin | Bin 792834 -> 795295 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/descriptor.bin b/descriptor.bin index 5c1aa1f2e99fe034a6648be85f4b92a844e2f190..2fba714eb24d29befc483a065ad66a03e26862b9 100644 GIT binary patch delta 38745 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 delta 37236 zcmZ9#dAJnSwg25+wY$2yx`9J89}aMkK|sy{;fSEfB+lXxHRG#^nQlzHiAntBP44gB z97I4RNDz@iL=ZthKtxnPWOM>VWD*gX5fw!y0Z~MFKWh(N-uDll=Y02GYwcBQ@Achl zS5+62-|RYMe%HY-rGI$G12gYTFPwR&cj$lAW1nZDczH$C?6KNRr-f&Cdw=o57gbca z;ZMK*O?=}Q-Y*w^xX&Arj@R$b4Tw$zQQblRxaH>Se=S{G7rytgcdMtnyd}ZHR}OgJ z8kC;6aNrl-4lk~1?+-}NTR88CcaP~=`23gNj5^uHnJE8*fw$-ZUS94Oz4&KAWK65kyiBU7>ZDr68}9ad*4D|?jq;Joq`Xwo zuj@673QYXOeI)A_8(5R7NJJakE`?yxtM3qk#fFWnV5aCd@S51J41x{3qC*Ha zXw+B>)~39m=r{D5+P(nEhF$}QkZjnvi8Yxm`i)A0Sp*xE1hWV>DhY-~zp>Za+6WPB z>{U2~VB=Pm)?%($>o@UQ+P)l;O-eJ6L$XOl3o98F{iY?85rR!iCL;u!mP|6u&Ag7* zVjjU}UK@uHY}USmwOA17-?A}=X;H;uB_zq8|$c| z>!Evo`}3_Xpvr3$|G5}lT4Qv5#;x)Kt1D}}Dyx$RU0=i-G>qEnaar44;@0>2l^3Qw zg;tl6x3bW?C z5T-89nV5kvbulsf84jf7x_ZTx3;dq({eSh_b?Q}8l4$kHnd?UkrCv>&MQyYa)73ZL z_<-L$KJ-^V>eSb(quoq67P%g**ZN$VYs;g4Jir3xi-&Xgku%V8LCo#E3V$!$M zHP!}g*to_<1B8uhh(>?L)b3v=(deZo5=X4x znjV^i>=N*_;XzqVZ;T?L7zDjtpfv$E#&`ZdnKtp0ew&Nr6^k>K2%ZLX)n^CUPow`>(%tL5?L7OzwMZLQyLfUHr^%V6Rb!_9(3 zAa9lk2ursV+gVE)EZx$fqn>+D(&8t2?(KyJ(qI<=y=eZ#E&vdkKVgDoLOl;I{h3T? z=dS$Cct0xzR*3ayc3SB}>t}Y^cpk)hyUq}_LbPr#X$i~TZWj-IXx+}@X|Ko175$&b zj~w({S}${W`Sa4%3hVwnZl!b=OKPoO`^+ytI$i)Vj{2Y=#sh=2aOD5#cY_m`5Vvh4nn)#ZYS zqWG6Ob)()|k@>qf-t&oH6R%jGQ(b*8K=s~|s;s+v?c~sh>b=d%b*}ib?*10Pup!qS zEm?PeD|ssG?r%Ahmh_?Zw_-yZ8rI$4<`_YVgFS&aV-_1=wdvKar#-rZSS$rsh&v@pu~@g22(P&GIW zrPR?EL2*DIoMNFb5K@u-)AtHRH6(td*1x2BNSeqR8L9*|Bn_=th{}+3%gX3Ftx~6` zhNk0Vne6#-Qhx331?G{DMMvcx=p*NogT4%QH@T=WmEjhc>R5TP(3;s zt3HaO(~yxFt3HaO(=A#>=WE4cQH@Cp9i4}l#XwLgOhq)uq#+}tNj(e1%Nw<3gQ6N6 zZye!YSL1sPxV*86uMJQfn`X@$#Re#jO~XjPg^^S-7@tnP7Wcg0|4rHWbl4>7gE<8! zsR?NzrHkTwp7vD@Ef}5Pt^N?vOP~C0t@_s@%o{JZj!qWs1(IXX$ZDjxNK zAM~E%Rwn%zo8uA~h_N{?fq@vC;}TeTQBlp81g?yaVy1e&%VK)aoA0t1h~9jc#ma-M zUiw}Z$2UEQ_Dji331hwFk{EHcUy}6btD^>EEg)(q{Y&CyC|3R^983_>rOOC5tK54Pgg zfG|irX#||UJh@QetmTeCkVJ90BM{}mSu2G=ZmwRLcqwePGFghkRx5=%eh+nIiou)d z)PeYgfBAQny_pW1YU;=cb*%b6bn;R{=32)cKs47n?#KvQXSgGt^e{nNmkcS?vCdHk zl3En%=*84#Jg8%RyzycG((3hzig3pISUWHTR#=0?XEKr}ZB zXZ%4AMy_v8d(F#lk5?*H9ltY*{g(!_|7N73rr**A5arE|HZnpRTP$q=Ftx?e1`y3H zjy8a3ZgI4c5!%>lXoJ7;cWW}F(8g9r8}y>MRcJ%lF(b6GP18n)xaDX+>b=b^MY^!F z&E*^rJKG#%0I{>pF-ArhW4mSyrZvLz?T#{lC~kL@0Yq`Tql}DD#?FK?qUxQ=90^Cz`?!yIuOxi{@^Zei@;My*B+uJ;F-bn_RPy#9o(v zNTRq`hLlYxBP8)ryz&vhXVpiJS7=1#qjYFU0*J~-LK3p&XM`j^Hd{V_s<2@6d{H#HZ=Fb&u$_`1BY*s{S+?Q8?n$bZF|DjOK_>rLOrM2_F=LgXz?$ z_|ZrG|0p}?5Ks1lJgbxHAw+a8x$C#$$$&ixp$6dlBsYOY6IZg+X z@F(LJ9`k!upG;IF;ZG*lCkcPjC43-$ow7v&KqH&8Kr~Oega@K|$`uKL6bav$A|akP zj@|B?yjOa=C>}{14;JpOtSMgzJ8Ys zDarnwOLlru{La+~fh7C6@6`yG(?YDyx#bVU+Bui9q*rC{ZOJJS^kh`%XDN=dC0S6dLUW;FHdi>H2~uKFV6XPFiG=&dA3Za7tMdk zV3Mqex0DVv5SE9z0b;c!;~(}ciPMYr!ybwIf5^XVF?hsFE%MUk{}KN= zr<%qOOz?kP_J|j@(mQWf67f;*dqq1fSbx-A6%gx>dbXMcV*OFi7VTNdn8!R*v;)w5 zEYXxie9W^uFTH3!=Gme>D~T8r4~q8g05oHFML;xT&sOa~G-JV?0k`$ckaXZ0W7b*A*A#wK;S~gPInyk({nq6ol@1F6vuVBWOynDvu#)90_%1YkN z;DOcM(G~HYMZSu=PKI`7B$q77H^a-evf7e-GraTKMnBNnB;T`Md}o*Fn)tcNT=KKr zqO+2cg3o%?h-O$x!DqeZEutE&ND9u5yUg&rvV3H_ot=y*i8$NKwzP_ph_k)c=S5d) zMH2D3xcE9Kr~-;oRO8S_hsRX)^XPzvk(KIvp&^c507hKs zhy#e`LPs1xG#AQxqZ(~IVEm;Rxo|4N(w05n&+ z`2(W4(xpET&6O_wLqV@g`nT))dNP>dR~eWN1*AnF^11a8*r z4-(iMKR?~SrE0TF|4{G1n_c4!DOKN@ z1PN&FOVNqyHb)&mRJVED2N3EAg#dON>Zk>~5v36mVMOaegjkXsNy zG!Ho@0it=xF-cC)5nV{ccg&_3IFgJgbaKSe34$UibaE-vkrO&O7C$oEzpUz5q9QDE zEV(>kkzbU-M{?MvZZi&-{<|&t2Kr~NDYRLwf69zexY>?e)z=<<%l>^Z} z<5oEk?K5tJ%n6wciSJqLSF!?lFs6q1whRZNIK;PQI1t4lJ_}3^&^h6dp}xKWj;7GZ zP@aqEBm|;4)VHNI5Y3^!Ev<7>zz_FzX?+QRF^BWi!fHwpG2FMMHN9vKmoe{?XWdaT z7~!X$WmW&RGJd44-ymM`OFtj~30g(p+|M`M{ zZS~khMHcqhW_DSifWwyz3Q)eKG!%daaC6LINw%(h@(Bux7A-Ht9yKW z=Y0Rx>hU}xvsWkUdc1GzK4efC@3T6kVvS^3Pw@5q^SIuN(C>s~ELqkQd|QtriQ)v` z*5kae#4`h5-##ZSQY24IG-XLo^z9LfUNk5Aq>>~=BujcyykV(7AU-N1PVz0`(}Uh5 z-`0vi^d|YXR*YmtPxJMOlqrPL0f^>ImkU5NXG$&%kzB|ZgE@X`9l3C?&V^P|F5X@? z#}CifX^@vRnESmn=uQis&2^puu|L@{$NklFW;$mL!Uj2uobjA&KG=mvnhagk_R+ zH!z~)!7`V6Kopm`)B~cpOj1vdTzScZ6)b=mei!Cm?#--7hLlWL;oCD8y=boR?U^et znedvK>b19UUL|84mN&D*6E_Y}|Wwpy4AS$cfK9ZLVc-!U< z059K8W>GTWZI?UrqWQMVoxBu?@0i@V2!NaKxZDAv`HssSAe!&Un0Jyog<`P5Po4DR zKfUVzyljIXHqaSUkc`>%{fwane>ORPfLPt+RuvGdn_R{eWTC&OcaHA-jpBQWqU6nc zE^p{X@jaI}1<9ND_0}d*9^_5ViLucPg3Rf}jul_}pqy-1xcnIzSp5Ves8Hiup57x@|q6RcDSViL~VyG6?qG(Aepq! zr~c_3uY8Kb?j6gxSwn+)-cL8m``n@dqP$NC_rJ9=$+SOSw#@%$)&9gyNu&L~y$4v( zX|!Kd1)Vux_}o61TS5iNoWpVD3Le`WPE;gk4*T}eD>967*ykCFY#s&4nWHuV07Ua> za!HapM_mHYi{??600l{%FHHi(XIHR~f9cjgT_}F();|!%FJ=A9lZb+3&WZTKm446a z6OK%1MCF8UpF{vrIpOmp;s#QtPBHk}PyIXodZj<8>}z2hxf4-GGUoL6GA17Nnji2Q zkXobUz+RP(_DpYHbWC_ zNs*z--X=txVTURbTwY75BPlXm#pf=~4TxL5=|^3MCyJ6D!H5yHF0x|HQvZW9Z0}m?BzOq5qkz^SW&wG=U9FdGE$udIO z{6Yqm5sLhhm0w48n~`zZTde$%ywG67D#AV$Z! z$pT_@tW1`?(Nb5|&NyXmjswsfmuSjj9OvRqFPh^d-ttCEU0ICdSy*y&9DwF{7Xl!f zFU9{{=l8FA$vICWhF(%x z6E`4+UQ%WCtqPqB;x9yHL82mSb%Dy()vnajYjuIDU(|V8PuA+9_^0psmsBlsY(OI_ zi`1>~MY`BU6&Vpyykk6FZfDe!@_ecCT9wD?xbNru zuw~$Se`FOch8gHbeW}Wtm*jw`FIBvnpJL+X+&t1OKl)# zS4nD5HahgaO`yto+iyiN+brI&i8o}MZ}NXvO|#iP%Jg3Kw#!%`Hr|$u)o&D)NzB*9 zFKptCqIHRm#C)CGa*#o1onp%oIxQ2lJ|42!zod3OZ#wCzq!E?%s$gF81B#I1gi#;@ z^^3tKmD;D$`pV_z;3gGHms0iR!Z$1LJZ%QVMR7 z6V|$&tE?qdw<@oz?d0XjTEWf~FGv9MX4Tf$i+HPQeu0z5)K*p9#hPLff1tc>wv%`4 z1v*O^EPbHzE;O>XKTs7_P8drcsIC`csaEC>;cbbj08>C`O4xZ@VoKO~TVhJsd7CjM zmSE=(l{dhSlf@FySrU@|Q03h^5t9C}R<*gzNn`3m)vv$3K3ICY@_O6O5K};BN^U}K zS9$XovA#a3Zda8TJ7FwsSC?FBEkWBm5~t*?0-&{2t8Yv0NW2m{-;p>aHN}p^Dd>Es z@@}@{M3@3Pr{pZVQ{~;%3%&1Dovw4jSlX#>xXC&Nz3)=qEw#2ck14P-C49e2sq5>?eYa|2UQPtoVrsWkW@e>R zy6;h5cWbH+rhv|r9D?^GD?uvyJ;_Rtihhsk+Ra+x(a2uq^|6-fVhQLh$)nP}D$h$o z*Xul&Mz+;;Q+w5=mqiU=o?2JrcipOewl zGM~H(eNb^isSEQp2vf!23+0_rzBUF$q84T3I?b=&a=J=RWwPqnUkk`EgJ0E3B zKBgMBwHGg2@-cP3S$GYkhWt_~LvlI;he9Py54pQ#{k_bk(%;r)%Hr)i|W_vn(M489P>>wj*tq_ zynoU_lgc-$%)Dh-3r6=F#o^vW3Q{?(RA*~gSOntx|^9 z8|XJIfG#J5HNI8l7h1#efc0Bd)4fO3l(cPF4DQRMhG){G)WL)7le zgw6G_uA!vp{qf!%e!m;<=LJ-4i$-Mb&)9P}5YzW(EM)+h`};GNG6WjRxIY7B$j#A) zl48T+dv^LgYKJ98C25Cca;9=d2BX6=RL;UOjf%m8nbf~BroL)~?4^L12h>6G?9HI)3U$5`OsJ{;L(iv z$D zr?~(Cu{SMa@2vo_H!Z_~Kn4dAfN7cXzB&K`O#r54n)lHGXet4iZUa!Zmm9j%T>$9P zeKr6H1(ta2Aco@F*VCAKp>`OWr~L9fm#`!ms4$1DZ}Rw>Ui&5e!p?UK5i=loh8{K z=D1KJi|QN+wcG}2Djv^`@7w2JS35UxT(*X}8T+gb8C2$))$XZg#o&cZ>P0)}&5(Q{ z!*N*VyqV0<{ER(lfS7ZjNlhTK^E36#ssv(neuf{x%StLQ)&?(UQj4tFaztOwgof+N z#q5HNty)3&3^Z#Wi0lH#DnQIGaI6Ak>K8ax5oo4gs7L%kIl-ujk%T@_;SHCg@xZ+gvLJ&jm;%`JQ&mR@rUAIR0e z<`%v{bM>#u!k563P<~`H@`zg1d-%Z?;;_2Oty@8A* zitlFZd!`j~*xQhiAFj6S31H+6iKf&}8rWF%3yMRjx zwJBroQ__oxO&MM^{YvhfRLC9S_aUY7Pwh`wo5%Ou74?f(AMhWmro+5HfEZTZ&+z+I zvlOJ7dOrglb=F3xramxaT2rB)MSkGe6o}>r8Ox?XG(QkFZLc+{r9RBWH+5I7yI1Jv zDjz2CmQw1&jQwdAy=ZT_o~{FsK^tQ9gcvJL1jmVf?f!?LY}DX zil6%2zw)wOjxA{ZQ(mDNyFy-6+ZT^M=y$B%my9iMsO@u1jSMRLGTeZachoE7CDr{I{f>If zv#qFhe{!92&uo9P6y=q){TW_Q7m{khYh{_#K}%9Cko?pUYYU;218|?7Mi7e@XpS^M zWDjKO8|njM^?*>HyrI=XA0Ix?#Dh=dy2XdYpU>U$XrW2-^9;{uWqAP6{9K4b{ApPX z4rNkDtv@Xp<4`7)4|6EhQv5mWh#o{lfoACfkv;5IKM<>j9aprZCS&~{c4R@fC5yw3 z>01id9C23*;%b40=z+S|5M;y_&Dh6L>QYWm>t&sdu7Qgu1N_;+!)n58yftUrG zAOaCS?t%!!>~S&MiBMGXgf5es7W3S(W4*6sR)pv)#o}pG=kPZ%IPGEp#N25|_dv{@ zc61LU1g9O{3p9Lr+R=Tbgy4*!`yT?ZeI~Ij5jf-Mo?dL9adZ#F_8CX_0*&o6Lih57 zvQp^&Y({>tdvUk3iB%c$teZ82uzFTz&FFvz2XGeO6KJj)$A_=9R+cLjv<#UjP?0grD8$sQ@zckie2U5X~WhCG|=n^`U`&St;Idl#*#^ zqA1ipG_ds#k|+)hpmupGT`AN)Job#csA7gTl88%U*ooEPW~L_db40f$E<+WN^}V0RIE8E{0vE+Q0M zsh{ixx}dKC;PJ@7R`fu|9T`{(2BJAKuoPUWAMgc+f&q*9FuiDw3M>Uz z%CnWx@$N7A5!UELMOb@uU~6DxP#GQA8n{wedrS~d`P}b25WrlH;ip439`atvn7|&v z=*7^Oz*fLO42=n3;%TyRRSKDp3*y5q)nqPMNPJupDk1T4LC)O&rWe(5LEH9G2dxQ- zj}PLNtyG(M`3Xw@@rj~v`1l}a7_d@v`1pYL288`9g~KPHDC`el$O(z2Q2B(wvOm2H zIU#`kjV4q+G5*C#zki>J$@R)>#uJn46;7WR*dIJs>eq}X2HaBAk0&bSJ>$v2xGlNI z?dqtH_GErHW`ifs5+(=sr_V?;{^Wq4KFfKb(&KvuQv&l848ZD`lDJVsb4p-OX7r*t zC9s=NrN{RSrUqscy8aZTKQ)|~0qSnMmjJOo zC$NWxHpSriAoYUvxeb!f2cdkbhnq&?^E?*{5LSUE6hLI>xljPHS~gE&aRGZt+hXu? zkoqwG=xe`I*~=1K*-P4r#f41ue*d!D00d#73jz>>3j=#-24ZkwU=Pheg0L{Khh~8$ z2nz#yc4#X>cqM-R8^7JHuOvq0+FuFmp#d3;z9I=Pr2r74uLSncAkY|nC14kkyBuw0 z7kQOwE59JFY@?dR^FH>Q;JL6h&1U+54Dza*J|Kg<>ZT9KAg{XV6KDo`Ri@7jg8b6> zxzqeWd}(4-jtxr_qq5N~6{B)&Xe%4dat^G!$RZ6%1S;^k+c^Hqt8>^iF)og;(FDo5vSW!G6_=zIWx zh^=wF0%Ytpj^2P6TI1*(h@mw?=W;4-E1S^Tc*b{ryQ;Ox{K)RJ*6n!6pt4qWyjEI; z-Dh3=&3At5>UD{V>^|#~DV5!4UBH1!el5~gcAxb@Jg6pWu1S;zd|aPs%a*e~uxBND z(Ow^LRuU3#D?83cL;uXC>^K_}P1$iaI{K#<&5c6;LceY0*s$5sFM!$HoP#u%MyDb?>_Lgmd{V_TsXl#>RQL6iP#b8H} z+GW|T9g;f&Tiv%4F4`H`M`|E09B7_`0Fm7pG%!a>AXaw<`bmbT+C%hvg49RWYs!xTVd_qr7T#Oz+j6hIdFUdI#y4O8rOMBiSBW?zZufjA8|L=V*6 zmgs?4-{*+_{9^ENkowg6d_IyN2mIbai2i)>`4blk5LSUE6hLG@aiIWWwd@m#g%Ev* zVsJ1>4Uelm)v4^DBl-?v@sK5Y06{q9f&j$eAxHE;3?6bs4N(LCu09*E{icarEJd($a%lBfY_WO*Hk<|&t6Kr~M|Uhg2h{*B@F_$GdKUj2=$ z(&<9+8%OIv6u)t_-a%;nTTANzhWs{hR%rcON9**W`K_b%4idZXq)P9OuX3dLE>RS6 z|IU#+y(oU?$i0J*`#D4I@jn9<^gicEi!SV(bKDNZ&N;{JK^>}O4|zzUI4o=H)s8$k%BDtSO}*L?$p^ER#yU!-J(RUH z2ErYn$z33_4`nTl0kQf}*3wufXl!IQ^>1so6QU!tw)X2JW*^SldKE-SfhImcWFOAj zLog7t4`*$?3S?3r&f0oaph<{_v$kICB>6Nd>*`e?PJ<1N0d=>fF(B4QWo^BBK{0qF zn|jpxd;yY=WG#(dAU=-s4$Yt^$d{<5^p-3N$fzJZsC<&Ju$s zvier{Z2;o?L}FVa@I=;Dt@L91iL9+!f!KZ`YpYg)#`Y6gXiN_HorT7pjGv8EpIe_y zjLL{lx=BL@qffd?17h?^H)#Tm(I;inj8Wt#XSq329oKK5D&n^z>fw9xN>$Nn7Di`% zcVu!hhH%*4`HBEMzt{P8U?)>Zyr} zu-H_WE6AWSHEZv6cNP|VCTs3>KUq*w^)rck!eY;4?Oh5aQG6zA?{#+;7MqbZ_qqX$ zJR{K*7Mqb=n6TK4ti9LWSz`CBgvNfPQGZl{R!q?BVk3O^Y}VFq^kU-KEcM&XIyUgx zY?i}x|N0)CHG|FOn-7{BfN0Ln+TX_k(VU&-M>@;aVW^PPpxp3j<_GXSFZeAZU;Ks2Av+M6>#G@sAfn=_q-&R)ps zn=>^4#(W_eQ~2zKti3ryFPbl8xj7^6-glO2^~G%RBSO@rWPLGFmy-3xto;=sy{NyK zXsD{vrAo00$Eo}T}}!#Il0skX|>@tD=0X9&D$rO3BKw*PMPo2#Uz1pLArxJU!K!TP zv$$`4Rb949s96sFUB%)WL!`F>2*Mf{1Rw_2I3@*RZ;fM8AVFB;m{gz%!Wze)hl48DgEAJRn1?bCV~~46#lo&kTY5`nb?QT~f6^F)CHz`oyR(=z7PX zU4=n63WHX~Pc=|M)kc>v^q{xV(I^nTjgCgUisPGwMtjxpw}3=Z$aJ$KQ+iR{?8vmM zkm(jnrhjS(nQlou6*Ar8$P`Hww>UEGDrCCVk|}^8wm2OxTp(_ZgVt>G|JnAM&;`=U8OAC4w>pr4-E{x-BBqJ?d^_AfoN}cRN7Uj zbf=?I{V5Kb(5KB%DG>dgj!J>(?-VM%OOFnf?uolJR)478lME>wx+iNtFVR(V=pM(u zU4=vU8TO5jG*&^^eU5zTLUErXUm#=cbL87qD0IL0y0@=t#jFZ{f}NkjpZgvC(u?l? zto|vML<#=<O!KQIQpd*^-moAc9nDg0ZYFCmdF7|zd$q(IQj*mdBD-{ zg~i}tHg(8y&V@)G%<^MnIfGs(4Dm(QzLpBYD$u;*1Vr|WY!mZ(HV~^{WH0Py=(k%j zIFe0$Y0Y*+^oUe&Vz!%@J?iKe#AO1_S^^?_)Gb6HW{5x(pU*GWe*Y-)@?I zk2(4U;xy0@B@pY!9Q^{Ze$3Ht_hN7&oBGQ7+#SgiZYSz4KA&`<0AUqqLIFhfqzgr3 zFlJ9mEToRDDF&yrsVCxD&8TBfyE?W;ES@p+`$GUhIOBo<#NZi6zd-Drar6r$2xlDq z3N%4DRmk~Q4v-hlBfu)4iOcpOKXHxhlb`0 z14o;4?j6b(dhA$2t3yLuog#_i(9l+=HA1VyL-U0JfJP-v;nm@xJas@a(lMc_E&+@= zCYcuD)G?v0F6l*cj6_O5eyb5u9Ty*Jsis$rORiGrbX;hkyCH+lxX?a#s}VXKAFpVo zI#rKPRD?yxhxUmZGN_CXxwj})XpOMwgizlHs0DCo6GD3*0Ep&<(B20CqB$Y7Rp>>< z;K?vGIW))li;#RWv{mRulBttITZMwK3N(xYM0QeWt56_TCxxyG?NJP-gsExPY!5`I zgtiLpA!eTr?QtGNG=V0efXF`WvIB_OrzJaN2L-Zxo(}DCUZBa+r$c+3@1bdMYG|ua zAWj2~(?G0G4Q&+)#QN0G9_KGE2GhgTOzZQ-NKOxJ6?(DwJi~3q@lv zW@kt&b&jyg(C#xuHGJ_Y_i^7wYr;j{(@8m)MpN%nR*#o?dLv3+;Ixi0yfyJ`@L=eyYhVtl@vJ%Psfe3?CC z9Ql_*4zHJttB#t*H|A9?-rh#Fsix5lA@uoDGKA3QOO8H!3Vkjx^jQPo$``mq1){mY z@h1??1&%*^3V$v#{E4RU=b}VY_;ZotPkPZ@B>X9~(o^_zv7wc?RXZqqv11jwP+aU- z1&HEe$0|LAMVDAs0Wjo}WJqDrC5~0-MRSR;ikw+{N+6eo-#fF?g8H&VU1)S!XwR(l zqP{G&U%u%nG`hmjX#B_aD(bqzF(_Rqu5b(rL~(^Ms62h@DGd5r=rxRIedkvYCMih4 zZfb->Uvu0|FS@UV{5V)1L-iC6eItxdf9IE@DIEGnqA48uMlz|wp>KrtX;e?4(6_?m zX%r1;zm;eUo4ys=yBYMN{Z>dBF4Wjl*mSj}MgWtw+EF7A&DD+?foQIF)Yz*StPNA^ zEFbhja%~vOZ`hRTCE5E<=v}3034~Rkc^d+V>^ouW0j?LT?}S%eX)44^ioyCYwaJ>j z1kv?j*j<~wM9gk*)Cl4-fhN2_WH-1V0WrJ5B^Qu2!G9oSepe*WB-aKYFgWu_N60p+r|s=)J|{4$F-IqOik70f@yNjvIj(+~K$pNECKB zZWL&uu)}d4obdQ@hfyU?_nKok-`F+BP7bl$f(+gB(HH~Iv^wzgJ z_a#FJC+>5c*jqSpzvV;#SG?cx1Q6%;J5B_mx!-YOZ{fsG3@66@I>T(AB#J_bpEycH z62(u15~WV-EtGh`63o)h5X=EbFm$1Kz!3}(#REbxlB~Uj5MQ*3= zzjFN9TT08XEq?+C>DP`wfoOj1_!Efc*N#6gD+b?&sqZXlT!!SgVQ7A?d6{JRnb5mN zGb9MBK=T?J5ZN=~dFEGTK&+k#ue#dsXP;tlE=&!{nToX!qURhJ^%1j!bGEbuahX7q zB|u~c=j>Sxh}pq8TUr8HI)ihTKLwgZ9GtVIWgpF-_vLJ93B+lj;ZGpe@5|ZJ5{UKt za<;VWTMUNgQp2s!eUTiR3op`~-&cGdmb0M%VHIdX0Yr9K&W55f7_-B2#G*a?*{>Lk z$fYL7l^3dZWg~Lj))D&bCl*KM%$rRBf-uqr0f@noIa^u+u{SbjOG_X@7@4!Br9cye zkvU3B`NT&*A+u5Ok>0A}HvY!+sKm5HU{ua-!}MZ$RF2OENa+s5^r&2;OZ1N-1RB$$ za*ccGrQJ{1b9DUUZmMB-zkU(3p5SD%E2W6{!%%Br3v& zV?;%&wSK~eV{`ft*d0K$$L8!I5Qyg3oIL~r(HxtzhroWqhU4NJyQ>aWbo<{dJ>2bM^Cc{JK$gpn;NH zFR={d|DXa8*_RUAa_ukW>_L%UY`-K6sGrs(Sr_EYN2FF<%zIM{5=F7Pz)i_Oow5sL zN{k|A7R9G7Rs*^%N>n6e7bPl^vWrCJRy`IeyEx}HEWa}D5@s)opX#Y9y3t^kz(Ad~ zi*xpt5fJ6YIgTCjp4LFg+9f$YJA6~T=MDeTxMMF>*^LILEcv^{@gdSEFA+YJ{}6B> z`5P?Dc`I|7`1T;%UjJ`wKcf|!G&>WL&&zW5OH%Y=Vp)!#5!NFOfP4ylS+3d293Om* zLf!B@hc(*DSLS?8N&}_rc|G_2Ph2q_^7#rH&8-h0qrC383CJj~=XmQ`Uh5es6!2y) zzVvgyTP*-W z;SbQf!vI8fP0qf~0mSN>9Ir6we7>?6ypv0^hgvK(2G0%V&XRMXz)De5KCkcU?XMaT;jy8Hn|FT|NV`{;tdCtBS$KTxzrR z`6?tg=IrYnSBcM?Tqr|B4bGx)a6NPPVm%dsuaJ%f%=iRtHF)A0o z-R;lFV063NpMeTg%9ZknDf5rC%-k^WJfN7-VmvA^Y;)WDv>ly)uY=a`0-&@Q>mf z`l$1(K1x(1uRqG=%vUFnLFJ2%-_fH)1vZmq9S?xaV}>*6?C=EdE@$VFgxh7oetCvy6OUm+Chn~@Wj<} zRykyNq6R?Z4kem$SUKc)f?hNa2~SAHaJ3v(j@XI;fU8Gb#Q;R}h^rWYXdZDD!!^a= z%UtS&O{;5={4y7s&v0BLIdDAZnKv0gSOuCl;(^E>&o%9$qY1?7@m#m=hGDKP24Ce; z-&nKPBKlR%-nhP2%${-#1L87)hGBrno^lKW#Ox`@FhHi{lw%lyX3kDIhPhTV%-4=# zfH(~_3O=4&whX zic&50_q+xn_dvw=5UxWv#VICA?TN3yTwPln5ruW-;aQNv{a|F|Jr>WrT=l9Q83p=x zgVGKUjg0E+-@OQAkdaYUU)gR2@*jjg9I4S!z}I|ox?$eiOU^4bCQ^??YAjOqqpX%1 z!#-`BcqM|SbTNn{@2SWy?@$^4Vxa0)8%KfunYwi1L>$%A^db-^;;3UU>jd8s3&uz4 ziINj(Wt^~$#tD&{7^%r6C(=APDm57=_zlw2kvH2oQU3~@c$x=S5^hEnMt(YK(B46u zcsjc93hM++8cdDU^pX>vb;33pCq!ySq-K?z@U#=QiMeJRzZg6hc?)o&O=bMr6{@QC zxhT-Ty^&6wcrG%(J`;!&&qZAZSSR>)L%>TbFO;0{trND(uYCORN_A1~qA1YCk#yq3qNuU{=8Hg_SQK4+gLOjw)7V!cwWQ>PvQF4W z5dAQ~eDk`sY-!ZsQwL~3)S-Y+>3XeVqFcO@~* z|LwIc^7i4xMV0Z`t5x6HZBd{PchZRy+oIOjef z&^loojT0jES){%wIT30nY|~Xb68!HZMRfvy3iKCrxPB@{ zb%Ylp?ZS{P`ABs6FKjsYHBfLgQpZc4&JK;%$C#NIx&{iOxoR0eb)Oy1A<$`Y`b++V5WIeHs z#uJe`7pWn6$DNV(#5P@{J>h%)!}8uJJn2;#KX{$GymnYV(7ym?)I3fM%eT11hC`}_ zVfib5Wu4&5biwevdIF9hZ68zvccqFgJmYgV9Cv2l}LZlwctMMf#3fc+VWFo=0rk}`r z(@Z3SK}6z-BocLS;)x^@a^v-hBocfMFPNBDlS@w2u};`V~#~AbT>gAFr^{gkh(RdxpeNo`}>td9}XeNqy~!Z8Dzl?ZZuZZ@cki&rRy8+D(ZQMV#1_I8nrj zO^Fjl%x})C_e)Oj9)YgAY@=~Pq_*bOhb1StH4BN`CbLBN0OHQP_la2|({EOTYIi29 zqXACrOjd{dlzL~fIvQYpS6=NcInls6VH=GTBDF8CJ}x=YKs#ZZexcVXpL08q_m1Jj zO_lLqexQC@dmta^A7ZmG8sfx(e21I(D5I2N4gF%~K>lY#({^Pv#QtY_^+m~xhSm$) zXuJ@qLwR+yCw+_JXgp9nX7b@ZyK*%DCTe{AT9=2)gGM)w}k1KF}XXz=K9O zbUc5-53NIuaOimc&WD{tjTq`gUY#mA)W|wy8;wIE^>to-TXLw8cE~nyGmU}xD%;t- z_dvlfzajqf4^)$QUSGcu-*BtyQF}HYbg-Gy7sU2Gg^g|En!-=tlMsA*(vRua&F1pSxl%`mJtf0o1d}wNYu#LtCk$SwK zCYF3?s(r9crX=LkW0MQsOnjgu9Q#8`!pVhFN!Sc0CKpO2VKbbVTqu=<%`pE|K}{_= z(abtw8;uhpHLaj#l$>a$ov=-2zb)s6c)@!SCn!Iz{}KD`tU_tOEysyjh0=aojuW#A zrTw-X^Ro+TZpn#q>x6AIPKea=1vS6qM7egtHktjFFOR)k@Rs2Ol}D><_*QqzA48@u z7fR(vb3A#uP%1x~{C(X4dwuyIin0xtH zS;1R_Cw(g8BX{{t<9$D7t6NbB+^MkwPgWFK^|5JFfhQ{p*W6`SM+IZ7ET}h1o>W** zY@_i+q~0v3)g@0Vv?sQS`{#JVhmO`3y!Y^AApg74Pt*;yYYTyX!YG|Mv9@5IFbc$p zwS^o1Vx4G#`F9FxeaVRy)(P8aoDiuE1+}^4L<{YNZQ{8bhWWbD`vq?|PE=IJcl=bf z|NZ-g(jl@XPP|_z9U@!e#QTNPA+jarw-(fgB_~>1Cv2l}LZr4A)UJ{fEwvNU^uXbt aD*k2o7w|93zmR`9{zVH9|1|%?s{apQzV}i9 From 88b60cec16ceb4cce34b35ef940a8ccaf0439596 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 May 2024 12:06:00 +0300 Subject: [PATCH 34/44] Bump @typescript-eslint/parser from 7.10.0 to 7.11.0 in /cli-tests (#3003) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 7.10.0 to 7.11.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.11.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 115 +++++++++++++++++++++++++++++++++--- cli-tests/package.json | 2 +- 2 files changed, 108 insertions(+), 9 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 3267186340..561cdd0ec6 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -21,7 +21,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^7.10.0", - "@typescript-eslint/parser": "^7.10.0", + "@typescript-eslint/parser": "^7.11.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", @@ -282,15 +282,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.10.0.tgz", - "integrity": "sha512-2EjZMA0LUW5V5tGQiaa2Gys+nKdfrn2xiTIBLR4fxmPmVSvgPcKNW+AE/ln9k0A4zDUti0J/GZXMDupQoI+e1w==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.11.0.tgz", + "integrity": "sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/typescript-estree": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", + "@typescript-eslint/scope-manager": "7.11.0", + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/typescript-estree": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", "debug": "^4.3.4" }, "engines": { @@ -309,6 +309,105 @@ } } }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.11.0.tgz", + "integrity": "sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", + "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz", + "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.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": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", + "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.11.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/parser/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/scope-manager": { "version": "7.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index 3252dddf05..5515b2925a 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -25,7 +25,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^7.10.0", - "@typescript-eslint/parser": "^7.10.0", + "@typescript-eslint/parser": "^7.11.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", From e4bf62a37b07a01a6d1cd16c3d96fdd51e1c3bde Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 29 May 2024 09:18:22 +0000 Subject: [PATCH 35/44] Bump @typescript-eslint/eslint-plugin in /cli-tests (#3004) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 7.10.0 to 7.11.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.11.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 163 +++++++----------------------------- cli-tests/package.json | 2 +- 2 files changed, 33 insertions(+), 132 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 561cdd0ec6..693fc48956 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -20,7 +20,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.10.0", + "@typescript-eslint/eslint-plugin": "^7.11.0", "@typescript-eslint/parser": "^7.11.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", @@ -249,16 +249,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.10.0.tgz", - "integrity": "sha512-PzCr+a/KAef5ZawX7nbyNwBDtM1HdLIT53aSA2DDlxmxMngZ43O8SIePOeX8H5S+FHXeI6t97mTt/dDdzY4Fyw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.11.0.tgz", + "integrity": "sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/type-utils": "7.10.0", - "@typescript-eslint/utils": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", + "@typescript-eslint/scope-manager": "7.11.0", + "@typescript-eslint/type-utils": "7.11.0", + "@typescript-eslint/utils": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -309,7 +309,7 @@ } } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { + "node_modules/@typescript-eslint/scope-manager": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.11.0.tgz", "integrity": "sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==", @@ -326,113 +326,14 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", - "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz", - "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.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": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", - "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/parser/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.10.0.tgz", - "integrity": "sha512-7L01/K8W/VGl7noe2mgH0K7BE29Sq6KAbVmxurj8GGaPDZXPr8EEQ2seOeAS+mEV9DnzxBQB6ax6qQQ5C6P4xg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.10.0.tgz", - "integrity": "sha512-D7tS4WDkJWrVkuzgm90qYw9RdgBcrWmbbRkrLA4d7Pg3w0ttVGDsvYGV19SH8gPR5L7OtcN5J1hTtyenO9xE9g==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.11.0.tgz", + "integrity": "sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.10.0", - "@typescript-eslint/utils": "7.10.0", + "@typescript-eslint/typescript-estree": "7.11.0", + "@typescript-eslint/utils": "7.11.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -453,9 +354,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.10.0.tgz", - "integrity": "sha512-7fNj+Ya35aNyhuqrA1E/VayQX9Elwr8NKZ4WueClR3KwJ7Xx9jcCdOrLW04h51de/+gNbyFMs+IDxh5xIwfbNg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", + "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -466,13 +367,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.10.0.tgz", - "integrity": "sha512-LXFnQJjL9XIcxeVfqmNj60YhatpRLt6UhdlFwAkjNc6jSUlK8zQOl1oktAP8PlWFzPQC1jny/8Bai3/HPuvN5g==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz", + "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/visitor-keys": "7.10.0", + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/visitor-keys": "7.11.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -518,15 +419,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.10.0.tgz", - "integrity": "sha512-olzif1Fuo8R8m/qKkzJqT7qwy16CzPRWBvERS0uvyc+DHd8AKbO4Jb7kpAvVzMmZm8TrHnI7hvjN4I05zow+tg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.11.0.tgz", + "integrity": "sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.10.0", - "@typescript-eslint/types": "7.10.0", - "@typescript-eslint/typescript-estree": "7.10.0" + "@typescript-eslint/scope-manager": "7.11.0", + "@typescript-eslint/types": "7.11.0", + "@typescript-eslint/typescript-estree": "7.11.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -540,12 +441,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.10.0.tgz", - "integrity": "sha512-9ntIVgsi6gg6FIq9xjEO4VQJvwOqA3jaBFQJ/6TK5AvEup2+cECI6Fh7QiBxmfMHXU0V0J4RyPeOU1VDNzl9cg==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", + "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.10.0", + "@typescript-eslint/types": "7.11.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { diff --git a/cli-tests/package.json b/cli-tests/package.json index 5515b2925a..9f99b39751 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.10.0", + "@typescript-eslint/eslint-plugin": "^7.11.0", "@typescript-eslint/parser": "^7.11.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", From 1ea2627702460acb63b765775d21607b79507535 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Wed, 29 May 2024 13:42:41 +0200 Subject: [PATCH 36/44] PMM-12880 Proper skip for MySQL TLS certs. (#2909) * PMM-12880 Proper skip for TLS certs. * PMM-12880 Lint. * PMM-12880 Add comment. * PMM-12880 Another comment. --- agent/agents/mysql/perfschema/perfschema.go | 2 +- agent/agents/mysql/slowlog/slowlog.go | 2 +- agent/connectionchecker/connection_checker.go | 4 ++-- agent/runner/actions/common.go | 4 ++-- agent/runner/actions/mysql_explain_action.go | 2 +- agent/runner/actions/mysql_query_select_action.go | 2 +- agent/runner/actions/mysql_query_show_action.go | 2 +- .../runner/actions/mysql_show_create_table_action.go | 2 +- agent/runner/actions/mysql_show_index_action.go | 2 +- .../runner/actions/mysql_show_table_status_action.go | 2 +- agent/serviceinfobroker/service_info_broker.go | 6 +++--- agent/tlshelpers/mysql.go | 9 +++++---- managed/models/agent_model.go | 12 ++++++++---- 13 files changed, 28 insertions(+), 23 deletions(-) diff --git a/agent/agents/mysql/perfschema/perfschema.go b/agent/agents/mysql/perfschema/perfschema.go index 9ef09a50e7..e9593fd6c5 100644 --- a/agent/agents/mysql/perfschema/perfschema.go +++ b/agent/agents/mysql/perfschema/perfschema.go @@ -129,7 +129,7 @@ func getPerfschemaHistorySize(q reform.Querier, l *logrus.Entry) uint { // New creates new PerfSchema QAN service. func New(params *Params, l *logrus.Entry) (*PerfSchema, error) { if params.TextFiles != nil { - err := tlshelpers.RegisterMySQLCerts(params.TextFiles.Files) + err := tlshelpers.RegisterMySQLCerts(params.TextFiles.Files, params.TLSSkipVerify) if err != nil { return nil, err } diff --git a/agent/agents/mysql/slowlog/slowlog.go b/agent/agents/mysql/slowlog/slowlog.go index ab6b69acc1..a15682883e 100644 --- a/agent/agents/mysql/slowlog/slowlog.go +++ b/agent/agents/mysql/slowlog/slowlog.go @@ -82,7 +82,7 @@ type slowLogInfo struct { // New creates new SlowLog QAN service. func New(params *Params, l *logrus.Entry) (*SlowLog, error) { if params.TextFiles != nil { - err := tlshelpers.RegisterMySQLCerts(params.TextFiles.Files) + err := tlshelpers.RegisterMySQLCerts(params.TextFiles.Files, params.TLSSkipVerify) if err != nil { return nil, err } diff --git a/agent/connectionchecker/connection_checker.go b/agent/connectionchecker/connection_checker.go index b7a9f9c08b..df77ef1bdd 100644 --- a/agent/connectionchecker/connection_checker.go +++ b/agent/connectionchecker/connection_checker.go @@ -96,12 +96,12 @@ func (cc *ConnectionChecker) sqlPing(ctx context.Context, db *sql.DB) error { return err } -func (cc *ConnectionChecker) checkMySQLConnection(ctx context.Context, dsn string, files *agentpb.TextFiles, tlsSkipVerify bool, id uint32) *agentpb.CheckConnectionResponse { //nolint:lll,unparam,revive +func (cc *ConnectionChecker) checkMySQLConnection(ctx context.Context, dsn string, files *agentpb.TextFiles, tlsSkipVerify bool, id uint32) *agentpb.CheckConnectionResponse { //nolint:lll var res agentpb.CheckConnectionResponse var err error if files != nil { - err = tlshelpers.RegisterMySQLCerts(files.Files) + err = tlshelpers.RegisterMySQLCerts(files.Files, tlsSkipVerify) if err != nil { cc.l.Debugf("checkMySQLConnection: failed to register cert: %s", err) res.Error = err.Error() diff --git a/agent/runner/actions/common.go b/agent/runner/actions/common.go index e81b843d24..362e6fecc5 100644 --- a/agent/runner/actions/common.go +++ b/agent/runner/actions/common.go @@ -58,9 +58,9 @@ func jsonRows(columns []string, dataRows [][]interface{}) ([]byte, error) { } // mysqlOpen returns *sql.DB for given MySQL DSN. -func mysqlOpen(dsn string, tlsFiles *agentpb.TextFiles) (*sql.DB, error) { +func mysqlOpen(dsn string, tlsFiles *agentpb.TextFiles, tlsSkipVerify bool) (*sql.DB, error) { if tlsFiles != nil { - err := tlshelpers.RegisterMySQLCerts(tlsFiles.Files) + err := tlshelpers.RegisterMySQLCerts(tlsFiles.Files, tlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/runner/actions/mysql_explain_action.go b/agent/runner/actions/mysql_explain_action.go index 7fda097e5f..ab939bb45b 100644 --- a/agent/runner/actions/mysql_explain_action.go +++ b/agent/runner/actions/mysql_explain_action.go @@ -104,7 +104,7 @@ func (a *mysqlExplainAction) Run(ctx context.Context) ([]byte, error) { // query has a copy of the original params.Query field if the query is a SELECT or the equivalent // SELECT after converting DML queries. query, changedToSelect := dmlToSelect(a.params.Query) - db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) + db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles, a.params.TlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/runner/actions/mysql_query_select_action.go b/agent/runner/actions/mysql_query_select_action.go index 9db5feed2d..172f799b8b 100644 --- a/agent/runner/actions/mysql_query_select_action.go +++ b/agent/runner/actions/mysql_query_select_action.go @@ -62,7 +62,7 @@ func (a *mysqlQuerySelectAction) DSN() string { // Run runs an Action and returns output and error. func (a *mysqlQuerySelectAction) Run(ctx context.Context) ([]byte, error) { - db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) + db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles, a.params.TlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/runner/actions/mysql_query_show_action.go b/agent/runner/actions/mysql_query_show_action.go index cb14cbf309..42b3154aa5 100644 --- a/agent/runner/actions/mysql_query_show_action.go +++ b/agent/runner/actions/mysql_query_show_action.go @@ -62,7 +62,7 @@ func (a *mysqlQueryShowAction) DSN() string { // Run runs an Action and returns output and error. func (a *mysqlQueryShowAction) Run(ctx context.Context) ([]byte, error) { - db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) + db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles, a.params.TlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/runner/actions/mysql_show_create_table_action.go b/agent/runner/actions/mysql_show_create_table_action.go index 1d98f24c0f..88da9ba3b8 100644 --- a/agent/runner/actions/mysql_show_create_table_action.go +++ b/agent/runner/actions/mysql_show_create_table_action.go @@ -60,7 +60,7 @@ func (a *mysqlShowCreateTableAction) DSN() string { // Run runs an Action and returns output and error. func (a *mysqlShowCreateTableAction) Run(ctx context.Context) ([]byte, error) { - db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) + db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles, a.params.TlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/runner/actions/mysql_show_index_action.go b/agent/runner/actions/mysql_show_index_action.go index 112c6814b2..454b5564f7 100644 --- a/agent/runner/actions/mysql_show_index_action.go +++ b/agent/runner/actions/mysql_show_index_action.go @@ -61,7 +61,7 @@ func (a *mysqlShowIndexAction) DSN() string { // Run runs an Action and returns output and error. func (a *mysqlShowIndexAction) Run(ctx context.Context) ([]byte, error) { - db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) + db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles, a.params.TlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/runner/actions/mysql_show_table_status_action.go b/agent/runner/actions/mysql_show_table_status_action.go index 9056a03600..478826a601 100644 --- a/agent/runner/actions/mysql_show_table_status_action.go +++ b/agent/runner/actions/mysql_show_table_status_action.go @@ -65,7 +65,7 @@ func (a *mysqlShowTableStatusAction) DSN() string { // Run runs an Action and returns output and error. func (a *mysqlShowTableStatusAction) Run(ctx context.Context) ([]byte, error) { - db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) + db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles, a.params.TlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/serviceinfobroker/service_info_broker.go b/agent/serviceinfobroker/service_info_broker.go index 84fc63e44f..fa9d3b96a5 100644 --- a/agent/serviceinfobroker/service_info_broker.go +++ b/agent/serviceinfobroker/service_info_broker.go @@ -69,7 +69,7 @@ func (sib *ServiceInfoBroker) GetInfoFromService(ctx context.Context, msg *agent switch msg.Type { case inventorypb.ServiceType_MYSQL_SERVICE: - return sib.getMySQLInfo(ctx, msg.Dsn, msg.TextFiles, id) + return sib.getMySQLInfo(ctx, msg.Dsn, msg.TextFiles, msg.TlsSkipVerify, id) case inventorypb.ServiceType_MONGODB_SERVICE: return sib.getMongoDBInfo(ctx, msg.Dsn, msg.TextFiles, id) case inventorypb.ServiceType_POSTGRESQL_SERVICE: @@ -84,12 +84,12 @@ func (sib *ServiceInfoBroker) GetInfoFromService(ctx context.Context, msg *agent } } -func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, id uint32) *agentpb.ServiceInfoResponse { +func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, tlsSkipVerify bool, id uint32) *agentpb.ServiceInfoResponse { var res agentpb.ServiceInfoResponse var err error if files != nil { - err = tlshelpers.RegisterMySQLCerts(files.Files) + err = tlshelpers.RegisterMySQLCerts(files.Files, tlsSkipVerify) if err != nil { sib.l.Debugf("getMySQLInfo: failed to register cert: %s", err) res.Error = err.Error() diff --git a/agent/tlshelpers/mysql.go b/agent/tlshelpers/mysql.go index b16352a268..d34eb5b9aa 100644 --- a/agent/tlshelpers/mysql.go +++ b/agent/tlshelpers/mysql.go @@ -24,7 +24,7 @@ import ( ) // RegisterMySQLCerts is used for register TLS config before sql.Open is called. -func RegisterMySQLCerts(files map[string]string) error { +func RegisterMySQLCerts(files map[string]string, tlsSkipVerify bool) error { if files == nil { return nil } @@ -36,9 +36,10 @@ func RegisterMySQLCerts(files map[string]string) error { } if ok := ca.AppendCertsFromPEM([]byte(files["tlsCa"])); ok { - err = mysql.RegisterTLSConfig("custom", &tls.Config{ //nolint:gosec - RootCAs: ca, - Certificates: []tls.Certificate{cert}, + err = mysql.RegisterTLSConfig("custom", &tls.Config{ + RootCAs: ca, + Certificates: []tls.Certificate{cert}, + InsecureSkipVerify: tlsSkipVerify, // #nosec G402 }) if err != nil { return errors.Wrap(err, "register MySQL CA cert failed") diff --git a/managed/models/agent_model.go b/managed/models/agent_model.go index 9c97d43c7e..bd7014b303 100644 --- a/managed/models/agent_model.go +++ b/managed/models/agent_model.go @@ -339,11 +339,13 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair) s cfg.DBName = dsnParams.Database cfg.Params = make(map[string]string) if s.TLS { + // It is mandatory to have "custom" as the first case. + // Skip verify for "custom" is handled on pmm-agent side. switch { - case s.TLSSkipVerify: - cfg.Params["tls"] = skipVerify case len(s.Files()) != 0: cfg.Params["tls"] = "custom" + case s.TLSSkipVerify: + cfg.Params["tls"] = skipVerify default: cfg.Params["tls"] = trueStr } @@ -368,11 +370,13 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair) s cfg.DBName = dsnParams.Database cfg.Params = make(map[string]string) if s.TLS { + // It is mandatory to have "custom" as the first case. + // Skip verify for "custom" is handled on pmm-agent side. switch { - case s.TLSSkipVerify: - cfg.Params["tls"] = "skip-verify" case len(s.Files()) != 0: cfg.Params["tls"] = "custom" + case s.TLSSkipVerify: + cfg.Params["tls"] = skipVerify default: cfg.Params["tls"] = trueStr } From 6ca7cc23ccf5bca191169316d532af0647992de9 Mon Sep 17 00:00:00 2001 From: Nurlan Moldomurov Date: Wed, 29 May 2024 16:38:47 +0300 Subject: [PATCH 37/44] PMM-12522 collect chunks metrics in low resolution (#2987) * PMM-12522 Collect chunks metrics in low resolution. * PMM-12522 Collect chunks metrics in low resolution. * PMM-12522 Remove unnecessary line. * PMM-12522 Fix linter. * PMM-12522 revert no used linter. --- managed/services/agents/mongodb.go | 68 +++++++++++-------- .../services/victoriametrics/prometheus.go | 21 +++--- .../victoriametrics/scrape_configs.go | 4 +- 3 files changed, 53 insertions(+), 40 deletions(-) diff --git a/managed/services/agents/mongodb.go b/managed/services/agents/mongodb.go index 37cac807af..3ff1983593 100644 --- a/managed/services/agents/mongodb.go +++ b/managed/services/agents/mongodb.go @@ -38,8 +38,8 @@ type collectorArgs struct { var ( // New MongoDB Exporter will be released with PMM agent v2.10.0. newMongoExporterPMMVersion = version.MustParse("2.9.99") - v2_24_99 = version.MustParse("2.24.99") - v2_25_99 = version.MustParse("2.25.99") + v2_25_0 = version.MustParse("2.25.0-0") + v2_26_0 = version.MustParse("2.26.0-0") v2_41_1 = version.MustParse("2.41.1-0") ) @@ -55,33 +55,12 @@ func mongodbExporterConfig(node *models.Node, service *models.Service, exporter // Starting with PMM 2.25.0, we change the discovering-mode making it to discover all databases. // Until now, discovering mode was not working properly and was enabled only if mongodb.collstats-colls= // was specified in the command line. + // Starting with PMM 2.26.0, we disabled all collectors by default and added flags to enable them. // Starting with PMM 2.41.1 we added shards collector. - switch { - case !pmmAgentVersion.Less(v2_41_1): // >= 2.41.1 - args = v226Args(exporter, tdp, listenAddress) - - if exporter.MongoDBOptions != nil && exporter.MongoDBOptions.EnableAllCollectors { - args = append(args, "--collector.shards") - } - case !pmmAgentVersion.Less(v2_25_99): // >= 2.26 - args = v226Args(exporter, tdp, listenAddress) - case !pmmAgentVersion.Less(v2_24_99): // >= 2.25 - args = v225Args(exporter, tdp, listenAddress) - case !pmmAgentVersion.Less(newMongoExporterPMMVersion): // >= 2.10 - args = []string{ - "--mongodb.global-conn-pool", - "--compatible-mode", - "--web.listen-address=" + listenAddress + ":" + tdp.Left + " .listen_port " + tdp.Right, - } - default: - args = []string{ - "--collect.collection", - "--collect.database", - "--collect.topmetrics", - "--no-collect.connpoolstats", - "--no-collect.indexusage", - "--web.listen-address=" + listenAddress + ":" + tdp.Left + " .listen_port " + tdp.Right, - } + if pmmAgentVersion.Less(v2_26_0) { + args = oldPMMAgentArgs(exporter, tdp, listenAddress, pmmAgentVersion) + } else { + args = v226Args(exporter, tdp, listenAddress, pmmAgentVersion) } args = collectors.FilterOutCollectors("--collect.", args, exporter.DisabledCollectors) @@ -122,7 +101,31 @@ func mongodbExporterConfig(node *models.Node, service *models.Service, exporter return res, nil } -func v226Args(exporter *models.Agent, tdp *models.DelimiterPair, listenAddress string) []string { +func oldPMMAgentArgs(exporter *models.Agent, tdp *models.DelimiterPair, listenAddress string, pmmAgentVersion *version.Parsed) []string { + var args []string + switch { + case !pmmAgentVersion.Less(v2_25_0): // >= 2.25 + args = v225Args(exporter, tdp, listenAddress) + case !pmmAgentVersion.Less(newMongoExporterPMMVersion): // >= 2.10 + args = []string{ + "--mongodb.global-conn-pool", + "--compatible-mode", + "--web.listen-address=" + listenAddress + ":" + tdp.Left + " .listen_port " + tdp.Right, //nolint:goconst + } + default: + args = []string{ + "--collect.collection", + "--collect.database", + "--collect.topmetrics", + "--no-collect.connpoolstats", + "--no-collect.indexusage", + "--web.listen-address=" + listenAddress + ":" + tdp.Left + " .listen_port " + tdp.Right, + } + } + return args +} + +func v226Args(exporter *models.Agent, tdp *models.DelimiterPair, listenAddress string, pmmAgentVersion *version.Parsed) []string { collectAll := false if exporter.MongoDBOptions != nil { collectAll = exporter.MongoDBOptions.EnableAllCollectors @@ -135,6 +138,13 @@ func v226Args(exporter *models.Agent, tdp *models.DelimiterPair, listenAddress s collectors := defaultCollectors(collectAll) + if !pmmAgentVersion.Less(v2_41_1) { // >= 2.41.1 + collectors["shards"] = collectorArgs{ + enabled: collectAll, + enableParam: "--collector.shards", + } + } + for _, collector := range exporter.DisabledCollectors { col, ok := collectors[strings.ToLower(collector)] if !ok { diff --git a/managed/services/victoriametrics/prometheus.go b/managed/services/victoriametrics/prometheus.go index 242c54fa15..245a9c5014 100644 --- a/managed/services/victoriametrics/prometheus.go +++ b/managed/services/victoriametrics/prometheus.go @@ -72,26 +72,29 @@ func AddScrapeConfigs(l *logrus.Entry, cfg *config.Config, q *reform.Querier, // // find Node address where the agent runs var paramsHost string var paramPMMAgentVersion *version.Parsed + var pmmAgent *models.Agent + if agent.PMMAgentID != nil { + // extract node address through pmm-agent + pmmAgent, err = models.FindAgentByID(q, *agent.PMMAgentID) + if err != nil { + return errors.WithStack(err) + } + paramPMMAgentVersion, err = version.Parse(pointer.GetString(pmmAgent.Version)) + if err != nil { + l.Warnf("couldn't parse pmm-agent version for pmm-agent %s: %q", pmmAgent.AgentID, err) + } + } switch { // special case for push metrics mode, // vmagent scrapes it from localhost. case pushMetrics: paramsHost = "127.0.0.1" case agent.PMMAgentID != nil: - // extract node address through pmm-agent - pmmAgent, err := models.FindAgentByID(q, *agent.PMMAgentID) - if err != nil { - return errors.WithStack(err) - } pmmAgentNode := &models.Node{NodeID: pointer.GetString(pmmAgent.RunsOnNodeID)} if err = q.Reload(pmmAgentNode); err != nil { return errors.WithStack(err) } paramsHost = pmmAgentNode.Address - paramPMMAgentVersion, err = version.Parse(pointer.GetString(pmmAgent.Version)) - if err != nil { - l.Warnf("couldn't parse pmm-agent version for pmm-agent %s: %q", pmmAgent.AgentID, err) - } case agent.RunsOnNodeID != nil: externalExporterNode := &models.Node{NodeID: pointer.GetString(agent.RunsOnNodeID)} if err = q.Reload(externalExporterNode); err != nil { diff --git a/managed/services/victoriametrics/scrape_configs.go b/managed/services/victoriametrics/scrape_configs.go index e41968f116..9dc595a871 100644 --- a/managed/services/victoriametrics/scrape_configs.go +++ b/managed/services/victoriametrics/scrape_configs.go @@ -388,7 +388,7 @@ func scrapeConfigsForMySQLdExporter(params *scrapeConfigParams) ([]*config.Scrap func scrapeConfigsForMongoDBExporter(params *scrapeConfigParams) ([]*config.ScrapeConfig, error) { // Old pmm-agents doesn't have support of multiple resolution, // so requesting mongodb_exporter metrics in two resolutions increases CPU and Memory usage. - if params.pmmAgentVersion == nil || params.pmmAgentVersion.Less(version.MustParse("2.25.99")) { + if params.pmmAgentVersion == nil || params.pmmAgentVersion.Less(version.MustParse("2.26.0-0")) { hr, err := scrapeConfigForStandardExporter("hr", params.metricsResolution.HR, params, nil) if err != nil { return nil, err @@ -419,7 +419,7 @@ func scrapeConfigsForMongoDBExporter(params *scrapeConfigParams) ([]*config.Scra "indexstats", "collstats", } - if params.pmmAgentVersion != nil && !params.pmmAgentVersion.Less(version.MustParse("2.41.1-0")) { + if !params.pmmAgentVersion.Less(version.MustParse("2.41.1-0")) { defaultCollectors = append(defaultCollectors, "shards") } From 8d3e0bf6fbcb12dc30df93a0c10292b518aeffe7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Thu, 30 May 2024 11:39:14 +0200 Subject: [PATCH 38/44] PMM-12880 Proper skip for MySQL TLS certs. (#2909) (#3007) * PMM-12880 Proper skip for TLS certs. * PMM-12880 Lint. * PMM-12880 Add comment. * PMM-12880 Another comment. --- agent/agents/mysql/perfschema/perfschema.go | 2 +- agent/agents/mysql/slowlog/slowlog.go | 2 +- agent/connectionchecker/connection_checker.go | 4 ++-- agent/runner/actions/common.go | 4 ++-- agent/runner/actions/mysql_explain_action.go | 2 +- agent/runner/actions/mysql_query_select_action.go | 2 +- agent/runner/actions/mysql_query_show_action.go | 2 +- .../runner/actions/mysql_show_create_table_action.go | 2 +- agent/runner/actions/mysql_show_index_action.go | 2 +- .../runner/actions/mysql_show_table_status_action.go | 2 +- agent/serviceinfobroker/service_info_broker.go | 6 +++--- agent/tlshelpers/mysql.go | 9 +++++---- managed/models/agent_model.go | 12 ++++++++---- 13 files changed, 28 insertions(+), 23 deletions(-) diff --git a/agent/agents/mysql/perfschema/perfschema.go b/agent/agents/mysql/perfschema/perfschema.go index 9ef09a50e7..e9593fd6c5 100644 --- a/agent/agents/mysql/perfschema/perfschema.go +++ b/agent/agents/mysql/perfschema/perfschema.go @@ -129,7 +129,7 @@ func getPerfschemaHistorySize(q reform.Querier, l *logrus.Entry) uint { // New creates new PerfSchema QAN service. func New(params *Params, l *logrus.Entry) (*PerfSchema, error) { if params.TextFiles != nil { - err := tlshelpers.RegisterMySQLCerts(params.TextFiles.Files) + err := tlshelpers.RegisterMySQLCerts(params.TextFiles.Files, params.TLSSkipVerify) if err != nil { return nil, err } diff --git a/agent/agents/mysql/slowlog/slowlog.go b/agent/agents/mysql/slowlog/slowlog.go index acc10c8316..519de1be82 100644 --- a/agent/agents/mysql/slowlog/slowlog.go +++ b/agent/agents/mysql/slowlog/slowlog.go @@ -84,7 +84,7 @@ type slowLogInfo struct { // New creates new SlowLog QAN service. func New(params *Params, l *logrus.Entry) (*SlowLog, error) { if params.TextFiles != nil { - err := tlshelpers.RegisterMySQLCerts(params.TextFiles.Files) + err := tlshelpers.RegisterMySQLCerts(params.TextFiles.Files, params.TLSSkipVerify) if err != nil { return nil, err } diff --git a/agent/connectionchecker/connection_checker.go b/agent/connectionchecker/connection_checker.go index b7a9f9c08b..df77ef1bdd 100644 --- a/agent/connectionchecker/connection_checker.go +++ b/agent/connectionchecker/connection_checker.go @@ -96,12 +96,12 @@ func (cc *ConnectionChecker) sqlPing(ctx context.Context, db *sql.DB) error { return err } -func (cc *ConnectionChecker) checkMySQLConnection(ctx context.Context, dsn string, files *agentpb.TextFiles, tlsSkipVerify bool, id uint32) *agentpb.CheckConnectionResponse { //nolint:lll,unparam,revive +func (cc *ConnectionChecker) checkMySQLConnection(ctx context.Context, dsn string, files *agentpb.TextFiles, tlsSkipVerify bool, id uint32) *agentpb.CheckConnectionResponse { //nolint:lll var res agentpb.CheckConnectionResponse var err error if files != nil { - err = tlshelpers.RegisterMySQLCerts(files.Files) + err = tlshelpers.RegisterMySQLCerts(files.Files, tlsSkipVerify) if err != nil { cc.l.Debugf("checkMySQLConnection: failed to register cert: %s", err) res.Error = err.Error() diff --git a/agent/runner/actions/common.go b/agent/runner/actions/common.go index e81b843d24..362e6fecc5 100644 --- a/agent/runner/actions/common.go +++ b/agent/runner/actions/common.go @@ -58,9 +58,9 @@ func jsonRows(columns []string, dataRows [][]interface{}) ([]byte, error) { } // mysqlOpen returns *sql.DB for given MySQL DSN. -func mysqlOpen(dsn string, tlsFiles *agentpb.TextFiles) (*sql.DB, error) { +func mysqlOpen(dsn string, tlsFiles *agentpb.TextFiles, tlsSkipVerify bool) (*sql.DB, error) { if tlsFiles != nil { - err := tlshelpers.RegisterMySQLCerts(tlsFiles.Files) + err := tlshelpers.RegisterMySQLCerts(tlsFiles.Files, tlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/runner/actions/mysql_explain_action.go b/agent/runner/actions/mysql_explain_action.go index 7fda097e5f..ab939bb45b 100644 --- a/agent/runner/actions/mysql_explain_action.go +++ b/agent/runner/actions/mysql_explain_action.go @@ -104,7 +104,7 @@ func (a *mysqlExplainAction) Run(ctx context.Context) ([]byte, error) { // query has a copy of the original params.Query field if the query is a SELECT or the equivalent // SELECT after converting DML queries. query, changedToSelect := dmlToSelect(a.params.Query) - db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) + db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles, a.params.TlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/runner/actions/mysql_query_select_action.go b/agent/runner/actions/mysql_query_select_action.go index 9db5feed2d..172f799b8b 100644 --- a/agent/runner/actions/mysql_query_select_action.go +++ b/agent/runner/actions/mysql_query_select_action.go @@ -62,7 +62,7 @@ func (a *mysqlQuerySelectAction) DSN() string { // Run runs an Action and returns output and error. func (a *mysqlQuerySelectAction) Run(ctx context.Context) ([]byte, error) { - db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) + db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles, a.params.TlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/runner/actions/mysql_query_show_action.go b/agent/runner/actions/mysql_query_show_action.go index cb14cbf309..42b3154aa5 100644 --- a/agent/runner/actions/mysql_query_show_action.go +++ b/agent/runner/actions/mysql_query_show_action.go @@ -62,7 +62,7 @@ func (a *mysqlQueryShowAction) DSN() string { // Run runs an Action and returns output and error. func (a *mysqlQueryShowAction) Run(ctx context.Context) ([]byte, error) { - db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) + db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles, a.params.TlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/runner/actions/mysql_show_create_table_action.go b/agent/runner/actions/mysql_show_create_table_action.go index 1d98f24c0f..88da9ba3b8 100644 --- a/agent/runner/actions/mysql_show_create_table_action.go +++ b/agent/runner/actions/mysql_show_create_table_action.go @@ -60,7 +60,7 @@ func (a *mysqlShowCreateTableAction) DSN() string { // Run runs an Action and returns output and error. func (a *mysqlShowCreateTableAction) Run(ctx context.Context) ([]byte, error) { - db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) + db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles, a.params.TlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/runner/actions/mysql_show_index_action.go b/agent/runner/actions/mysql_show_index_action.go index 112c6814b2..454b5564f7 100644 --- a/agent/runner/actions/mysql_show_index_action.go +++ b/agent/runner/actions/mysql_show_index_action.go @@ -61,7 +61,7 @@ func (a *mysqlShowIndexAction) DSN() string { // Run runs an Action and returns output and error. func (a *mysqlShowIndexAction) Run(ctx context.Context) ([]byte, error) { - db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) + db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles, a.params.TlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/runner/actions/mysql_show_table_status_action.go b/agent/runner/actions/mysql_show_table_status_action.go index 9056a03600..478826a601 100644 --- a/agent/runner/actions/mysql_show_table_status_action.go +++ b/agent/runner/actions/mysql_show_table_status_action.go @@ -65,7 +65,7 @@ func (a *mysqlShowTableStatusAction) DSN() string { // Run runs an Action and returns output and error. func (a *mysqlShowTableStatusAction) Run(ctx context.Context) ([]byte, error) { - db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles) + db, err := mysqlOpen(a.params.Dsn, a.params.TlsFiles, a.params.TlsSkipVerify) if err != nil { return nil, err } diff --git a/agent/serviceinfobroker/service_info_broker.go b/agent/serviceinfobroker/service_info_broker.go index 84fc63e44f..fa9d3b96a5 100644 --- a/agent/serviceinfobroker/service_info_broker.go +++ b/agent/serviceinfobroker/service_info_broker.go @@ -69,7 +69,7 @@ func (sib *ServiceInfoBroker) GetInfoFromService(ctx context.Context, msg *agent switch msg.Type { case inventorypb.ServiceType_MYSQL_SERVICE: - return sib.getMySQLInfo(ctx, msg.Dsn, msg.TextFiles, id) + return sib.getMySQLInfo(ctx, msg.Dsn, msg.TextFiles, msg.TlsSkipVerify, id) case inventorypb.ServiceType_MONGODB_SERVICE: return sib.getMongoDBInfo(ctx, msg.Dsn, msg.TextFiles, id) case inventorypb.ServiceType_POSTGRESQL_SERVICE: @@ -84,12 +84,12 @@ func (sib *ServiceInfoBroker) GetInfoFromService(ctx context.Context, msg *agent } } -func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, id uint32) *agentpb.ServiceInfoResponse { +func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, tlsSkipVerify bool, id uint32) *agentpb.ServiceInfoResponse { var res agentpb.ServiceInfoResponse var err error if files != nil { - err = tlshelpers.RegisterMySQLCerts(files.Files) + err = tlshelpers.RegisterMySQLCerts(files.Files, tlsSkipVerify) if err != nil { sib.l.Debugf("getMySQLInfo: failed to register cert: %s", err) res.Error = err.Error() diff --git a/agent/tlshelpers/mysql.go b/agent/tlshelpers/mysql.go index b16352a268..d34eb5b9aa 100644 --- a/agent/tlshelpers/mysql.go +++ b/agent/tlshelpers/mysql.go @@ -24,7 +24,7 @@ import ( ) // RegisterMySQLCerts is used for register TLS config before sql.Open is called. -func RegisterMySQLCerts(files map[string]string) error { +func RegisterMySQLCerts(files map[string]string, tlsSkipVerify bool) error { if files == nil { return nil } @@ -36,9 +36,10 @@ func RegisterMySQLCerts(files map[string]string) error { } if ok := ca.AppendCertsFromPEM([]byte(files["tlsCa"])); ok { - err = mysql.RegisterTLSConfig("custom", &tls.Config{ //nolint:gosec - RootCAs: ca, - Certificates: []tls.Certificate{cert}, + err = mysql.RegisterTLSConfig("custom", &tls.Config{ + RootCAs: ca, + Certificates: []tls.Certificate{cert}, + InsecureSkipVerify: tlsSkipVerify, // #nosec G402 }) if err != nil { return errors.Wrap(err, "register MySQL CA cert failed") diff --git a/managed/models/agent_model.go b/managed/models/agent_model.go index f4dbfdbde1..be2489cd13 100644 --- a/managed/models/agent_model.go +++ b/managed/models/agent_model.go @@ -338,11 +338,13 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair) s cfg.DBName = dsnParams.Database cfg.Params = make(map[string]string) if s.TLS { + // It is mandatory to have "custom" as the first case. + // Skip verify for "custom" is handled on pmm-agent side. switch { - case s.TLSSkipVerify: - cfg.Params["tls"] = skipVerify case len(s.Files()) != 0: cfg.Params["tls"] = "custom" + case s.TLSSkipVerify: + cfg.Params["tls"] = skipVerify default: cfg.Params["tls"] = trueStr } @@ -367,11 +369,13 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair) s cfg.DBName = dsnParams.Database cfg.Params = make(map[string]string) if s.TLS { + // It is mandatory to have "custom" as the first case. + // Skip verify for "custom" is handled on pmm-agent side. switch { - case s.TLSSkipVerify: - cfg.Params["tls"] = "skip-verify" case len(s.Files()) != 0: cfg.Params["tls"] = "custom" + case s.TLSSkipVerify: + cfg.Params["tls"] = skipVerify default: cfg.Params["tls"] = trueStr } From 7221d3ecc1e5c0f1e8124b340e61a23aba7bf411 Mon Sep 17 00:00:00 2001 From: Alex Demidoff Date: Fri, 31 May 2024 16:22:02 +0400 Subject: [PATCH 39/44] PMM-13137 Fix SHA1 deprecation in EL9 (#3009) * PMM-13137 Fix SHA1 deprecation in EL9 * PMM-12137 bump up go to v1.22.3 --- build/docker/rpmbuild/Dockerfile.el9 | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/build/docker/rpmbuild/Dockerfile.el9 b/build/docker/rpmbuild/Dockerfile.el9 index 01ef74f1a5..aaee21b90a 100644 --- a/build/docker/rpmbuild/Dockerfile.el9 +++ b/build/docker/rpmbuild/Dockerfile.el9 @@ -6,9 +6,14 @@ RUN curl -sL https://rpm.nodesource.com/setup_16.x | bash - RUN curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo RUN yum update -y && \ + yum install -y crypto-policies-scripts && \ + update-crypto-policies --set DEFAULT:SHA1 && \ yum install -y --setopt=skip_missing_names_on_install=False \ - gcc gcc-c++ \ nodejs \ + yarn && \ + yum remove -y nodesource-release-el9-1.noarch + +RUN yum install -y gcc gcc-c++ \ libtool libtool-ltdl \ make cmake \ git \ @@ -18,14 +23,12 @@ RUN yum update -y && \ rpmdevtools createrepo_c epel-release \ bison yum-utils rpm-build \ rsync \ - wget \ - yarn && \ + wget && \ yum install -y --enablerepo=ol9_codeready_builder glibc-static && \ - yum remove -y nodesource-release-el9-1.noarch && \ yum clean all && rm -rf /var/cache/yum # keep that format for easier search -ENV GO_VERSION 1.22.2 +ENV GO_VERSION 1.22.3 ENV GO_RELEASER_VERSION 1.24.0 RUN if [ `uname -i` == "x86_64" ]; then ARCH=amd64; else ARCH=arm64; fi && \ From 3650024ea7c517fcb1f0f1d868a313c412738fad Mon Sep 17 00:00:00 2001 From: idoko Date: Tue, 4 Jun 2024 08:01:46 +0100 Subject: [PATCH 40/44] update api tests --- api-tests/server/updates_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api-tests/server/updates_test.go b/api-tests/server/updates_test.go index 4285182f17..0d1bb0d3ea 100644 --- a/api-tests/server/updates_test.go +++ b/api-tests/server/updates_test.go @@ -55,8 +55,8 @@ func TestCheckUpdates(t *testing.T) { require.NoError(t, err) require.NotEmpty(t, res.Payload.Installed) - assert.True(t, strings.HasPrefix(res.Payload.Installed.Version, "2."), - "installed.version = %q should have '2.' prefix", res.Payload.Installed.Version) + assert.True(t, strings.HasPrefix(res.Payload.Installed.Version, "2.") || strings.HasPrefix(res.Payload.Installed.Version, "3."), + "installed.version = %q should have either a '2.' or '3.' prefix", res.Payload.Installed.Version) assert.NotEmpty(t, res.Payload.Installed.FullVersion) require.NotEmpty(t, res.Payload.Installed.Timestamp) ts := time.Time(res.Payload.Installed.Timestamp) @@ -65,8 +65,8 @@ func TestCheckUpdates(t *testing.T) { assert.Zero(t, min, "installed.timestamp should contain only date") require.NotEmpty(t, res.Payload.Latest) - assert.True(t, strings.HasPrefix(res.Payload.Latest.Version, "2."), - "latest.version = %q should have '2.' prefix", res.Payload.Latest.Version) + assert.True(t, strings.HasPrefix(res.Payload.Latest.Version, "2.") || strings.HasPrefix(res.Payload.Installed.Version, "3."), + "latest.version = %q should have either a '2.' or '3.' prefix", res.Payload.Latest.Version) require.NotEmpty(t, res.Payload.Latest.Timestamp) ts = time.Time(res.Payload.Latest.Timestamp) hour, min, _ = ts.Clock() From 24aa78944fc4b7d801cff07baa0c89134945cf72 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 21:33:23 +0200 Subject: [PATCH 41/44] Bump @typescript-eslint/eslint-plugin in /cli-tests (#3012) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 7.11.0 to 7.12.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.12.0/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 266 +++++++++++++++++++++++++++++++++--- cli-tests/package.json | 2 +- 2 files changed, 248 insertions(+), 20 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 693fc48956..95f0024c8c 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -20,7 +20,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.11.0", + "@typescript-eslint/eslint-plugin": "^7.12.0", "@typescript-eslint/parser": "^7.11.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", @@ -249,16 +249,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.11.0.tgz", - "integrity": "sha512-P+qEahbgeHW4JQ/87FuItjBj8O3MYv5gELDzr8QaQ7fsll1gSMTYb6j87MYyxwf3DtD7uGFB9ShwgmCJB5KmaQ==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.12.0.tgz", + "integrity": "sha512-7F91fcbuDf/d3S8o21+r3ZncGIke/+eWk0EpO21LXhDfLahriZF9CGj4fbAetEjlaBdjdSm9a6VeXbpbT6Z40Q==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.11.0", - "@typescript-eslint/type-utils": "7.11.0", - "@typescript-eslint/utils": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", + "@typescript-eslint/scope-manager": "7.12.0", + "@typescript-eslint/type-utils": "7.12.0", + "@typescript-eslint/utils": "7.12.0", + "@typescript-eslint/visitor-keys": "7.12.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -281,6 +281,53 @@ } } }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz", + "integrity": "sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.12.0", + "@typescript-eslint/visitor-keys": "7.12.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz", + "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz", + "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.12.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@typescript-eslint/parser": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.11.0.tgz", @@ -327,13 +374,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.11.0.tgz", - "integrity": "sha512-WmppUEgYy+y1NTseNMJ6mCFxt03/7jTOy08bcg7bxJJdsM4nuhnchyBbE8vryveaJUf62noH7LodPSo5Z0WUCg==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.12.0.tgz", + "integrity": "sha512-lib96tyRtMhLxwauDWUp/uW3FMhLA6D0rJ8T7HmH7x23Gk1Gwwu8UZ94NMXBvOELn6flSPiBrCKlehkiXyaqwA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.11.0", - "@typescript-eslint/utils": "7.11.0", + "@typescript-eslint/typescript-estree": "7.12.0", + "@typescript-eslint/utils": "7.12.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -353,6 +400,88 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz", + "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz", + "integrity": "sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.12.0", + "@typescript-eslint/visitor-keys": "7.12.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz", + "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.12.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/types": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", @@ -419,15 +548,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.11.0.tgz", - "integrity": "sha512-xlAWwPleNRHwF37AhrZurOxA1wyXowW4PqVXZVUNCLjB48CqdPJoJWkrpH2nij9Q3Lb7rtWindtoXwxjxlKKCA==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.12.0.tgz", + "integrity": "sha512-Y6hhwxwDx41HNpjuYswYp6gDbkiZ8Hin9Bf5aJQn1bpTs3afYY4GX+MPYxma8jtoIV2GRwTM/UJm/2uGCVv+DQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "7.11.0", - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/typescript-estree": "7.11.0" + "@typescript-eslint/scope-manager": "7.12.0", + "@typescript-eslint/types": "7.12.0", + "@typescript-eslint/typescript-estree": "7.12.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -440,6 +569,105 @@ "eslint": "^8.56.0" } }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz", + "integrity": "sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.12.0", + "@typescript-eslint/visitor-keys": "7.12.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz", + "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz", + "integrity": "sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.12.0", + "@typescript-eslint/visitor-keys": "7.12.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz", + "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.12.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/@typescript-eslint/visitor-keys": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index 9f99b39751..60a838a4e5 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^7.11.0", + "@typescript-eslint/eslint-plugin": "^7.12.0", "@typescript-eslint/parser": "^7.11.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", From 51f239683a28c5a6a232688a78cf28dfd1bf9496 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 4 Jun 2024 19:40:47 +0000 Subject: [PATCH 42/44] Bump @typescript-eslint/parser from 7.11.0 to 7.12.0 in /cli-tests (#3011) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 7.11.0 to 7.12.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v7.12.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- cli-tests/package-lock.json | 258 +++--------------------------------- cli-tests/package.json | 2 +- 2 files changed, 16 insertions(+), 244 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 95f0024c8c..d59a2ce49d 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -21,7 +21,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^7.12.0", - "@typescript-eslint/parser": "^7.11.0", + "@typescript-eslint/parser": "^7.12.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", @@ -281,63 +281,16 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz", - "integrity": "sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz", - "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/parser": { "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz", - "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.12.0.tgz", + "integrity": "sha512-dm/J2UDY3oV3TKius2OUZIFHsomQmpHtsV0FTh1WO8EKgHLQ1QCADUqscPgTpU+ih1e21FQSRjXckHn3txn6kQ==", "dev": true, "dependencies": { + "@typescript-eslint/scope-manager": "7.12.0", "@typescript-eslint/types": "7.12.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.11.0.tgz", - "integrity": "sha512-yimw99teuaXVWsBcPO1Ais02kwJ1jmNA1KxE7ng0aT7ndr1pT1wqj0OJnsYVGKKlc4QJai86l/025L6z8CljOg==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "7.11.0", - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/typescript-estree": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", + "@typescript-eslint/typescript-estree": "7.12.0", + "@typescript-eslint/visitor-keys": "7.12.0", "debug": "^4.3.4" }, "engines": { @@ -357,13 +310,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.11.0.tgz", - "integrity": "sha512-27tGdVEiutD4POirLZX4YzT180vevUURJl4wJGmm6TrQoiYwuxTIY98PBp6L2oN+JQxzE0URvYlzJaBHIekXAw==", + "version": "7.12.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz", + "integrity": "sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0" + "@typescript-eslint/types": "7.12.0", + "@typescript-eslint/visitor-keys": "7.12.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -400,7 +353,7 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/types": { "version": "7.12.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz", "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==", @@ -413,7 +366,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/typescript-estree": { "version": "7.12.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz", "integrity": "sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==", @@ -441,88 +394,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz", - "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.12.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.11.0.tgz", - "integrity": "sha512-MPEsDRZTyCiXkD4vd3zywDCifi7tatc4K37KqTprCvaXptP7Xlpdw0NR2hRJTetG5TxbWDB79Ys4kLmHliEo/w==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.11.0.tgz", - "integrity": "sha512-cxkhZ2C/iyi3/6U9EPc5y+a6csqHItndvN/CzbNXTNrsC3/ASoYQZEt9uMaEp+xFNjasqQyszp5TumAVKKvJeQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "@typescript-eslint/visitor-keys": "7.11.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -569,65 +440,7 @@ "eslint": "^8.56.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.12.0.tgz", - "integrity": "sha512-itF1pTnN6F3unPak+kutH9raIkL3lhH1YRPGgt7QQOh43DQKVJXmWkpb+vpc/TiDHs6RSd9CTbDsc/Y+Ygq7kg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.12.0.tgz", - "integrity": "sha512-o+0Te6eWp2ppKY3mLCU+YA9pVJxhUJE15FV7kxuD9jgwIAa+w/ycGJBMrYDTpVGUM/tgpa9SeMOugSabWFq7bg==", - "dev": true, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.12.0.tgz", - "integrity": "sha512-5bwqLsWBULv1h6pn7cMW5dXX/Y2amRqLaKqsASVwbBHMZSnHqE/HN4vT4fE0aFsiwxYvr98kqOWh1a8ZKXalCQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.12.0", - "@typescript-eslint/visitor-keys": "7.12.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/visitor-keys": { "version": "7.12.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.12.0.tgz", "integrity": "sha512-uZk7DevrQLL3vSnfFl5bj4sL75qC9D6EdjemIdbtkuUmIheWpuiiylSY01JxJE7+zGrOWDZrp1WxOuDntvKrHQ==", @@ -644,47 +457,6 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/utils/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.11.0.tgz", - "integrity": "sha512-7syYk4MzjxTEk0g/w3iqtgxnFQspDJfn6QKD36xMuuhTzjcxY7F8EmBLnALjVyaOF1/bVocu3bS/2/F7rXrveQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "7.11.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index 60a838a4e5..82b0bf1e64 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -25,7 +25,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^7.12.0", - "@typescript-eslint/parser": "^7.11.0", + "@typescript-eslint/parser": "^7.12.0", "eslint": "8.56", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^18.0.0", From a7721fdbcab3f249d750c45dacb824998f87d78c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Wed, 5 Jun 2024 13:47:10 +0200 Subject: [PATCH 43/44] PMM-13145 Certs Fix - Backward compatibility for older clients. (#3014) * PMM-13145 Fix for older clients. * PMM-13145 Small changes. * PMM-13145 Lint. * PMM-13145 Lint. * PMM-13145 Logic fix. * PMM-13145 Refactor. * PMM-13145 Fix after refactor. * Update managed/models/agent_model.go Co-authored-by: Nurlan Moldomurov * Update managed/models/agent_model.go Co-authored-by: Nurlan Moldomurov --------- Co-authored-by: Nurlan Moldomurov --- managed/models/agent_helpers.go | 18 ++++++++ managed/models/agent_model.go | 12 +++++- managed/models/agent_model_test.go | 42 +++++++++---------- managed/models/dsn_helpers.go | 3 +- managed/services/agents/connection_checker.go | 13 +++--- managed/services/agents/mongodb.go | 6 +-- managed/services/agents/mysql.go | 10 ++--- managed/services/agents/postgresql.go | 6 +-- managed/services/agents/proxysql.go | 2 +- .../services/agents/service_info_broker.go | 13 +++--- managed/services/agents/state.go | 6 +-- 11 files changed, 83 insertions(+), 48 deletions(-) diff --git a/managed/models/agent_helpers.go b/managed/models/agent_helpers.go index d509bdf435..68fd243bec 100644 --- a/managed/models/agent_helpers.go +++ b/managed/models/agent_helpers.go @@ -524,6 +524,24 @@ func FindPmmAgentIDToRunActionOrJob(pmmAgentID string, agents []*Agent) (string, return "", status.Errorf(codes.FailedPrecondition, "Couldn't find pmm-agent-id to run action") } +// ExtractPmmAgentVersionFromAgent extract PMM agent version from Agent by pmm-agent-id. +func ExtractPmmAgentVersionFromAgent(q *reform.Querier, agent *Agent) *version.Parsed { + pmmAgentID, err := ExtractPmmAgentID(agent) + if err != nil { + return nil + } + pmmAgent, err := FindAgentByID(q, pmmAgentID) + if err != nil { + return nil + } + version, err := version.Parse(pointer.GetString(pmmAgent.Version)) + if err != nil { + return nil + } + + return version +} + // ExtractPmmAgentID extract pmm-agent-id from Agent by type. func ExtractPmmAgentID(agent *Agent) (string, error) { switch agent.AgentType { diff --git a/managed/models/agent_model.go b/managed/models/agent_model.go index bd7014b303..ab838e423f 100644 --- a/managed/models/agent_model.go +++ b/managed/models/agent_model.go @@ -73,6 +73,8 @@ const ( VMAgentType AgentType = "vmagent" ) +var v2_42 = version.MustParse("2.42.0-0") + // PMMServerAgentID is a special Agent ID representing pmm-agent on PMM Server. const PMMServerAgentID = string("pmm-server") // no /agent_id/ prefix @@ -313,7 +315,7 @@ type DSNParams struct { } // DSN returns a DSN string for accessing a given Service with this Agent (and an implicit driver). -func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair) string { //nolint:cyclop,maintidx +func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair, pmmAgentVersion *version.Parsed) string { //nolint:cyclop,maintidx host := pointer.GetString(service.Address) port := pointer.GetUint16(service.Port) socket := pointer.GetString(service.Socket) @@ -340,8 +342,12 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair) s cfg.Params = make(map[string]string) if s.TLS { // It is mandatory to have "custom" as the first case. + // Except case for backward compatibility. // Skip verify for "custom" is handled on pmm-agent side. switch { + // Backward compatibility + case s.TLSSkipVerify && (pmmAgentVersion == nil || pmmAgentVersion.Less(v2_42)): + cfg.Params["tls"] = skipVerify case len(s.Files()) != 0: cfg.Params["tls"] = "custom" case s.TLSSkipVerify: @@ -371,8 +377,12 @@ func (s *Agent) DSN(service *Service, dsnParams DSNParams, tdp *DelimiterPair) s cfg.Params = make(map[string]string) if s.TLS { // It is mandatory to have "custom" as the first case. + // Except case for backward compatibility. // Skip verify for "custom" is handled on pmm-agent side. switch { + // Backward compatibility + case pmmAgentVersion != nil && s.TLSSkipVerify && pmmAgentVersion.Less(v2_42): + cfg.Params["tls"] = skipVerify case len(s.Files()) != 0: cfg.Params["tls"] = "custom" case s.TLSSkipVerify: diff --git a/managed/models/agent_model_test.go b/managed/models/agent_model_test.go index a8a09de5ad..a17b44f26c 100644 --- a/managed/models/agent_model_test.go +++ b/managed/models/agent_model_test.go @@ -66,15 +66,15 @@ func TestAgent(t *testing.T) { } { t.Run(string(typ), func(t *testing.T) { agent.AgentType = typ - assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil)) + assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } t.Run("MongoDBNoDatabase", func(t *testing.T) { agent.AgentType = models.MongoDBExporterType - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil)) - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?directConnection=true", agent.DSN(service, models.DSNParams{}, nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil, nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?directConnection=true", agent.DSN(service, models.DSNParams{}, nil, nil)) }) }) @@ -94,7 +94,7 @@ func TestAgent(t *testing.T) { } { t.Run(string(typ), func(t *testing.T) { agent.AgentType = typ - assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil)) + assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } }) @@ -113,7 +113,7 @@ func TestAgent(t *testing.T) { } { t.Run(string(typ), func(t *testing.T) { agent.AgentType = typ - assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil)) + assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } }) @@ -159,7 +159,7 @@ func TestAgent(t *testing.T) { } { t.Run(string(typ), func(t *testing.T) { agent.AgentType = typ - assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil)) + assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } @@ -169,8 +169,8 @@ func TestAgent(t *testing.T) { agent.MongoDBOptions.TLSCertificateKeyFilePassword = "" agent.MongoDBOptions.AuthenticationMechanism = "" - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil)) - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?directConnection=true&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{}, nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil, nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?directConnection=true&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{}, nil, nil)) expectedFiles := map[string]string{ "caFilePlaceholder": "cert", "certificateKeyFilePlaceholder": "key", @@ -185,8 +185,8 @@ func TestAgent(t *testing.T) { agent.MongoDBOptions.AuthenticationMechanism = "MONGO-X509" agent.MongoDBOptions.AuthenticationDatabase = "$external" - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?authMechanism=MONGO-X509&authSource=%24external&connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil)) - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?authMechanism=MONGO-X509&authSource=%24external&directConnection=true&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{}, nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?authMechanism=MONGO-X509&authSource=%24external&connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil, nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?authMechanism=MONGO-X509&authSource=%24external&directConnection=true&ssl=true&tlsCaFile={{.TextFiles.caFilePlaceholder}}&tlsCertificateKeyFile={{.TextFiles.certificateKeyFilePlaceholder}}", agent.DSN(service, models.DSNParams{}, nil, nil)) expectedFiles := map[string]string{ "caFilePlaceholder": "cert", "certificateKeyFilePlaceholder": "key", @@ -217,15 +217,15 @@ func TestAgent(t *testing.T) { } { t.Run(string(typ), func(t *testing.T) { agent.AgentType = typ - assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil)) + assert.Equal(t, expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } t.Run("MongoDBNoDatabase", func(t *testing.T) { agent.AgentType = models.MongoDBExporterType - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true&tlsInsecure=true", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil)) - assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?directConnection=true&ssl=true&tlsInsecure=true", agent.DSN(service, models.DSNParams{}, nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true&tlsInsecure=true", agent.DSN(service, models.DSNParams{DialTimeout: time.Second}, nil, nil)) + assert.Equal(t, "mongodb://username:s3cur3%20p%40$$w0r4.@1.2.3.4:12345/?directConnection=true&ssl=true&tlsInsecure=true", agent.DSN(service, models.DSNParams{}, nil, nil)) }) }) } @@ -255,13 +255,13 @@ func TestPostgresAgentTLS(t *testing.T) { t.Run(name, func(t *testing.T) { agent.TLS = testCase.tls agent.TLSSkipVerify = testCase.tlsSkipVerify - assert.Equal(t, testCase.expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil)) + assert.Equal(t, testCase.expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) t.Run(fmt.Sprintf("AutodiscoveryLimit set TLS:%v/TLSSkipVerify:%v", testCase.tls, testCase.tlsSkipVerify), func(t *testing.T) { agent.TLS = testCase.tls agent.TLSSkipVerify = testCase.tlsSkipVerify agent.PostgreSQLOptions = &models.PostgreSQLOptions{AutoDiscoveryLimit: 10} - assert.Equal(t, testCase.expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil)) + assert.Equal(t, testCase.expected, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } } @@ -278,7 +278,7 @@ func TestPostgresWithSocket(t *testing.T) { Socket: pointer.ToString("/var/run/postgres"), } expect := "postgres://username@/database?connect_timeout=1&host=%2Fvar%2Frun%2Fpostgres&sslmode=verify-ca" - assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil)) + assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) t.Run("empty-user-password", func(t *testing.T) { @@ -289,7 +289,7 @@ func TestPostgresWithSocket(t *testing.T) { Socket: pointer.ToString("/var/run/postgres"), } expect := "postgres:///database?connect_timeout=1&host=%2Fvar%2Frun%2Fpostgres&sslmode=disable" - assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil)) + assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) t.Run("dir-with-symbols", func(t *testing.T) { @@ -300,7 +300,7 @@ func TestPostgresWithSocket(t *testing.T) { Socket: pointer.ToString(`/tmp/123\ A0m\%\$\@\8\,\+\-`), } expect := "postgres:///database?connect_timeout=1&host=%2Ftmp%2F123%5C+A0m%5C%25%5C%24%5C%40%5C8%5C%2C%5C%2B%5C-&sslmode=disable" - assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil)) + assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } @@ -316,7 +316,7 @@ func TestMongoWithSocket(t *testing.T) { Socket: pointer.ToString("/tmp/mongodb-27017.sock"), } expect := "mongodb://username@%2Ftmp%2Fmongodb-27017.sock/database?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000&ssl=true" - assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil)) + assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) t.Run("empty-user-password", func(t *testing.T) { @@ -327,7 +327,7 @@ func TestMongoWithSocket(t *testing.T) { Socket: pointer.ToString("/tmp/mongodb-27017.sock"), } expect := "mongodb://%2Ftmp%2Fmongodb-27017.sock/database?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000" - assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil)) + assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) t.Run("dir-with-symbols", func(t *testing.T) { @@ -338,7 +338,7 @@ func TestMongoWithSocket(t *testing.T) { Socket: pointer.ToString(`/tmp/123\ A0m\%\$\@\8\,\+\-/mongodb-27017.sock`), } expect := "mongodb://%2Ftmp%2F123%5C%20A0m%5C%25%5C$%5C%40%5C8%5C,%5C+%5C-%2Fmongodb-27017.sock/database?connectTimeoutMS=1000&directConnection=true&serverSelectionTimeoutMS=1000" - assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil)) + assert.Equal(t, expect, agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: "database"}, nil, nil)) }) } diff --git a/managed/models/dsn_helpers.go b/managed/models/dsn_helpers.go index d4d6112262..a8d47399d0 100644 --- a/managed/models/dsn_helpers.go +++ b/managed/models/dsn_helpers.go @@ -86,7 +86,8 @@ func FindDSNByServiceIDandPMMAgentID(q *reform.Querier, serviceID, pmmAgentID, d } if len(fexp) == 1 { agent := fexp[0] - return agent.DSN(svc, dsnParams, nil), agent, nil + pmmAgentVersion := ExtractPmmAgentVersionFromAgent(q, agent) + return agent.DSN(svc, dsnParams, nil, pmmAgentVersion), agent, nil } if len(fexp) > 1 { return "", nil, status.Errorf(codes.FailedPrecondition, "Couldn't resolve dsn, as there should be only one agent") diff --git a/managed/services/agents/connection_checker.go b/managed/services/agents/connection_checker.go index 9f695d8a8a..402ad52d18 100644 --- a/managed/services/agents/connection_checker.go +++ b/managed/services/agents/connection_checker.go @@ -137,12 +137,14 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref func connectionRequest(q *reform.Querier, service *models.Service, agent *models.Agent) (*agentpb.CheckConnectionRequest, error) { var request *agentpb.CheckConnectionRequest + + pmmAgentVersion := models.ExtractPmmAgentVersionFromAgent(q, agent) switch service.ServiceType { case models.MySQLServiceType: tdp := agent.TemplateDelimiters(service) request = &agentpb.CheckConnectionRequest{ Type: inventorypb.ServiceType_MYSQL_SERVICE, - Dsn: agent.DSN(service, models.DSNParams{DialTimeout: 2 * time.Second, Database: service.DatabaseName}, nil), + Dsn: agent.DSN(service, models.DSNParams{DialTimeout: 2 * time.Second, Database: service.DatabaseName}, nil, pmmAgentVersion), Timeout: durationpb.New(3 * time.Second), TextFiles: &agentpb.TextFiles{ Files: agent.Files(), @@ -158,8 +160,9 @@ func connectionRequest(q *reform.Querier, service *models.Service, agent *models return nil, err } request = &agentpb.CheckConnectionRequest{ - Type: inventorypb.ServiceType_POSTGRESQL_SERVICE, - Dsn: agent.DSN(service, models.DSNParams{DialTimeout: 2 * time.Second, Database: service.DatabaseName, PostgreSQLSupportsSSLSNI: sqlSniSupported}, nil), + Type: inventorypb.ServiceType_POSTGRESQL_SERVICE, + Dsn: agent.DSN(service, models.DSNParams{DialTimeout: 2 * time.Second, Database: service.DatabaseName, PostgreSQLSupportsSSLSNI: sqlSniSupported}, + nil, pmmAgentVersion), Timeout: durationpb.New(3 * time.Second), TextFiles: &agentpb.TextFiles{ Files: agent.Files(), @@ -171,7 +174,7 @@ func connectionRequest(q *reform.Querier, service *models.Service, agent *models tdp := agent.TemplateDelimiters(service) request = &agentpb.CheckConnectionRequest{ Type: inventorypb.ServiceType_MONGODB_SERVICE, - Dsn: agent.DSN(service, models.DSNParams{DialTimeout: 2 * time.Second, Database: service.DatabaseName}, nil), + Dsn: agent.DSN(service, models.DSNParams{DialTimeout: 2 * time.Second, Database: service.DatabaseName}, nil, pmmAgentVersion), Timeout: durationpb.New(3 * time.Second), TextFiles: &agentpb.TextFiles{ Files: agent.Files(), @@ -182,7 +185,7 @@ func connectionRequest(q *reform.Querier, service *models.Service, agent *models case models.ProxySQLServiceType: request = &agentpb.CheckConnectionRequest{ Type: inventorypb.ServiceType_PROXYSQL_SERVICE, - Dsn: agent.DSN(service, models.DSNParams{DialTimeout: 2 * time.Second, Database: service.DatabaseName}, nil), + Dsn: agent.DSN(service, models.DSNParams{DialTimeout: 2 * time.Second, Database: service.DatabaseName}, nil, pmmAgentVersion), Timeout: durationpb.New(3 * time.Second), } case models.ExternalServiceType: diff --git a/managed/services/agents/mongodb.go b/managed/services/agents/mongodb.go index 3ff1983593..0e043e3904 100644 --- a/managed/services/agents/mongodb.go +++ b/managed/services/agents/mongodb.go @@ -78,7 +78,7 @@ func mongodbExporterConfig(node *models.Node, service *models.Service, exporter database = exporter.MongoDBOptions.AuthenticationDatabase } env := []string{ - fmt.Sprintf("MONGODB_URI=%s", exporter.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: database}, tdp)), + fmt.Sprintf("MONGODB_URI=%s", exporter.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: database}, tdp, pmmAgentVersion)), } res := &agentpb.SetStateRequest_AgentProcess{ @@ -270,11 +270,11 @@ func defaultCollectors(collectAll bool) map[string]collectorArgs { } // qanMongoDBProfilerAgentConfig returns desired configuration of qan-mongodb-profiler-agent built-in agent. -func qanMongoDBProfilerAgentConfig(service *models.Service, agent *models.Agent) *agentpb.SetStateRequest_BuiltinAgent { +func qanMongoDBProfilerAgentConfig(service *models.Service, agent *models.Agent, pmmAgentVersion *version.Parsed) *agentpb.SetStateRequest_BuiltinAgent { tdp := agent.TemplateDelimiters(service) return &agentpb.SetStateRequest_BuiltinAgent{ Type: inventorypb.AgentType_QAN_MONGODB_PROFILER_AGENT, - Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: ""}, nil), + Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: ""}, nil, pmmAgentVersion), DisableQueryExamples: agent.QueryExamplesDisabled, MaxQueryLength: agent.MaxQueryLength, TextFiles: &agentpb.TextFiles{ diff --git a/managed/services/agents/mysql.go b/managed/services/agents/mysql.go index a7d9487ff2..e3e1c377e6 100644 --- a/managed/services/agents/mysql.go +++ b/managed/services/agents/mysql.go @@ -141,7 +141,7 @@ func mysqldExporterConfig( TemplateRightDelim: tdp.Right, Args: args, Env: []string{ - fmt.Sprintf("DATA_SOURCE_NAME=%s", exporter.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: ""}, nil)), + fmt.Sprintf("DATA_SOURCE_NAME=%s", exporter.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: ""}, nil, pmmAgentVersion)), fmt.Sprintf("HTTP_AUTH=pmm:%s", exporter.GetAgentPassword()), }, TextFiles: exporter.Files(), @@ -153,11 +153,11 @@ func mysqldExporterConfig( } // qanMySQLPerfSchemaAgentConfig returns desired configuration of qan-mysql-perfschema built-in agent. -func qanMySQLPerfSchemaAgentConfig(service *models.Service, agent *models.Agent) *agentpb.SetStateRequest_BuiltinAgent { +func qanMySQLPerfSchemaAgentConfig(service *models.Service, agent *models.Agent, pmmAgentVersion *version.Parsed) *agentpb.SetStateRequest_BuiltinAgent { tdp := agent.TemplateDelimiters(service) return &agentpb.SetStateRequest_BuiltinAgent{ Type: inventorypb.AgentType_QAN_MYSQL_PERFSCHEMA_AGENT, - Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: ""}, nil), + Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: ""}, nil, pmmAgentVersion), MaxQueryLength: agent.MaxQueryLength, DisableQueryExamples: agent.QueryExamplesDisabled, DisableCommentsParsing: agent.CommentsParsingDisabled, @@ -171,11 +171,11 @@ func qanMySQLPerfSchemaAgentConfig(service *models.Service, agent *models.Agent) } // qanMySQLSlowlogAgentConfig returns desired configuration of qan-mysql-slowlog built-in agent. -func qanMySQLSlowlogAgentConfig(service *models.Service, agent *models.Agent) *agentpb.SetStateRequest_BuiltinAgent { +func qanMySQLSlowlogAgentConfig(service *models.Service, agent *models.Agent, pmmAgentVersion *version.Parsed) *agentpb.SetStateRequest_BuiltinAgent { tdp := agent.TemplateDelimiters(service) return &agentpb.SetStateRequest_BuiltinAgent{ Type: inventorypb.AgentType_QAN_MYSQL_SLOWLOG_AGENT, - Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: ""}, nil), + Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: ""}, nil, pmmAgentVersion), MaxQueryLength: agent.MaxQueryLength, DisableQueryExamples: agent.QueryExamplesDisabled, DisableCommentsParsing: agent.CommentsParsingDisabled, diff --git a/managed/services/agents/postgresql.go b/managed/services/agents/postgresql.go index 33523d830e..73575eafed 100644 --- a/managed/services/agents/postgresql.go +++ b/managed/services/agents/postgresql.go @@ -121,7 +121,7 @@ func postgresExporterConfig(node *models.Node, service *models.Service, exporter TemplateRightDelim: tdp.Right, Args: args, Env: []string{ - fmt.Sprintf("DATA_SOURCE_NAME=%s", exporter.DSN(service, dnsParams, nil)), + fmt.Sprintf("DATA_SOURCE_NAME=%s", exporter.DSN(service, dnsParams, nil, pmmAgentVersion)), }, TextFiles: exporter.Files(), } @@ -147,7 +147,7 @@ func qanPostgreSQLPgStatementsAgentConfig(service *models.Service, agent *models } return &agentpb.SetStateRequest_BuiltinAgent{ Type: inventorypb.AgentType_QAN_POSTGRESQL_PGSTATEMENTS_AGENT, - Dsn: agent.DSN(service, dnsParams, nil), + Dsn: agent.DSN(service, dnsParams, nil, pmmAgentVersion), MaxQueryLength: agent.MaxQueryLength, DisableCommentsParsing: agent.CommentsParsingDisabled, TextFiles: &agentpb.TextFiles{ @@ -168,7 +168,7 @@ func qanPostgreSQLPgStatMonitorAgentConfig(service *models.Service, agent *model } return &agentpb.SetStateRequest_BuiltinAgent{ Type: inventorypb.AgentType_QAN_POSTGRESQL_PGSTATMONITOR_AGENT, - Dsn: agent.DSN(service, dnsParams, nil), + Dsn: agent.DSN(service, dnsParams, nil, pmmAgentVersion), DisableQueryExamples: agent.QueryExamplesDisabled, MaxQueryLength: agent.MaxQueryLength, DisableCommentsParsing: agent.CommentsParsingDisabled, diff --git a/managed/services/agents/proxysql.go b/managed/services/agents/proxysql.go index 383a27c0c6..9d66bbb906 100644 --- a/managed/services/agents/proxysql.go +++ b/managed/services/agents/proxysql.go @@ -73,7 +73,7 @@ func proxysqlExporterConfig(node *models.Node, service *models.Service, exporter TemplateRightDelim: tdp.Right, Args: args, Env: []string{ - fmt.Sprintf("DATA_SOURCE_NAME=%s", exporter.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: ""}, nil)), + fmt.Sprintf("DATA_SOURCE_NAME=%s", exporter.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: ""}, nil, pmmAgentVersion)), fmt.Sprintf("HTTP_AUTH=pmm:%s", exporter.GetAgentPassword()), }, } diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go index 6f0041656a..890a647109 100644 --- a/managed/services/agents/service_info_broker.go +++ b/managed/services/agents/service_info_broker.go @@ -52,12 +52,14 @@ func NewServiceInfoBroker(r *Registry) *ServiceInfoBroker { // ServiceInfoRequest creates a ServiceInfoRequest for a given service. func serviceInfoRequest(q *reform.Querier, service *models.Service, agent *models.Agent) (*agentpb.ServiceInfoRequest, error) { var request *agentpb.ServiceInfoRequest + + pmmAgentVersion := models.ExtractPmmAgentVersionFromAgent(q, agent) switch service.ServiceType { case models.MySQLServiceType: tdp := agent.TemplateDelimiters(service) request = &agentpb.ServiceInfoRequest{ Type: inventorypb.ServiceType_MYSQL_SERVICE, - Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: service.DatabaseName}, nil), + Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: service.DatabaseName}, nil, pmmAgentVersion), Timeout: durationpb.New(3 * time.Second), TextFiles: &agentpb.TextFiles{ Files: agent.Files(), @@ -73,8 +75,9 @@ func serviceInfoRequest(q *reform.Querier, service *models.Service, agent *model return nil, err } request = &agentpb.ServiceInfoRequest{ - Type: inventorypb.ServiceType_POSTGRESQL_SERVICE, - Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: service.DatabaseName, PostgreSQLSupportsSSLSNI: sqlSniSupported}, nil), + Type: inventorypb.ServiceType_POSTGRESQL_SERVICE, + Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: service.DatabaseName, PostgreSQLSupportsSSLSNI: sqlSniSupported}, + nil, pmmAgentVersion), Timeout: durationpb.New(3 * time.Second), TextFiles: &agentpb.TextFiles{ Files: agent.Files(), @@ -86,7 +89,7 @@ func serviceInfoRequest(q *reform.Querier, service *models.Service, agent *model tdp := agent.TemplateDelimiters(service) request = &agentpb.ServiceInfoRequest{ Type: inventorypb.ServiceType_MONGODB_SERVICE, - Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: service.DatabaseName}, nil), + Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: service.DatabaseName}, nil, pmmAgentVersion), Timeout: durationpb.New(3 * time.Second), TextFiles: &agentpb.TextFiles{ Files: agent.Files(), @@ -97,7 +100,7 @@ func serviceInfoRequest(q *reform.Querier, service *models.Service, agent *model case models.ProxySQLServiceType: request = &agentpb.ServiceInfoRequest{ Type: inventorypb.ServiceType_PROXYSQL_SERVICE, - Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: service.DatabaseName}, nil), + Dsn: agent.DSN(service, models.DSNParams{DialTimeout: time.Second, Database: service.DatabaseName}, nil, pmmAgentVersion), Timeout: durationpb.New(3 * time.Second), } case models.ExternalServiceType: diff --git a/managed/services/agents/state.go b/managed/services/agents/state.go index ed0c4e0ecd..0e55f14a97 100644 --- a/managed/services/agents/state.go +++ b/managed/services/agents/state.go @@ -245,11 +245,11 @@ func (u *StateUpdater) sendSetStateRequest(ctx context.Context, agent *pmmAgentI case models.ProxySQLExporterType: agentProcesses[row.AgentID] = proxysqlExporterConfig(node, service, row, redactMode, pmmAgentVersion) case models.QANMySQLPerfSchemaAgentType: - builtinAgents[row.AgentID] = qanMySQLPerfSchemaAgentConfig(service, row) + builtinAgents[row.AgentID] = qanMySQLPerfSchemaAgentConfig(service, row, pmmAgentVersion) case models.QANMySQLSlowlogAgentType: - builtinAgents[row.AgentID] = qanMySQLSlowlogAgentConfig(service, row) + builtinAgents[row.AgentID] = qanMySQLSlowlogAgentConfig(service, row, pmmAgentVersion) case models.QANMongoDBProfilerAgentType: - builtinAgents[row.AgentID] = qanMongoDBProfilerAgentConfig(service, row) + builtinAgents[row.AgentID] = qanMongoDBProfilerAgentConfig(service, row, pmmAgentVersion) case models.QANPostgreSQLPgStatementsAgentType: builtinAgents[row.AgentID] = qanPostgreSQLPgStatementsAgentConfig(service, row, pmmAgentVersion) case models.QANPostgreSQLPgStatMonitorAgentType: From eae75bc71a3b1ca08f602cd67e45d4a0555c0947 Mon Sep 17 00:00:00 2001 From: idoko Date: Sun, 16 Jun 2024 23:31:44 +0100 Subject: [PATCH 44/44] List version differences between installed and latest PMM versions This adds a new array field to list all the versions between the currently installed PMM version and the latest released version. Additionally, it adds support for release notes text by querying the appropriate github file for the raw markdown document. --- api-tests/server/updates_test.go | 7 +- .../client/server/check_updates_responses.go | 132 ++- api/serverpb/json/serverpb.json | 51 +- api/serverpb/server.pb.go | 759 +++++++++--------- api/serverpb/server.pb.validate.go | 38 +- api/serverpb/server.proto | 10 +- api/swagger/swagger-dev.json | 47 +- api/swagger/swagger.json | 47 +- descriptor.bin | Bin 706002 -> 709047 bytes managed/services/server/server.go | 47 +- managed/services/server/updater.go | 110 ++- managed/services/server/updater_test.go | 8 +- version/update.go | 16 +- 13 files changed, 830 insertions(+), 442 deletions(-) diff --git a/api-tests/server/updates_test.go b/api-tests/server/updates_test.go index 0d1bb0d3ea..3666417569 100644 --- a/api-tests/server/updates_test.go +++ b/api-tests/server/updates_test.go @@ -77,11 +77,14 @@ func TestCheckUpdates(t *testing.T) { assert.NotEmpty(t, res.Payload.Latest.Tag) assert.NotEqual(t, res.Payload.Installed.FullVersion, res.Payload.Latest.Version) assert.NotEqual(t, res.Payload.Installed.Timestamp, res.Payload.Latest.Timestamp) - assert.True(t, strings.HasPrefix(res.Payload.LatestNewsURL, "https://per.co.na/pmm/2."), "latest_news_url = %q", res.Payload.LatestNewsURL) + assert.True(t, strings.HasPrefix(res.Payload.Latest.ReleaseNotesURL, "https://per.co.na/pmm/2."), "latest_news_url = %q", res.Payload.Latest.ReleaseNotesURL) + + assert.NotEmpty(t, res.Payload.AvailableVersions) + assert.NotEmpty(t, res.Payload.AvailableVersions[0].ReleaseNotesURL) } else { assert.Equal(t, res.Payload.Installed.Timestamp, res.Payload.Latest.Timestamp) assert.Empty(t, res.Payload.Installed.FullVersion, res.Payload.Latest.Version) - assert.Empty(t, res.Payload.LatestNewsURL, "latest_news_url should be empty") + assert.Empty(t, res.Payload.Latest.ReleaseNotesText, "release_notes_url should be empty") } assert.NotEmpty(t, res.Payload.LastCheck) diff --git a/api/serverpb/json/client/server/check_updates_responses.go b/api/serverpb/json/client/server/check_updates_responses.go index fb791b2c07..9717344e50 100644 --- a/api/serverpb/json/client/server/check_updates_responses.go +++ b/api/serverpb/json/client/server/check_updates_responses.go @@ -419,8 +419,8 @@ type CheckUpdatesOKBody struct { // True if there is a PMM Server update available. UpdateAvailable bool `json:"update_available,omitempty"` - // Latest available PMM Server release announcement URL. - LatestNewsURL string `json:"latest_news_url,omitempty"` + // List of all available PMM versions between the installed version and the newest released versioned. + AvailableVersions []*CheckUpdatesOKBodyAvailableVersionsItems0 `json:"available_versions"` // Last check time. // Format: date-time @@ -437,6 +437,10 @@ type CheckUpdatesOKBody struct { func (o *CheckUpdatesOKBody) Validate(formats strfmt.Registry) error { var res []error + if err := o.validateAvailableVersions(formats); err != nil { + res = append(res, err) + } + if err := o.validateLastCheck(formats); err != nil { res = append(res, err) } @@ -455,6 +459,32 @@ func (o *CheckUpdatesOKBody) Validate(formats strfmt.Registry) error { return nil } +func (o *CheckUpdatesOKBody) validateAvailableVersions(formats strfmt.Registry) error { + if swag.IsZero(o.AvailableVersions) { // not required + return nil + } + + for i := 0; i < len(o.AvailableVersions); i++ { + if swag.IsZero(o.AvailableVersions[i]) { // not required + continue + } + + if o.AvailableVersions[i] != nil { + if err := o.AvailableVersions[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("checkUpdatesOk" + "." + "available_versions" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("checkUpdatesOk" + "." + "available_versions" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + func (o *CheckUpdatesOKBody) validateLastCheck(formats strfmt.Registry) error { if swag.IsZero(o.LastCheck) { // not required return nil @@ -509,6 +539,10 @@ func (o *CheckUpdatesOKBody) validateLatest(formats strfmt.Registry) error { func (o *CheckUpdatesOKBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error { var res []error + if err := o.contextValidateAvailableVersions(ctx, formats); err != nil { + res = append(res, err) + } + if err := o.contextValidateInstalled(ctx, formats); err != nil { res = append(res, err) } @@ -523,6 +557,23 @@ func (o *CheckUpdatesOKBody) ContextValidate(ctx context.Context, formats strfmt return nil } +func (o *CheckUpdatesOKBody) contextValidateAvailableVersions(ctx context.Context, formats strfmt.Registry) error { + for i := 0; i < len(o.AvailableVersions); i++ { + if o.AvailableVersions[i] != nil { + if err := o.AvailableVersions[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("checkUpdatesOk" + "." + "available_versions" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("checkUpdatesOk" + "." + "available_versions" + "." + strconv.Itoa(i)) + } + return err + } + } + } + + return nil +} + func (o *CheckUpdatesOKBody) contextValidateInstalled(ctx context.Context, formats strfmt.Registry) error { if o.Installed != nil { if err := o.Installed.ContextValidate(ctx, formats); err != nil { @@ -571,6 +622,77 @@ func (o *CheckUpdatesOKBody) UnmarshalBinary(b []byte) error { return nil } +/* +CheckUpdatesOKBodyAvailableVersionsItems0 check updates OK body available versions items0 +swagger:model CheckUpdatesOKBodyAvailableVersionsItems0 +*/ +type CheckUpdatesOKBodyAvailableVersionsItems0 struct { + // PMM Version. + Version string `json:"version,omitempty"` + + // Docker image tag. + Tag string `json:"tag,omitempty"` + + // Release date. + // Format: date-time + Timestamp strfmt.DateTime `json:"timestamp,omitempty"` + + // Release notes URL for the version release (if available). + ReleaseNotesURL string `json:"release_notes_url,omitempty"` + + // Release notes text for the version release (if available). + ReleaseNotesText string `json:"release_notes_text,omitempty"` +} + +// Validate validates this check updates OK body available versions items0 +func (o *CheckUpdatesOKBodyAvailableVersionsItems0) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateTimestamp(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *CheckUpdatesOKBodyAvailableVersionsItems0) validateTimestamp(formats strfmt.Registry) error { + if swag.IsZero(o.Timestamp) { // not required + return nil + } + + if err := validate.FormatOf("timestamp", "body", "date-time", o.Timestamp.String(), formats); err != nil { + return err + } + + return nil +} + +// ContextValidate validates this check updates OK body available versions items0 based on context it is used +func (o *CheckUpdatesOKBodyAvailableVersionsItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *CheckUpdatesOKBodyAvailableVersionsItems0) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *CheckUpdatesOKBodyAvailableVersionsItems0) UnmarshalBinary(b []byte) error { + var res CheckUpdatesOKBodyAvailableVersionsItems0 + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + /* CheckUpdatesOKBodyInstalled VersionInfo describes component version, or PMM Server as a whole. swagger:model CheckUpdatesOKBodyInstalled @@ -650,6 +772,12 @@ type CheckUpdatesOKBodyLatest struct { // Release date. // Format: date-time Timestamp strfmt.DateTime `json:"timestamp,omitempty"` + + // Release notes URL for the version release (if available). + ReleaseNotesURL string `json:"release_notes_url,omitempty"` + + // Release notes text for the version release (if available). + ReleaseNotesText string `json:"release_notes_text,omitempty"` } // Validate validates this check updates OK body latest diff --git a/api/serverpb/json/serverpb.json b/api/serverpb/json/serverpb.json index f425d7fc35..a97ae7962b 100644 --- a/api/serverpb/json/serverpb.json +++ b/api/serverpb/json/serverpb.json @@ -690,6 +690,42 @@ "schema": { "type": "object", "properties": { + "available_versions": { + "description": "List of all available PMM versions between the installed version and the newest released versioned.", + "type": "array", + "items": { + "type": "object", + "properties": { + "release_notes_text": { + "description": "Release notes text for the version release (if available).", + "type": "string", + "x-order": 4 + }, + "release_notes_url": { + "description": "Release notes URL for the version release (if available).", + "type": "string", + "x-order": 3 + }, + "tag": { + "description": "Docker image tag.", + "type": "string", + "x-order": 1 + }, + "timestamp": { + "description": "Release date.", + "type": "string", + "format": "date-time", + "x-order": 2 + }, + "version": { + "description": "PMM Version.", + "type": "string", + "x-order": 0 + } + } + }, + "x-order": 3 + }, "installed": { "description": "VersionInfo describes component version, or PMM Server as a whole.", "type": "object", @@ -722,6 +758,16 @@ "latest": { "type": "object", "properties": { + "release_notes_text": { + "description": "Release notes text for the version release (if available).", + "type": "string", + "x-order": 4 + }, + "release_notes_url": { + "description": "Release notes URL for the version release (if available).", + "type": "string", + "x-order": 3 + }, "tag": { "description": "Docker image tag.", "type": "string", @@ -741,11 +787,6 @@ }, "x-order": 1 }, - "latest_news_url": { - "description": "Latest available PMM Server release announcement URL.", - "type": "string", - "x-order": 3 - }, "update_available": { "description": "True if there is a PMM Server update available.", "type": "boolean", diff --git a/api/serverpb/server.pb.go b/api/serverpb/server.pb.go index 5798f6e814..d21942a09d 100644 --- a/api/serverpb/server.pb.go +++ b/api/serverpb/server.pb.go @@ -495,6 +495,10 @@ type DockerVersionInfo struct { Tag string `protobuf:"bytes,2,opt,name=tag,proto3" json:"tag,omitempty"` // Release date. Timestamp *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + // Release notes URL for the version release (if available). + ReleaseNotesUrl string `protobuf:"bytes,4,opt,name=release_notes_url,json=releaseNotesUrl,proto3" json:"release_notes_url,omitempty"` + // Release notes text for the version release (if available). + ReleaseNotesText string `protobuf:"bytes,5,opt,name=release_notes_text,json=releaseNotesText,proto3" json:"release_notes_text,omitempty"` } func (x *DockerVersionInfo) Reset() { @@ -550,6 +554,20 @@ func (x *DockerVersionInfo) GetTimestamp() *timestamppb.Timestamp { return nil } +func (x *DockerVersionInfo) GetReleaseNotesUrl() string { + if x != nil { + return x.ReleaseNotesUrl + } + return "" +} + +func (x *DockerVersionInfo) GetReleaseNotesText() string { + if x != nil { + return x.ReleaseNotesText + } + return "" +} + type CheckUpdatesResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -557,12 +575,12 @@ type CheckUpdatesResponse struct { // Currently installed PMM Server version. Installed *VersionInfo `protobuf:"bytes,1,opt,name=installed,proto3" json:"installed,omitempty"` - // Latest available PMM Server version. + // Latest available PMM Server version that can be upgraded to. Latest *DockerVersionInfo `protobuf:"bytes,2,opt,name=latest,proto3" json:"latest,omitempty"` // True if there is a PMM Server update available. UpdateAvailable bool `protobuf:"varint,3,opt,name=update_available,json=updateAvailable,proto3" json:"update_available,omitempty"` - // Latest available PMM Server release announcement URL. - LatestNewsUrl string `protobuf:"bytes,4,opt,name=latest_news_url,json=latestNewsUrl,proto3" json:"latest_news_url,omitempty"` + // List of all available PMM versions between the installed version and the newest released versioned. + AvailableVersions []*DockerVersionInfo `protobuf:"bytes,4,rep,name=available_versions,json=availableVersions,proto3" json:"available_versions,omitempty"` // Last check time. LastCheck *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=last_check,json=lastCheck,proto3" json:"last_check,omitempty"` } @@ -620,11 +638,11 @@ func (x *CheckUpdatesResponse) GetUpdateAvailable() bool { return false } -func (x *CheckUpdatesResponse) GetLatestNewsUrl() string { +func (x *CheckUpdatesResponse) GetAvailableVersions() []*DockerVersionInfo { if x != nil { - return x.LatestNewsUrl + return x.AvailableVersions } - return "" + return nil } func (x *CheckUpdatesResponse) GetLastCheck() *timestamppb.Timestamp { @@ -1674,332 +1692,340 @@ var file_serverpb_server_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x6c, 0x79, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x6f, 0x6e, 0x6c, 0x79, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x79, 0x0a, 0x11, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 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, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x74, 0x61, 0x67, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x03, 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, 0x22, 0x8a, 0x02, - 0x0a, 0x14, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, - 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, - 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x06, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x10, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x74, 0x5f, 0x6e, 0x65, 0x77, 0x73, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x4e, 0x65, 0x77, 0x73, 0x55, 0x72, 0x6c, 0x12, - 0x39, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x05, 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, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0x31, 0x0a, 0x12, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, - 0x13, 0x53, 0x74, 0x61, 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x22, 0x53, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, - 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, - 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, - 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6c, 0x6f, - 0x67, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, 0x66, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, - 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x22, - 0x95, 0x01, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, 0x02, 0x68, 0x72, 0x18, 0x01, 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, 0x02, 0x68, - 0x72, 0x12, 0x29, 0x0a, 0x02, 0x6d, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x6f, 0x6e, 0x22, 0xd3, 0x01, 0x0a, 0x11, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 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, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x74, 0x61, 0x67, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x03, 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, 0x2a, + 0x0a, 0x11, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x5f, + 0x75, 0x72, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x72, 0x65, 0x6c, 0x65, 0x61, + 0x73, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x55, 0x72, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x72, 0x65, + 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x6f, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, + 0x6f, 0x74, 0x65, 0x73, 0x54, 0x65, 0x78, 0x74, 0x22, 0xac, 0x02, 0x0a, 0x14, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x31, 0x0a, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x09, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x06, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x6f, + 0x63, 0x6b, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x06, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x48, 0x0a, 0x12, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x11, 0x61, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x6c, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0a, + 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x05, 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, 0x6c, 0x61, + 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x22, 0x31, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x6e, 0x65, 0x77, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x6e, 0x65, 0x77, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x22, 0x53, 0x0a, 0x13, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22, + 0x53, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x75, 0x74, 0x68, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x22, 0x66, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, + 0x6c, 0x6f, 0x67, 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x08, 0x6c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, + 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x6c, + 0x6f, 0x67, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x22, 0x95, 0x01, 0x0a, + 0x12, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x29, 0x0a, 0x02, 0x68, 0x72, 0x18, 0x01, 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, 0x02, 0x68, 0x72, 0x12, 0x29, + 0x0a, 0x02, 0x6d, 0x72, 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, 0x02, 0x6d, 0x72, 0x12, 0x29, 0x0a, 0x02, 0x6c, 0x72, 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, 0x02, 0x6c, 0x72, 0x22, 0xe3, 0x01, 0x0a, 0x11, 0x53, 0x54, 0x54, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x12, 0x46, 0x0a, 0x11, 0x73, 0x74, + 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, + 0x01, 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, 0x10, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x12, 0x3e, 0x0a, 0x0d, 0x72, 0x61, 0x72, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 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, 0x0c, 0x72, 0x61, 0x72, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x12, 0x46, 0x0a, 0x11, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x74, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 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, 0x02, 0x6d, 0x72, 0x12, 0x29, 0x0a, 0x02, - 0x6c, 0x72, 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, 0x02, 0x6c, 0x72, 0x22, 0xe3, 0x01, 0x0a, 0x11, 0x53, 0x54, 0x54, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x12, 0x46, 0x0a, - 0x11, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x18, 0x01, 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, 0x10, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, 0x72, 0x64, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x3e, 0x0a, 0x0d, 0x72, 0x61, 0x72, 0x65, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 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, 0x0c, 0x72, 0x61, 0x72, 0x65, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x46, 0x0a, 0x11, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, - 0x74, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 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, 0x10, 0x66, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xe7, 0x06, - 0x0a, 0x08, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, - 0x72, 0x79, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x10, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, - 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, - 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x40, 0x0a, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 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, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x77, - 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0d, 0x61, 0x77, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x74, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x65, - 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x6c, 0x61, 0x74, - 0x66, 0x6f, 0x72, 0x6d, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x6c, 0x65, - 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6d, 0x6d, 0x5f, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0xe7, 0x06, 0x0a, 0x08, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x74, + 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0e, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, + 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, + 0x0d, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, + 0x0a, 0x07, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x77, 0x73, 0x5f, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x61, 0x77, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x74, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x74, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x25, 0x0a, 0x0e, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x65, 0x6d, 0x61, 0x69, + 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, + 0x6d, 0x45, 0x6d, 0x61, 0x69, 0x6c, 0x12, 0x29, 0x0a, 0x10, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6d, 0x6d, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, + 0x6d, 0x6d, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x49, 0x0a, 0x13, 0x73, 0x74, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x54, 0x54, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x52, 0x11, 0x73, 0x74, 0x74, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x33, 0x0a, 0x15, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x64, + 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x70, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x6f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, + 0x2f, 0x0a, 0x13, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x5f, 0x73, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x09, 0x52, 0x12, 0x74, 0x65, + 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, + 0x12, 0x32, 0x0a, 0x15, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, + 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x4a, 0x04, 0x08, 0x07, + 0x10, 0x08, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x0d, 0x10, 0x0e, 0x4a, 0x04, + 0x08, 0x0e, 0x10, 0x0f, 0x22, 0x14, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x43, 0x0a, 0x13, 0x47, 0x65, + 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, + 0xce, 0x08, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x1c, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x65, 0x6c, 0x65, 0x6d, + 0x65, 0x74, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, + 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x10, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, + 0x79, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, 0x72, 0x65, 0x73, + 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, + 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, + 0x0a, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 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, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x17, 0x0a, 0x07, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x77, 0x73, + 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x61, 0x77, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x74, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x74, 0x12, + 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x74, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x53, 0x74, 0x74, + 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x6c, 0x65, 0x72, 0x74, + 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x29, 0x0a, 0x10, 0x64, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x6c, 0x65, 0x72, + 0x74, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6d, 0x6d, 0x5f, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x6d, 0x6d, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x49, 0x0a, 0x13, 0x73, 0x74, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x54, 0x54, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x52, 0x11, 0x73, 0x74, 0x74, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x12, 0x3a, 0x0a, - 0x19, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x17, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x33, 0x0a, 0x15, 0x61, 0x7a, 0x75, - 0x72, 0x65, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x64, - 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x32, - 0x0a, 0x15, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x70, - 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x6f, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, - 0x72, 0x6d, 0x12, 0x2f, 0x0a, 0x13, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x5f, - 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x12, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x69, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x15, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x26, 0x0a, 0x0f, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x49, 0x64, 0x4a, - 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x0d, 0x10, - 0x0e, 0x4a, 0x04, 0x08, 0x0e, 0x10, 0x0f, 0x22, 0x14, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x43, 0x0a, - 0x13, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x22, 0xce, 0x08, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x25, 0x0a, 0x0e, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x1c, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x64, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x10, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x65, - 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x12, 0x2b, 0x0a, 0x11, 0x64, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x5f, 0x74, 0x65, 0x6c, 0x65, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x10, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x54, 0x65, 0x6c, 0x65, 0x6d, - 0x65, 0x74, 0x72, 0x79, 0x12, 0x4b, 0x0a, 0x13, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x5f, - 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x12, 0x6d, - 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x40, 0x0a, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x72, 0x65, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x04, 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, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x74, 0x65, 0x6e, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x73, 0x68, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x73, 0x68, 0x4b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0e, - 0x61, 0x77, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x77, 0x73, 0x50, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, - 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x53, - 0x74, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x73, 0x74, - 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x53, 0x74, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x6c, - 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x65, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x29, 0x0a, 0x10, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x41, - 0x6c, 0x65, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6d, 0x6d, 0x5f, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x13, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x70, 0x6d, 0x6d, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, - 0x70, 0x6d, 0x6d, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x50, 0x6d, 0x6d, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x49, 0x0a, 0x13, 0x73, 0x74, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x54, 0x54, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x52, 0x11, 0x73, 0x74, 0x74, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x64, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x33, - 0x0a, 0x15, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x64, - 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x64, 0x69, 0x73, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x18, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3a, 0x0a, - 0x19, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x17, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x34, 0x0a, - 0x16, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, - 0x04, 0x08, 0x09, 0x10, 0x0a, 0x4a, 0x04, 0x08, 0x0a, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x0f, 0x10, - 0x10, 0x4a, 0x04, 0x08, 0x10, 0x10, 0x11, 0x4a, 0x04, 0x08, 0x11, 0x10, 0x12, 0x4a, 0x04, 0x08, - 0x12, 0x10, 0x13, 0x22, 0x46, 0x0a, 0x16, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, - 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x43, 0x0a, 0x17, 0x41, - 0x57, 0x53, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, - 0x22, 0x1a, 0x0a, 0x18, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x66, 0x0a, 0x12, - 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, - 0x6f, 0x64, 0x12, 0x1f, 0x0a, 0x1b, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x43, 0x4b, 0x45, 0x52, 0x10, 0x01, 0x12, - 0x07, 0x0a, 0x03, 0x4f, 0x56, 0x46, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4d, 0x49, 0x10, - 0x03, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, - 0x44, 0x4f, 0x10, 0x05, 0x32, 0xe5, 0x0c, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, - 0x79, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x92, 0x41, 0x27, - 0x12, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x1c, 0x52, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x73, 0x20, 0x50, 0x4d, 0x4d, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, - 0x76, 0x31, 0x2f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x9e, 0x02, 0x0a, 0x09, 0x52, - 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x61, 0x64, - 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x01, - 0x92, 0x41, 0xc5, 0x01, 0x12, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x20, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x1a, 0xaa, 0x01, 0x52, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, - 0x77, 0x68, 0x65, 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, - 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, - 0x65, 0x61, 0x64, 0x79, 0x20, 0x79, 0x65, 0x74, 0x2e, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x69, 0x6e, 0x67, 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x20, 0x6f, - 0x66, 0x20, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x62, - 0x69, 0x6e, 0x67, 0x20, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x20, 0x72, - 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, - 0x0a, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x7a, 0x12, 0xf7, 0x01, 0x0a, 0x11, - 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x12, 0x20, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x9c, 0x01, 0x92, 0x41, 0x79, 0x12, 0x10, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x20, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x1a, 0x65, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, - 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x2e, 0x20, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, - 0x2f, 0x76, 0x31, 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0xa3, 0x01, 0x0a, 0x0c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x58, 0x92, 0x41, 0x39, 0x12, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x73, 0x1a, 0x28, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x50, 0x4d, 0x4d, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x82, + 0x73, 0x73, 0x12, 0x39, 0x0a, 0x19, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x5f, 0x70, 0x6d, 0x6d, + 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6d, 0x6d, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x49, 0x0a, + 0x13, 0x73, 0x74, 0x74, 0x5f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x53, 0x54, 0x54, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x73, 0x52, 0x11, 0x73, 0x74, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x5f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x7a, + 0x75, 0x72, 0x65, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x15, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x7a, 0x75, 0x72, 0x65, 0x64, 0x69, 0x73, 0x63, + 0x6f, 0x76, 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x41, 0x7a, 0x75, 0x72, 0x65, 0x64, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x12, 0x38, 0x0a, 0x18, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x5f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x18, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x16, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x19, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x64, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x18, + 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x41, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x34, 0x0a, 0x16, 0x64, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x64, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x08, 0x10, 0x09, 0x4a, 0x04, 0x08, 0x09, + 0x10, 0x0a, 0x4a, 0x04, 0x08, 0x0a, 0x10, 0x0b, 0x4a, 0x04, 0x08, 0x0f, 0x10, 0x10, 0x4a, 0x04, + 0x08, 0x10, 0x10, 0x11, 0x4a, 0x04, 0x08, 0x11, 0x10, 0x12, 0x4a, 0x04, 0x08, 0x12, 0x10, 0x13, + 0x22, 0x46, 0x0a, 0x16, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x08, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x43, 0x0a, 0x17, 0x41, 0x57, 0x53, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, + 0x01, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x1a, 0x0a, + 0x18, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x66, 0x0a, 0x12, 0x44, 0x69, 0x73, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, + 0x1f, 0x0a, 0x1b, 0x44, 0x49, 0x53, 0x54, 0x52, 0x49, 0x42, 0x55, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x4d, 0x45, 0x54, 0x48, 0x4f, 0x44, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x43, 0x4b, 0x45, 0x52, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, + 0x4f, 0x56, 0x46, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x4d, 0x49, 0x10, 0x03, 0x12, 0x09, + 0x0a, 0x05, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x10, 0x04, 0x12, 0x06, 0x0a, 0x02, 0x44, 0x4f, 0x10, + 0x05, 0x32, 0xe5, 0x0c, 0x0a, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x79, 0x0a, 0x07, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x17, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x92, 0x41, 0x27, 0x12, 0x07, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x1c, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, + 0x50, 0x4d, 0x4d, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x76, 0x31, 0x2f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x9e, 0x02, 0x0a, 0x09, 0x52, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x65, 0x73, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, + 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, + 0x73, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x01, 0x92, 0x41, 0xc5, + 0x01, 0x12, 0x16, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, + 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x1a, 0xaa, 0x01, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x20, 0x77, 0x68, 0x65, + 0x6e, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x73, 0x20, 0x62, 0x65, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x79, 0x20, 0x79, 0x65, 0x74, 0x2e, 0x20, 0x55, 0x73, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, + 0x41, 0x50, 0x49, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x67, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x20, 0x6f, 0x66, 0x20, 0x44, + 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x70, 0x72, 0x6f, 0x62, 0x69, 0x6e, 0x67, + 0x20, 0x4b, 0x75, 0x62, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x65, 0x73, 0x20, 0x72, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x65, 0x73, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x76, + 0x31, 0x2f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x7a, 0x12, 0xf7, 0x01, 0x0a, 0x11, 0x4c, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x20, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x9c, 0x01, 0x92, 0x41, 0x79, 0x12, 0x10, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x20, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x68, 0x69, 0x70, 0x1a, 0x65, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, + 0x6e, 0x63, 0x65, 0x20, 0x69, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x20, + 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1a, 0x3a, 0x01, 0x2a, 0x22, 0x15, 0x2f, 0x76, 0x31, + 0x2f, 0x6c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x12, 0xa3, 0x01, 0x0a, 0x0c, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1c, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x58, + 0x92, 0x41, 0x39, 0x12, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x1a, 0x28, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x20, 0x50, 0x4d, 0x4d, 0x20, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x2f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x90, 0x01, 0x0a, 0x0b, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x48, 0x92, 0x41, 0x29, 0x12, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x20, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x1a, 0x19, 0x53, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, 0x50, 0x4d, 0x4d, + 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x90, 0x01, 0x0a, 0x0b, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x92, 0x41, 0x29, 0x12, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x19, 0x53, 0x74, 0x61, 0x72, 0x74, 0x73, 0x20, - 0x50, 0x4d, 0x4d, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x3a, 0x01, 0x2a, 0x22, 0x11, 0x2f, 0x76, 0x31, - 0x2f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x9d, - 0x01, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x1b, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x73, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x9d, 0x01, 0x0a, 0x0c, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x92, 0x41, 0x32, 0x12, - 0x0d, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x21, - 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x50, 0x4d, 0x4d, 0x20, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x76, 0x31, 0x2f, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x2f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x9a, - 0x01, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1a, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x92, 0x41, 0x34, 0x12, 0x0c, 0x47, 0x65, - 0x74, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x24, 0x52, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x73, 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x50, 0x4d, 0x4d, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x12, 0xa1, 0x01, 0x0a, 0x0e, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1d, - 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, 0x92, - 0x41, 0x2f, 0x12, 0x0f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x1a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x50, 0x4d, 0x4d, - 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, - 0xaa, 0x01, 0x0a, 0x10, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x12, 0x1f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x57, - 0x53, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, - 0x57, 0x53, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x92, 0x41, 0x31, 0x12, 0x12, 0x41, 0x57, - 0x53, 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, - 0x1a, 0x1b, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x41, 0x57, 0x53, 0x20, 0x45, 0x43, 0x32, - 0x20, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x49, 0x44, 0x2e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x19, 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x41, 0x57, 0x53, 0x49, - 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x76, 0x0a, 0x0a, - 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x42, 0x0b, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x23, 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, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x70, 0x62, 0xa2, 0x02, - 0x03, 0x53, 0x58, 0x58, 0xaa, 0x02, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0xca, 0x02, 0x06, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0xe2, 0x02, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x06, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x92, 0x41, 0x32, 0x12, 0x0d, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x21, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x20, 0x50, 0x4d, 0x4d, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x22, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x73, 0x2f, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x9a, 0x01, 0x0a, 0x0b, + 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1a, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x52, 0x92, 0x41, 0x34, 0x12, 0x0c, 0x47, 0x65, 0x74, 0x20, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0x24, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, + 0x20, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x50, 0x4d, 0x4d, 0x20, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x15, 0x3a, 0x01, 0x2a, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x12, 0xa1, 0x01, 0x0a, 0x0e, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1d, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, 0x92, 0x41, 0x2f, 0x12, + 0x0f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x1a, 0x1c, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x50, 0x4d, 0x4d, 0x20, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x20, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x18, 0x3a, 0x01, 0x2a, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0xaa, 0x01, 0x0a, + 0x10, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x12, 0x1f, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x57, 0x53, 0x49, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x57, 0x53, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x92, 0x41, 0x31, 0x12, 0x12, 0x41, 0x57, 0x53, 0x20, 0x69, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x1a, 0x1b, 0x43, + 0x68, 0x65, 0x63, 0x6b, 0x73, 0x20, 0x41, 0x57, 0x53, 0x20, 0x45, 0x43, 0x32, 0x20, 0x69, 0x6e, + 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x20, 0x49, 0x44, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x19, + 0x3a, 0x01, 0x2a, 0x22, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x41, 0x57, 0x53, 0x49, 0x6e, 0x73, 0x74, + 0x61, 0x6e, 0x63, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x42, 0x76, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, + 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x42, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x23, 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, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x53, 0x58, + 0x58, 0xaa, 0x02, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0xca, 0x02, 0x06, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0xe2, 0x02, 0x12, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5c, 0x47, 0x50, 0x42, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x06, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2055,44 +2081,45 @@ var file_serverpb_server_proto_depIdxs = []int32{ 24, // 4: server.DockerVersionInfo.timestamp:type_name -> google.protobuf.Timestamp 1, // 5: server.CheckUpdatesResponse.installed:type_name -> server.VersionInfo 9, // 6: server.CheckUpdatesResponse.latest:type_name -> server.DockerVersionInfo - 24, // 7: server.CheckUpdatesResponse.last_check:type_name -> google.protobuf.Timestamp - 25, // 8: server.MetricsResolutions.hr:type_name -> google.protobuf.Duration - 25, // 9: server.MetricsResolutions.mr:type_name -> google.protobuf.Duration - 25, // 10: server.MetricsResolutions.lr:type_name -> google.protobuf.Duration - 25, // 11: server.STTCheckIntervals.standard_interval:type_name -> google.protobuf.Duration - 25, // 12: server.STTCheckIntervals.rare_interval:type_name -> google.protobuf.Duration - 25, // 13: server.STTCheckIntervals.frequent_interval:type_name -> google.protobuf.Duration - 15, // 14: server.Settings.metrics_resolutions:type_name -> server.MetricsResolutions - 25, // 15: server.Settings.data_retention:type_name -> google.protobuf.Duration - 16, // 16: server.Settings.stt_check_intervals:type_name -> server.STTCheckIntervals - 17, // 17: server.GetSettingsResponse.settings:type_name -> server.Settings - 15, // 18: server.ChangeSettingsRequest.metrics_resolutions:type_name -> server.MetricsResolutions - 25, // 19: server.ChangeSettingsRequest.data_retention:type_name -> google.protobuf.Duration - 16, // 20: server.ChangeSettingsRequest.stt_check_intervals:type_name -> server.STTCheckIntervals - 17, // 21: server.ChangeSettingsResponse.settings:type_name -> server.Settings - 2, // 22: server.Server.Version:input_type -> server.VersionRequest - 4, // 23: server.Server.Readiness:input_type -> server.ReadinessRequest - 6, // 24: server.Server.LeaderHealthCheck:input_type -> server.LeaderHealthCheckRequest - 8, // 25: server.Server.CheckUpdates:input_type -> server.CheckUpdatesRequest - 11, // 26: server.Server.StartUpdate:input_type -> server.StartUpdateRequest - 13, // 27: server.Server.UpdateStatus:input_type -> server.UpdateStatusRequest - 18, // 28: server.Server.GetSettings:input_type -> server.GetSettingsRequest - 20, // 29: server.Server.ChangeSettings:input_type -> server.ChangeSettingsRequest - 22, // 30: server.Server.AWSInstanceCheck:input_type -> server.AWSInstanceCheckRequest - 3, // 31: server.Server.Version:output_type -> server.VersionResponse - 5, // 32: server.Server.Readiness:output_type -> server.ReadinessResponse - 7, // 33: server.Server.LeaderHealthCheck:output_type -> server.LeaderHealthCheckResponse - 10, // 34: server.Server.CheckUpdates:output_type -> server.CheckUpdatesResponse - 12, // 35: server.Server.StartUpdate:output_type -> server.StartUpdateResponse - 14, // 36: server.Server.UpdateStatus:output_type -> server.UpdateStatusResponse - 19, // 37: server.Server.GetSettings:output_type -> server.GetSettingsResponse - 21, // 38: server.Server.ChangeSettings:output_type -> server.ChangeSettingsResponse - 23, // 39: server.Server.AWSInstanceCheck:output_type -> server.AWSInstanceCheckResponse - 31, // [31:40] is the sub-list for method output_type - 22, // [22:31] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 9, // 7: server.CheckUpdatesResponse.available_versions:type_name -> server.DockerVersionInfo + 24, // 8: server.CheckUpdatesResponse.last_check:type_name -> google.protobuf.Timestamp + 25, // 9: server.MetricsResolutions.hr:type_name -> google.protobuf.Duration + 25, // 10: server.MetricsResolutions.mr:type_name -> google.protobuf.Duration + 25, // 11: server.MetricsResolutions.lr:type_name -> google.protobuf.Duration + 25, // 12: server.STTCheckIntervals.standard_interval:type_name -> google.protobuf.Duration + 25, // 13: server.STTCheckIntervals.rare_interval:type_name -> google.protobuf.Duration + 25, // 14: server.STTCheckIntervals.frequent_interval:type_name -> google.protobuf.Duration + 15, // 15: server.Settings.metrics_resolutions:type_name -> server.MetricsResolutions + 25, // 16: server.Settings.data_retention:type_name -> google.protobuf.Duration + 16, // 17: server.Settings.stt_check_intervals:type_name -> server.STTCheckIntervals + 17, // 18: server.GetSettingsResponse.settings:type_name -> server.Settings + 15, // 19: server.ChangeSettingsRequest.metrics_resolutions:type_name -> server.MetricsResolutions + 25, // 20: server.ChangeSettingsRequest.data_retention:type_name -> google.protobuf.Duration + 16, // 21: server.ChangeSettingsRequest.stt_check_intervals:type_name -> server.STTCheckIntervals + 17, // 22: server.ChangeSettingsResponse.settings:type_name -> server.Settings + 2, // 23: server.Server.Version:input_type -> server.VersionRequest + 4, // 24: server.Server.Readiness:input_type -> server.ReadinessRequest + 6, // 25: server.Server.LeaderHealthCheck:input_type -> server.LeaderHealthCheckRequest + 8, // 26: server.Server.CheckUpdates:input_type -> server.CheckUpdatesRequest + 11, // 27: server.Server.StartUpdate:input_type -> server.StartUpdateRequest + 13, // 28: server.Server.UpdateStatus:input_type -> server.UpdateStatusRequest + 18, // 29: server.Server.GetSettings:input_type -> server.GetSettingsRequest + 20, // 30: server.Server.ChangeSettings:input_type -> server.ChangeSettingsRequest + 22, // 31: server.Server.AWSInstanceCheck:input_type -> server.AWSInstanceCheckRequest + 3, // 32: server.Server.Version:output_type -> server.VersionResponse + 5, // 33: server.Server.Readiness:output_type -> server.ReadinessResponse + 7, // 34: server.Server.LeaderHealthCheck:output_type -> server.LeaderHealthCheckResponse + 10, // 35: server.Server.CheckUpdates:output_type -> server.CheckUpdatesResponse + 12, // 36: server.Server.StartUpdate:output_type -> server.StartUpdateResponse + 14, // 37: server.Server.UpdateStatus:output_type -> server.UpdateStatusResponse + 19, // 38: server.Server.GetSettings:output_type -> server.GetSettingsResponse + 21, // 39: server.Server.ChangeSettings:output_type -> server.ChangeSettingsResponse + 23, // 40: server.Server.AWSInstanceCheck:output_type -> server.AWSInstanceCheckResponse + 32, // [32:41] is the sub-list for method output_type + 23, // [23:32] is the sub-list for method input_type + 23, // [23:23] is the sub-list for extension type_name + 23, // [23:23] is the sub-list for extension extendee + 0, // [0:23] is the sub-list for field type_name } func init() { file_serverpb_server_proto_init() } diff --git a/api/serverpb/server.pb.validate.go b/api/serverpb/server.pb.validate.go index 7b80039780..71dee5335a 100644 --- a/api/serverpb/server.pb.validate.go +++ b/api/serverpb/server.pb.validate.go @@ -998,6 +998,10 @@ func (m *DockerVersionInfo) validate(all bool) error { } } + // no validation rules for ReleaseNotesUrl + + // no validation rules for ReleaseNotesText + if len(errors) > 0 { return DockerVersionInfoMultiError(errors) } @@ -1160,7 +1164,39 @@ func (m *CheckUpdatesResponse) validate(all bool) error { // no validation rules for UpdateAvailable - // no validation rules for LatestNewsUrl + for idx, item := range m.GetAvailableVersions() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, CheckUpdatesResponseValidationError{ + field: fmt.Sprintf("AvailableVersions[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, CheckUpdatesResponseValidationError{ + field: fmt.Sprintf("AvailableVersions[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return CheckUpdatesResponseValidationError{ + field: fmt.Sprintf("AvailableVersions[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } if all { switch v := interface{}(m.GetLastCheck()).(type) { diff --git a/api/serverpb/server.proto b/api/serverpb/server.proto index 284d2ed481..7aa21d2ada 100644 --- a/api/serverpb/server.proto +++ b/api/serverpb/server.proto @@ -73,17 +73,21 @@ message DockerVersionInfo { string tag = 2; // Release date. google.protobuf.Timestamp timestamp = 3; + // Release notes URL for the version release (if available). + string release_notes_url = 4; + // Release notes text for the version release (if available). + string release_notes_text = 5; } message CheckUpdatesResponse { // Currently installed PMM Server version. VersionInfo installed = 1; - // Latest available PMM Server version. + // Latest available PMM Server version that can be upgraded to. DockerVersionInfo latest = 2; // True if there is a PMM Server update available. bool update_available = 3; - // Latest available PMM Server release announcement URL. - string latest_news_url = 4; + // List of all available PMM versions between the installed version and the newest released versioned. + repeated DockerVersionInfo available_versions = 4; // Last check time. google.protobuf.Timestamp last_check = 5; } diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 054efed28a..4f886589d8 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -3575,6 +3575,16 @@ "type": "string", "format": "date-time", "x-order": 2 + }, + "release_notes_url": { + "description": "Release notes URL for the version release (if available).", + "type": "string", + "x-order": 3 + }, + "release_notes_text": { + "description": "Release notes text for the version release (if available).", + "type": "string", + "x-order": 4 } }, "x-order": 1 @@ -3584,9 +3594,40 @@ "type": "boolean", "x-order": 2 }, - "latest_news_url": { - "description": "Latest available PMM Server release announcement URL.", - "type": "string", + "available_versions": { + "description": "List of all available PMM versions between the installed version and the newest released versioned.", + "type": "array", + "items": { + "type": "object", + "properties": { + "version": { + "description": "PMM Version.", + "type": "string", + "x-order": 0 + }, + "tag": { + "description": "Docker image tag.", + "type": "string", + "x-order": 1 + }, + "timestamp": { + "description": "Release date.", + "type": "string", + "format": "date-time", + "x-order": 2 + }, + "release_notes_url": { + "description": "Release notes URL for the version release (if available).", + "type": "string", + "x-order": 3 + }, + "release_notes_text": { + "description": "Release notes text for the version release (if available).", + "type": "string", + "x-order": 4 + } + } + }, "x-order": 3 }, "last_check": { diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index dd3b3b8091..f5d06fd0d1 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -731,6 +731,16 @@ "type": "string", "format": "date-time", "x-order": 2 + }, + "release_notes_url": { + "description": "Release notes URL for the version release (if available).", + "type": "string", + "x-order": 3 + }, + "release_notes_text": { + "description": "Release notes text for the version release (if available).", + "type": "string", + "x-order": 4 } }, "x-order": 1 @@ -740,9 +750,40 @@ "type": "boolean", "x-order": 2 }, - "latest_news_url": { - "description": "Latest available PMM Server release announcement URL.", - "type": "string", + "available_versions": { + "description": "List of all available PMM versions between the installed version and the newest released versioned.", + "type": "array", + "items": { + "type": "object", + "properties": { + "version": { + "description": "PMM Version.", + "type": "string", + "x-order": 0 + }, + "tag": { + "description": "Docker image tag.", + "type": "string", + "x-order": 1 + }, + "timestamp": { + "description": "Release date.", + "type": "string", + "format": "date-time", + "x-order": 2 + }, + "release_notes_url": { + "description": "Release notes URL for the version release (if available).", + "type": "string", + "x-order": 3 + }, + "release_notes_text": { + "description": "Release notes text for the version release (if available).", + "type": "string", + "x-order": 4 + } + } + }, "x-order": 3 }, "last_check": { diff --git a/descriptor.bin b/descriptor.bin index 052c2284800704ed65022b356ca2d98b62cc4382..62d4eb199ad2fb47cf90efbd23735780223f9fc8 100644 GIT binary patch delta 45633 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 Q6C)Q!PR)Iq^~-(#08=^?)&Kwi delta 43445 zcmZ9Vd7Kr+)%S0A*X?_6-vNd@tiv`eA|f*)jIxM|xG%WGXcix1G$DzJQKLS-N!~me zMBESwB2okq6c7*<0TB?{MFkNN2qFRsiiisW?hESsJ+<8SdH>+U{Ho45b^27DUsYFE z_gy&k=uLMYJ#>C>>96jXd1bJ0=9S_8|55jUkWKWJ&*fX+-;nLT@cXyI8^ZikDycaC zy5A1b7km_6weXF%!x4dgXncN9@>!fT9{jh9FFNnHQnhvAf8Gs$8k(wbNxblxec`tj z1rryZ_EESa)U{osLBX7ba}I>p+nR+>eiF`Tlv|ulia$B+V$;CW%cD}LFN?E-D!z%5 z%G3XP(~ujkz498V>#}fk6x|)@KkN<%sS(+vxqkTSsD=LdN8vB-Ummqyczhf!5A^7- zsQorfTIxfsqLvFM=cA5+9+Zy;ExaI!ez>yu*lSUeD`hj8T^0JG1^H(B`Z>9dx_gs+ zBYpS}g{qdll0p*Zi=`;Z^h)|BVK!4zjWX@^tJg$*8yaOBC&ff%GhwC_H4a-R6-ib= zAgGx~A*f|5CrDM3u+mip1{FO*uu0=4P7qL877P)r3==09N?oHSNrP=WDn(7ptwl&S z4VyU02+5|UDrZua2xbdcr4THIO+7-e)U3G^%$B06u%)ZYB3KocJVLOlc?%=hkO|{b z)GTb}>S83Dg;gFQ*{nrNXEIlcnwJH02sSSZ<`8UN7R;BT7GXzcBadKacr*tE)h=I_%;RlGR5Z#u(1FJ7#+7>DNX58h6ZB zCMPCJnSt6__x$gupYAX>7x(BK=Eag!V5oD!j0Zsss?LmuzD9|vBf@t2;Wwi?{i{Z~ z_~?KUazt5GhVc;vGYU`*P(7ke+vIek8tULr@e#UaX4IzMHY8)_$gsIyb_uP^*vrOLS)U+AwzVGQMkbCV`NTM5L-&(#5pJ_&!E=yeXzH=!llKC`6qM9)nbY+CzeMjfJ}%$Hgej1G?qkB#lfN<5$C(0Qs*j5k z2vdEC(`7gi$hGv-H4CD?`qmqxBf9r1D@la<73?)5hEl&)t&`41i7q=?Z@eRFqxat! zCEZUB8yPo)P|Tg&*w6^JB{U~PBXX&MfK%jByLLaN+=ztc6nBwGhzJ+i)5sH=Q}thN zih6ZFwJa||Ikn*JOHfY5{w2gDEU7ayztQV&iY{q^ ziv|cAXA_N6Xw$fVu0*4s>3A@4Jh!YVAvxEDggP|OB_wAVO+qqQ-@70h=rlt#2fHB< z8pDHghT>>NLNOSMJKAUhF3?y0SGKc$@MeN}fg5K?(cA@YoPk7+an{Eu5uA(k#+##l zJuWIYBEh*R*T!^37)o$1YTqF_$H?Q&#bI~-Z9_D0kc{at%wpnV%g=&DplDMGgr$p1 zM>tDaEM45~DAV_$q{1&u-@6NqrN9jUYSH|K8vr0Qe?bRHhlU}1dYN=+kDmNZdzY01 zE982a>sIQ}y37rmFoaw$HyMIf9<9sETEeuKyTL;pT9-3;x|+5MrRWNM?}t%)=Vbve zuP9%wFz*#bJB-4xfaVn~TPNomO_=v8{pWn)9DTvxqPY82X=jUnG<3HR<33)7&-AaS)odo%d!ugpPygU5Zz%gJBkzWsSv80lN;foWoD48Zbm2{U z*WRe!^l22vSh=aJDI@PD*FDssc~k3ZlP!^qyqopFX6hKHDWmV^vZFHkZZ6p5L>A4P zOU+z-7=3@$w>(08E}WTH^^qBZe=V!Z5d3TT8f6InwOI>yjSRuR6Q$0&!(I7~dguQ{ zje7mPtSBS!?*%(2L}mp3y{dU~C@>ew5d3G@z51P?=BIk&zNmv9@XzSE<0NgPFv0bI zhB=d(Ak6$TZ>Djnqy2v}jrTBCiX}BP5Mnt}|EeL1Ylj9fOCw{1bpmxzi-VCsxJ9PU zD6A-{Vfx;NsDItCfbd!w77S`w0J}Jd%CMk)O>(YLX;f0f1AQo)J5tvSjgA;FJRsMs zWTULqK`jnqXLta&IEbC$LAUN^j)=m>B{f3dGBoO1HzI&jtPCp)H6nmi97JVA06!dS znr>23BLkM(xo&#b=t%XB!X~shG9c7ep5+D*c5x8(kpby$J+CaOQM&$?XmH)A^kOSf z85QJeoJu7sqk_&yBuAJQo0in*KvzB-)#wekL~-5dw5_Hnjt<}?+g4K)M+faXBu5&> zQb~;ogq1qsWhoX^4pRxuF#()pHCfsM@$v$rSyfVF^~Mp=xs1RnE^ln=YZZ!P0|vfT ztU_^Y05SazVp64ee2`hC``#K2sT?2VTP7!APC-p-LLl69oW6car0OZb=mdWqK#WcZ z7}#PIh|viF**nOnQ#mmZk~$Ghrbv*BHqcbUQ&tn6q86e$+h{UNPa*;fqSN$-;e>9I zzYZ7`#Yq7)Wffs2AUq{24khRz6sJPy0GfO#Z4#;i!c|rit^z_<#~V#mQd0tb?Sbf6 zG+APS%FaSj!186nQ9v$JMwWu4)U-fYst1}(kRX>1Ks2WX5S48cq5{HHvSL-tk!pG% zRMi(vXbM!;gr|V6zoN(khrr&9q6|8-SgeK5Kz!&h%LeM02LkTE#r6W=Yo8 z(PN zaMns8kc;Y8rd|qLtxSiau+>VTjz2;j*;4#`klCl_-W^?C`FxOXWvC-7)bZkvse=+O z;6;A{K#acVa|(#j7d>@kCCS%1>Hwg*Hq{jBSQ|L%pcc)wo;tFuanw3X9rXY-*ZB(p zqPfm<2N2D5o;$LF)?4n-lkOpC>(eHMI@WvYK+=dp9sTIqYzTF1&>QcGPN>_Est9Ln zNUu*gV}s|6toXIjaz9VG*{`SC~wt3pf3TVx#XEZCy;0xV zcRaaJh{`)b-ZBLcm3M?GWZusTQ@m^DeMXZI#k*<82vNM7js+o#cO`j$WfUQb_kyr% z^@aM1FxNq^850etqrg&HHWadWFUZ>k4iM${WP$SsGCwZG9|oCG`o8<3-&cO+8qy5DC85TpBj=Estv2VCX@&^(Z8O6DK%nNKa62YlwolKF>R<^#|? zP`^y+7(#_j#%! zng4lueUkZ~`^=BUuP@zd0br2JTOgWW`pgHS`K4bi#IjoW+O8J#oN-KhU#FKR3IDb4 zWF%4i+9!N03IDB2cmQU;^$8C|^IMy{0I~LiPkSKNe(-4z#M%!&?PE#%+d|n)=%CLZPygH&x`+nD$r25^VTdz}#=H1emB5LBn>b*ArP3^A;h^7wR@*Rk#4&CxSC+OdL^wg-s@%)YAztbiq5&s>! z)jPE!8j^@|&!3Y-d>{;4=*JUvoPK2@V+3eBoJv$5NUu{8@&UO{nVWLr--9}MkTLRL z>ZWAkgV3Pq2V_urFm&tooMhr;edUAE$#s)c70JQLzORr$Wpc=ZU2c|hl7kP2vbWHi zn6R$^D*Gon_;AS1f{X!b(R?^$Ye8;la*~5n_0UJ64t@C>#i^;H~Atrujp?!0etIwIlqu9qr67P|a9R}OBB;F$-TMV+vm6ODq5$Z-w6uYC7p`01% zUhYD(%a_o+`Un#+Ca=Oy)5y3_}txzhI^5Y3f7^?_)v^r@d0^qi#r z5j~$v8HrPx{_KngiRB4Mg|(^b#fOpZ8gx7uQ~ttgl5;X5kl8 zKPC5H^tn$hiZA-y&r9yFmE7-F&)+DnO%;U!)_Mk@7R9xm0rJ8C>l_0B&|H`LDh#mB zGXS+{uJa6#7Y0}_3~)rR^{I;V_4@SkB=^_*+|SGWyW#)Kef`5Dj895^fF$)d_|!)Q z3mbgu=Oy(w+SDgP>?VTTv;;(RqtAUHnj0neFEYc9+~2I9oE}|VyV+-b-b}iiebxg} z+3d4EFO%*T$@=5#x1_B|zHjmQjtnYWB;SSc^D^mf4Z}{=bu}03%ckdhoM32ya$Kdt zvJDU;Tf=-iUyG5gVNFLv8hJ_kZDDwnp8FIJs!pCse1LXOib_^3Mw86n9fmd4#hRKwU-#RZo38%t-|Re-4=Zt= zI^RRW1G_zgP>Y@2oAF?p&`DhgP276O-)BcX<5QNcvM|}7{a7dvP zzZYiih=S^?YxKu`qLzB-qtP!b-}7sSf>6i%DRroNN^tFc?-~&E@B85g#Qgi7KnjxS zA36d7p!s2{DFpJNClG4U{Lm9fK?r2OBM<zkB4yBhTdB)Z?D3_UP|wm$pNNLn ze(8reRcLv=94H4n+H~pBD?lBg6Fdi=!Gw z0MEwMu*j{vfhZ1(+{zn>;;@JTCil$+p^xE_+5ARR=wmp~L`)I_(HtJR)ie;z;gMTS z7i7(Tdt_GA{QqsuEtMER~}R!n4QkBrh~vHsynM$1U=9rd&^GIFb8AZ?6{+^RT{Avj8RSP-4W zX&UrKrFt^1M@4Q;j39cWBDW?^WL%HdqZdS{*Yh{w7|pXMb5TGPM@Mc+3`B8sY(%D^5IxivAhMwWpskD3XHJPi2r+~}OTv8jp-?6K+9$-o{fS10Q| zjsTU^xX7;e>gI8I<5DkWV2_L3dJjny$3Vobe{%^Oo=mH8USc> zrcVPPnlpVG0MVQ&X)sLEpje6@k232?gPTkmbdUw&<&}>|`6EpR6eR;@|0n}`Q-Wu+ zy=Oq|&-Q}^i2d0<1&T6U=ST{iRy!wEkaI?z2ciqMWWKb3*0T$UoiKbBdqSRl>fJJ^(Qj6vyKProo0gLUZL{qqZajGeau-K1E zYSCOQqf(NtD2cGdCLKK?3&SO;rewkrpLNutxx{B(Q8HnfWZn5RDT%Pm=N=HnWj^Me^nv|`W6={=_3M(Ran?)^}Ds9%QreA@0x$XGp%%@T zeDV}!arm-Lp5p+x`La(QAet}x1jvb1?6xl>V!UyU-KNBX*Fqbn+3jq+6{Whx|P zHvKqdD8Zji-X9=VH~C=&#OfxWG8Hn?|6^v2-u#W?e^NzBod5X5p%%se_{6D@#Cgq3 z8{?KjSg-kBq5`$oeDVNMdrgw3hW@P(^m?R!Si{My3s7u$J#9~N=k>_l@FQtNIcL_v zD3UvGL}A~eibH-_K1p{tg4VS`aoa3 zJgTkzAPul2&<9b@-Z&sbD<4GMIMf*x66hoS-14Yr?MJDKWX?yCI}T7`GUua+-E!Fh zs*ue2Sl6uJxWvb)isa14k$dEd46S?|@z_LWj|$0|gDwF8MDt*JNs>ATeF9L6=0TqT z6_Pri*aXnuuV5no#E*ZfQ2fM?e;|sV$oQ9s4;7L*pXp;)Mt$o(^JGFHDxXE};R6tr z&mtZ^oKMO$D#c$#nSbf8Rz`y>zY@lg&4)&kG2i?sWAvz1QOqGAH*%=Q<~KfJfY|&- z5=I`WHImVNII`z5d({KEcCa0FKvT`JOxZ#LqI)>vT&D18BgvWXBi;SE=z_ZMeWWQx z=X;+pKy<$MvrQvGLzP)&=}E)mxNazqznyhSn4!uovXC^QOf~~eVrHYap!<1V{HZr*}OmT%WOEr?*7_Rg&*X0NFwO1jt&G1xPQe?Ptn}Ueb>~KYb z%W;%Ok|MV&J^8x)Al?4?DCv27swnAkyK?JLBvHIwu@04k1C3;|xl?h+8{80g)CXVT zAPi+#qtGTN5CeBAw-y3o;7-MTugs8*Bw0r2InR@lBhoe{Sw<+AU&x>`LXlrG@*Bx) zGg4Q+z{nrTK?WCANtThyjeKNK8L8aJZzRbwO4-{70FfD$HYPbUO1awyYSA2}xPACD zqp@)*9-}f(>e?5hYbwVm?)zmlHkQ#iR;7#ndP*=l)*A(4bgb_zAV$YZXUR#H#xi!s zDZ3XAKyzHGDT8sGk2kewj+1!HNtVVk7{@cPWG@_m=6D|hAe!TqTlfRf94}og9Nt*a z1pWP*s8j8Pv@scs6O?0bWJE~8-p3df2IE9Mcx`lS&xxsu48w`4aHNTQV>1jVs_sXd zVc1wanxr`K+4C>C{$?OjWXtUM2ckbo73@hYAWcqE9P^YVbz>Qb4=KHIX>>|ofI)5` z0nvQO4wsfrBPbbpKZ0`)U|>m{GQKy17u>1&P^RZ7g)>$#gaR`(tjlLtR}wUgejmm6=CW%RkY`~nwlWKrmBzf!bZ18t+RycRu%Si zm7Jh#5bRBHI09I-qqeCT#9LLHqrEhywyL^goGAwJ>niN!Dmia2&|Au4>2+1~p^>ru zx@ueNg|YOy>Uk`d8l?Xa-jtS33h%%g@ar>IV=Ia zB_ZiIRMC$UA?Y_7ROb`DG^XBA15a_+2TN~P;Q&{e#}v?;lHJJds%Rf0HZ`}c+f_{; zFN~$_s{aYj612S|bxKYY0G*`TN=Je$?{}pmL6-NsRL@?{63<9>tMDXesWFy--jX~j-K~lo5IWD~xjZx3tvdGg z(wN$QJ)4NxdFEH2}F3G zU!(!CzE2iulKMaf+CJ6dgrsT0&;UM}=k+p*TK4BsLRD3YKUA6T9P`O}=noaQD~(~k zs(hvtf26|0Dl*2v0U7;~%F7!|)Qe;Lm9l9F;KoGRUoP#D_)4B)dqC&|A11qlR@YL?ZbK?x(8HK`#>Cs?g7P4jrACG zP$|3Ys|tnOfR=HAs2)^RHiLmi_=v7fl|DYCRD&IeRdUozu=i1>3{G}RTp`ZU#r zuRc@CJ_M{Xt4N^lE+MGTRNLcSv$Bf(O!bpdA^pR!`CO^vT%`~akbBDpMisT_ey&UZx?d~q^lhXdm2Z^l;S39l0Db=mi+q#zkFdx$>ZqfgDlGD?QkK`N%n1vi&k13T zZ&mfN&agab{Z`fYK0awh+BPf2w`4Q7XMNQ*ZuxRyKHNQ+AZ098*`7>Oj7h# zy?aMA@Pb=8fNE?}h|H~7cM}f8^sQM(89@5})~urpftE6E%|aQnQ`$^Y>^6P<&gl4t z+ft*Fw6|pocIAu=MsLfqau$|pUW)I`X70|~^;L5u@657uA^~hJF5Z<5?f3wZXF$uP zKvL(fY|*|<0Yvq#Y{`;JbGyE}D{EG9Vv5=kS+^Mo)V)I_^S% zZG$Q#@6EbR7$9xjn`IM5$QVdu@6EOwWXM>cjqJVI_NSPgh!%1I_hs#SM;E@u9_4*m zcjHKvsdGCJKuq74(fi}KCWOdfv zYXPyUv)mHOzCo)}HlC7Y!UeJO5T_ySvkU0H`u`E&xDGPnQ75 zeO4=(6lP}iu1}&~#{+O`CTF}|vto5-HfOn-S~O>7xm!5RXo6;C+5I^sRwtg`DwG8< z*airQsabvi0x>l!Te3V4G|KS2+|{;{W%%QSTJN6COC0CF%^oArTaqc_aUW`AQGHxO zEqfxZ#N*lembasG8)m1D%hWJC>z>>pgUW0>+C$a46wl3Oo^pNO8p*j?Zil7MTT2hk z%eos45Pc4`sR=}OUbcxHl|Zb{%komZjHK#PL;Q3$v&fmPM)c`y-f~^Fm|c){t5y&` z1MS!cBD=t|3J|jkJgWfd`URd<1lq1&Agm%jS4$@?%!WtUH6swG!FK2XO?97fCTay)8PJGM8S6i{TN{0Vw7q0SGPa&38`GF6_(kegjfn5D6Kkxa+m~!0N2qa;26AR?8rk%mUKD>TIhMO=bzS4Xn<# z9$-kjtt7|`^j-PQ({7hgMiUg;9t6_F3%&<|H1UG(K_E@M;CoP@ZQ=z#FSHf;HM;HI z==j<-sZq(8HK|d_m^ETlc23($#=N8(_Of&Ok{|XIqViJKJ?aLc@>144>TWAOzpUTd z%R$qZQx(aSmwl!ngUZX2DY7BZR+fmbWX(ZS-S8f)@=EHSte{@Wx-DfSQG6xq&Y8BA zJHA)5@(yeJz5rT&HPw^_)T`-*$pY%ttUGAhR)V!D`@avG4xkhh6#Ib7I%-qa?Oale ziA`A!ntmbMCv9bq_%)cR`aSnDYa9Ki>vIG3ntjpzbyV0R1&CqgwJdM4+Myszs@Jk` zQV(NtbJG-(4*jCQ1?aJzvvFeYza%Oy28faNe?aI1Ga@3-^ zD_h;x&~{rnw)VCj{b6)e-P>u~a$fCiPuIwx@^+S8NI9h5R!*w!$(lpznx|b!!=Cgy zW#ep5IuzxA+MX=u(}k(pamXy2`Oq;{J0#!p?AlIvWgi4+x)H>n1={->AhP?iO)dWc zvAR$APtI$#Gxrc5Wc5W)pT+A?DyfJ+Nq}gGyV|5^!!(zwkHNxt{V{?E>zj_dg9-b-+w-1lq zDhNpwhsSWcJgBY_ZofU&&)=Ev)JFz51(>=$byx`g_PAhIJJh0md(7RNoS3aKkN))K zhoY0}?o3sL+3$=C-JRp+VP9N(jG0Vo%)`FeOeXaJ8XJ*nnrD8on@y;tu@Nz|iBNHk zdFB_J)jgVWUpz8)%X=Vgj*J}@1JN8AJ1VX*kN#py#Q@qIm4-)1d{peHm|8SP#g2+= z^Q@vqP9IN>dFwU* zZ}ZrY0@Nq-2APYVJXx3=ySJgK#evB&Z$r!7Lrush4jzu}Gcf?e684{(cC~EjO-++WK5;NLcC%5(QanA*%#7`Ac}FCt$8O!+ zQFw1g9NMii5bgl&eK-)=8F9((%mA@EBQ{%Qq3Xmf#H={;gfrU-(OI!0=uTqxvDn>0 zfQS#!k_!;o$2_?JG5c8THYR}Z-D9!am=I|B?y=b2LUa;hdp!2H5I~#;+ermzs@
v($#yS6E6i2goQo`KnyO7-7Pc_g9~GK3k@U)3uAW+ zEzkyGVeIZCx=0Y7iPJj?{mR!-{L^Pr`x1s{Vs|5fIQE~BzdB0wVv~C)bi()auF2Uo&?g!v%V*RH1e$PNg$0p>w8k5ZRA<$ zN!tkWOPPgWp?sbBHc5RKb1P1vZ$fS?mZnX}Ote&*kQ<9GG7~MgGf`gv&Mo&j0Yr1T zpNW8IE|;0;Pev2jmGS?6ncQS^7jp=JDm$S8F|*RA77#NlWnL1p?;`WkbB^o*205|^ zqWPRBdmx(6d9v>!bJFvU>;bs*eA=c=P0xF>rxwlUJ=u4Wu)e65ABOB-OjTq~deM_T zGN`=h$-axsNoy_H4+0RiwVrfv{uMoZeY8}6tzyz_%1r4c3s*> zGB>UB^C2>*tdse$gHd5_TCczUF6vmfK2?#qX?@zQGB>S{xvi2nOuES2v?10959Zsr zK9LD&L#izk(uUaGQ6Y}@hL}4lq4+K`A8oXg1H(z?qm8Mi%tssjb71L)1oX_#a}+U&WRS~NEcH_Ljei%dvcV!iuk*<?20q*II~?5-Q^jztC-#GX8{mB0knw?M0U3y0YJ>|_S^wvkni@~A<%Ni zZa)ij73z7rJPQDE8f<3)ps9AV01)eM`&r<~Qv7b5dC&QLB$DsOydxpAz>(tfULOh& zR)IDYKxFs&Pyn%7xmRK#vp}~}{9&BAUDt)Gd*z3I7U(7x_q$mDKoIu(AOJDA-_HU- z4DR={0FWT;_p^XN8-)FS7U(8HIPjxc;8IFx;6U1d#NmLS2B@Wh1AZC+(!c>f4G6Ri z9FS>1?(w_HG;k=^*F~!Dg@;nB((WPOcL-tikncMnRuB2U6KJg-lD@N6k^eN-Ut+cH z)6}X^{imr_q54lf)prxB|J>bl0JzG}eX0P_{M=JL5Y5m1O-DDGv%a)99rXZ%9J>S2 z{L&{G5X~<=yLS_I|Jt&%R6Yd8$zS+LJpF#jicNcN22|){#4aCcjOc6>|U9 zlRLF&e(TA-o5b!rS;_atSGn!@E>#qY|ISl9wJ3h)DZZOf{12Am^*>`35BR}T7ggB# z!81G%J3n}a2V&<3VR&KBZo=@l=oPU#rS2Bqx;E-Vvo;2k$BXV|0dlZs)<{X(FCHZz&&XE}icYrp7fymyKb7Tg@>RmZUX5AsPk-5yj zoZ0S(j?B5`VRtcmPtGlAL4*`&;{!zYo}9a124eP}oLkZY>C}62Zb>W9Cd55Cx1{YZ z`7|o$m$X2f23s-%nrcU8K&+3-xh3tDSE z`pg}bBfKq)3D_OTH#!M=94+Me*;AG$(-B2=^<=3H)r>60JJ$bZByuMZqDuBP>bf=9Q!wN zaKDEvS)bAsP1J>TPo*ldR(&ex-aAAFm8WvNcW5t@wd&KBbQ^k@wd&KJbb)9-?MWAi z=F>vDvJk8-#fx&8#f~s)kzAC^+jA(jlHSkcLc6aD;^KjphJeUEldG;by#U1OGr2x} zlLj$cSBjV9GRvLWIz*S`@;%I=s!q%<_1p;}GC(^HfXFWOLkWo4r9KaVjHRVM4+Yvh zTAE({uY!3**Ox4n&*%}`f=KhQxtnRL7Cy-rjm1=&mkP(Hp9}%I6^}Zj0G_l_IBakN6 z`+gK?n^-UXXq!NOgRZDj{cAU*MrBR7AvG!ly1^4@Pa)8aLZG$!p(+*EZuGfB4SE|r zivrQx=vlOZ7pe7SE!{pt8lY zXis6$t&T+jG`2O>6c*i@UY)S$R?nh6C1TtDH;Xo^qrk^o_;Z`*Poz=aCj2R%q3J2h z!RmEP$1gdJ%{!b4&CWF)NHs@gg#}KLxJe;^c)IAf2VNh z)uwegbeBG+h5A$7uCz%Z&s{n9L5iM+Ja>88?J4B>wxwNtpapB~w>|4ph2q_P9pQBy?V`87DULczLJoN(6+~=wH*i!sqF0g`pE59BhRIJ3PFJs=A^`-cmT;>5it2N8k zZ~U^gUMwDV)C(X8hkX!$7(DE$7l^&Xo_c`<;jpJ(fi?(-J@wWL?S20v>b-;#8u&hK zK;rPd=U!@Q;Cs)#KpObobFV<#!1uzv{prGb;ohP8P_-IRJCrZtm}!nej1JAaI}RX5 zhvr#XS{2YR{mV9LK;5uZMYwcWsv=xEOjKksS}$BWJa0craIg*eH=NJ-xVD5$hv(gr z6iF0^=iQRDUdZ(Jy!|Kvz@W0Gu<7l2cN0e~nz!fOL%n)o(>wLQ+N#>RJ5w)(P4CRR zCwa)Aa%Y}}k}SIGg-u7~^{);^ed+-;HX_v&HXV_75A>)-b41=f(5n|V9htWe^Z;m% zOf`i{N9Nr+m|8SP=2-^|mDUTDj>;PqFNid=YvN=N10a+F%MN99?L%5t(^ zsC0DRE++w8^60!j>)^_B(-Rc zktmr*a`i%{V-zf>lGbT_qy?^iV*1dyn70V z3@YRE>?q0-v|b2wLf+i>HvqV_33+$l4@7f9-re^D(VUQXOVHy=@q_uy@x%GdG-vjBL?6z(CFt>Dc1qse zzJrJ+&?XZQ*(p9VfS8>knISVLkfAdr?{41(+6r?aY_PtLjo}SOlbUyb%a(dn^LHmf$GkhpOSOr?EKxAk5P_zJJc80`4ekP`G zDSkYkS*zD~RDCNS&*yuZC1_ue>7ib%plZOZ8 zt1f+o2j|g+`ue&2Ov)9VReS-^b|IA*pXa*}i1B&83xOD)=etm#H9k+e&>Ba6zMkJ% zol`eIH7blbKQ$_hIo~s8Ut!DzmNDxATLMMTln*ZyxXv#7VQ`E zEVzXX`wD-qabyUfpVoLX1fsddlOYhzHJ%LnmEv{z%zDQF{g7Oj&&z9VO7)X`eK{YV zX^04fRiHf+0YvuYe8)k)7OOAkPd~#h3j3Gh4f)I_XSP408}j+y#%zBv`>H2H5SIzG z;RPc5st*znv#SEkXTHws3yy*f z-;n6a4fy~uxx=v`fGF(nQ2=6bhi5||26uQi1QLZEo(%=sDD3cTI6&y=%^$JhC6v&> zn`r|Qh&MeOQcDAGdNu^oz?+^81=Pn-ETX+jHUo z;lw?T69H)M@niwSxjmi}foSgWoH#%@aj)e>J+KGNwl`H2O5E!y5lIyH3MI<&Y=BVW zKF2akd%!aLJj+mp;y%wZKos{0%Sgr!5K8MRao{WKLe&oq`fDq%yj*J1c`ElB&FyqIbjHyNQV^78dgc%Py zG6tY|Fx3=ZJm|@oS~L#|84ITl5MKNwum4)7y3~D=_NFl6C!R|YLgy1%`3jc~5Jvng zuV1QDHFck*I>LjWr6WLi@H5Y%1B3^^_z{azfR|sS+QNljcowA=?Jqow4v;0~SB^yi z#PloAqChmi@+=BO^DEDyCzj%G^O^4)b)1OgxB0w%kMl&y^TYY@Y{QcvtOD(kG$68v z^PTMLW%xvqKARNeSXIfi_Km$PO*I`!gVB zhZfwD63EyYT5wBBfi@F|7Tl8ZB*UV&6x@;$h|@sJqCl+QQgBO3Al7dwxFzMurFeKD zbG!5TWF&_d^2ZtGKUsXft>8id!Ya^)0*LHw1s94IV9efDAQoL=(SfCSL?JU-*Bq;k zs2ovX8%IcVpjaGPFiXly00d#A4+0Q_BMWXx3B=yWf?HAo3Bt&NTT%+NK^R$JNhu!! z87OQvN*@@Y+G1Mhb5v?tA~34pCSz(bJ*vR>1Z2q$#Pp~_^Zw>V34zx1s6vZ=W@rx- z`W&r)-b;0?9i1AL21gg%V@_l+I=a9&og^Cu3L2xQqf$2}Rgop)m{djRaEz$Pa&4f{ z;n;$?`RffJ+G7ju<`0PG*n+$H1EM*$;BNi~3LTEq7xY%$YRBG*KC!st5&+PgR5h$BW8QMgQ%qGiK&Xv-Nb@BYKjc4Of0ap7or^~bT^41!e>Al0Ju4cPhYxA z61tmIaQBJSqB*JH?h{YphOUsA>PGS@NIqQP^)y);og(9IN`arulnw`B6=**K0z`I7 zp|Sl60T8QG3Vb`mJgOK}iXSOtW;(Nj5PhV;p&2ndNX$<6Ne!YKfHtXt$WHf34aDqp zpVUA?Guf%fX>6?pAYW}wp~x#lwrTL7x*qY&7|xC=@P4mnMFpi zk6zJ7#mCE9W>Kmv$-5|3mgHR|%0D%&lDvxxVYBKp^!5LhKTbc?SGDa$fgKE|nfzT` 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 diff --git a/managed/services/server/server.go b/managed/services/server/server.go index fecbe93660..1d620b3c89 100644 --- a/managed/services/server/server.go +++ b/managed/services/server/server.go @@ -262,20 +262,9 @@ func (s *Server) CheckUpdates(ctx context.Context, req *serverpb.CheckUpdatesReq return nil, status.Error(codes.Unavailable, "failed to check for updates") } - res := &serverpb.CheckUpdatesResponse{ - Installed: &serverpb.VersionInfo{ - Version: v.Installed.Version, - FullVersion: v.Installed.FullVersion, - Timestamp: timestamppb.New(*v.Installed.BuildTime), - }, - Latest: &serverpb.DockerVersionInfo{ - Version: v.Latest.Version.String(), - Tag: v.Latest.DockerImage, - }, - UpdateAvailable: v.Latest.DockerImage != "", - LatestNewsUrl: v.LatestNewsURL, - } + res := convertResponseToProto(v) + s.l.Infof("%+v", res.AvailableVersions) if updatesDisabled { res.UpdateAvailable = false } @@ -295,6 +284,36 @@ func (s *Server) CheckUpdates(ctx context.Context, req *serverpb.CheckUpdatesReq return res, nil } +func convertResponseToProto(v *version.UpdateCheckResult) *serverpb.CheckUpdatesResponse { + newerVersions := make([]*serverpb.DockerVersionInfo, 0, len(v.NewerVersions)) + for _, nv := range v.NewerVersions { + newerVersions = append(newerVersions, &serverpb.DockerVersionInfo{ + Version: nv.Version.String(), + ReleaseNotesUrl: nv.ReleaseNotesURL, + ReleaseNotesText: nv.ReleaseNotesText, + Tag: nv.DockerImage, + Timestamp: timestamppb.New(nv.BuildTime), + }) + } + + return &serverpb.CheckUpdatesResponse{ + Installed: &serverpb.VersionInfo{ + Version: v.Installed.Version, + FullVersion: v.Installed.FullVersion, + Timestamp: timestamppb.New(*v.Installed.BuildTime), + }, + Latest: &serverpb.DockerVersionInfo{ + Version: v.Latest.Version.String(), + ReleaseNotesUrl: v.Latest.ReleaseNotesURL, + ReleaseNotesText: v.Latest.ReleaseNotesText, + Tag: v.Latest.DockerImage, + Timestamp: timestamppb.New(v.Latest.BuildTime), + }, + AvailableVersions: newerVersions, + UpdateAvailable: v.Latest.DockerImage != "", + } +} + // StartUpdate starts PMM Server update. func (s *Server) StartUpdate(ctx context.Context, req *serverpb.StartUpdateRequest) (*serverpb.StartUpdateResponse, error) { //nolint:revive s.envRW.RLock() @@ -307,7 +326,7 @@ func (s *Server) StartUpdate(ctx context.Context, req *serverpb.StartUpdateReque newImage := req.GetNewImage() if newImage == "" { - latest, err := s.updater.latest(ctx) + _, latest, err := s.updater.latest(ctx) if err != nil { s.l.WithError(err).Error("Failed to get latest version") newImage = defaultLatestPMMImage diff --git a/managed/services/server/updater.go b/managed/services/server/updater.go index fe18fd8619..e859b06ebe 100644 --- a/managed/services/server/updater.go +++ b/managed/services/server/updater.go @@ -56,6 +56,7 @@ type Updater struct { checkRW sync.RWMutex lastCheckResult *version.DockerVersionInfo + newerVersions []*version.DockerVersionInfo lastCheckTime time.Time } @@ -164,22 +165,22 @@ func (up *Updater) ForceCheckUpdates(ctx context.Context) error { // LastCheckUpdatesResult returns the result of the last update check. func (up *Updater) LastCheckUpdatesResult(ctx context.Context) (*version.UpdateCheckResult, time.Time) { installed := up.InstalledPMMVersion() - latest, lastCheckTime := up.checkResult(ctx) + newerVersions, latest, lastCheckTime := up.checkResult(ctx) return &version.UpdateCheckResult{ Installed: installed, Latest: *latest, + NewerVersions: newerVersions, UpdateAvailable: latest.DockerImage != "", - LatestNewsURL: "https://per.co.na/pmm/" + latest.Version.String(), }, lastCheckTime } -func (up *Updater) latest(ctx context.Context) (*version.DockerVersionInfo, error) { +func (up *Updater) latest(ctx context.Context) ([]*version.DockerVersionInfo, *version.DockerVersionInfo, error) { info, err := up.readFromFile() if err != nil { - return nil, errors.Wrap(err, "failed to read from file") + return nil, nil, errors.Wrap(err, "failed to read from file") } if info != nil { - return info, nil + return nil, info, nil } if os.Getenv("PMM_DEV_UPDATE_DOCKER_IMAGE") != "" { return up.parseDockerTag(os.Getenv("PMM_DEV_UPDATE_DOCKER_IMAGE")) @@ -190,7 +191,7 @@ func (up *Updater) latest(ctx context.Context) (*version.DockerVersionInfo, erro } func (up *Updater) readFromFile() (*version.DockerVersionInfo, error) { - // Read from file, if it's not exist read from ENV variable, if it's not exist get the latest tag from DockerHub. + // Read from file, if it does not exist read from ENV variable, if it does not exist get the latest tag from DockerHub. content, err := os.ReadFile(fileName) if err != nil && !os.IsNotExist(err) { up.l.WithError(err).Error("Failed to read file") @@ -222,7 +223,7 @@ type TagsResponse struct { // It returns the latest minor version for the current major version. // If the current version is the latest minor version, it returns the next major version. // If the current version is the latest version, it returns the current version. -func (up *Updater) latestAvailableFromDockerHub(ctx context.Context) (*version.DockerVersionInfo, error) { +func (up *Updater) latestAvailableFromDockerHub(ctx context.Context) ([]*version.DockerVersionInfo, *version.DockerVersionInfo, error) { repo := os.Getenv("PMM_DEV_UPDATE_DOCKER_REPO") if repo == "" { repo = "percona/pmm-server" @@ -231,52 +232,83 @@ func (up *Updater) latestAvailableFromDockerHub(ctx context.Context) (*version.D req, err := http.NewRequestWithContext(ctx, http.MethodGet, u, nil) if err != nil { up.l.WithError(err).Error("Failed to create request") - return nil, errors.Wrap(err, "failed to create request") + return nil, nil, errors.Wrap(err, "failed to create request") } resp, err := http.DefaultClient.Do(req) if err != nil { up.l.WithError(err).Error("Failed to get tags from DockerHub") - return nil, errors.Wrap(err, "failed to get tags from DockerHub") + return nil, nil, errors.Wrap(err, "failed to get tags from DockerHub") } defer resp.Body.Close() //nolint:errcheck var tagsResponse TagsResponse if err := json.NewDecoder(resp.Body).Decode(&tagsResponse); err != nil { up.l.WithError(err).Error("Failed to decode response") - return nil, errors.Wrap(err, "failed to decode response") + return nil, nil, errors.Wrap(err, "failed to decode response") } if len(tagsResponse.Results) != 0 { - up.l.Infof("Found %d tags", len(tagsResponse.Results)) - next := up.next(*up.currentVersion(), tagsResponse.Results) + up.l.Debugf("Found %d tags", len(tagsResponse.Results)) + newerVersions, next := up.next(*up.currentVersion(), tagsResponse.Results) if next.DockerImage != "" { next.DockerImage = repo + ":" + next.DockerImage } - return next, err + return newerVersions, next, err } - return nil, errors.New("no tags found") + return nil, nil, errors.New("no tags found") } -func (up *Updater) parseDockerTag(tag string) (*version.DockerVersionInfo, error) { +func (up *Updater) parseDockerTag(tag string) ([]*version.DockerVersionInfo, *version.DockerVersionInfo, error) { splitTag := strings.Split(tag, ":") if len(splitTag) != 2 { - return nil, fmt.Errorf("invalid tag: %s", tag) + return nil, nil, fmt.Errorf("invalid tag: %s", tag) } parsed, err := version.Parse(splitTag[1]) if err != nil { up.l.Debugf("Failed to parse version: %s", splitTag[1]) - return &version.DockerVersionInfo{DockerImage: tag}, nil //nolint:nilerr + return nil, &version.DockerVersionInfo{DockerImage: tag}, nil //nolint:nilerr } - return &version.DockerVersionInfo{ - Version: *parsed, - DockerImage: tag, + return nil, &version.DockerVersionInfo{ + Version: *parsed, + DockerImage: tag, + ReleaseNotesURL: "https://per.co.na/pmm/" + parsed.String(), }, nil } -func (up *Updater) next(currentVersion version.Parsed, results []result) *version.DockerVersionInfo { +// getReleaseNotesText returns the change log for a specific PMM server release. +func (up *Updater) getReleaseNotesText(ctx context.Context, version version.Parsed) (string, error) { + u := "https://api.github.com/repos/percona/pmm-doc/contents/docs/release-notes/" + version.String() + ".md" + req, err := http.NewRequestWithContext(ctx, http.MethodGet, u, nil) + req.Header.Set("Accept", "application/vnd.github.raw+json") + if err != nil { + up.l.WithError(err).Error("Failed to create request") + return "", errors.Wrap(err, "failed to create request") + } + resp, err := http.DefaultClient.Do(req) + if err != nil { + up.l.WithError(err).Error("Failed to get tags from DockerHub") + return "", errors.Wrap(err, "failed to get change log") + } + if resp.StatusCode != http.StatusOK { + up.l.Infof("Failed to fetch release notes for PMM version: %s", version.String()) + return "", nil + } + defer resp.Body.Close() //nolint:errcheck + + content, err := io.ReadAll(resp.Body) + if err != nil { + return "", errors.Wrap(err, "failed to read file content") + } + return string(content), nil +} + +// next returns both a list of newer versions and the next version that can be upgraded to. +func (up *Updater) next(currentVersion version.Parsed, results []result) (available []*version.DockerVersionInfo, next *version.DockerVersionInfo) { + newerVersions := make([]*version.DockerVersionInfo, 0) nextMinor := &version.DockerVersionInfo{ Version: currentVersion, } + var nextMajor *version.DockerVersionInfo for _, result := range results { v, err := version.Parse(result.Name) @@ -287,26 +319,39 @@ func (up *Updater) next(currentVersion version.Parsed, results []result) *versio if !currentVersion.Less(v) { continue } + releaseNote, err := up.getReleaseNotesText(context.Background(), *v) + newerVersions = append(newerVersions, &version.DockerVersionInfo{ + Version: *v, + DockerImage: result.Name, + BuildTime: result.TagLastPushed, + ReleaseNotesURL: "https://per.co.na/pmm/" + v.String(), + ReleaseNotesText: releaseNote, + }) if v.Major == currentVersion.Major && nextMinor.Version.Less(v) { // next major nextMinor = &version.DockerVersionInfo{ - Version: *v, - DockerImage: result.Name, - BuildTime: result.TagLastPushed, + Version: *v, + DockerImage: result.Name, + BuildTime: result.TagLastPushed, + ReleaseNotesURL: "https://per.co.na/pmm/" + v.String(), + ReleaseNotesText: releaseNote, } } if v.Major > currentVersion.Major && (nextMajor == nil || (nextMajor.Version.Less(v) && nextMajor.Version.Major == v.Major) || v.Major < nextMajor.Version.Major) { nextMajor = &version.DockerVersionInfo{ - Version: *v, - DockerImage: result.Name, - BuildTime: result.TagLastPushed, + Version: *v, + DockerImage: result.Name, + BuildTime: result.TagLastPushed, + ReleaseNotesURL: "https://per.co.na/pmm/" + v.String(), + ReleaseNotesText: releaseNote, } } } + if nextMinor.Version == currentVersion && nextMajor != nil { - return nextMajor + return newerVersions, nextMajor } - return nextMinor + return newerVersions, nextMinor } // InstalledPMMVersion returns the currently installed PMM version. @@ -363,7 +408,7 @@ func (up *Updater) UpdateLog(offset uint32) ([]string, uint32, error) { // checkResult returns the result of the last update check. // It may force re-check if last result is empty or too old. -func (up *Updater) checkResult(ctx context.Context) (*version.DockerVersionInfo, time.Time) { +func (up *Updater) checkResult(ctx context.Context) ([]*version.DockerVersionInfo, *version.DockerVersionInfo, time.Time) { up.checkRW.RLock() defer up.checkRW.RUnlock() @@ -373,7 +418,7 @@ func (up *Updater) checkResult(ctx context.Context) (*version.DockerVersionInfo, up.checkRW.RLock() } - return up.lastCheckResult, up.lastCheckTime + return up.newerVersions, up.lastCheckResult, up.lastCheckTime } // check performs update check. @@ -381,11 +426,12 @@ func (up *Updater) check(ctx context.Context) error { up.checkRW.Lock() defer up.checkRW.Unlock() - latest, err := up.latest(ctx) + newerVersions, latest, err := up.latest(ctx) if err != nil { return errors.Wrap(err, "failed to get latest version") } up.lastCheckResult = latest up.lastCheckTime = time.Now() + up.newerVersions = newerVersions return nil } diff --git a/managed/services/server/updater_test.go b/managed/services/server/updater_test.go index 68bb6e69f4..89028fee27 100644 --- a/managed/services/server/updater_test.go +++ b/managed/services/server/updater_test.go @@ -233,7 +233,7 @@ func TestUpdater(t *testing.T) { u := NewUpdater(watchtowerURL, gRPCMessageMaxSize) parsed, err := version.Parse(tt.args.currentVersion) require.NoError(t, err) - next := u.next(*parsed, tt.args.results) + _, next := u.next(*parsed, tt.args.results) require.NoError(t, err) assert.Equal(t, tt.want.Version, next.Version.String()) assert.Equal(t, tt.want.DockerImage, next.DockerImage) @@ -247,9 +247,9 @@ func TestUpdater(t *testing.T) { t.Run("TestLatest", func(t *testing.T) { // Used PMM 2, because PMM 3 is not released yet. - version.Version = "2.41.0" + version.Version = "2.40.0" u := NewUpdater(watchtowerURL, gRPCMessageMaxSize) - latest, err := u.latest(context.Background()) + _, latest, err := u.latest(context.Background()) require.NoError(t, err) assert.NotNil(t, latest) assert.True(t, strings.HasPrefix(latest.Version.String(), "2.41."), "latest version of PMM 2 should have prefix 2.41.") @@ -265,7 +265,7 @@ func TestUpdater(t *testing.T) { require.NoError(t, err) u := NewUpdater(watchtowerURL, gRPCMessageMaxSize) - latest, err := u.latest(context.Background()) + _, latest, err := u.latest(context.Background()) require.NoError(t, err) assert.Equal(t, "2.41.1", latest.Version.String()) assert.Equal(t, "2.41.1", latest.DockerImage) diff --git a/version/update.go b/version/update.go index 235004df4d..167a383a01 100644 --- a/version/update.go +++ b/version/update.go @@ -32,15 +32,17 @@ type UpdateInstalledResult struct { // UpdateCheckResult represents `pmm-update -check` result. type UpdateCheckResult struct { - Installed PackageInfo `json:"installed"` - Latest DockerVersionInfo `json:"latest,omitempty"` - UpdateAvailable bool `json:"update_available"` - LatestNewsURL string `json:"latest_news_url"` + Installed PackageInfo `json:"installed"` + Latest DockerVersionInfo `json:"latest,omitempty"` + NewerVersions []*DockerVersionInfo `json:"newer_versions"` + UpdateAvailable bool `json:"update_available"` } // DockerVersionInfo describes the version of the Docker image. type DockerVersionInfo struct { - Version Parsed `json:"version"` - DockerImage string `json:"docker_image"` - BuildTime time.Time `json:"build_time"` + Version Parsed `json:"version"` + DockerImage string `json:"docker_image"` + BuildTime time.Time `json:"build_time"` + ReleaseNotesURL string `json:"release_notes_url"` + ReleaseNotesText string `json:"release_notes_text"` }