diff --git a/.golangci.yml b/.golangci.yml index 5e1e1956cc..40139e6094 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -47,6 +47,7 @@ linters-settings: - github.com/charmbracelet/bubbletea.Model - github.com/percona/pmm/admin/commands.Result - github.com/percona/pmm/agent/runner/actions.Action + - github.com/percona/pmm/managed/services/telemetry.DataSource lll: line-length: 170 @@ -114,7 +115,7 @@ linters: - revive - paralleltest - gocognit - - errcheck + # ENDTODO run: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e489039ffa..72fcafd3b7 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,9 +4,9 @@ We'd be glad to welcome you to Percona community which tries to keep the open so ## Table of contents 1. [Project repos structure](#Project-repos-structure) -2. [API documentation](#API-documentation) +2. [API documentation](#API-Reference-Documentation) 3. [Prerequisites](#Prerequisites) -4. [Submitting a Bug](#Submitting-a-Bug) +4. [Submitting a bug](#Submitting-a-Bug) 5. [Setup your local development environment](#Setup-your-local-development-environment) 6. [Tests](#Tests) 7. [Feature Build](#Feature-Build) @@ -200,19 +200,22 @@ There are number of approaches for the code review and ownership: Code Ownership For more efficient review process we use a mixed approach: * repos that have CODEOWNERS - * add **auto-review-team** additionally to CODEOWNERS assigned + * github will assign reviewers automatically * repos that don't have CODEOWNERS - * add **auto-review-team** + * add reviewers as follows: + * add `pmm-review-fe` for UI/UX reviews + * add `pmm-review-exporters` for exporter reviews [see PMM Client](#PMM-Client) + * add `pmm-review-be` for backend reviews * if you know exactly who should review your code - * add ppl to the review + * add them to the review -| Team | Description | Members | -| -------------------- | ----------------------------------------------------------------------- | ------- | -| pmm-review-fe | ppl for UI/UX reviews for [FrontEnd repos](#FrontEnd) | [FE team](https://github.com/orgs/percona/teams/pmm-review-fe/members) | -| pmm-review-exporters | reviewers for all exporters [see PMM Client](#PMM-Client) | [Exporters team](https://github.com/orgs/percona/teams/pmm-review-exporters/members) | -| pmm-review-be | Back-End engineers | [BE team](https://github.com/orgs/percona/teams/pmm-review-be/members) | -| PMM Admins | ppl that could use admins rights to force merge or change repo settings | [PMM Admin team](https://github.com/orgs/percona/teams/pmm-admins/members) | +| Team | Description | Members | +| -------------------- | -------------------------------------------------------------- | ------- | +| pmm-review-fe | UI reviewers of PRs to [FrontEnd repos](#FrontEnd) | [FE team](https://github.com/orgs/percona/teams/pmm-review-fe/members) | +| pmm-review-exporters | exporter reviewers of PRs to [PMM Client](#PMM-Client) | [Exporters team](https://github.com/orgs/percona/teams/pmm-review-exporters/members) | +| pmm-review-be | reviewers of backend (Go) PRs | [BE team](https://github.com/orgs/percona/teams/pmm-review-be/members) | +| PMM Admins | reviewers that could use admins rights to force merge or change repo settings | [PMM Admin team](https://github.com/orgs/percona/teams/pmm-admins/members) | ## After your Pull Request is merged diff --git a/admin/commands/management/add.go b/admin/commands/management/add.go index e69826e8cb..6d8e716748 100644 --- a/admin/commands/management/add.go +++ b/admin/commands/management/add.go @@ -21,7 +21,7 @@ import ( // AddCommand is used by Kong for CLI flags and commands. type AddCommand struct { - External AddExternalCommand `cmd:"" help:"Add External source of data (like a custom exporter running on a port) to the monitoring"` + External AddExternalCommand `cmd:"" help:"Add External source of data (like a custom exporter running on a port) to monitoring"` ExternalServerless AddExternalServerlessCommand `cmd:"" help:"Add External Service on Remote node to monitoring"` HAProxy AddHAProxyCommand `cmd:"" name:"haproxy" help:"Add HAProxy to monitoring"` MongoDB AddMongoDBCommand `cmd:"" name:"mongodb" help:"Add MongoDB to monitoring"` diff --git a/admin/commands/management/add_mysql.go b/admin/commands/management/add_mysql.go index 08d5fc537d..8c655e9f06 100644 --- a/admin/commands/management/add_mysql.go +++ b/admin/commands/management/add_mysql.go @@ -146,7 +146,7 @@ func (cmd *AddMySQLCommand) RunCmd() (commands.Result, error) { if cmd.CreateUser { return nil, errors.New("Unrecognized option. To create a user, see " + - "'https://www.percona.com/doc/percona-monitoring-and-management/2.x/concepts/services-mysql.html#pmm-conf-mysql-user-account-creating'") + "'https://docs.percona.com/percona-monitoring-and-management/setting-up/client/mysql.html#create-a-database-account-for-pmm'") } var ( diff --git a/admin/commands/management/add_mysql_test.go b/admin/commands/management/add_mysql_test.go index 400fbced84..a4e6692af9 100644 --- a/admin/commands/management/add_mysql_test.go +++ b/admin/commands/management/add_mysql_test.go @@ -155,7 +155,7 @@ func TestRun(t *testing.T) { _, err := cmd.RunCmd() if assert.Error(t, err) { - expected := "Unrecognized option. To create a user, see 'https://www.percona.com/doc/percona-monitoring-and-management/2.x/concepts/services-mysql.html#pmm-conf-mysql-user-account-creating'" + expected := "Unrecognized option. To create a user, see 'https://docs.percona.com/percona-monitoring-and-management/setting-up/client/mysql.html#create-a-database-account-for-pmm'" assert.Equal(t, expected, err.Error()) } }) diff --git a/admin/commands/pmm/server/docker/mock_functions_test.go b/admin/commands/pmm/server/docker/mock_functions_test.go index 2ddf30f174..021064c634 100644 --- a/admin/commands/pmm/server/docker/mock_functions_test.go +++ b/admin/commands/pmm/server/docker/mock_functions_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package docker diff --git a/admin/commands/summary.go b/admin/commands/summary.go index 270d7b7892..7216a65df5 100644 --- a/admin/commands/summary.go +++ b/admin/commands/summary.go @@ -85,7 +85,7 @@ func addFile(zipW *zip.Writer, name string, fileName string) { logrus.Debugf("%s", err) r = io.NopCloser(bytes.NewReader([]byte(err.Error() + "\n"))) } - defer r.Close() //nolint:gosec + defer r.Close() //nolint:gosec,errcheck modTime := time.Now() if fi, _ := os.Stat(fileName); fi != nil { @@ -219,7 +219,7 @@ func addVMAgentTargets(ctx context.Context, zipW *zip.Writer, agentsInfo []*agen addData(zipW, "client/vmagent-targets.html", now, bytes.NewReader([]byte(err.Error()))) return } - defer res.Body.Close() //nolint:gosec + defer res.Body.Close() //nolint:gosec,errcheck html, err = io.ReadAll(res.Body) if err != nil { logrus.Debugf("%s", err) @@ -241,7 +241,7 @@ func getURL(ctx context.Context, url string) ([]byte, error) { if err != nil { return nil, errors.WithStack(err) } - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck if resp.StatusCode != http.StatusOK { return nil, errors.Errorf("status code: %d", resp.StatusCode) diff --git a/admin/pkg/client/tarball/tarball.go b/admin/pkg/client/tarball/tarball.go index f9651f8bc3..45cd697eb0 100644 --- a/admin/pkg/client/tarball/tarball.go +++ b/admin/pkg/client/tarball/tarball.go @@ -148,7 +148,7 @@ func (b *Base) checksumTarball(ctx context.Context, link string, path string) er return err } - defer res.Body.Close() //nolint:gosec + defer res.Body.Close() //nolint:gosec,errcheck if res.StatusCode != http.StatusOK { return fmt.Errorf("%w: cannot download tarball's sha256sum (http %d)", ErrHTTPStatusNotOk, res.StatusCode) } diff --git a/admin/pkg/docker/docker.go b/admin/pkg/docker/docker.go index 9fe875ab51..569bdb2fcc 100644 --- a/admin/pkg/docker/docker.go +++ b/admin/pkg/docker/docker.go @@ -234,7 +234,7 @@ var ErrVolumeExists = fmt.Errorf("VolumeExists") func (b *Base) CreateVolume(ctx context.Context, volumeName string, labels map[string]string) (*volume.Volume, error) { // We need to first manually check if the volume exists because // cli.VolumeCreate() does not complain if it already exists. - v, err := b.Cli.VolumeList(ctx, filters.NewArgs(filters.Arg("name", volumeName))) + v, err := b.Cli.VolumeList(ctx, volume.ListOptions{Filters: filters.NewArgs(filters.Arg("name", volumeName))}) if err != nil { return nil, err } diff --git a/agent/agentlocal/mock_client_test.go b/agent/agentlocal/mock_client_test.go index 5a3e6b69bf..e4e0e47cad 100644 --- a/agent/agentlocal/mock_client_test.go +++ b/agent/agentlocal/mock_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package agentlocal diff --git a/agent/agentlocal/mock_supervisor_test.go b/agent/agentlocal/mock_supervisor_test.go index c9c7873002..6201748dbf 100644 --- a/agent/agentlocal/mock_supervisor_test.go +++ b/agent/agentlocal/mock_supervisor_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package agentlocal diff --git a/agent/agents/mysql/perfschema/perfschema.go b/agent/agents/mysql/perfschema/perfschema.go index 04312fcf8a..2f914fe692 100644 --- a/agent/agents/mysql/perfschema/perfschema.go +++ b/agent/agents/mysql/perfschema/perfschema.go @@ -36,7 +36,6 @@ import ( "github.com/percona/pmm/agent/queryparser" "github.com/percona/pmm/agent/tlshelpers" "github.com/percona/pmm/agent/utils/truncate" - "github.com/percona/pmm/agent/utils/version" "github.com/percona/pmm/api/agentpb" "github.com/percona/pmm/api/inventorypb" "github.com/percona/pmm/utils/sqlmetrics" @@ -59,18 +58,6 @@ type versionsCache struct { items map[string]*mySQLVersion } -func (m *PerfSchema) mySQLVersion() *mySQLVersion { - m.versionsCache.rw.RLock() - defer m.versionsCache.rw.RUnlock() - - res := m.versionsCache.items[m.agentID] - if res == nil { - return &mySQLVersion{} - } - - return res -} - const ( retainHistory = 5 * time.Minute refreshHistory = 5 * time.Second @@ -93,7 +80,6 @@ type PerfSchema struct { changes chan agents.Change historyCache *historyCache summaryCache *summaryCache - versionsCache *versionsCache } // Params represent Agent parameters. @@ -207,7 +193,6 @@ func newPerfSchema(params *newPerfSchemaParams) (*PerfSchema, error) { changes: make(chan agents.Change, 10), historyCache: historyCache, summaryCache: summaryCache, - versionsCache: &versionsCache{items: make(map[string]*mySQLVersion)}, }, nil } @@ -237,17 +222,6 @@ func (m *PerfSchema) Run(ctx context.Context) { m.changes <- agents.Change{Status: inventorypb.AgentStatus_WAITING} } - // cache MySQL version - ver, ven, err := version.GetMySQLVersion(ctx, m.q) - if err != nil { - m.l.Error(err) - } - - m.versionsCache.items[m.agentID] = &mySQLVersion{ - version: ver.Float(), - vendor: ven.String(), - } - go m.runHistoryCacheRefresher(ctx) // query events_statements_summary_by_digest every minute at 00 seconds diff --git a/agent/agents/postgres/pgstatmonitor/pgstatmonitor.go b/agent/agents/postgres/pgstatmonitor/pgstatmonitor.go index 4545595db6..f489af40a8 100644 --- a/agent/agents/postgres/pgstatmonitor/pgstatmonitor.go +++ b/agent/agents/postgres/pgstatmonitor/pgstatmonitor.go @@ -366,7 +366,7 @@ func getPGSM20Settings(q *reform.Querier) (settings, error) { if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() //nolint:errcheck result := make(settings) for rows.Next() { diff --git a/agent/agents/supervisor/ports_registry_test.go b/agent/agents/supervisor/ports_registry_test.go index 4528a35793..2fd56331bd 100644 --- a/agent/agents/supervisor/ports_registry_test.go +++ b/agent/agents/supervisor/ports_registry_test.go @@ -27,7 +27,7 @@ func TestRegistry(t *testing.T) { r := newPortsRegistry(65000, 65002, []uint16{65000}) l1, err := net.Listen("tcp", "127.0.0.1:65001") require.NoError(t, err) - defer l1.Close() //nolint:gosec + defer l1.Close() //nolint:gosec,errcheck p, err := r.Reserve() assert.NoError(t, err) @@ -46,8 +46,8 @@ func TestRegistry(t *testing.T) { err = r.Release(65002) assert.Equal(t, errPortBusy, err) - l1.Close() - l2.Close() + l1.Close() //nolint:errcheck + l2.Close() //nolint:errcheck p, err = r.Reserve() assert.NoError(t, err) diff --git a/agent/client/cache/cache.go b/agent/client/cache/cache.go new file mode 100644 index 0000000000..abd5805665 --- /dev/null +++ b/agent/client/cache/cache.go @@ -0,0 +1,108 @@ +// Copyright 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package cache incapsulates agent message storing logic. +package cache + +import ( + "path" + + "github.com/pkg/errors" + "github.com/sirupsen/logrus" + + "github.com/percona/pmm/agent/config" + "github.com/percona/pmm/agent/models" + "github.com/percona/pmm/agent/utils/buffer-ring/bigqueue" + "github.com/percona/pmm/api/agentpb" +) + +// Cache represent cache implementation based on bigqueue. +type Cache struct { + l *logrus.Entry + // prioritized represent cache for high priority agent messages e.g. job, action results + prioritized *bigqueue.Ring + // unprioritized represent cache for low priority agent messages e.g. qan metrics + unprioritized *bigqueue.Ring +} + +// New recreates cache. +func New(cfg config.Cache) (*Cache, error) { + if cfg.Disable { + return nil, errors.New("disable in cache config is set to true") + } + if cfg.Dir == "" { + return nil, errors.New("cache directory is not set up") + } + l := logrus.WithField("component", "cache") + prioritized, err := bigqueue.New(path.Join(cfg.Dir, "prioritized"), cfg.PrioritizedSize, l.WithField("type", "prioritized")) + if err != nil { + return nil, err + } + unprioritized, err := bigqueue.New(path.Join(cfg.Dir, "unprioritized"), cfg.UnprioritizedSize, l.WithField("type", "unprioritized")) + if err != nil { + return nil, err + } + return &Cache{ + l: l, + prioritized: prioritized, + unprioritized: unprioritized, + }, nil +} + +// Send stores agent response to cache on nil channel. +func (c *Cache) Send(resp *models.AgentResponse) error { + var cache *bigqueue.Ring + switch resp.Payload.(type) { + case *agentpb.StartActionResponse, + *agentpb.StopActionResponse, + *agentpb.PBMSwitchPITRResponse, + *agentpb.StartJobResponse, + *agentpb.JobStatusResponse, + *agentpb.GetVersionsResponse, + *agentpb.JobProgress, + *agentpb.StopJobResponse, + *agentpb.CheckConnectionResponse, + *agentpb.JobResult, + *agentpb.ServiceInfoResponse: + cache = c.prioritized + default: + cache = c.unprioritized + } + return cache.Send(resp) +} + +// SendAndWaitResponse stores AgentMessages with AgentMessageRequestPayload on nil channel. +func (c *Cache) SendAndWaitResponse(payload agentpb.AgentRequestPayload) (agentpb.ServerResponsePayload, error) { //nolint:ireturn + switch payload.(type) { + case *agentpb.ActionResultRequest: + return c.prioritized.SendAndWaitResponse(payload) + case *agentpb.QANCollectRequest, + *agentpb.StateChangedRequest: + return c.unprioritized.SendAndWaitResponse(payload) + default: + } + return &agentpb.StateChangedResponse{}, nil +} + +// Close closes cache databases. +func (c *Cache) Close() { + c.prioritized.Close() + c.unprioritized.Close() +} + +// SetSender sets sender and sends stored agent messages with sender. +func (c *Cache) SetSender(s models.Sender) { + c.prioritized.SetSender(s) + c.unprioritized.SetSender(s) +} diff --git a/agent/client/cache/dummy.go b/agent/client/cache/dummy.go new file mode 100644 index 0000000000..7381b8e960 --- /dev/null +++ b/agent/client/cache/dummy.go @@ -0,0 +1,64 @@ +// Copyright 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package cache + +import ( + "sync/atomic" + + "github.com/pkg/errors" + + "github.com/percona/pmm/agent/models" + agenterrors "github.com/percona/pmm/agent/utils/errors" + "github.com/percona/pmm/api/agentpb" +) + +// Dummy represent dummy cache. +type Dummy struct { + s atomic.Pointer[models.Sender] +} + +// Close to satisfy interface. +func (*Dummy) Close() {} + +// Send drops agent responses on nil channel. +func (c *Dummy) Send(resp *models.AgentResponse) error { + s := c.s.Load() + if s == nil { + return nil + } + err := (*s).Send(resp) + if err != nil && errors.As(err, &agenterrors.ErrChanConn) { + c.s.CompareAndSwap(s, nil) + } + return err +} + +// SendAndWaitResponse drops AgentMessages on nil channel. +func (c *Dummy) SendAndWaitResponse(payload agentpb.AgentRequestPayload) (agentpb.ServerResponsePayload, error) { //nolint:ireturn + s := c.s.Load() + if s == nil { + return &agentpb.StateChangedResponse{}, nil + } + resp, err := (*s).SendAndWaitResponse(payload) + if err != nil && errors.As(err, &agenterrors.ErrChanConn) { + c.s.CompareAndSwap(s, nil) + } + return resp, err +} + +// SetSender sets sender. +func (c *Dummy) SetSender(s models.Sender) { + c.s.Store(&s) +} diff --git a/agent/client/channel/channel.go b/agent/client/channel/channel.go index 324f8ca27b..c022681540 100644 --- a/agent/client/channel/channel.go +++ b/agent/client/channel/channel.go @@ -28,6 +28,8 @@ import ( "google.golang.org/protobuf/encoding/prototext" "google.golang.org/protobuf/proto" + "github.com/percona/pmm/agent/models" + agenterrors "github.com/percona/pmm/agent/utils/errors" "github.com/percona/pmm/api/agentpb" ) @@ -46,15 +48,6 @@ type ServerRequest struct { Payload agentpb.ServerRequestPayload } -// AgentResponse represents agent's response. -// It is similar to agentpb.AgentMessage except it can contain only responses, -// and the payload is already unwrapped (XXX instead of AgentMessage_XXX). -type AgentResponse struct { - ID uint32 - Status *grpcstatus.Status - Payload agentpb.AgentResponsePayload -} - // Response is a type used to pass response from pmm-server to the subscriber. type Response struct { Payload agentpb.ServerResponsePayload @@ -118,7 +111,7 @@ func New(stream agentpb.Agent_ConnectClient) *Channel { func (c *Channel) close(err error) { c.closeOnce.Do(func() { c.l.Debugf("Closing with error: %+v", err) - c.closeErr = err + c.closeErr = agenterrors.NewChannelClosedError(err) c.m.Lock() for _, ch := range c.responses { // unblock all subscribers @@ -148,7 +141,7 @@ func (c *Channel) Requests() <-chan *ServerRequest { } // Send sends message to pmm-managed. It is no-op once channel is closed (see Wait). -func (c *Channel) Send(resp *AgentResponse) { +func (c *Channel) Send(resp *models.AgentResponse) error { msg := &agentpb.AgentMessage{ Id: resp.ID, } @@ -158,7 +151,7 @@ func (c *Channel) Send(resp *AgentResponse) { if resp.Status != nil { msg.Status = resp.Status.Proto() } - c.send(msg) + return c.send(msg) } // SendAndWaitResponse sends request to pmm-managed, blocks until response is available. @@ -169,21 +162,24 @@ func (c *Channel) SendAndWaitResponse(payload agentpb.AgentRequestPayload) (agen id := atomic.AddUint32(&c.lastSentRequestID, 1) ch := c.subscribe(id) - c.send(&agentpb.AgentMessage{ + err := c.send(&agentpb.AgentMessage{ Id: id, Payload: payload.AgentMessageRequestPayload(), }) + if err != nil { + return nil, err + } resp := <-ch return resp.Payload, resp.Error } -func (c *Channel) send(msg *agentpb.AgentMessage) { +func (c *Channel) send(msg *agentpb.AgentMessage) error { c.sendM.Lock() select { case <-c.closeWait: c.sendM.Unlock() - return + return c.Wait() default: } @@ -201,10 +197,12 @@ func (c *Channel) send(msg *agentpb.AgentMessage) { err := c.s.Send(msg) c.sendM.Unlock() if err != nil { - c.close(errors.Wrap(err, "failed to send message")) - return + err = errors.Wrap(err, "failed to send message") + c.close(err) + return agenterrors.NewChannelClosedError(err) } c.mSend.Inc() + return nil } // runReader receives messages from server. @@ -290,6 +288,11 @@ func (c *Channel) runReceiver() { ID: msg.Id, Payload: p.AgentLogs, } + case *agentpb.ServerMessage_ServiceInfo: + c.requests <- &ServerRequest{ + ID: msg.Id, + Payload: p.ServiceInfo, + } // responses case *agentpb.ServerMessage_Pong: @@ -309,10 +312,13 @@ func (c *Channel) runReceiver() { c.l.Warnf("pmm-managed was not able to process message with id: %d, handling of that payload type is unimplemented", msg.Id) continue } - c.Send(&AgentResponse{ + err := c.Send(&models.AgentResponse{ ID: msg.Id, - Status: grpcstatus.New(codes.Unimplemented, "can't handle message type send, it is not implemented"), + Status: grpcstatus.New(codes.Unimplemented, "can't handle message type sent, it is not implemented"), }) + if err != nil { + c.l.Error(err) + } } } } diff --git a/agent/client/channel/channel_test.go b/agent/client/channel/channel_test.go index 5a785fa508..5be2fee495 100644 --- a/agent/client/channel/channel_test.go +++ b/agent/client/channel/channel_test.go @@ -34,6 +34,7 @@ import ( "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/timestamppb" + "github.com/percona/pmm/agent/models" "github.com/percona/pmm/agent/utils/truncate" "github.com/percona/pmm/api/agentpb" ) @@ -149,7 +150,6 @@ func TestAgentRequestWithTruncatedInvalidUTF8(t *testing.T) { Mysql: &agentpb.MetricsBucket_MySQL{}, }} resp, err = channel.SendAndWaitResponse(&request) - require.NoError(t, err) assert.Nil(t, resp) } @@ -248,12 +248,13 @@ func TestServerRequest(t *testing.T) { for req := range channel.Requests() { assert.IsType(t, &agentpb.Ping{}, req.Payload) - channel.Send(&AgentResponse{ + err := channel.Send(&models.AgentResponse{ ID: req.ID, Payload: &agentpb.Pong{ CurrentTime: timestamppb.Now(), }, }) + assert.NoError(t, err) } } @@ -416,10 +417,11 @@ func TestUnexpectedResponsePayloadFromServer(t *testing.T) { channel, _, teardown := setup(t, connect, io.EOF) defer teardown() req := <-channel.Requests() - channel.Send(&AgentResponse{ + err := channel.Send(&models.AgentResponse{ ID: req.ID, Payload: &agentpb.Pong{ CurrentTime: timestamppb.Now(), }, }) + assert.NoError(t, err) } diff --git a/agent/client/client.go b/agent/client/client.go index 5e8811d9ee..f6ba5547a7 100644 --- a/agent/client/client.go +++ b/agent/client/client.go @@ -35,9 +35,11 @@ import ( grpcstatus "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/timestamppb" + "github.com/percona/pmm/agent/client/cache" "github.com/percona/pmm/agent/client/channel" "github.com/percona/pmm/agent/config" "github.com/percona/pmm/agent/connectionuptime" + "github.com/percona/pmm/agent/models" "github.com/percona/pmm/agent/runner" "github.com/percona/pmm/agent/runner/actions" // TODO https://jira.percona.com/browse/PMM-7206 "github.com/percona/pmm/agent/runner/jobs" @@ -68,10 +70,10 @@ type Client struct { supervisor supervisor connectionChecker connectionChecker softwareVersioner softwareVersioner + serviceInfoBroker serviceInfoBroker l *logrus.Entry backoff *backoff.Backoff - done chan struct{} // for unit tests only dialTimeout time.Duration @@ -84,17 +86,21 @@ type Client struct { cus *connectionuptime.Service logStore *tailog.Store + + wg sync.WaitGroup + cache models.Cache } // New creates new client. // // Caller should call Run. -func New(cfg configGetter, supervisor supervisor, r *runner.Runner, connectionChecker connectionChecker, sv softwareVersioner, cus *connectionuptime.Service, logStore *tailog.Store) *Client { //nolint:lll - return &Client{ +func New(cfg configGetter, supervisor supervisor, r *runner.Runner, connectionChecker connectionChecker, sv softwareVersioner, sib serviceInfoBroker, cus *connectionuptime.Service, logStore *tailog.Store) *Client { //nolint:lll + out := &Client{ cfg: cfg, supervisor: supervisor, connectionChecker: connectionChecker, softwareVersioner: sv, + serviceInfoBroker: sib, l: logrus.WithField("component", "client"), backoff: backoff.New(backoffMinDelay, backoffMaxDelay), dialTimeout: dialTimeout, @@ -102,22 +108,20 @@ func New(cfg configGetter, supervisor supervisor, r *runner.Runner, connectionCh cus: cus, logStore: logStore, } + + var err error + if out.cache, err = cache.New(cfg.Get().Cache); err != nil { + out.l.Infof("Failed to init cache: %s. Initializing cachelless client.", err) + out.cache = &cache.Dummy{} + } + return out } -// Run connects to the server, processes requests and sends responses. -// -// Once Run exits, connection is closed, and caller should cancel supervisor's context. -// Then caller should wait until Done() channel is closed. -// That Client instance can't be reused after that. +// Connect connects to the server, processes requests and sends responses. // // Returned error is already logged and should be ignored. It is returned only for unit tests. -func (c *Client) Run(ctx context.Context) error { +func (c *Client) Connect(ctx context.Context) error { c.l.Info("Starting...") - - c.rw.Lock() - c.done = make(chan struct{}) - c.rw.Unlock() - cfg := c.cfg.Get() // do nothing until ctx is canceled if config misses critical info @@ -131,7 +135,6 @@ func (c *Client) Run(ctx context.Context) error { if missing != "" { c.l.Errorf("%s is not provided, halting.", missing) <-ctx.Done() - close(c.done) return errors.Wrap(ctx.Err(), "missing "+missing) } @@ -156,13 +159,11 @@ func (c *Client) Run(ctx context.Context) error { } } if ctx.Err() != nil { - close(c.done) if dialErr != nil { return dialErr } return ctx.Err() } - defer func() { if err := dialResult.conn.Close(); err != nil { c.l.Errorf("Connection closed: %s.", err) @@ -170,65 +171,16 @@ func (c *Client) Run(ctx context.Context) error { } c.l.Info("Connection closed.") }() + c.supervisor.ClearChangesChannel() + c.SendActualStatuses() + c.cache.SetSender(dialResult.channel) c.rw.Lock() c.md = dialResult.md c.channel = dialResult.channel c.rw.Unlock() - // Once the client is connected, ctx cancellation is ignored by it. - // - // We start goroutines, and terminate the gRPC connection and exit Run when any of them exits: - // - // 1. processActionResults reads action results from action runner and sends them to the channel. - // It exits when the action runner is stopped by cancelling ctx. - // - // 2. processSupervisorRequests reads requests (status changes and QAN data) from the supervisor and sends them to the channel. - // It exits when the supervisor is stopped by the caller. - // Caller stops supervisor when Run is left and gRPC connection is closed. - // - // 3. processChannelRequests reads requests from the channel and processes them. - // It exits when an unexpected message is received from the channel, or when can't be received at all. - // When Run is left, caller stops supervisor, and that allows processSupervisorRequests to exit. - // - // Done() channel is closed when all three goroutines exited. - - // TODO Make 2 and 3 behave more like 1 - that seems to be simpler. - // https://jira.percona.com/browse/PMM-4245 - - c.supervisor.ClearChangesChannel() - c.SendActualStatuses() - - oneDone := make(chan struct{}, 4) - go func() { - c.processActionResults(ctx) - c.l.Debug("processActionResults is finished") - oneDone <- struct{}{} - }() - go func() { - c.processJobsResults(ctx) - c.l.Debug("processJobsResults is finished") - oneDone <- struct{}{} - }() - go func() { - c.processSupervisorRequests(ctx) - c.l.Debug("processSupervisorRequests is finished") - oneDone <- struct{}{} - }() - go func() { - c.processChannelRequests(ctx) - c.l.Debug("processChannelRequests is finished") - oneDone <- struct{}{} - }() - - <-oneDone - go func() { - <-oneDone - <-oneDone - <-oneDone - c.l.Info("Done.") - close(c.done) - }() + c.processChannelRequests(ctx) return nil } @@ -236,7 +188,7 @@ func (c *Client) Run(ctx context.Context) error { func (c *Client) SendActualStatuses() { for _, agent := range c.supervisor.AgentsList() { c.l.Infof("Sending status: %s (port %d).", agent.Status, agent.ListenPort) - resp, err := c.channel.SendAndWaitResponse( + resp, err := c.sendAndWaitResponse( &agentpb.StateChangedRequest{ AgentId: agent.AgentId, Status: agent.Status, @@ -253,11 +205,6 @@ func (c *Client) SendActualStatuses() { } } -// Done is closed when all supervisors's requests are sent (if possible) and connection is closed. -func (c *Client) Done() <-chan struct{} { - return c.done -} - func (c *Client) processActionResults(ctx context.Context) { for { select { @@ -265,7 +212,7 @@ func (c *Client) processActionResults(ctx context.Context) { if result == nil { continue } - resp, err := c.channel.SendAndWaitResponse(result) + resp, err := c.sendAndWaitResponse(result) if err != nil { c.l.Error(err) continue @@ -287,7 +234,7 @@ func (c *Client) processJobsResults(ctx context.Context) { if message == nil { continue } - c.channel.Send(&channel.AgentResponse{ + c.send(&models.AgentResponse{ ID: 0, // Jobs send messages that don't require any responses, so we can leave message ID blank. Payload: message, }) @@ -299,68 +246,56 @@ func (c *Client) processJobsResults(ctx context.Context) { } func (c *Client) processSupervisorRequests(ctx context.Context) { - var wg sync.WaitGroup - - wg.Add(1) - go func() { - defer wg.Done() - - for { - select { - case state := <-c.supervisor.Changes(): - if state == nil { - continue - } - resp, err := c.channel.SendAndWaitResponse(state) - if err != nil { - c.l.Error(err) - continue - } - if resp == nil { - c.l.Warn("Failed to send StateChanged request.") - } - case <-ctx.Done(): - c.l.Infof("Supervisor Changes() channel drained.") - return + for { + select { + case state := <-c.supervisor.Changes(): + if state == nil { + continue + } + resp, err := c.sendAndWaitResponse(state) + if err != nil { + c.l.Error(err) + continue } + if resp == nil { + c.l.Warn("Failed to send StateChanged request.") + } + case <-ctx.Done(): + c.l.Infof("Supervisor Changes() channel drained.") + return } - }() - - wg.Add(1) - go func() { - defer wg.Done() + } +} - for { - select { - case collect := <-c.supervisor.QANRequests(): - if collect == nil { - continue - } - resp, err := c.channel.SendAndWaitResponse(collect) - if err != nil { - c.l.Error(err) - continue - } - if resp == nil { - c.l.Warn("Failed to send QanCollect request.") - } - case <-ctx.Done(): - c.l.Infof("Supervisor QANRequests() channel drained.") - return +func (c *Client) processQANRequests(ctx context.Context) { + for { + select { + case collect := <-c.supervisor.QANRequests(): + if collect == nil { + continue + } + resp, err := c.sendAndWaitResponse(collect) + if err != nil { + c.l.Error(err) + continue + } + if resp == nil { + c.l.Warn("Failed to send QanCollect request.") } + case <-ctx.Done(): + c.l.Infof("Supervisor QANRequests() channel drained.") + return } - }() - - wg.Wait() + } } func (c *Client) processChannelRequests(ctx context.Context) { -loop: +LOOP: for { select { case req, more := <-c.channel.Requests(): if !more { - break loop + break LOOP } var responsePayload agentpb.AgentResponsePayload var status *grpcstatus.Status @@ -388,6 +323,9 @@ loop: case *agentpb.CheckConnectionRequest: responsePayload = c.connectionChecker.Check(ctx, p, req.ID) + case *agentpb.ServiceInfoRequest: + responsePayload = c.serviceInfoBroker.GetInfoFromService(ctx, p, req.ID) + case *agentpb.StartJobRequest: var resp agentpb.StartJobResponse if err := c.handleStartJobRequest(p); err != nil { @@ -422,23 +360,24 @@ loop: } c.cus.RegisterConnectionStatus(time.Now(), true) - response := &channel.AgentResponse{ + response := &models.AgentResponse{ ID: req.ID, Payload: responsePayload, } if status != nil { response.Status = status } - c.channel.Send(response) + c.send(response) case <-ctx.Done(): - break loop + break LOOP } } if err := c.channel.Wait(); err != nil { c.l.Debugf("Channel closed: %s.", err) - return + } else { + c.l.Debug("Channel closed.") } - c.l.Debug("Channel closed.") + c.l.Debug("processChannelRequests is finished") } func (c *Client) handleStartActionRequest(p *agentpb.StartActionRequest) error { @@ -728,29 +667,8 @@ type dialResult struct { // dial tries to connect to the server once. // State changes are logged via l. Returned error is not user-visible. func dial(dialCtx context.Context, cfg *config.Config, l *logrus.Entry) (*dialResult, error) { - opts := []grpc.DialOption{ - grpc.WithBlock(), - grpc.WithUserAgent("pmm-agent/" + version.Version), - } - if cfg.Server.WithoutTLS { - opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) - } else { - host, _, _ := net.SplitHostPort(cfg.Server.Address) - tlsConfig := tlsconfig.Get() - tlsConfig.ServerName = host - tlsConfig.InsecureSkipVerify = cfg.Server.InsecureTLS - opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))) - } - - if cfg.Server.Username != "" { - opts = append(opts, grpc.WithPerRPCCredentials(&basicAuth{ - username: cfg.Server.Username, - password: cfg.Server.Password, - })) - } - l.Infof("Connecting to %s ...", cfg.Server.FilteredURL()) - conn, err := grpc.DialContext(dialCtx, cfg.Server.Address, opts...) + conn, err := grpc.DialContext(dialCtx, cfg.Server.Address, getGRPCOps(cfg)...) if err != nil { msg := err.Error() @@ -984,6 +902,79 @@ func convertAgentErrorToGrpcStatus(agentErr error) *grpcstatus.Status { return status } +func getGRPCOps(cfg *config.Config) []grpc.DialOption { + opts := []grpc.DialOption{ + grpc.WithBlock(), + grpc.WithUserAgent("pmm-agent/" + version.Version), + } + if cfg.Server.WithoutTLS { + opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) + } else { + host, _, _ := net.SplitHostPort(cfg.Server.Address) + tlsConfig := tlsconfig.Get() + tlsConfig.ServerName = host + tlsConfig.InsecureSkipVerify = cfg.Server.InsecureTLS + opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))) + } + + if cfg.Server.Username != "" { + opts = append(opts, grpc.WithPerRPCCredentials(&basicAuth{ + username: cfg.Server.Username, + password: cfg.Server.Password, + })) + } + return opts +} + +// Start starts client processes that handle requests and sends responses. +func (c *Client) Start(ctx context.Context) { + if _, ok := c.cache.(*cache.Cache); ok { + c.wg.Add(1) + go func() { + defer c.wg.Done() + <-ctx.Done() + c.cache.Close() + }() + } + c.wg.Add(4) + go func() { + defer c.wg.Done() + c.processActionResults(ctx) + c.l.Debug("processActionResults is finished") + }() + go func() { + defer c.wg.Done() + c.processJobsResults(ctx) + c.l.Debug("processJobsResults is finished") + }() + go func() { + defer c.wg.Done() + c.processSupervisorRequests(ctx) + c.l.Debug("processSupervisorRequests is finished") + }() + go func() { + defer c.wg.Done() + c.processQANRequests(ctx) + c.l.Debug("processQANRequests is finished") + }() +} + +// Wait waits for client processes to stop. +func (c *Client) Wait() { + c.wg.Wait() +} + +func (c *Client) sendAndWaitResponse(msg agentpb.AgentRequestPayload) (agentpb.ServerResponsePayload, error) { //nolint:ireturn + return c.cache.SendAndWaitResponse(msg) +} + +func (c *Client) send(msg *models.AgentResponse) { + err := c.cache.Send(msg) + if err != nil { + c.l.Error(err) + } +} + // check interface. var ( _ prometheus.Collector = (*Client)(nil) diff --git a/agent/client/client_test.go b/agent/client/client_test.go index 49c0d697d4..c49eb91fad 100644 --- a/agent/client/client_test.go +++ b/agent/client/client_test.go @@ -18,6 +18,8 @@ import ( "context" "fmt" "net" + "os" + "path" "testing" "time" @@ -83,9 +85,9 @@ func TestClient(t *testing.T) { ctx, cancel := context.WithCancel(context.Background()) cfgStorage := config.NewStorage(&config.Config{}) - client := New(cfgStorage, nil, nil, nil, nil, nil, nil) + client := New(cfgStorage, nil, nil, nil, nil, nil, nil, nil) cancel() - err := client.Run(ctx) + err := client.Connect(ctx) assert.EqualError(t, err, "missing PMM Server address: context canceled") }) @@ -98,9 +100,9 @@ func TestClient(t *testing.T) { Address: "127.0.0.1:1", }, }) - client := New(cfgStorage, nil, nil, nil, nil, nil, nil) + client := New(cfgStorage, nil, nil, nil, nil, nil, nil, nil) cancel() - err := client.Run(ctx) + err := client.Connect(ctx) assert.EqualError(t, err, "missing Agent ID: context canceled") }) @@ -115,8 +117,8 @@ func TestClient(t *testing.T) { Address: "127.0.0.1:1", }, }) - client := New(cfgStorage, nil, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) - err := client.Run(ctx) + client := New(cfgStorage, nil, nil, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) + err := client.Connect(ctx) assert.EqualError(t, err, "failed to dial: context deadline exceeded") }) @@ -164,8 +166,9 @@ func TestClient(t *testing.T) { s.On("ClearChangesChannel").Return() r := runner.New(cfgStorage.Get().RunnerCapacity) - client := New(cfgStorage, &s, r, nil, nil, connectionuptime.NewService(time.Hour), nil) - err := client.Run(context.Background()) + client := New(cfgStorage, &s, r, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) + client.Start(context.Background()) + err := client.Connect(context.Background()) assert.NoError(t, err) assert.Equal(t, serverMD, client.GetServerConnectMetadata()) }) @@ -192,9 +195,9 @@ func TestClient(t *testing.T) { }, }) - client := New(cfgStorage, nil, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) + client := New(cfgStorage, nil, nil, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) client.dialTimeout = 100 * time.Millisecond - err := client.Run(ctx) + err := client.Connect(ctx) assert.EqualError(t, err, "failed to get server metadata: rpc error: code = Canceled desc = context canceled", "%+v", err) }) }) @@ -282,8 +285,9 @@ func TestUnexpectedActionType(t *testing.T) { s.On("ClearChangesChannel").Return() r := runner.New(cfgStorage.Get().RunnerCapacity) - client := New(cfgStorage, s, r, nil, nil, connectionuptime.NewService(time.Hour), nil) - err := client.Run(context.Background()) + client := New(cfgStorage, s, r, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) + client.Start(context.Background()) + err := client.Connect(context.Background()) assert.NoError(t, err) assert.Equal(t, serverMD, client.GetServerConnectMetadata()) } @@ -379,3 +383,132 @@ func TestArgListFromMongoDBParams(t *testing.T) { }) } } + +func TestCache(t *testing.T) { + t.Parallel() + cacheSize := uint32(3 * 1024 * 1024) + t.Run("Read", func(t *testing.T) { + t.Parallel() + serverMD := &agentpb.ServerConnectMetadata{ServerVersion: t.Name()} + + // test payload + payload := &agentpb.QANCollectRequest{MetricsBucket: []*agentpb.MetricsBucket{{Common: &agentpb.MetricsBucket_Common{Queryid: "33b65211f7df97665e74b8f98dbc90d5"}}}} + + connect := func(stream agentpb.Agent_ConnectServer) error { + md, err := agentpb.ReceiveAgentConnectMetadata(stream) + require.NoError(t, err) + assert.Equal(t, &agentpb.AgentConnectMetadata{ID: "agent_id"}, md) + err = agentpb.SendServerConnectMetadata(stream, serverMD) + require.NoError(t, err) + msg, err := stream.Recv() + require.NoError(t, err) + ping := msg.GetPing() + require.NotNil(t, ping) + err = stream.Send(&agentpb.ServerMessage{ + Id: msg.Id, + Payload: (&agentpb.Pong{CurrentTime: timestamppb.Now()}).ServerMessageResponsePayload(), + }) + require.NoError(t, err) + msg, err = stream.Recv() + require.NoError(t, err) + require.Equal(t, payload.MetricsBucket[0].Common.Queryid, msg.Payload.(*agentpb.AgentMessage_QanCollect).QanCollect.MetricsBucket[0].Common.Queryid) + return nil + } + + // setup for client processes + qan := make(chan *agentpb.QANCollectRequest, 1) + s := &mockSupervisor{} + s.On("Changes").Return(make(<-chan *agentpb.StateChangedRequest)) + s.On("QANRequests").Return((<-chan *agentpb.QANCollectRequest)(qan)) + s.On("AgentsList").Return([]*agentlocalpb.AgentInfo{}) + s.On("ClearChangesChannel").Return() + + // setup for cache + testDirname := path.Join(os.TempDir(), fmt.Sprint(t.Name(), time.Now().UnixNano())) + t.Cleanup(func() { _ = os.RemoveAll(testDirname) }) + cfgStorage := config.NewStorage(&config.Config{Cache: config.Cache{Dir: testDirname, PrioritizedSize: cacheSize, UnprioritizedSize: cacheSize}}) + + // actual test + client := New(cfgStorage, s, runner.New(0), nil, nil, nil, connectionuptime.NewService(time.Hour), nil) + client.Start(context.Background()) + time.Sleep(1 * time.Second) // time to start processes + qan <- payload // sending request with qan on closed connection to store in cache + port, teardown := setup(t, connect) + defer teardown() + + *cfgStorage = *config.NewStorage(&config.Config{ + ID: "agent_id", + Server: config.Server{ + Address: fmt.Sprintf("127.0.0.1:%d", port), // prepare config with server params + WithoutTLS: true, + }, + }) + require.NoError(t, client.Connect(context.Background())) + }) + t.Run("Read with shutdown", func(t *testing.T) { + t.Parallel() + serverMD := &agentpb.ServerConnectMetadata{ServerVersion: t.Name()} + + // test payload + payload := &agentpb.QANCollectRequest{MetricsBucket: []*agentpb.MetricsBucket{{Common: &agentpb.MetricsBucket_Common{Queryid: "33b65211f7df97665e74b8f98dbc90d6"}}}} + + connect := func(stream agentpb.Agent_ConnectServer) error { + md, err := agentpb.ReceiveAgentConnectMetadata(stream) + require.NoError(t, err) + assert.Equal(t, &agentpb.AgentConnectMetadata{ID: "agent_id"}, md) + err = agentpb.SendServerConnectMetadata(stream, serverMD) + require.NoError(t, err) + msg, err := stream.Recv() + require.NoError(t, err) + ping := msg.GetPing() + require.NotNil(t, ping) + err = stream.Send(&agentpb.ServerMessage{ + Id: msg.Id, + Payload: (&agentpb.Pong{CurrentTime: timestamppb.Now()}).ServerMessageResponsePayload(), + }) + require.NoError(t, err) + msg, err = stream.Recv() + require.NoError(t, err) + require.Equal(t, payload.MetricsBucket[0].Common.Queryid, msg.Payload.(*agentpb.AgentMessage_QanCollect).QanCollect.MetricsBucket[0].Common.Queryid) + return nil + } + + // setup for client processes + qan := make(chan *agentpb.QANCollectRequest, 1) + s := &mockSupervisor{} + s.On("Changes").Return(make(<-chan *agentpb.StateChangedRequest)) + s.On("QANRequests").Return((<-chan *agentpb.QANCollectRequest)(qan)) + s.On("AgentsList").Return([]*agentlocalpb.AgentInfo{}) + s.On("ClearChangesChannel").Return() + r := runner.New(0) + + // setup for cache + testDirname := path.Join(os.TempDir(), fmt.Sprint(t.Name(), time.Now().UnixNano())) + t.Cleanup(func() { _ = os.RemoveAll(testDirname) }) + cfgStorage := config.NewStorage(&config.Config{Cache: config.Cache{Dir: testDirname, PrioritizedSize: cacheSize, UnprioritizedSize: cacheSize}}) + + // actual test + client := New(cfgStorage, s, r, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) + ctx, cancel := context.WithCancel(context.Background()) + client.Start(ctx) // starting client processes + time.Sleep(1 * time.Second) // time to start processes + qan <- payload // sending request with qan on closed connection to store in cache + time.Sleep(1 * time.Second) // time to store message before close cache + cancel() // shuting down client + client.Wait() // closing cache and waiting for processes to stop + + client = New(cfgStorage, s, r, nil, nil, nil, connectionuptime.NewService(time.Hour), nil) // new client setup + client.Start(context.Background()) + port, teardown := setup(t, connect) + defer teardown() + + *cfgStorage = *config.NewStorage(&config.Config{ // prepare config with new server params + ID: "agent_id", + Server: config.Server{ + Address: fmt.Sprintf("127.0.0.1:%d", port), + WithoutTLS: true, + }, + }) + require.NoError(t, client.Connect(context.Background())) + }) +} diff --git a/agent/client/deps.go b/agent/client/deps.go index 21ecbadf43..112a92bf57 100644 --- a/agent/client/deps.go +++ b/agent/client/deps.go @@ -24,6 +24,7 @@ import ( ) //go:generate ../../bin/mockery --name=connectionChecker --case=snake --inpackage --testonly +//go:generate ../../bin/mockery --name=serviceInfoBroker --case=snake --inpackage --testonly //go:generate ../../bin/mockery --name=supervisor --case=snake --inpackage --testonly // connectionChecker is a subset of methods of connectionchecker.ConnectionChecker used by this package. @@ -32,6 +33,11 @@ type connectionChecker interface { Check(ctx context.Context, req *agentpb.CheckConnectionRequest, id uint32) *agentpb.CheckConnectionResponse } +// serviceInfoBroker is a subset of methods of serviceinfobroker.ServiceInfoBroker used by this package. +type serviceInfoBroker interface { + GetInfoFromService(ctx context.Context, req *agentpb.ServiceInfoRequest, id uint32) *agentpb.ServiceInfoResponse +} + // softwareVersioner is a subset of methods of version.Versioner used by this package. type softwareVersioner interface { MySQLdVersion() (string, error) diff --git a/agent/client/mock_connection_checker_test.go b/agent/client/mock_connection_checker_test.go index cfaa03a960..610ab654c1 100644 --- a/agent/client/mock_connection_checker_test.go +++ b/agent/client/mock_connection_checker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package client diff --git a/agent/client/mock_service_info_broker_test.go b/agent/client/mock_service_info_broker_test.go new file mode 100644 index 0000000000..9123c456fc --- /dev/null +++ b/agent/client/mock_service_info_broker_test.go @@ -0,0 +1,47 @@ +// Code generated by mockery v2.36.0. DO NOT EDIT. + +package client + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" + + agentpb "github.com/percona/pmm/api/agentpb" +) + +// mockServiceInfoBroker is an autogenerated mock type for the serviceInfoBroker type +type mockServiceInfoBroker struct { + mock.Mock +} + +// GetInfoFromService provides a mock function with given fields: ctx, req, id +func (_m *mockServiceInfoBroker) GetInfoFromService(ctx context.Context, req *agentpb.ServiceInfoRequest, id uint32) *agentpb.ServiceInfoResponse { + ret := _m.Called(ctx, req, id) + + var r0 *agentpb.ServiceInfoResponse + if rf, ok := ret.Get(0).(func(context.Context, *agentpb.ServiceInfoRequest, uint32) *agentpb.ServiceInfoResponse); ok { + r0 = rf(ctx, req, id) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*agentpb.ServiceInfoResponse) + } + } + + return r0 +} + +// newMockServiceInfoBroker creates a new instance of mockServiceInfoBroker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockServiceInfoBroker(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockServiceInfoBroker { + mock := &mockServiceInfoBroker{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/agent/client/mock_supervisor_test.go b/agent/client/mock_supervisor_test.go index b31f4a15c6..1a53dbbae8 100644 --- a/agent/client/mock_supervisor_test.go +++ b/agent/client/mock_supervisor_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package client diff --git a/agent/commands/run.go b/agent/commands/run.go index 43111807b1..2d57167511 100644 --- a/agent/commands/run.go +++ b/agent/commands/run.go @@ -33,6 +33,7 @@ import ( "github.com/percona/pmm/agent/connectionchecker" "github.com/percona/pmm/agent/connectionuptime" "github.com/percona/pmm/agent/runner" + "github.com/percona/pmm/agent/serviceinfobroker" "github.com/percona/pmm/agent/tailog" "github.com/percona/pmm/agent/versioner" "github.com/percona/pmm/api/inventorypb" @@ -69,8 +70,9 @@ func Run() { supervisor := supervisor.NewSupervisor(ctx, v, configStorage) connectionChecker := connectionchecker.New(configStorage) + serviceInfoBroker := serviceinfobroker.New(configStorage) r := runner.New(cfg.RunnerCapacity) - client := client.New(configStorage, supervisor, r, connectionChecker, v, prepareConnectionService(ctx, cfg), logStore) + client := client.New(configStorage, supervisor, r, connectionChecker, v, serviceInfoBroker, prepareConnectionService(ctx, cfg), logStore) localServer := agentlocal.NewServer(configStorage, supervisor, client, configFilepath, logStore) logrus.Infof("Window check connection time is %.2f hour(s)", cfg.WindowConnectedTime.Hours()) @@ -93,10 +95,12 @@ func Run() { localServer.Run(ctx, reloadCh) cancel() }() + client.Start(ctx) processClientUntilCancel(ctx, client, reloadCh) cleanupTmp(cfg.Paths.TempDir, l) + client.Wait() wg.Wait() select { case <-rootCtx.Done(): @@ -109,10 +113,9 @@ func Run() { func processClientUntilCancel(ctx context.Context, client *client.Client, reloadCh chan bool) { for { clientCtx, cancelClientCtx := context.WithCancel(ctx) - client.Run(clientCtx) + _ = client.Connect(clientCtx) cancelClientCtx() - <-client.Done() select { case <-reloadCh: diff --git a/agent/config/config.go b/agent/config/config.go index c81438aef5..82032d74c4 100644 --- a/agent/config/config.go +++ b/agent/config/config.go @@ -37,8 +37,10 @@ import ( ) const ( - pathBaseDefault = "/usr/local/percona/pmm2" - agentTmpPath = "tmp" // temporary directory to keep exporters' config files, relative to pathBase + pathBaseDefault = "/usr/local/percona/pmm2" + agentTmpPath = "tmp" // temporary directory to keep exporters' config files, relative to pathBase + prioritizedCacheSize = 100 * 1024 * 1024 // 100 MB TODO: R&D on median daily amount + unprioritizedCacheSize = 500 * 1024 * 1024 // 500 MB TODO: R&D on median daily amount ) // Server represents PMM Server configuration. @@ -139,6 +141,18 @@ type Setup struct { SkipRegistration bool } +// Cache represent cache settings. +type Cache struct { + // Dir represent file to store valuable agent messages + Dir string `yaml:"dir"` + // PrioritizedSize represent cache size for high priority agent messages e.g., job, action results + PrioritizedSize uint32 `yaml:"prioritized_size"` + // UnprioritizedSize represent cache size for low priority agent messages e.g., qan metrics + UnprioritizedSize uint32 `yaml:"unprioritized_size"` + // Disable disables cache + Disable bool `yaml:"disable"` +} + // Config represents pmm-agent's configuration. // //nolint:maligned @@ -161,6 +175,7 @@ type Config struct { //nolint:musttag LogLinesCount uint `json:"log-lines-count"` WindowConnectedTime time.Duration `yaml:"window-connected-time"` + Cache Cache `yaml:"cache"` Setup Setup `yaml:"-"` } @@ -207,6 +222,12 @@ func get(args []string, cfg *Config, l *logrus.Entry) (configFileF string, err e if cfg.WindowConnectedTime == 0 { cfg.WindowConnectedTime = time.Hour } + if cfg.Cache.PrioritizedSize == 0 { + cfg.Cache.PrioritizedSize = prioritizedCacheSize + } + if cfg.Cache.UnprioritizedSize == 0 { + cfg.Cache.UnprioritizedSize = unprioritizedCacheSize + } for sp, v := range map[*string]string{ &cfg.Paths.NodeExporter: "node_exporter", @@ -221,6 +242,7 @@ func get(args []string, cfg *Config, l *logrus.Entry) (configFileF string, err e &cfg.Paths.PTPGSummary: "tools/pt-pg-summary", &cfg.Paths.PTMongoDBSummary: "tools/pt-mongodb-summary", &cfg.Paths.PTMySQLSummary: "tools/pt-mysql-summary", + &cfg.Cache.Dir: "cache", } { if *sp == "" { *sp = v @@ -263,6 +285,9 @@ func get(args []string, cfg *Config, l *logrus.Entry) (configFileF string, err e if !filepath.IsAbs(cfg.Paths.PTMySQLSummary) { cfg.Paths.PTMySQLSummary = filepath.Join(cfg.Paths.PathsBase, cfg.Paths.PTMySQLSummary) } + if !filepath.IsAbs(cfg.Cache.Dir) { + cfg.Cache.Dir = filepath.Join(cfg.Paths.PathsBase, cfg.Cache.Dir) + } for _, sp := range []*string{ &cfg.Paths.NodeExporter, @@ -386,6 +411,14 @@ func Application(cfg *Config) (*kingpin.Application, *string) { Envar("PMM_AGENT_PATHS_PT_MYSQL_SUMMARY").StringVar(&cfg.Paths.PTMySQLSummary) app.Flag("paths-tempdir", "Temporary directory for exporters [PMM_AGENT_PATHS_TEMPDIR]"). Envar("PMM_AGENT_PATHS_TEMPDIR").StringVar(&cfg.Paths.TempDir) + app.Flag("cache-dir", "Directory for cache [PMM_AGENT_CACHE_DIR]"). + Envar("PMM_AGENT_CACHE_DIR").StringVar(&cfg.Cache.Dir) + app.Flag("cache-prioritized-size", "Cache size for high priority agent messages e.g., job, action results [PMM_AGENT_CACHE_PRIORITIZED_SIZE]"). + Envar("PMM_AGENT_CACHE_PRIORITIZED_SIZE").Uint32Var(&cfg.Cache.PrioritizedSize) + app.Flag("cache-unprioritized-size", "Cache for low priority agent messages e.g., qan metrics [PMM_AGENT_CACHE_UNPRIORITIZED_SIZE]"). + Envar("PMM_AGENT_CACHE_UNPRIORITIZED_SIZE").Uint32Var(&cfg.Cache.UnprioritizedSize) + app.Flag("cache-disable", "Disables cache [PMM_AGENT_CACHE_DISABLE]"). + Envar("PMM_AGENT_CACHE_DISABLE").BoolVar(&cfg.Cache.Disable) // no flag for SlowLogFilePrefix - it is only for development and testing app.Flag("ports-min", "Minimal allowed port number for listening sockets [PMM_AGENT_PORTS_MIN]"). diff --git a/agent/config/config_test.go b/agent/config/config_test.go index 490f6c450f..be2287829a 100644 --- a/agent/config/config_test.go +++ b/agent/config/config_test.go @@ -127,6 +127,11 @@ func TestGet(t *testing.T) { Max: 51999, }, LogLinesCount: 1024, + Cache: Cache{ + Dir: "/usr/local/percona/pmm2/cache", + PrioritizedSize: 104857600, + UnprioritizedSize: 524288000, + }, } assert.Equal(t, expected, actual) assert.Empty(t, configFilepath) @@ -187,6 +192,11 @@ func TestGet(t *testing.T) { Max: 51999, }, LogLinesCount: 1024, + Cache: Cache{ + Dir: "/usr/local/percona/pmm2/cache", + PrioritizedSize: 104857600, + UnprioritizedSize: 524288000, + }, } assert.Equal(t, expected, actual) assert.Equal(t, name, configFilepath) @@ -248,6 +258,11 @@ func TestGet(t *testing.T) { LogLevel: "info", Debug: true, LogLinesCount: 1024, + Cache: Cache{ + Dir: "/usr/local/percona/pmm2/cache", + PrioritizedSize: 104857600, + UnprioritizedSize: 524288000, + }, } assert.Equal(t, expected, actual) assert.Equal(t, name, configFilepath) @@ -314,6 +329,11 @@ func TestGet(t *testing.T) { }, Debug: true, LogLinesCount: 1024, + Cache: Cache{ + Dir: "/usr/local/percona/pmm2/cache", + PrioritizedSize: 104857600, + UnprioritizedSize: 524288000, + }, } assert.Equal(t, expected, actual) assert.Equal(t, name, configFilepath) @@ -379,6 +399,11 @@ func TestGet(t *testing.T) { }, Debug: true, LogLinesCount: 1024, + Cache: Cache{ + Dir: "/base/cache", + PrioritizedSize: 104857600, + UnprioritizedSize: 524288000, + }, } assert.Equal(t, expected, actual) assert.Equal(t, name, configFilepath) @@ -442,6 +467,11 @@ func TestGet(t *testing.T) { }, Debug: true, LogLinesCount: 1024, + Cache: Cache{ + Dir: "/base/cache", + PrioritizedSize: 104857600, + UnprioritizedSize: 524288000, + }, } assert.Equal(t, expected, actual) assert.Equal(t, name, configFilepath) @@ -490,6 +520,11 @@ func TestGet(t *testing.T) { }, Debug: true, LogLinesCount: 1024, + Cache: Cache{ + Dir: "/usr/local/percona/pmm2/cache", + PrioritizedSize: 104857600, + UnprioritizedSize: 524288000, + }, } assert.Equal(t, expected, actual) assert.Equal(t, filepath.Join(wd, name), configFilepath) diff --git a/agent/connectionchecker/connection_checker.go b/agent/connectionchecker/connection_checker.go index c59ac148e8..d11b04393a 100644 --- a/agent/connectionchecker/connection_checker.go +++ b/agent/connectionchecker/connection_checker.go @@ -21,7 +21,6 @@ import ( "database/sql" "fmt" "io" - "math" "net/http" "path/filepath" "strconv" @@ -140,22 +139,6 @@ func (cc *ConnectionChecker) checkMySQLConnection(ctx context.Context, dsn strin } else { res.Error = err.Error() } - return &res - } - - var count uint64 - if err = db.QueryRowContext(ctx, "SELECT /* agent='connectionchecker' */ COUNT(*) FROM information_schema.tables").Scan(&count); err != nil { - res.Error = err.Error() - return &res - } - - tableCount := int32(count) - if count > math.MaxInt32 { - tableCount = math.MaxInt32 - } - - res.Stats = &agentpb.CheckConnectionResponse_Stats{ - TableCount: tableCount, } return &res @@ -271,7 +254,7 @@ func (cc *ConnectionChecker) checkExternalConnection(ctx context.Context, uri st res.Error = err.Error() return &res } - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck if resp.StatusCode != http.StatusOK { res.Error = fmt.Sprintf("Unexpected HTTP status code: %d. Expected: 200", resp.StatusCode) diff --git a/agent/connectionchecker/connection_checker_test.go b/agent/connectionchecker/connection_checker_test.go index cf06e94bc7..ffb1d0403d 100644 --- a/agent/connectionchecker/connection_checker_test.go +++ b/agent/connectionchecker/connection_checker_test.go @@ -237,7 +237,7 @@ func TestConnectionChecker(t *testing.T) { }) } - t.Run("TableCount", func(t *testing.T) { + t.Run("Stats should be empty", func(t *testing.T) { cfgStorage := config.NewStorage(&config.Config{ Paths: config.Paths{TempDir: t.TempDir()}, }) @@ -247,7 +247,8 @@ func TestConnectionChecker(t *testing.T) { Type: inventorypb.ServiceType_MYSQL_SERVICE, }, 0) require.NotNil(t, resp) - assert.InDelta(t, 250, resp.Stats.TableCount, 150) + // CheckConnectionResponse_Stats are deprecated, but we can't remove them yet without breaking older clients. + assert.Equal(t, (*agentpb.CheckConnectionResponse_Stats)(nil), resp.Stats) //nolint:staticcheck }) t.Run("MongoDBWithSSL", func(t *testing.T) { diff --git a/agent/models/agent_message.go b/agent/models/agent_message.go new file mode 100644 index 0000000000..a8f858c6e1 --- /dev/null +++ b/agent/models/agent_message.go @@ -0,0 +1,39 @@ +// Copyright 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package models contains client domain models and helpers. +package models + +import ( + "google.golang.org/grpc/status" + + "github.com/percona/pmm/api/agentpb" +) + +// AgentRequest represents an request from agent. +// It is similar to agentpb.AgentMessage except it can contain only requests, +// and the payload is already unwrapped (XXX instead of AgentMessage_XXX). +type AgentRequest struct { + ID uint32 + Payload agentpb.AgentRequestPayload +} + +// AgentResponse represents agent's response. +// It is similar to agentpb.AgentMessage except it can contain only responses, +// and the payload is already unwrapped (XXX instead of AgentMessage_XXX). +type AgentResponse struct { + ID uint32 + Status *status.Status + Payload agentpb.AgentResponsePayload +} diff --git a/agent/models/cache.go b/agent/models/cache.go new file mode 100644 index 0000000000..fee575cdb0 --- /dev/null +++ b/agent/models/cache.go @@ -0,0 +1,31 @@ +// Copyright 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package models contains client domain models and helpers. +package models + +import "github.com/percona/pmm/api/agentpb" + +// Sender is a subset of methods of channel, cache. +type Sender interface { + Send(resp *AgentResponse) error + SendAndWaitResponse(payload agentpb.AgentRequestPayload) (agentpb.ServerResponsePayload, error) +} + +// Cache represent cache methods. +type Cache interface { + Sender + Close() + SetSender(s Sender) +} diff --git a/agent/serviceinfobroker/service_info_broker.go b/agent/serviceinfobroker/service_info_broker.go new file mode 100644 index 0000000000..54259f2fab --- /dev/null +++ b/agent/serviceinfobroker/service_info_broker.go @@ -0,0 +1,256 @@ +// Copyright 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package serviceinfobroker helps extract various information from databases. +package serviceinfobroker + +import ( + "context" + "database/sql" + "fmt" + "math" + "path/filepath" + "strconv" + "strings" + + "github.com/go-sql-driver/mysql" + "github.com/lib/pq" + "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/mongo" + + "github.com/percona/pmm/agent/config" + "github.com/percona/pmm/agent/tlshelpers" + "github.com/percona/pmm/agent/utils/mongo_fix" + "github.com/percona/pmm/agent/utils/templates" + "github.com/percona/pmm/api/agentpb" + "github.com/percona/pmm/api/inventorypb" +) + +// configGetter allows to get a config. +type configGetter interface { + Get() *config.Config +} + +// ServiceInfoBroker helps query various information from services. +type ServiceInfoBroker struct { + l *logrus.Entry + cfg configGetter +} + +// New creates a new ServiceInfoBroker. +func New(cfg configGetter) *ServiceInfoBroker { + return &ServiceInfoBroker{ + l: logrus.WithField("component", "serviceinfobroker"), + cfg: cfg, + } +} + +// GetInfoFromService gathers information from a service. It returns context cancelation/timeout or driver errors as is. +func (sib *ServiceInfoBroker) GetInfoFromService(ctx context.Context, msg *agentpb.ServiceInfoRequest, id uint32) *agentpb.ServiceInfoResponse { + timeout := msg.Timeout.AsDuration() + if timeout > 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, timeout) + defer cancel() + } + + switch msg.Type { + case inventorypb.ServiceType_MYSQL_SERVICE: + return sib.getMySQLInfo(ctx, msg.Dsn, msg.TextFiles, id) + case inventorypb.ServiceType_MONGODB_SERVICE: + return sib.getMongoDBInfo(ctx, msg.Dsn, msg.TextFiles, id) + case inventorypb.ServiceType_POSTGRESQL_SERVICE: + return sib.getPostgreSQLInfo(ctx, msg.Dsn, msg.TextFiles, id) + case inventorypb.ServiceType_PROXYSQL_SERVICE: + return sib.getProxySQLInfo(ctx, msg.Dsn) + // NOTE: these types may be implemented later. + case inventorypb.ServiceType_EXTERNAL_SERVICE, inventorypb.ServiceType_HAPROXY_SERVICE: + return &agentpb.ServiceInfoResponse{} + default: + panic(fmt.Sprintf("unknown service type: %v", msg.Type)) + } +} + +func (sib *ServiceInfoBroker) getMySQLInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, id uint32) *agentpb.ServiceInfoResponse { + var res agentpb.ServiceInfoResponse + var err error + + if files != nil { + err = tlshelpers.RegisterMySQLCerts(files.Files) + if err != nil { + sib.l.Debugf("getMySQLInfo: failed to register cert: %s", err) + res.Error = err.Error() + return &res + } + } + + cfg, err := mysql.ParseDSN(dsn) + if err != nil { + sib.l.Debugf("getMySQLInfo: failed to parse DSN: %s", err) + res.Error = err.Error() + return &res + } + + tempdir := filepath.Join(sib.cfg.Get().Paths.TempDir, strings.ToLower("get-mysql-info"), strconv.Itoa(int(id))) + _, err = templates.RenderDSN(dsn, files, tempdir) + if err != nil { + sib.l.Debugf("getMySQLInfo: failed to Render DSN: %s", err) + res.Error = err.Error() + return &res + } + + connector, err := mysql.NewConnector(cfg) + if err != nil { + sib.l.Debugf("getMySQLInfo: failed to create connector: %s", err) + res.Error = err.Error() + return &res + } + + db := sql.OpenDB(connector) + defer db.Close() //nolint:errcheck + + var count uint64 + if err = db.QueryRowContext(ctx, "SELECT /* agent='serviceinfobroker' */ COUNT(*) FROM information_schema.tables").Scan(&count); err != nil { + res.Error = err.Error() + return &res + } + + res.TableCount = int32(count) + if count > math.MaxInt32 { + res.TableCount = math.MaxInt32 + } + + var version string + if err = db.QueryRowContext(ctx, "SELECT /* agent='serviceinfobroker' */ VERSION()").Scan(&version); err != nil { + res.Error = err.Error() + } + + res.Version = version + return &res +} + +func (sib *ServiceInfoBroker) getMongoDBInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, id uint32) *agentpb.ServiceInfoResponse { + var res agentpb.ServiceInfoResponse + var err error + + tempdir := filepath.Join(sib.cfg.Get().Paths.TempDir, strings.ToLower("get-mongodb-info"), strconv.Itoa(int(id))) + dsn, err = templates.RenderDSN(dsn, files, tempdir) + if err != nil { + sib.l.Debugf("getMongoDBInfo: failed to Render DSN: %s", err) + res.Error = err.Error() + return &res + } + + opts, err := mongo_fix.ClientOptionsForDSN(dsn) + if err != nil { + sib.l.Debugf("failed to parse DSN: %s", err) + res.Error = err.Error() + return &res + } + + client, err := mongo.Connect(ctx, opts) + if err != nil { + sib.l.Debugf("getMongoDBInfo: failed to Connect: %s", err) + res.Error = err.Error() + return &res + } + defer client.Disconnect(ctx) //nolint:errcheck + + if err = client.Ping(ctx, nil); err != nil { + sib.l.Debugf("getMongoDBInfo: failed to Ping: %s", err) + res.Error = err.Error() + return &res + } + + resp := client.Database("admin").RunCommand(ctx, bson.D{{Key: "getDiagnosticData", Value: 1}}) + if err = resp.Err(); err != nil { + sib.l.Debugf("getMongoDBInfo: failed to runCommand getDiagnosticData: %s", err) + res.Error = err.Error() + return &res + } + + resp = client.Database("admin").RunCommand(ctx, bson.D{{Key: "buildInfo", Value: 1}}) + if err = resp.Err(); err != nil { + res.Error = err.Error() + return &res + } + + buildInfo := struct { + Version string `bson:"version"` + }{} + + if err = resp.Decode(&buildInfo); err != nil { + sib.l.Debugf("getMongoDBInfo: failed to decode buildInfo: %s", err) + } + + res.Version = buildInfo.Version + return &res +} + +func (sib *ServiceInfoBroker) getPostgreSQLInfo(ctx context.Context, dsn string, files *agentpb.TextFiles, id uint32) *agentpb.ServiceInfoResponse { + var res agentpb.ServiceInfoResponse + var err error + + tempdir := filepath.Join(sib.cfg.Get().Paths.TempDir, strings.ToLower("get-postgresql-info"), strconv.Itoa(int(id))) + dsn, err = templates.RenderDSN(dsn, files, tempdir) + if err != nil { + sib.l.Debugf("getPostgreSQLInfo: failed to Render DSN: %s", err) + res.Error = err.Error() + return &res + } + + c, err := pq.NewConnector(dsn) + if err != nil { + res.Error = err.Error() + return &res + } + db := sql.OpenDB(c) + defer db.Close() //nolint:errcheck + + var version string + if err = db.QueryRowContext(ctx, "SHOW /* agent='serviceinfobroker' */ SERVER_VERSION").Scan(&version); err != nil { + res.Error = err.Error() + } + + res.Version = version + return &res +} + +func (sib *ServiceInfoBroker) getProxySQLInfo(ctx context.Context, dsn string) *agentpb.ServiceInfoResponse { + var res agentpb.ServiceInfoResponse + + cfg, err := mysql.ParseDSN(dsn) + if err != nil { + res.Error = err.Error() + return &res + } + + connector, err := mysql.NewConnector(cfg) + if err != nil { + res.Error = err.Error() + return &res + } + + db := sql.OpenDB(connector) + defer db.Close() //nolint:errcheck + + var version string + if err := db.QueryRowContext(ctx, "SELECT /* agent='serviceinfobroker' */ @@GLOBAL.'admin-version'").Scan(&version); err != nil { + res.Error = err.Error() + } + + res.Version = version + return &res +} diff --git a/agent/serviceinfobroker/service_info_broker_test.go b/agent/serviceinfobroker/service_info_broker_test.go new file mode 100644 index 0000000000..6ff08b17b4 --- /dev/null +++ b/agent/serviceinfobroker/service_info_broker_test.go @@ -0,0 +1,272 @@ +// Copyright 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package serviceinfobroker + +import ( + "context" + "math/rand" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/types/known/durationpb" + + "github.com/percona/pmm/agent/config" + "github.com/percona/pmm/agent/utils/tests" + "github.com/percona/pmm/api/agentpb" + "github.com/percona/pmm/api/inventorypb" +) + +func TestServiceInfoBroker(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + req *agentpb.ServiceInfoRequest + expectedErr string + panic bool + }{ + { + name: "MySQL", + req: &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=1s", + Type: inventorypb.ServiceType_MYSQL_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + }, + { + name: "MySQL wrong params", + req: &agentpb.ServiceInfoRequest{ + Dsn: "pmm-agent:pmm-agent-wrong-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=1s", + Type: inventorypb.ServiceType_MYSQL_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `Error 1045 \(28000\): Access denied for user 'pmm-agent'@'.+' \(using password: YES\)`, + }, + { + name: "MySQL timeout", + req: &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=10s", + Type: inventorypb.ServiceType_MYSQL_SERVICE, + Timeout: durationpb.New(time.Nanosecond), + }, + expectedErr: `context deadline exceeded`, + }, + + { + name: "MongoDB with no auth", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://127.0.0.1:27019/admin?connectTimeoutMS=1000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + }, + { + name: "MongoDB with no auth with params", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://root:root-password@127.0.0.1:27019/admin?connectTimeoutMS=1000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `.*auth error: (sasl conversation error: )?unable to authenticate using mechanism "[\w-]+": ` + + `\(AuthenticationFailed\) Authentication failed.`, + }, + { + name: "MongoDB", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://root:root-password@127.0.0.1:27017/admin?connectTimeoutMS=1000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + }, + { + name: "MongoDB no params", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://127.0.0.1:27017/admin?connectTimeoutMS=1000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `\(Unauthorized\) (?:command getDiagnosticData requires authentication|` + + `there are no users authenticated|` + + `not authorized on admin to execute command \{ getDiagnosticData\: 1 \})`, + }, + { + name: "MongoDB wrong params", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://root:root-password-wrong@127.0.0.1:27017/admin?connectTimeoutMS=1000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `.*auth error: (sasl conversation error: )?unable to authenticate using mechanism "[\w-]+": ` + + `\(AuthenticationFailed\) Authentication failed.`, + }, + { + name: "MongoDB timeout", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://root:root-password@127.0.0.1:27017/admin?connectTimeoutMS=10000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(time.Nanosecond), + }, + expectedErr: `.*context deadline exceeded.*`, + }, + { + name: "MongoDB no database", + req: &agentpb.ServiceInfoRequest{ + Dsn: "mongodb://root:root-password@127.0.0.1:27017?connectTimeoutMS=1000", + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `error parsing uri: must have a / before the query \?`, + }, + + { + name: "PostgreSQL", + req: &agentpb.ServiceInfoRequest{ + Dsn: "postgres://pmm-agent:pmm-agent-password@127.0.0.1:5432/postgres?connect_timeout=1&sslmode=disable", + Type: inventorypb.ServiceType_POSTGRESQL_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + }, + { + name: "PostgreSQL wrong params", + req: &agentpb.ServiceInfoRequest{ + Dsn: "postgres://pmm-agent:pmm-agent-wrong-password@127.0.0.1:5432/postgres?connect_timeout=1&sslmode=disable", + Type: inventorypb.ServiceType_POSTGRESQL_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `pq: password authentication failed for user "pmm-agent"`, + }, + { + name: "PostgreSQL timeout", + req: &agentpb.ServiceInfoRequest{ + Dsn: "postgres://pmm-agent:pmm-agent-password@127.0.0.1:5432/postgres?connect_timeout=10&sslmode=disable", + Type: inventorypb.ServiceType_POSTGRESQL_SERVICE, + Timeout: durationpb.New(time.Nanosecond), + }, + expectedErr: `context deadline exceeded`, + }, + + // Use MySQL for ProxySQL tests for now. + // TODO https://jira.percona.com/browse/PMM-4930 + // NOTE the above will also fix the error `Error 1193 (HY000): Unknown system variable 'admin-version'` + { + name: "ProxySQL/MySQL", + req: &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=1s", + Type: inventorypb.ServiceType_PROXYSQL_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `Error 1193 \(HY000\): Unknown system variable 'admin-version'`, + }, + { + name: "ProxySQL/MySQL wrong params", + req: &agentpb.ServiceInfoRequest{ + Dsn: "pmm-agent:pmm-agent-wrong-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=1s", + Type: inventorypb.ServiceType_PROXYSQL_SERVICE, + Timeout: durationpb.New(3 * time.Second), + }, + expectedErr: `Error 1045 \(28000\): Access denied for user 'pmm-agent'@'.+' \(using password: YES\)`, + }, + { + name: "ProxySQL/MySQL timeout", + req: &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=10s", + Type: inventorypb.ServiceType_PROXYSQL_SERVICE, + Timeout: durationpb.New(time.Nanosecond), + }, + expectedErr: `context deadline exceeded`, + }, + { + name: "Invalid service type", + req: &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=10s", + Type: inventorypb.ServiceType_SERVICE_TYPE_INVALID, + Timeout: durationpb.New(time.Nanosecond), + }, + expectedErr: `unknown service type: SERVICE_TYPE_INVALID`, + panic: true, + }, + { + name: "Unknown service type", + req: &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=10s", + Type: inventorypb.ServiceType(12345), + Timeout: durationpb.New(time.Nanosecond), + }, + expectedErr: `unknown service type: 12345`, + panic: true, + }, + } + + for _, tt := range testCases { + tt := tt + t.Run(tt.name, func(t *testing.T) { + t.Parallel() + + cfgStorage := config.NewStorage(&config.Config{ + Paths: config.Paths{TempDir: t.TempDir()}, + }) + c := New(cfgStorage) + + if tt.panic { + require.PanicsWithValue(t, tt.expectedErr, func() { + c.GetInfoFromService(context.Background(), tt.req, 0) + }) + return + } + + resp := c.GetInfoFromService(context.Background(), tt.req, 0) + require.NotNil(t, resp) + if tt.expectedErr == "" { + assert.Empty(t, resp.Error) + } else { + require.NotEmpty(t, resp.Error) + assert.Regexp(t, `^`+tt.expectedErr+`$`, resp.Error) + } + }) + } + + t.Run("TableCount", func(t *testing.T) { + cfgStorage := config.NewStorage(&config.Config{ + Paths: config.Paths{TempDir: t.TempDir()}, + }) + c := New(cfgStorage) + resp := c.GetInfoFromService(context.Background(), &agentpb.ServiceInfoRequest{ + Dsn: "root:root-password@tcp(127.0.0.1:3306)/?clientFoundRows=true&parseTime=true&timeout=1s", + Type: inventorypb.ServiceType_MYSQL_SERVICE, + }, 0) + require.NotNil(t, resp) + assert.InDelta(t, 250, resp.TableCount, 150) + }) + + t.Run("MongoDBWithSSL", func(t *testing.T) { + mongoDBDSNWithSSL, mongoDBTextFiles := tests.GetTestMongoDBWithSSLDSN(t, "../") + + cfgStorage := config.NewStorage(&config.Config{ + Paths: config.Paths{TempDir: t.TempDir()}, + }) + + c := New(cfgStorage) + resp := c.GetInfoFromService(context.Background(), &agentpb.ServiceInfoRequest{ + Dsn: mongoDBDSNWithSSL, + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Timeout: durationpb.New(30 * time.Second), + TextFiles: mongoDBTextFiles, + }, rand.Uint32()) //nolint:gosec + require.NotNil(t, resp) + assert.Empty(t, resp.Error) + }) +} diff --git a/agent/utils/buffer-ring/bigqueue/bigqueue.go b/agent/utils/buffer-ring/bigqueue/bigqueue.go new file mode 100644 index 0000000000..8bc35b8472 --- /dev/null +++ b/agent/utils/buffer-ring/bigqueue/bigqueue.go @@ -0,0 +1,429 @@ +// Copyright 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package bigqueue implements ring buffer based on bigqueue. +package bigqueue + +import ( + "fmt" + "math" + "os" + "path/filepath" + "sync" + "sync/atomic" + "time" + + "github.com/jhunters/bigqueue" + "github.com/pkg/errors" + "github.com/sirupsen/logrus" + grpcstatus "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" + + "github.com/percona/pmm/agent/models" + agenterrors "github.com/percona/pmm/agent/utils/errors" + "github.com/percona/pmm/api/agentpb" +) + +const ( + metaFileSize = 16 + 8 // represent FrontFileInfo size + MetaFileInfo size + indexEntrySize = 32 // represent index entry size +) + +var ( + ErrClosed = errors.New("cache closed") + + dataPageSize = 1024 * 1024 // represent page size for data entries + indexPageSize = dataPageSize / indexEntrySize // represent page size for index entries (default bigqueue ratio) + drainThreshold = int64(1024 * 1024) // represent threshold for preliminary draining + gcDuration = 10 * time.Second // represent gc ticker duration +) + +// Ring represent ring buffer based on bigqueue. +type Ring struct { + l *logrus.Entry + fq *bigqueue.FileQueue + wg sync.WaitGroup + + sendLock sync.RWMutex + recvLock sync.RWMutex + totalSize int64 // represent the limit after which old data will be overwritten + + sender atomic.Pointer[models.Sender] + + gcCh chan struct{} + drainCh chan struct{} + recvNotifyCh chan struct{} + establishCh chan struct{} + done chan struct{} +} + +// New creates/loads ring buffer. +func New(dir string, size uint32, l *logrus.Entry) (*Ring, error) { + err := initPaths(dir) + if err != nil { + return nil, err + } + dir, queueName := filepath.Split(dir) + if lastRuneIdx := len(dir) - 1; len(dir) > 0 && rune(dir[lastRuneIdx]) == filepath.Separator { + dir = dir[:lastRuneIdx] + } + if metaSize := uint32(metaFileSize + indexPageSize + dataPageSize); metaSize > size { + return nil, fmt.Errorf("cache size must be greater than '%d' bytes to store at least one entry", metaSize) + } + fq := &bigqueue.FileQueue{} + if err = fq.Open(dir, queueName, &bigqueue.Options{ + DataPageSize: dataPageSize, + IndexItemsPerPage: int(math.Log2(float64(indexPageSize) / indexEntrySize)), + }); err != nil { + return nil, err + } + out := &Ring{ + l: l, + fq: fq, + totalSize: int64(size), + drainCh: make(chan struct{}, 1), + gcCh: make(chan struct{}, 1), + establishCh: make(chan struct{}, 1), + recvNotifyCh: make(chan struct{}, 1), + done: make(chan struct{}), + } + out.gcRunner() + out.sendRunner() + if !out.isEmpty() { + asyncNotify(out.recvNotifyCh) + } + return out, nil +} + +// Send stores agent responses in cache on nil channel. +func (r *Ring) Send(resp *models.AgentResponse) error { + msg := &agentpb.AgentMessage{Id: resp.ID} + if resp.Payload != nil { + msg.Payload = resp.Payload.AgentMessageResponsePayload() + } + if resp.Status != nil { + msg.Status = resp.Status.Proto() + } + + var ( + err error + s = r.sender.Load() + ) + + r.recvLock.Lock() + defer r.recvLock.Unlock() + if r.isEmpty() && s != nil { + err = (*s).Send(resp) + if err != nil && errors.As(err, &agenterrors.ErrChanConn) { + if r.sender.CompareAndSwap(s, nil) { + asyncRelease(r.establishCh) + r.l.Debugf("sender released: %v", err) + } + } else { + return err + } + } + + r.push(msg) + return nil +} + +// SendAndWaitResponse stores AgentMessageRequestPayload on nil channel. +func (r *Ring) SendAndWaitResponse(payload agentpb.AgentRequestPayload) (agentpb.ServerResponsePayload, error) { //nolint:unparam,ireturn + var ( + err error + resp agentpb.ServerResponsePayload + s = r.sender.Load() + ) + + r.recvLock.Lock() + defer r.recvLock.Unlock() + if r.isEmpty() && s != nil { + resp, err = (*s).SendAndWaitResponse(payload) + if err != nil && errors.As(err, &agenterrors.ErrChanConn) { + if r.sender.CompareAndSwap(s, nil) { + asyncRelease(r.establishCh) + r.l.Debugf("sender released: %v", err) + } + } else { + return resp, err + } + } + + r.push(&agentpb.AgentMessage{Payload: payload.AgentMessageRequestPayload()}) + return &agentpb.StateChangedResponse{}, nil +} + +// SetSender check and set sender and notify sender loop. +func (r *Ring) SetSender(s models.Sender) { + r.sender.Store(&s) + asyncNotify(r.establishCh) + r.l.Debug("sender set") +} + +// Close closes cache. +func (r *Ring) Close() { + select { + case <-r.done: + default: + close(r.done) + r.wg.Wait() + if err := r.fq.Close(); err != nil { + r.l.Errorf("closing cache: %+v", err) + } + r.l.Info("cache closed") + } +} + +func (r *Ring) isEmpty() bool { + return r.fq.IsEmpty() +} + +func (r *Ring) push(msg *agentpb.AgentMessage) { + b, err := proto.Marshal(msg) + if err != nil { + r.l.Errorf("marshal proto while inserting message to cache: %+v", err) + return + } + size := int64(len(b)) + indexEntrySize + if size > r.totalSize { + r.l.Errorf("data size: '%d' overflows free cache space: '%d'", size, r.totalSize) + return + } + select { + case <-r.done: + return + default: + } + _, err = r.fq.Enqueue(b) + if err != nil { + r.l.Errorf("inserting to cache: %+v", err) + } + asyncNotify(r.recvNotifyCh) +} + +func (r *Ring) gcRunner() { + r.wg.Add(1) + go func() { + defer r.wg.Done() + ticker := time.NewTicker(gcDuration) + defer ticker.Stop() + for { + select { + case <-r.done: + r.doDrain() + return + case <-r.drainCh: + r.doDrain() + case <-ticker.C: + r.doDrain() + case <-r.gcCh: + r.sendLock.Lock() + r.runGC() + r.sendLock.Unlock() + } + } + }() +} + +func (r *Ring) doDrain() { + if overflow := r.size() + drainThreshold - r.totalSize; overflow > 0 { + r.sendLock.Lock() + r.drain(overflow) + r.runGC() + r.sendLock.Unlock() + } +} + +func (r *Ring) sendRunner() { + r.wg.Add(1) + go func() { + defer r.wg.Done() + for { + select { + case <-r.done: + return + case <-r.recvNotifyCh: + r.sendInLoop() + } + } + }() +} + +func (r *Ring) sendInLoop() { + var s *models.Sender + for { + s = r.sender.Load() + if s != nil { + break + } + select { + case <-r.done: + return + case <-r.establishCh: + continue + } + } + r.sendLock.Lock() + defer r.sendLock.Unlock() + var count int + for { + select { + case <-r.done: + return + default: + } + r.recvLock.Lock() + _, b, err := r.fq.Peek() + r.recvLock.Unlock() + if err != nil { + r.l.Errorf("reading entry from cache: %+v", err) + } + if b == nil { + break + } + var m agentpb.AgentMessage + if err := proto.Unmarshal(b, &m); err != nil { + r.l.Errorf("unmarshal entry from cache: %+v", err) + } else if err = r.send(*s, &m); err != nil { + if r.sender.CompareAndSwap(s, nil) { + asyncRelease(r.establishCh) + r.l.Debugf("sender released: %v", err) + } + break + } + r.recvLock.Lock() + r.fq.Skip(1) //nolint:errcheck + r.recvLock.Unlock() + count++ + } + if count > 0 { + asyncNotify(r.gcCh) + } +} + +// initPaths creates all paths for queue to use. Original repo creates directories with perm error. +func initPaths(dir string) error { + for _, path := range []string{ + "", + bigqueue.IndexFileName, + bigqueue.DataFileName, + bigqueue.MetaFileName, + bigqueue.FrontFileName, + } { + if err := os.MkdirAll(filepath.Join(dir, path), os.ModePerm); err != nil { + return err + } + } + return nil +} + +func (r *Ring) drain(amount int64) { + for size := int64(0); size < amount; { + r.recvLock.Lock() + _, b, err := r.fq.Dequeue() + r.recvLock.Unlock() + if err != nil { + r.l.Errorf("draining cache: %+v", err) + return + } + if b == nil { + return + } + size += int64(len(b)) + indexEntrySize + } +} + +func (r *Ring) size() int64 { + r.recvLock.Lock() + status := r.fq.Status() + r.recvLock.Unlock() + sum := status.FrontFileInfo.Size + status.MetaFileInfo.Size + for _, list := range status.IndexFileList { + sum += list.Size + } + for _, list := range status.DataFileList { + sum += list.Size + } + return sum +} + +func (r *Ring) runGC() { + r.recvLock.Lock() + defer r.recvLock.Unlock() + if err := r.fq.Gc(); err != nil { + r.l.Errorf("run gc: %+v", err) + } +} + +func (r *Ring) send(s models.Sender, m *agentpb.AgentMessage) error { + var err error + switch p := m.Payload.(type) { + // responses + case *agentpb.AgentMessage_StartAction: + err = s.Send(&models.AgentResponse{ID: m.Id, Status: grpcstatus.FromProto(m.Status), Payload: p.StartAction}) + case *agentpb.AgentMessage_StopAction: + err = s.Send(&models.AgentResponse{ID: m.Id, Status: grpcstatus.FromProto(m.Status), Payload: p.StopAction}) + case *agentpb.AgentMessage_PbmSwitchPitr: + err = s.Send(&models.AgentResponse{ID: m.Id, Status: grpcstatus.FromProto(m.Status), Payload: p.PbmSwitchPitr}) + case *agentpb.AgentMessage_StartJob: + err = s.Send(&models.AgentResponse{ID: m.Id, Status: grpcstatus.FromProto(m.Status), Payload: p.StartJob}) + case *agentpb.AgentMessage_JobStatus: + err = s.Send(&models.AgentResponse{ID: m.Id, Status: grpcstatus.FromProto(m.Status), Payload: p.JobStatus}) + case *agentpb.AgentMessage_GetVersions: + err = s.Send(&models.AgentResponse{ID: m.Id, Status: grpcstatus.FromProto(m.Status), Payload: p.GetVersions}) + case *agentpb.AgentMessage_JobProgress: + err = s.Send(&models.AgentResponse{ID: m.Id, Status: grpcstatus.FromProto(m.Status), Payload: p.JobProgress}) + case *agentpb.AgentMessage_StopJob: + err = s.Send(&models.AgentResponse{ID: m.Id, Status: grpcstatus.FromProto(m.Status), Payload: p.StopJob}) + case *agentpb.AgentMessage_CheckConnection: + err = s.Send(&models.AgentResponse{ID: m.Id, Status: grpcstatus.FromProto(m.Status), Payload: p.CheckConnection}) + case *agentpb.AgentMessage_JobResult: + err = s.Send(&models.AgentResponse{ID: m.Id, Status: grpcstatus.FromProto(m.Status), Payload: p.JobResult}) + case *agentpb.AgentMessage_AgentLogs: + err = s.Send(&models.AgentResponse{ID: m.Id, Status: grpcstatus.FromProto(m.Status), Payload: p.AgentLogs}) + case *agentpb.AgentMessage_SetState: + err = s.Send(&models.AgentResponse{ID: m.Id, Status: grpcstatus.FromProto(m.Status), Payload: p.SetState}) + case *agentpb.AgentMessage_Pong: + err = s.Send(&models.AgentResponse{ID: m.Id, Status: grpcstatus.FromProto(m.Status), Payload: p.Pong}) + // requests + case *agentpb.AgentMessage_ActionResult: + _, err = s.SendAndWaitResponse(p.ActionResult) + case *agentpb.AgentMessage_QanCollect: + _, err = s.SendAndWaitResponse(p.QanCollect) + case *agentpb.AgentMessage_StateChanged: + _, err = s.SendAndWaitResponse(p.StateChanged) + default: + r.l.Errorf("unknown message: %T", m) + return nil + } + if err != nil && errors.As(err, &agenterrors.ErrChanConn) { + return err + } + return nil +} + +func asyncNotify(ch chan struct{}) { + select { + case ch <- struct{}{}: + default: + } +} + +func asyncRelease(ch chan struct{}) { + select { + case <-ch: + default: + } +} diff --git a/agent/utils/buffer-ring/bigqueue/bigqueue_test.go b/agent/utils/buffer-ring/bigqueue/bigqueue_test.go new file mode 100644 index 0000000000..b153ed818e --- /dev/null +++ b/agent/utils/buffer-ring/bigqueue/bigqueue_test.go @@ -0,0 +1,266 @@ +// Copyright 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package bigqueue + +import ( + "bytes" + "io/fs" + "math/rand" + "os" + "path/filepath" + "runtime" + "strings" + "sync/atomic" + "testing" + "time" + + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + + "github.com/percona/pmm/agent/models" + "github.com/percona/pmm/api/agentpb" +) + +func TestMetaSizes(t *testing.T) { //nolint:tparallel + indexPageSize = 20 + t.Run("meta file size", func(t *testing.T) { + t.Parallel() + ring, err := New(filepath.Join(os.TempDir(), newRandomString(10)), uint32(dataPageSize+indexPageSize+metaFileSize), nil) + assert.NoError(t, err) + status := ring.fq.Status() + assert.Equal(t, int64(metaFileSize), status.FrontFileInfo.Size+status.MetaFileInfo.Size) + }) + t.Run("index entry size", func(t *testing.T) { + t.Parallel() + ring, err := New(filepath.Join(os.TempDir(), newRandomString(10)), uint32(dataPageSize+indexPageSize+metaFileSize), nil) + assert.NoError(t, err) + _, err = ring.fq.Enqueue([]byte("1")) + assert.NoError(t, err) + assert.Equal(t, int64(indexEntrySize), ring.fq.Status().IndexFileList[0].Size) + }) +} + +func TestNew(t *testing.T) { //nolint:tparallel + indexPageSize = 20 + t.Run("new with size less than meta", func(t *testing.T) { + t.Parallel() + _, err := New(filepath.Join(os.TempDir(), newRandomString(10)), uint32(dataPageSize+indexPageSize+metaFileSize)-1, nil) + assert.Error(t, err) + }) + t.Run("data size too big", func(t *testing.T) { + t.Parallel() + ring, log, cleanup := setupTest(t, filepath.Join(os.TempDir(), newRandomString(10)), uint32(dataPageSize+indexPageSize+metaFileSize)) + t.Cleanup(cleanup) + _, err := ring.SendAndWaitResponse(&agentpb.QANCollectRequest{MetricsBucket: []*agentpb.MetricsBucket{{ + Common: &agentpb.MetricsBucket_Common{Queryid: newRandomString(dataPageSize + indexPageSize + metaFileSize)}, + }}}) + assert.NoError(t, err) + assert.Equal(t, "level=error msg=\"data size: '1048668' overflows free cache space: '1048620'\" cache=test\n", log.String()) + }) +} + +type sender struct { + t *testing.T + i uint32 +} + +func (s *sender) Send(resp *models.AgentResponse) error { return nil } +func (s *sender) SendAndWaitResponse(payload agentpb.AgentRequestPayload) (agentpb.ServerResponsePayload, error) { + qan, ok := payload.(*agentpb.QANCollectRequest) + assert.Equal(s.t, true, ok) + assert.Equal(s.t, 1, len(qan.MetricsBucket)) + assert.Equal(s.t, atomic.LoadUint32(&s.i), qan.MetricsBucket[0].Common.PlaceholdersCount) + atomic.AddUint32(&s.i, 1) + return nil, nil +} + +func TestDrain(t *testing.T) { //nolint:tparallel + dataPageSize = indexEntrySize + indexPageSize = dataPageSize + payloadLen := indexEntrySize - 11 // queryId + proto = 32 + drainThreshold = 0 + + t.Run("push", func(t *testing.T) { + t.Parallel() + dir := filepath.Join(os.TempDir(), newRandomString(10)) + ring, log, cleanup := setupTest(t, dir, uint32(dataPageSize+indexPageSize)*3+metaFileSize) + t.Cleanup(cleanup) + + for i := uint32(1); i <= 4; i++ { + _, err := ring.SendAndWaitResponse(&agentpb.QANCollectRequest{MetricsBucket: []*agentpb.MetricsBucket{{ + Common: &agentpb.MetricsBucket_Common{PlaceholdersCount: i, Queryid: newRandomString(payloadLen)}, + }}}) + assert.NoError(t, err) + runtime.Gosched() + } + asyncNotify(ring.drainCh) + runtime.Gosched() + time.Sleep(1 * time.Second) + s := sender{ + i: uint32(2), // first must be drained + t: t, + } + ring.SetSender(&s) + time.Sleep(1 * time.Second) + assert.NotEqual(t, uint32(2), atomic.LoadUint32(&s.i)) + assert.Equal(t, -1, strings.LastIndex(log.String(), "level=error")) + }) + t.Run("shutdown", func(t *testing.T) { + t.Parallel() + dir := filepath.Join(os.TempDir(), newRandomString(10)) + ring, log, _ := setupTest(t, dir, uint32(dataPageSize+indexPageSize)*3+metaFileSize) + for i := uint32(1); i <= 4; i++ { + _, err := ring.SendAndWaitResponse(&agentpb.QANCollectRequest{MetricsBucket: []*agentpb.MetricsBucket{{ + Common: &agentpb.MetricsBucket_Common{PlaceholdersCount: i, Queryid: newRandomString(payloadLen)}, + }}}) + assert.NoError(t, err) + runtime.Gosched() + } + time.Sleep(1 * time.Second) + ring.Close() + assert.Equal(t, -1, strings.LastIndex(log.String(), "closing cache")) + + ring, log, cleanup := setupTest(t, dir, uint32(dataPageSize+indexPageSize)*3+metaFileSize) + t.Cleanup(cleanup) + s := sender{ + i: uint32(2), // first must be drained + t: t, + } + ring.SetSender(&s) + time.Sleep(1 * time.Second) + assert.NotEqual(t, uint32(2), atomic.LoadUint32(&s.i)) + assert.Equal(t, -1, strings.LastIndex(log.String(), "level=error")) + }) + t.Run("size", func(t *testing.T) { + t.Parallel() + dir := filepath.Join(os.TempDir(), newRandomString(10)) + ring, log, cleanup := setupTest(t, dir, uint32(dataPageSize+indexPageSize)*4+metaFileSize) + t.Cleanup(cleanup) + for i := uint32(1); i <= 5; i++ { + _, err := ring.SendAndWaitResponse(&agentpb.QANCollectRequest{MetricsBucket: []*agentpb.MetricsBucket{{ + Common: &agentpb.MetricsBucket_Common{PlaceholdersCount: i, Queryid: newRandomString(payloadLen)}, + }}}) + assert.NoError(t, err) + runtime.Gosched() + } + asyncNotify(ring.drainCh) + runtime.Gosched() + time.Sleep(1 * time.Second) + + // after push all messages + size, err := dirSize(dir) + assert.NoError(t, err) + assert.Equal(t, int64(344), size) + s := sender{ + i: uint32(2), // first must be drained + t: t, + } + ring.SetSender(&s) + time.Sleep(1 * time.Second) + assert.NotEqual(t, uint32(2), atomic.LoadUint32(&s.i)) + assert.Equal(t, -1, strings.LastIndex(log.String(), "level=error")) + + // after send + size, err = dirSize(dir) + assert.NoError(t, err) + assert.Equal(t, int64(indexPageSize+dataPageSize+metaFileSize), size) + }) +} + +func TestReadWrite(t *testing.T) { //nolint:tparallel + dataPageSize = indexEntrySize + indexPageSize = dataPageSize + payloadLen := indexEntrySize - 11 // queryId + proto = 32 + drainThreshold = 0 + + t.Run("async read write", func(t *testing.T) { + t.Parallel() + dir := filepath.Join(os.TempDir(), newRandomString(10)) + ring, log, cleanup := setupTest(t, dir, uint32(dataPageSize+indexPageSize)*10+metaFileSize) + t.Cleanup(cleanup) + + started := make(chan struct{}) + go func() { + close(started) + for i := uint32(1); i <= 10; i++ { + _, err := ring.SendAndWaitResponse(&agentpb.QANCollectRequest{MetricsBucket: []*agentpb.MetricsBucket{{ + Common: &agentpb.MetricsBucket_Common{PlaceholdersCount: i, Queryid: newRandomString(payloadLen)}, + }}}) + assert.NoError(t, err) + runtime.Gosched() + } + }() + <-started + s := sender{ + i: uint32(1), + t: t, + } + ring.SetSender(&s) + time.Sleep(1 * time.Second) + assert.NotEqual(t, uint32(1), atomic.LoadUint32(&s.i)) + assert.Equal(t, -1, strings.LastIndex(log.String(), "level=error")) + }) +} + +func newRandomString(length int) string { + r := rand.New(rand.NewSource(time.Now().UnixNano())) //nolint:gosec + const alp = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + b := make([]byte, length) + for i := range b { + b[i] = alp[r.Intn(len(alp))] + } + return string(b) +} + +func setupTest(t *testing.T, dir string, size uint32) (*Ring, *bytes.Buffer, func()) { + t.Helper() + var buf bytes.Buffer + testLogger := logrus.Logger{ + Out: &buf, + Level: logrus.ErrorLevel, + Formatter: &logrus.TextFormatter{ + DisableColors: true, + DisableTimestamp: true, + DisableSorting: true, + }, + } + out, err := New(dir, size, testLogger.WithField("cache", "test")) + assert.NoError(t, err) + cleanup := func() { + out.Close() + assert.Equal(t, -1, strings.LastIndex(buf.String(), "closing cache")) + assert.NoError(t, os.RemoveAll(dir)) + } + return out, &buf, cleanup +} + +func dirSize(path string) (int64, error) { + var size int64 + err := filepath.WalkDir(path, func(_ string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + if d.IsDir() { + return nil + } + fi, err := d.Info() + if err != nil { + return err + } + size += fi.Size() + return err + }) + return size, err +} diff --git a/agent/utils/errors/errors.go b/agent/utils/errors/errors.go index 55ca35f1f4..95b750564f 100644 --- a/agent/utils/errors/errors.go +++ b/agent/utils/errors/errors.go @@ -23,4 +23,24 @@ var ( // ErrActionQueueOverflow is returned when the agent is already running the maximum number of actions. ErrActionQueueOverflow = errors.New("action queue overflow") + // ErrChanConn is returned when the channel is closed. + ErrChanConn ChannelClosedError ) + +// NewChannelClosedError creates new channel connection closed error. +func NewChannelClosedError(err error) ChannelClosedError { + return ChannelClosedError{err} +} + +// ChannelClosedError is returned when the channel is closed. +type ChannelClosedError struct { + e error +} + +func (c ChannelClosedError) Error() string { + return c.e.Error() +} + +func (c ChannelClosedError) Unwrap() error { + return c.e +} diff --git a/agent/versioner/mock_exec_functions_test.go b/agent/versioner/mock_exec_functions_test.go index 511b8655f5..4912d643ba 100644 --- a/agent/versioner/mock_exec_functions_test.go +++ b/agent/versioner/mock_exec_functions_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package versioner diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index 99158daac5..f8a798a6cb 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -62,7 +62,7 @@ func TestAuth(t *testing.T) { req, _ := http.NewRequestWithContext(pmmapitests.Context, http.MethodGet, uri.String(), nil) resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck b, err := httputil.DumpResponse(resp, true) require.NoError(t, err) @@ -119,7 +119,7 @@ func TestSetup(t *testing.T) { req.Header.Set("X-Test-Must-Setup", "1") resp, b := doRequest(t, client, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck assert.Equal(t, 200, resp.StatusCode, "response:\n%s", b) assert.True(t, strings.HasPrefix(string(b), ``), string(b)) @@ -153,7 +153,7 @@ func TestSetup(t *testing.T) { req.Header.Set("X-Test-Must-Setup", "1") resp, b := doRequest(t, client, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck assert.Equal(t, code, resp.StatusCode, "response:\n%s", b) if code == 303 { @@ -179,7 +179,7 @@ func TestSetup(t *testing.T) { req.Header.Set("X-Test-Must-Setup", "1") resp, b := doRequest(t, client, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck assert.Equal(t, 200, resp.StatusCode, "response:\n%s", b) assert.Equal(t, "{}", string(b), "response:\n%s", b) @@ -214,7 +214,7 @@ func TestSwagger(t *testing.T) { require.NoError(t, err) resp, _ := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck require.NoError(t, err) assert.Equal(t, 200, resp.StatusCode) @@ -231,7 +231,7 @@ func TestSwagger(t *testing.T) { require.NoError(t, err) resp, _ := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck require.NoError(t, err) assert.Equal(t, 200, resp.StatusCode) @@ -318,7 +318,7 @@ func TestPermissions(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck assert.Equal(t, user.statusCode, resp.StatusCode) }) @@ -340,7 +340,7 @@ func TestPermissions(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck assert.Equal(t, user.statusCode, resp.StatusCode) }) @@ -360,7 +360,7 @@ func TestPermissions(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck assert.Equal(t, user.statusCode, resp.StatusCode) }) @@ -374,7 +374,7 @@ func doRequest(tb testing.TB, client *http.Client, req *http.Request) (*http.Res resp, err := client.Do(req) require.NoError(tb, err) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck b, err := io.ReadAll(resp.Body) require.NoError(tb, err) @@ -400,7 +400,7 @@ func deleteUser(t *testing.T, userID int) { require.NoError(t, err) resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete user, status code: %d, response: %s", resp.StatusCode, b) } @@ -426,7 +426,7 @@ func createUser(t *testing.T, login string) int { req.Header.Set("Content-Type", "application/json; charset=utf-8") resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to create user, status code: %d, response: %s", resp.StatusCode, b) var m map[string]interface{} @@ -453,7 +453,7 @@ func setRole(t *testing.T, userID int, role string) { req.Header.Set("Content-Type", "application/json; charset=utf-8") resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to set role for user, response: %s", b) } @@ -469,7 +469,7 @@ func deleteAPIKey(t *testing.T, apiKeyID int) { require.NoError(t, err) resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete API Key, status code: %d, response: %s", resp.StatusCode, b) } @@ -493,7 +493,7 @@ func createAPIKeyWithRole(t *testing.T, name, role string) (int, string) { req.Header.Set("Content-Type", "application/json; charset=utf-8") resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to create API key, status code: %d, response: %s", resp.StatusCode, b) @@ -509,7 +509,7 @@ func createAPIKeyWithRole(t *testing.T, name, role string) (int, string) { req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) resp1, b := doRequest(t, http.DefaultClient, req) - defer resp1.Body.Close() //nolint:gosec + defer resp1.Body.Close() //nolint:gosec,errcheck require.Equalf(t, http.StatusOK, resp1.StatusCode, "failed to get API key, status code: %d, response: %s", resp1.StatusCode, b) diff --git a/api-tests/server/logs_test.go b/api-tests/server/logs_test.go index 0cd981ec0b..7019fa57cb 100644 --- a/api-tests/server/logs_test.go +++ b/api-tests/server/logs_test.go @@ -43,10 +43,8 @@ func TestDownloadLogs(t *testing.T) { assert.NoError(t, err) expected := []string{ - "alertmanager.base.yml", "alertmanager.ini", "alertmanager.log", - "alertmanager.yml", "clickhouse-server.log", "client/list.txt", "client/pmm-admin-version.txt", diff --git a/api-tests/server/readyz_test.go b/api-tests/server/readyz_test.go index 25a05f13ad..066f401b82 100644 --- a/api-tests/server/readyz_test.go +++ b/api-tests/server/readyz_test.go @@ -52,7 +52,7 @@ func TestReadyz(t *testing.T) { req, _ := http.NewRequestWithContext(pmmapitests.Context, http.MethodGet, uri.String(), nil) resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck b, err := io.ReadAll(resp.Body) require.NoError(t, err) diff --git a/api-tests/server/version_test.go b/api-tests/server/version_test.go index 3ac20024b2..46dbbf9d95 100644 --- a/api-tests/server/version_test.go +++ b/api-tests/server/version_test.go @@ -50,7 +50,7 @@ func TestVersion(t *testing.T) { req, _ := http.NewRequestWithContext(pmmapitests.Context, http.MethodGet, uri.String(), nil) resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck b, err := io.ReadAll(resp.Body) require.NoError(t, err) diff --git a/api/agentpb/agent.go b/api/agentpb/agent.go index 74cc4969e1..1b59732ace 100644 --- a/api/agentpb/agent.go +++ b/api/agentpb/agent.go @@ -102,6 +102,10 @@ func (m *CheckConnectionResponse) AgentMessageResponsePayload() isAgentMessage_P return &AgentMessage_CheckConnection{CheckConnection: m} } +func (m *ServiceInfoResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn + return &AgentMessage_ServiceInfo{ServiceInfo: m} +} + func (m *JobStatusResponse) AgentMessageResponsePayload() isAgentMessage_Payload { //nolint:ireturn return &AgentMessage_JobStatus{JobStatus: m} } @@ -198,21 +202,31 @@ func (m *AgentLogsRequest) ServerMessageRequestPayload() isServerMessage_Payload return &ServerMessage_AgentLogs{AgentLogs: m} } +func (m *ServiceInfoRequest) ServerMessageRequestPayload() isServerMessage_Payload { //nolint:ireturn + return &ServerMessage_ServiceInfo{ServiceInfo: m} +} + // in alphabetical order. func (*ActionResultRequest) sealed() {} func (*ActionResultResponse) sealed() {} +func (*AgentLogsRequest) sealed() {} +func (*AgentLogsResponse) sealed() {} func (*CheckConnectionRequest) sealed() {} func (*CheckConnectionResponse) sealed() {} +func (*GetVersionsRequest) sealed() {} +func (*GetVersionsResponse) sealed() {} func (*JobProgress) sealed() {} func (*JobResult) sealed() {} func (*JobStatusRequest) sealed() {} func (*JobStatusResponse) sealed() {} -func (*AgentLogsRequest) sealed() {} -func (*AgentLogsResponse) sealed() {} +func (*PBMSwitchPITRRequest) sealed() {} +func (*PBMSwitchPITRResponse) sealed() {} func (*Ping) sealed() {} func (*Pong) sealed() {} func (*QANCollectRequest) sealed() {} func (*QANCollectResponse) sealed() {} +func (*ServiceInfoRequest) sealed() {} +func (*ServiceInfoResponse) sealed() {} func (*SetStateRequest) sealed() {} func (*SetStateResponse) sealed() {} func (*StartActionRequest) sealed() {} @@ -225,10 +239,6 @@ func (*StopActionRequest) sealed() {} func (*StopActionResponse) sealed() {} func (*StopJobRequest) sealed() {} func (*StopJobResponse) sealed() {} -func (*GetVersionsRequest) sealed() {} -func (*GetVersionsResponse) sealed() {} -func (*PBMSwitchPITRRequest) sealed() {} -func (*PBMSwitchPITRResponse) sealed() {} // check interfaces. var ( @@ -251,6 +261,7 @@ var ( _ AgentResponsePayload = (*JobStatusResponse)(nil) _ AgentResponsePayload = (*GetVersionsResponse)(nil) _ AgentResponsePayload = (*AgentLogsResponse)(nil) + _ AgentResponsePayload = (*ServiceInfoResponse)(nil) // A list of ServerMessage response payloads. _ ServerResponsePayload = (*Pong)(nil) @@ -270,6 +281,7 @@ var ( _ ServerRequestPayload = (*GetVersionsRequest)(nil) _ ServerRequestPayload = (*PBMSwitchPITRRequest)(nil) _ ServerRequestPayload = (*AgentLogsRequest)(nil) + _ ServerRequestPayload = (*ServiceInfoRequest)(nil) ) //go-sumtype:decl AgentParams diff --git a/api/agentpb/agent.pb.go b/api/agentpb/agent.pb.go index 81d6fde6bb..314a5563ca 100644 --- a/api/agentpb/agent.pb.go +++ b/api/agentpb/agent.pb.go @@ -1921,14 +1921,15 @@ func (x *CheckConnectionRequest) GetTlsSkipVerify() bool { return false } -// CheckConnectionResponse is an AgentMessage containing a result of connection check. +// CheckConnectionResponse is an AgentMessage containing the result of a connection check. type CheckConnectionResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // Error message if connection check failed. - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + // Deprecated: Marked as deprecated in agentpb/agent.proto. Stats *CheckConnectionResponse_Stats `protobuf:"bytes,2,opt,name=stats,proto3" json:"stats,omitempty"` } @@ -1971,6 +1972,7 @@ func (x *CheckConnectionResponse) GetError() string { return "" } +// Deprecated: Marked as deprecated in agentpb/agent.proto. func (x *CheckConnectionResponse) GetStats() *CheckConnectionResponse_Stats { if x != nil { return x.Stats @@ -1978,6 +1980,158 @@ func (x *CheckConnectionResponse) GetStats() *CheckConnectionResponse_Stats { return nil } +// ServiceInfoRequest is a ServerMessage that queries pmm-agent for database information. +type ServiceInfoRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Service type. + Type inventorypb.ServiceType `protobuf:"varint,1,opt,name=type,proto3,enum=inventory.ServiceType" json:"type,omitempty"` + // DSN for the service. May contain connection (dial) timeout. + Dsn string `protobuf:"bytes,2,opt,name=dsn,proto3" json:"dsn,omitempty"` + // Timeout for the whole request. + Timeout *durationpb.Duration `protobuf:"bytes,3,opt,name=timeout,proto3" json:"timeout,omitempty"` + // Contains files and their contents which can be used in DSN. + TextFiles *TextFiles `protobuf:"bytes,4,opt,name=text_files,json=textFiles,proto3" json:"text_files,omitempty"` + // TLS certificate wont be verified. + TlsSkipVerify bool `protobuf:"varint,5,opt,name=tls_skip_verify,json=tlsSkipVerify,proto3" json:"tls_skip_verify,omitempty"` +} + +func (x *ServiceInfoRequest) Reset() { + *x = ServiceInfoRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_agentpb_agent_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServiceInfoRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServiceInfoRequest) ProtoMessage() {} + +func (x *ServiceInfoRequest) ProtoReflect() protoreflect.Message { + mi := &file_agentpb_agent_proto_msgTypes[26] + 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 ServiceInfoRequest.ProtoReflect.Descriptor instead. +func (*ServiceInfoRequest) Descriptor() ([]byte, []int) { + return file_agentpb_agent_proto_rawDescGZIP(), []int{26} +} + +func (x *ServiceInfoRequest) GetType() inventorypb.ServiceType { + if x != nil { + return x.Type + } + return inventorypb.ServiceType(0) +} + +func (x *ServiceInfoRequest) GetDsn() string { + if x != nil { + return x.Dsn + } + return "" +} + +func (x *ServiceInfoRequest) GetTimeout() *durationpb.Duration { + if x != nil { + return x.Timeout + } + return nil +} + +func (x *ServiceInfoRequest) GetTextFiles() *TextFiles { + if x != nil { + return x.TextFiles + } + return nil +} + +func (x *ServiceInfoRequest) GetTlsSkipVerify() bool { + if x != nil { + return x.TlsSkipVerify + } + return false +} + +// ServiceInfoResponse is an AgentMessage containing information gathered from a service. +type ServiceInfoResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Error message if the request failed. + Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + // A number of MySQL tables, 0 if unknown. + TableCount int32 `protobuf:"varint,2,opt,name=table_count,json=tableCount,proto3" json:"table_count,omitempty"` + // Database server version. + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` +} + +func (x *ServiceInfoResponse) Reset() { + *x = ServiceInfoResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_agentpb_agent_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ServiceInfoResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServiceInfoResponse) ProtoMessage() {} + +func (x *ServiceInfoResponse) ProtoReflect() protoreflect.Message { + mi := &file_agentpb_agent_proto_msgTypes[27] + 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 ServiceInfoResponse.ProtoReflect.Descriptor instead. +func (*ServiceInfoResponse) Descriptor() ([]byte, []int) { + return file_agentpb_agent_proto_rawDescGZIP(), []int{27} +} + +func (x *ServiceInfoResponse) GetError() string { + if x != nil { + return x.Error + } + return "" +} + +func (x *ServiceInfoResponse) GetTableCount() int32 { + if x != nil { + return x.TableCount + } + return 0 +} + +func (x *ServiceInfoResponse) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + // JobStatusRequest is a ServerMessage asking pmm-agent for job status. type JobStatusRequest struct { state protoimpl.MessageState @@ -1990,7 +2144,7 @@ type JobStatusRequest struct { func (x *JobStatusRequest) Reset() { *x = JobStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[26] + mi := &file_agentpb_agent_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2003,7 +2157,7 @@ func (x *JobStatusRequest) String() string { func (*JobStatusRequest) ProtoMessage() {} func (x *JobStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[26] + mi := &file_agentpb_agent_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2016,7 +2170,7 @@ func (x *JobStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use JobStatusRequest.ProtoReflect.Descriptor instead. func (*JobStatusRequest) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{26} + return file_agentpb_agent_proto_rawDescGZIP(), []int{28} } func (x *JobStatusRequest) GetJobId() string { @@ -2038,7 +2192,7 @@ type JobStatusResponse struct { func (x *JobStatusResponse) Reset() { *x = JobStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[27] + mi := &file_agentpb_agent_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2051,7 +2205,7 @@ func (x *JobStatusResponse) String() string { func (*JobStatusResponse) ProtoMessage() {} func (x *JobStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[27] + mi := &file_agentpb_agent_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2064,7 +2218,7 @@ func (x *JobStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use JobStatusResponse.ProtoReflect.Descriptor instead. func (*JobStatusResponse) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{27} + return file_agentpb_agent_proto_rawDescGZIP(), []int{29} } func (x *JobStatusResponse) GetAlive() bool { @@ -2090,7 +2244,7 @@ type S3LocationConfig struct { func (x *S3LocationConfig) Reset() { *x = S3LocationConfig{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[28] + mi := &file_agentpb_agent_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2103,7 +2257,7 @@ func (x *S3LocationConfig) String() string { func (*S3LocationConfig) ProtoMessage() {} func (x *S3LocationConfig) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[28] + mi := &file_agentpb_agent_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2116,7 +2270,7 @@ func (x *S3LocationConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use S3LocationConfig.ProtoReflect.Descriptor instead. func (*S3LocationConfig) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{28} + return file_agentpb_agent_proto_rawDescGZIP(), []int{30} } func (x *S3LocationConfig) GetEndpoint() string { @@ -2166,7 +2320,7 @@ type FilesystemLocationConfig struct { func (x *FilesystemLocationConfig) Reset() { *x = FilesystemLocationConfig{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[29] + mi := &file_agentpb_agent_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2179,7 +2333,7 @@ func (x *FilesystemLocationConfig) String() string { func (*FilesystemLocationConfig) ProtoMessage() {} func (x *FilesystemLocationConfig) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[29] + mi := &file_agentpb_agent_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2192,7 +2346,7 @@ func (x *FilesystemLocationConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use FilesystemLocationConfig.ProtoReflect.Descriptor instead. func (*FilesystemLocationConfig) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{29} + return file_agentpb_agent_proto_rawDescGZIP(), []int{31} } func (x *FilesystemLocationConfig) GetPath() string { @@ -2223,7 +2377,7 @@ type StartJobRequest struct { func (x *StartJobRequest) Reset() { *x = StartJobRequest{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[30] + mi := &file_agentpb_agent_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2236,7 +2390,7 @@ func (x *StartJobRequest) String() string { func (*StartJobRequest) ProtoMessage() {} func (x *StartJobRequest) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[30] + mi := &file_agentpb_agent_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2249,7 +2403,7 @@ func (x *StartJobRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StartJobRequest.ProtoReflect.Descriptor instead. func (*StartJobRequest) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{30} + return file_agentpb_agent_proto_rawDescGZIP(), []int{32} } func (x *StartJobRequest) GetJobId() string { @@ -2341,7 +2495,7 @@ type StartJobResponse struct { func (x *StartJobResponse) Reset() { *x = StartJobResponse{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[31] + mi := &file_agentpb_agent_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2354,7 +2508,7 @@ func (x *StartJobResponse) String() string { func (*StartJobResponse) ProtoMessage() {} func (x *StartJobResponse) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[31] + mi := &file_agentpb_agent_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2367,7 +2521,7 @@ func (x *StartJobResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StartJobResponse.ProtoReflect.Descriptor instead. func (*StartJobResponse) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{31} + return file_agentpb_agent_proto_rawDescGZIP(), []int{33} } func (x *StartJobResponse) GetError() string { @@ -2389,7 +2543,7 @@ type StopJobRequest struct { func (x *StopJobRequest) Reset() { *x = StopJobRequest{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[32] + mi := &file_agentpb_agent_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2402,7 +2556,7 @@ func (x *StopJobRequest) String() string { func (*StopJobRequest) ProtoMessage() {} func (x *StopJobRequest) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[32] + mi := &file_agentpb_agent_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2415,7 +2569,7 @@ func (x *StopJobRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StopJobRequest.ProtoReflect.Descriptor instead. func (*StopJobRequest) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{32} + return file_agentpb_agent_proto_rawDescGZIP(), []int{34} } func (x *StopJobRequest) GetJobId() string { @@ -2435,7 +2589,7 @@ type StopJobResponse struct { func (x *StopJobResponse) Reset() { *x = StopJobResponse{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[33] + mi := &file_agentpb_agent_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2448,7 +2602,7 @@ func (x *StopJobResponse) String() string { func (*StopJobResponse) ProtoMessage() {} func (x *StopJobResponse) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[33] + mi := &file_agentpb_agent_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2461,7 +2615,7 @@ func (x *StopJobResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StopJobResponse.ProtoReflect.Descriptor instead. func (*StopJobResponse) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{33} + return file_agentpb_agent_proto_rawDescGZIP(), []int{35} } // JobResult represents job result. @@ -2485,7 +2639,7 @@ type JobResult struct { func (x *JobResult) Reset() { *x = JobResult{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[34] + mi := &file_agentpb_agent_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2498,7 +2652,7 @@ func (x *JobResult) String() string { func (*JobResult) ProtoMessage() {} func (x *JobResult) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[34] + mi := &file_agentpb_agent_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2511,7 +2665,7 @@ func (x *JobResult) ProtoReflect() protoreflect.Message { // Deprecated: Use JobResult.ProtoReflect.Descriptor instead. func (*JobResult) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{34} + return file_agentpb_agent_proto_rawDescGZIP(), []int{36} } func (x *JobResult) GetJobId() string { @@ -2623,7 +2777,7 @@ type JobProgress struct { func (x *JobProgress) Reset() { *x = JobProgress{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[35] + mi := &file_agentpb_agent_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2636,7 +2790,7 @@ func (x *JobProgress) String() string { func (*JobProgress) ProtoMessage() {} func (x *JobProgress) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[35] + mi := &file_agentpb_agent_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2649,7 +2803,7 @@ func (x *JobProgress) ProtoReflect() protoreflect.Message { // Deprecated: Use JobProgress.ProtoReflect.Descriptor instead. func (*JobProgress) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{35} + return file_agentpb_agent_proto_rawDescGZIP(), []int{37} } func (x *JobProgress) GetJobId() string { @@ -2728,7 +2882,7 @@ type GetVersionsRequest struct { func (x *GetVersionsRequest) Reset() { *x = GetVersionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[36] + mi := &file_agentpb_agent_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2741,7 +2895,7 @@ func (x *GetVersionsRequest) String() string { func (*GetVersionsRequest) ProtoMessage() {} func (x *GetVersionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[36] + mi := &file_agentpb_agent_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2754,7 +2908,7 @@ func (x *GetVersionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest.ProtoReflect.Descriptor instead. func (*GetVersionsRequest) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38} } func (x *GetVersionsRequest) GetSoftwares() []*GetVersionsRequest_Software { @@ -2776,7 +2930,7 @@ type GetVersionsResponse struct { func (x *GetVersionsResponse) Reset() { *x = GetVersionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[37] + mi := &file_agentpb_agent_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2789,7 +2943,7 @@ func (x *GetVersionsResponse) String() string { func (*GetVersionsResponse) ProtoMessage() {} func (x *GetVersionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[37] + mi := &file_agentpb_agent_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2802,7 +2956,7 @@ func (x *GetVersionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsResponse.ProtoReflect.Descriptor instead. func (*GetVersionsResponse) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{37} + return file_agentpb_agent_proto_rawDescGZIP(), []int{39} } func (x *GetVersionsResponse) GetVersions() []*GetVersionsResponse_Version { @@ -2843,13 +2997,14 @@ type AgentMessage struct { // *AgentMessage_GetVersions // *AgentMessage_PbmSwitchPitr // *AgentMessage_AgentLogs + // *AgentMessage_ServiceInfo Payload isAgentMessage_Payload `protobuf_oneof:"payload"` } func (x *AgentMessage) Reset() { *x = AgentMessage{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[38] + mi := &file_agentpb_agent_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2862,7 +3017,7 @@ func (x *AgentMessage) String() string { func (*AgentMessage) ProtoMessage() {} func (x *AgentMessage) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[38] + mi := &file_agentpb_agent_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2875,7 +3030,7 @@ func (x *AgentMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use AgentMessage.ProtoReflect.Descriptor instead. func (*AgentMessage) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{38} + return file_agentpb_agent_proto_rawDescGZIP(), []int{40} } func (x *AgentMessage) GetId() uint32 { @@ -3018,6 +3173,13 @@ func (x *AgentMessage) GetAgentLogs() *AgentLogsResponse { return nil } +func (x *AgentMessage) GetServiceInfo() *ServiceInfoResponse { + if x, ok := x.GetPayload().(*AgentMessage_ServiceInfo); ok { + return x.ServiceInfo + } + return nil +} + type isAgentMessage_Payload interface { isAgentMessage_Payload() } @@ -3092,6 +3254,10 @@ type AgentMessage_AgentLogs struct { AgentLogs *AgentLogsResponse `protobuf:"bytes,21,opt,name=agent_logs,json=agentLogs,proto3,oneof"` } +type AgentMessage_ServiceInfo struct { + ServiceInfo *ServiceInfoResponse `protobuf:"bytes,22,opt,name=service_info,json=serviceInfo,proto3,oneof"` +} + func (*AgentMessage_Ping) isAgentMessage_Payload() {} func (*AgentMessage_StateChanged) isAgentMessage_Payload() {} @@ -3126,6 +3292,8 @@ func (*AgentMessage_PbmSwitchPitr) isAgentMessage_Payload() {} func (*AgentMessage_AgentLogs) isAgentMessage_Payload() {} +func (*AgentMessage_ServiceInfo) isAgentMessage_Payload() {} + type ServerMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3155,13 +3323,14 @@ type ServerMessage struct { // *ServerMessage_GetVersions // *ServerMessage_PbmSwitchPitr // *ServerMessage_AgentLogs + // *ServerMessage_ServiceInfo Payload isServerMessage_Payload `protobuf_oneof:"payload"` } func (x *ServerMessage) Reset() { *x = ServerMessage{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[39] + mi := &file_agentpb_agent_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3174,7 +3343,7 @@ func (x *ServerMessage) String() string { func (*ServerMessage) ProtoMessage() {} func (x *ServerMessage) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[39] + mi := &file_agentpb_agent_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3187,7 +3356,7 @@ func (x *ServerMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ServerMessage.ProtoReflect.Descriptor instead. func (*ServerMessage) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{39} + return file_agentpb_agent_proto_rawDescGZIP(), []int{41} } func (x *ServerMessage) GetId() uint32 { @@ -3316,6 +3485,13 @@ func (x *ServerMessage) GetAgentLogs() *AgentLogsRequest { return nil } +func (x *ServerMessage) GetServiceInfo() *ServiceInfoRequest { + if x, ok := x.GetPayload().(*ServerMessage_ServiceInfo); ok { + return x.ServiceInfo + } + return nil +} + type isServerMessage_Payload interface { isServerMessage_Payload() } @@ -3382,6 +3558,10 @@ type ServerMessage_AgentLogs struct { AgentLogs *AgentLogsRequest `protobuf:"bytes,19,opt,name=agent_logs,json=agentLogs,proto3,oneof"` } +type ServerMessage_ServiceInfo struct { + ServiceInfo *ServiceInfoRequest `protobuf:"bytes,20,opt,name=service_info,json=serviceInfo,proto3,oneof"` +} + func (*ServerMessage_Pong) isServerMessage_Payload() {} func (*ServerMessage_StateChanged) isServerMessage_Payload() {} @@ -3412,6 +3592,8 @@ func (*ServerMessage_PbmSwitchPitr) isServerMessage_Payload() {} func (*ServerMessage_AgentLogs) isServerMessage_Payload() {} +func (*ServerMessage_ServiceInfo) isServerMessage_Payload() {} + // AgentProcess describes desired configuration of a single agent process started by pmm-agent. type SetStateRequest_AgentProcess struct { state protoimpl.MessageState @@ -3430,7 +3612,7 @@ type SetStateRequest_AgentProcess struct { func (x *SetStateRequest_AgentProcess) Reset() { *x = SetStateRequest_AgentProcess{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[41] + mi := &file_agentpb_agent_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3443,7 +3625,7 @@ func (x *SetStateRequest_AgentProcess) String() string { func (*SetStateRequest_AgentProcess) ProtoMessage() {} func (x *SetStateRequest_AgentProcess) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[41] + mi := &file_agentpb_agent_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3535,7 +3717,7 @@ type SetStateRequest_BuiltinAgent struct { func (x *SetStateRequest_BuiltinAgent) Reset() { *x = SetStateRequest_BuiltinAgent{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[43] + mi := &file_agentpb_agent_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3548,7 +3730,7 @@ func (x *SetStateRequest_BuiltinAgent) String() string { func (*SetStateRequest_BuiltinAgent) ProtoMessage() {} func (x *SetStateRequest_BuiltinAgent) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[43] + mi := &file_agentpb_agent_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3648,7 +3830,7 @@ type StartActionRequest_MySQLExplainParams struct { func (x *StartActionRequest_MySQLExplainParams) Reset() { *x = StartActionRequest_MySQLExplainParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[47] + mi := &file_agentpb_agent_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3661,7 +3843,7 @@ func (x *StartActionRequest_MySQLExplainParams) String() string { func (*StartActionRequest_MySQLExplainParams) ProtoMessage() {} func (x *StartActionRequest_MySQLExplainParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[47] + mi := &file_agentpb_agent_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3744,7 +3926,7 @@ type StartActionRequest_MySQLShowCreateTableParams struct { func (x *StartActionRequest_MySQLShowCreateTableParams) Reset() { *x = StartActionRequest_MySQLShowCreateTableParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[48] + mi := &file_agentpb_agent_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3757,7 +3939,7 @@ func (x *StartActionRequest_MySQLShowCreateTableParams) String() string { func (*StartActionRequest_MySQLShowCreateTableParams) ProtoMessage() {} func (x *StartActionRequest_MySQLShowCreateTableParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[48] + mi := &file_agentpb_agent_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3819,7 +4001,7 @@ type StartActionRequest_MySQLShowTableStatusParams struct { func (x *StartActionRequest_MySQLShowTableStatusParams) Reset() { *x = StartActionRequest_MySQLShowTableStatusParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[49] + mi := &file_agentpb_agent_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3832,7 +4014,7 @@ func (x *StartActionRequest_MySQLShowTableStatusParams) String() string { func (*StartActionRequest_MySQLShowTableStatusParams) ProtoMessage() {} func (x *StartActionRequest_MySQLShowTableStatusParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[49] + mi := &file_agentpb_agent_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3894,7 +4076,7 @@ type StartActionRequest_MySQLShowIndexParams struct { func (x *StartActionRequest_MySQLShowIndexParams) Reset() { *x = StartActionRequest_MySQLShowIndexParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[50] + mi := &file_agentpb_agent_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3907,7 +4089,7 @@ func (x *StartActionRequest_MySQLShowIndexParams) String() string { func (*StartActionRequest_MySQLShowIndexParams) ProtoMessage() {} func (x *StartActionRequest_MySQLShowIndexParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[50] + mi := &file_agentpb_agent_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3969,7 +4151,7 @@ type StartActionRequest_PostgreSQLShowCreateTableParams struct { func (x *StartActionRequest_PostgreSQLShowCreateTableParams) Reset() { *x = StartActionRequest_PostgreSQLShowCreateTableParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[51] + mi := &file_agentpb_agent_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3982,7 +4164,7 @@ func (x *StartActionRequest_PostgreSQLShowCreateTableParams) String() string { func (*StartActionRequest_PostgreSQLShowCreateTableParams) ProtoMessage() {} func (x *StartActionRequest_PostgreSQLShowCreateTableParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[51] + mi := &file_agentpb_agent_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4044,7 +4226,7 @@ type StartActionRequest_PostgreSQLShowIndexParams struct { func (x *StartActionRequest_PostgreSQLShowIndexParams) Reset() { *x = StartActionRequest_PostgreSQLShowIndexParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[52] + mi := &file_agentpb_agent_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4057,7 +4239,7 @@ func (x *StartActionRequest_PostgreSQLShowIndexParams) String() string { func (*StartActionRequest_PostgreSQLShowIndexParams) ProtoMessage() {} func (x *StartActionRequest_PostgreSQLShowIndexParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[52] + mi := &file_agentpb_agent_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4118,7 +4300,7 @@ type StartActionRequest_MongoDBExplainParams struct { func (x *StartActionRequest_MongoDBExplainParams) Reset() { *x = StartActionRequest_MongoDBExplainParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[53] + mi := &file_agentpb_agent_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4131,7 +4313,7 @@ func (x *StartActionRequest_MongoDBExplainParams) String() string { func (*StartActionRequest_MongoDBExplainParams) ProtoMessage() {} func (x *StartActionRequest_MongoDBExplainParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[53] + mi := &file_agentpb_agent_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4178,7 +4360,7 @@ type StartActionRequest_PTSummaryParams struct { func (x *StartActionRequest_PTSummaryParams) Reset() { *x = StartActionRequest_PTSummaryParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[54] + mi := &file_agentpb_agent_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4191,7 +4373,7 @@ func (x *StartActionRequest_PTSummaryParams) String() string { func (*StartActionRequest_PTSummaryParams) ProtoMessage() {} func (x *StartActionRequest_PTSummaryParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[54] + mi := &file_agentpb_agent_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4222,7 +4404,7 @@ type StartActionRequest_PTPgSummaryParams struct { func (x *StartActionRequest_PTPgSummaryParams) Reset() { *x = StartActionRequest_PTPgSummaryParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[55] + mi := &file_agentpb_agent_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4235,7 +4417,7 @@ func (x *StartActionRequest_PTPgSummaryParams) String() string { func (*StartActionRequest_PTPgSummaryParams) ProtoMessage() {} func (x *StartActionRequest_PTPgSummaryParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[55] + mi := &file_agentpb_agent_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4294,7 +4476,7 @@ type StartActionRequest_PTMongoDBSummaryParams struct { func (x *StartActionRequest_PTMongoDBSummaryParams) Reset() { *x = StartActionRequest_PTMongoDBSummaryParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[56] + mi := &file_agentpb_agent_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4307,7 +4489,7 @@ func (x *StartActionRequest_PTMongoDBSummaryParams) String() string { func (*StartActionRequest_PTMongoDBSummaryParams) ProtoMessage() {} func (x *StartActionRequest_PTMongoDBSummaryParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[56] + mi := &file_agentpb_agent_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4367,7 +4549,7 @@ type StartActionRequest_PTMySQLSummaryParams struct { func (x *StartActionRequest_PTMySQLSummaryParams) Reset() { *x = StartActionRequest_PTMySQLSummaryParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[57] + mi := &file_agentpb_agent_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4380,7 +4562,7 @@ func (x *StartActionRequest_PTMySQLSummaryParams) String() string { func (*StartActionRequest_PTMySQLSummaryParams) ProtoMessage() {} func (x *StartActionRequest_PTMySQLSummaryParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[57] + mi := &file_agentpb_agent_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4450,7 +4632,7 @@ type StartActionRequest_MySQLQueryShowParams struct { func (x *StartActionRequest_MySQLQueryShowParams) Reset() { *x = StartActionRequest_MySQLQueryShowParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[58] + mi := &file_agentpb_agent_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4463,7 +4645,7 @@ func (x *StartActionRequest_MySQLQueryShowParams) String() string { func (*StartActionRequest_MySQLQueryShowParams) ProtoMessage() {} func (x *StartActionRequest_MySQLQueryShowParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[58] + mi := &file_agentpb_agent_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4526,7 +4708,7 @@ type StartActionRequest_MySQLQuerySelectParams struct { func (x *StartActionRequest_MySQLQuerySelectParams) Reset() { *x = StartActionRequest_MySQLQuerySelectParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[59] + mi := &file_agentpb_agent_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4539,7 +4721,7 @@ func (x *StartActionRequest_MySQLQuerySelectParams) String() string { func (*StartActionRequest_MySQLQuerySelectParams) ProtoMessage() {} func (x *StartActionRequest_MySQLQuerySelectParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[59] + mi := &file_agentpb_agent_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4600,7 +4782,7 @@ type StartActionRequest_PostgreSQLQueryShowParams struct { func (x *StartActionRequest_PostgreSQLQueryShowParams) Reset() { *x = StartActionRequest_PostgreSQLQueryShowParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[60] + mi := &file_agentpb_agent_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4613,7 +4795,7 @@ func (x *StartActionRequest_PostgreSQLQueryShowParams) String() string { func (*StartActionRequest_PostgreSQLQueryShowParams) ProtoMessage() {} func (x *StartActionRequest_PostgreSQLQueryShowParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[60] + mi := &file_agentpb_agent_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4669,7 +4851,7 @@ type StartActionRequest_PostgreSQLQuerySelectParams struct { func (x *StartActionRequest_PostgreSQLQuerySelectParams) Reset() { *x = StartActionRequest_PostgreSQLQuerySelectParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[61] + mi := &file_agentpb_agent_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4682,7 +4864,7 @@ func (x *StartActionRequest_PostgreSQLQuerySelectParams) String() string { func (*StartActionRequest_PostgreSQLQuerySelectParams) ProtoMessage() {} func (x *StartActionRequest_PostgreSQLQuerySelectParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[61] + mi := &file_agentpb_agent_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4742,7 +4924,7 @@ type StartActionRequest_MongoDBQueryGetParameterParams struct { func (x *StartActionRequest_MongoDBQueryGetParameterParams) Reset() { *x = StartActionRequest_MongoDBQueryGetParameterParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[62] + mi := &file_agentpb_agent_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4755,7 +4937,7 @@ func (x *StartActionRequest_MongoDBQueryGetParameterParams) String() string { func (*StartActionRequest_MongoDBQueryGetParameterParams) ProtoMessage() {} func (x *StartActionRequest_MongoDBQueryGetParameterParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[62] + mi := &file_agentpb_agent_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4801,7 +4983,7 @@ type StartActionRequest_MongoDBQueryBuildInfoParams struct { func (x *StartActionRequest_MongoDBQueryBuildInfoParams) Reset() { *x = StartActionRequest_MongoDBQueryBuildInfoParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[63] + mi := &file_agentpb_agent_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4814,7 +4996,7 @@ func (x *StartActionRequest_MongoDBQueryBuildInfoParams) String() string { func (*StartActionRequest_MongoDBQueryBuildInfoParams) ProtoMessage() {} func (x *StartActionRequest_MongoDBQueryBuildInfoParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[63] + mi := &file_agentpb_agent_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4860,7 +5042,7 @@ type StartActionRequest_MongoDBQueryGetCmdLineOptsParams struct { func (x *StartActionRequest_MongoDBQueryGetCmdLineOptsParams) Reset() { *x = StartActionRequest_MongoDBQueryGetCmdLineOptsParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[64] + mi := &file_agentpb_agent_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4873,7 +5055,7 @@ func (x *StartActionRequest_MongoDBQueryGetCmdLineOptsParams) String() string { func (*StartActionRequest_MongoDBQueryGetCmdLineOptsParams) ProtoMessage() {} func (x *StartActionRequest_MongoDBQueryGetCmdLineOptsParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[64] + mi := &file_agentpb_agent_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4919,7 +5101,7 @@ type StartActionRequest_MongoDBQueryReplSetGetStatusParams struct { func (x *StartActionRequest_MongoDBQueryReplSetGetStatusParams) Reset() { *x = StartActionRequest_MongoDBQueryReplSetGetStatusParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[65] + mi := &file_agentpb_agent_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4932,7 +5114,7 @@ func (x *StartActionRequest_MongoDBQueryReplSetGetStatusParams) String() string func (*StartActionRequest_MongoDBQueryReplSetGetStatusParams) ProtoMessage() {} func (x *StartActionRequest_MongoDBQueryReplSetGetStatusParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[65] + mi := &file_agentpb_agent_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4978,7 +5160,7 @@ type StartActionRequest_MongoDBQueryGetDiagnosticDataParams struct { func (x *StartActionRequest_MongoDBQueryGetDiagnosticDataParams) Reset() { *x = StartActionRequest_MongoDBQueryGetDiagnosticDataParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[66] + mi := &file_agentpb_agent_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4991,7 +5173,7 @@ func (x *StartActionRequest_MongoDBQueryGetDiagnosticDataParams) String() string func (*StartActionRequest_MongoDBQueryGetDiagnosticDataParams) ProtoMessage() {} func (x *StartActionRequest_MongoDBQueryGetDiagnosticDataParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[66] + mi := &file_agentpb_agent_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5033,7 +5215,7 @@ type StartActionRequest_RestartSystemServiceParams struct { func (x *StartActionRequest_RestartSystemServiceParams) Reset() { *x = StartActionRequest_RestartSystemServiceParams{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[67] + mi := &file_agentpb_agent_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5046,7 +5228,7 @@ func (x *StartActionRequest_RestartSystemServiceParams) String() string { func (*StartActionRequest_RestartSystemServiceParams) ProtoMessage() {} func (x *StartActionRequest_RestartSystemServiceParams) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[67] + mi := &file_agentpb_agent_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5082,7 +5264,7 @@ type CheckConnectionResponse_Stats struct { func (x *CheckConnectionResponse_Stats) Reset() { *x = CheckConnectionResponse_Stats{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[68] + mi := &file_agentpb_agent_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5095,7 +5277,7 @@ func (x *CheckConnectionResponse_Stats) String() string { func (*CheckConnectionResponse_Stats) ProtoMessage() {} func (x *CheckConnectionResponse_Stats) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[68] + mi := &file_agentpb_agent_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5149,7 +5331,7 @@ type StartJobRequest_MySQLBackup struct { func (x *StartJobRequest_MySQLBackup) Reset() { *x = StartJobRequest_MySQLBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[69] + mi := &file_agentpb_agent_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5162,7 +5344,7 @@ func (x *StartJobRequest_MySQLBackup) String() string { func (*StartJobRequest_MySQLBackup) ProtoMessage() {} func (x *StartJobRequest_MySQLBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[69] + mi := &file_agentpb_agent_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5175,7 +5357,7 @@ func (x *StartJobRequest_MySQLBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use StartJobRequest_MySQLBackup.ProtoReflect.Descriptor instead. func (*StartJobRequest_MySQLBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{30, 0} + return file_agentpb_agent_proto_rawDescGZIP(), []int{32, 0} } func (x *StartJobRequest_MySQLBackup) GetUser() string { @@ -5274,7 +5456,7 @@ type StartJobRequest_MySQLRestoreBackup struct { func (x *StartJobRequest_MySQLRestoreBackup) Reset() { *x = StartJobRequest_MySQLRestoreBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[70] + mi := &file_agentpb_agent_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5287,7 +5469,7 @@ func (x *StartJobRequest_MySQLRestoreBackup) String() string { func (*StartJobRequest_MySQLRestoreBackup) ProtoMessage() {} func (x *StartJobRequest_MySQLRestoreBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[70] + mi := &file_agentpb_agent_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5300,7 +5482,7 @@ func (x *StartJobRequest_MySQLRestoreBackup) ProtoReflect() protoreflect.Message // Deprecated: Use StartJobRequest_MySQLRestoreBackup.ProtoReflect.Descriptor instead. func (*StartJobRequest_MySQLRestoreBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{30, 1} + return file_agentpb_agent_proto_rawDescGZIP(), []int{32, 1} } func (x *StartJobRequest_MySQLRestoreBackup) GetServiceId() string { @@ -5400,7 +5582,7 @@ type StartJobRequest_MongoDBBackup struct { func (x *StartJobRequest_MongoDBBackup) Reset() { *x = StartJobRequest_MongoDBBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[71] + mi := &file_agentpb_agent_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5413,7 +5595,7 @@ func (x *StartJobRequest_MongoDBBackup) String() string { func (*StartJobRequest_MongoDBBackup) ProtoMessage() {} func (x *StartJobRequest_MongoDBBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[71] + mi := &file_agentpb_agent_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5426,7 +5608,7 @@ func (x *StartJobRequest_MongoDBBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use StartJobRequest_MongoDBBackup.ProtoReflect.Descriptor instead. func (*StartJobRequest_MongoDBBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{30, 2} + return file_agentpb_agent_proto_rawDescGZIP(), []int{32, 2} } // Deprecated: Marked as deprecated in agentpb/agent.proto. @@ -5600,7 +5782,7 @@ type StartJobRequest_MongoDBRestoreBackup struct { func (x *StartJobRequest_MongoDBRestoreBackup) Reset() { *x = StartJobRequest_MongoDBRestoreBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[72] + mi := &file_agentpb_agent_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5613,7 +5795,7 @@ func (x *StartJobRequest_MongoDBRestoreBackup) String() string { func (*StartJobRequest_MongoDBRestoreBackup) ProtoMessage() {} func (x *StartJobRequest_MongoDBRestoreBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[72] + mi := &file_agentpb_agent_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5626,7 +5808,7 @@ func (x *StartJobRequest_MongoDBRestoreBackup) ProtoReflect() protoreflect.Messa // Deprecated: Use StartJobRequest_MongoDBRestoreBackup.ProtoReflect.Descriptor instead. func (*StartJobRequest_MongoDBRestoreBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{30, 3} + return file_agentpb_agent_proto_rawDescGZIP(), []int{32, 3} } // Deprecated: Marked as deprecated in agentpb/agent.proto. @@ -5762,7 +5944,7 @@ type JobResult_Error struct { func (x *JobResult_Error) Reset() { *x = JobResult_Error{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[73] + mi := &file_agentpb_agent_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5775,7 +5957,7 @@ func (x *JobResult_Error) String() string { func (*JobResult_Error) ProtoMessage() {} func (x *JobResult_Error) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[73] + mi := &file_agentpb_agent_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5788,7 +5970,7 @@ func (x *JobResult_Error) ProtoReflect() protoreflect.Message { // Deprecated: Use JobResult_Error.ProtoReflect.Descriptor instead. func (*JobResult_Error) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{34, 0} + return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 0} } func (x *JobResult_Error) GetMessage() string { @@ -5812,7 +5994,7 @@ type JobResult_MongoDBBackup struct { func (x *JobResult_MongoDBBackup) Reset() { *x = JobResult_MongoDBBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[74] + mi := &file_agentpb_agent_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5825,7 +6007,7 @@ func (x *JobResult_MongoDBBackup) String() string { func (*JobResult_MongoDBBackup) ProtoMessage() {} func (x *JobResult_MongoDBBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[74] + mi := &file_agentpb_agent_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5838,7 +6020,7 @@ func (x *JobResult_MongoDBBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use JobResult_MongoDBBackup.ProtoReflect.Descriptor instead. func (*JobResult_MongoDBBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{34, 1} + return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 1} } func (x *JobResult_MongoDBBackup) GetIsShardedCluster() bool { @@ -5868,7 +6050,7 @@ type JobResult_MySQLBackup struct { func (x *JobResult_MySQLBackup) Reset() { *x = JobResult_MySQLBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[75] + mi := &file_agentpb_agent_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5881,7 +6063,7 @@ func (x *JobResult_MySQLBackup) String() string { func (*JobResult_MySQLBackup) ProtoMessage() {} func (x *JobResult_MySQLBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[75] + mi := &file_agentpb_agent_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5894,7 +6076,7 @@ func (x *JobResult_MySQLBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use JobResult_MySQLBackup.ProtoReflect.Descriptor instead. func (*JobResult_MySQLBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{34, 2} + return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 2} } func (x *JobResult_MySQLBackup) GetMetadata() *backup.Metadata { @@ -5914,7 +6096,7 @@ type JobResult_MySQLRestoreBackup struct { func (x *JobResult_MySQLRestoreBackup) Reset() { *x = JobResult_MySQLRestoreBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[76] + mi := &file_agentpb_agent_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5927,7 +6109,7 @@ func (x *JobResult_MySQLRestoreBackup) String() string { func (*JobResult_MySQLRestoreBackup) ProtoMessage() {} func (x *JobResult_MySQLRestoreBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[76] + mi := &file_agentpb_agent_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5940,7 +6122,7 @@ func (x *JobResult_MySQLRestoreBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use JobResult_MySQLRestoreBackup.ProtoReflect.Descriptor instead. func (*JobResult_MySQLRestoreBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{34, 3} + return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 3} } // MongoDBRestoreBackup contains result for MongoDB restore backup job. @@ -5953,7 +6135,7 @@ type JobResult_MongoDBRestoreBackup struct { func (x *JobResult_MongoDBRestoreBackup) Reset() { *x = JobResult_MongoDBRestoreBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[77] + mi := &file_agentpb_agent_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5966,7 +6148,7 @@ func (x *JobResult_MongoDBRestoreBackup) String() string { func (*JobResult_MongoDBRestoreBackup) ProtoMessage() {} func (x *JobResult_MongoDBRestoreBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[77] + mi := &file_agentpb_agent_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5979,7 +6161,7 @@ func (x *JobResult_MongoDBRestoreBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use JobResult_MongoDBRestoreBackup.ProtoReflect.Descriptor instead. func (*JobResult_MongoDBRestoreBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{34, 4} + return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 4} } // MySQLBackup contains backup job status update. @@ -5992,7 +6174,7 @@ type JobProgress_MySQLBackup struct { func (x *JobProgress_MySQLBackup) Reset() { *x = JobProgress_MySQLBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[78] + mi := &file_agentpb_agent_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6005,7 +6187,7 @@ func (x *JobProgress_MySQLBackup) String() string { func (*JobProgress_MySQLBackup) ProtoMessage() {} func (x *JobProgress_MySQLBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[78] + mi := &file_agentpb_agent_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6018,7 +6200,7 @@ func (x *JobProgress_MySQLBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use JobProgress_MySQLBackup.ProtoReflect.Descriptor instead. func (*JobProgress_MySQLBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{35, 0} + return file_agentpb_agent_proto_rawDescGZIP(), []int{37, 0} } // MySQLRestoreBackup contains restore backup job status update. @@ -6031,7 +6213,7 @@ type JobProgress_MySQLRestoreBackup struct { func (x *JobProgress_MySQLRestoreBackup) Reset() { *x = JobProgress_MySQLRestoreBackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[79] + mi := &file_agentpb_agent_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6044,7 +6226,7 @@ func (x *JobProgress_MySQLRestoreBackup) String() string { func (*JobProgress_MySQLRestoreBackup) ProtoMessage() {} func (x *JobProgress_MySQLRestoreBackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[79] + mi := &file_agentpb_agent_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6057,7 +6239,7 @@ func (x *JobProgress_MySQLRestoreBackup) ProtoReflect() protoreflect.Message { // Deprecated: Use JobProgress_MySQLRestoreBackup.ProtoReflect.Descriptor instead. func (*JobProgress_MySQLRestoreBackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{35, 1} + return file_agentpb_agent_proto_rawDescGZIP(), []int{37, 1} } // Logs contains generic logs from job. @@ -6074,7 +6256,7 @@ type JobProgress_Logs struct { func (x *JobProgress_Logs) Reset() { *x = JobProgress_Logs{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[80] + mi := &file_agentpb_agent_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6087,7 +6269,7 @@ func (x *JobProgress_Logs) String() string { func (*JobProgress_Logs) ProtoMessage() {} func (x *JobProgress_Logs) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[80] + mi := &file_agentpb_agent_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6100,7 +6282,7 @@ func (x *JobProgress_Logs) ProtoReflect() protoreflect.Message { // Deprecated: Use JobProgress_Logs.ProtoReflect.Descriptor instead. func (*JobProgress_Logs) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{35, 2} + return file_agentpb_agent_proto_rawDescGZIP(), []int{37, 2} } func (x *JobProgress_Logs) GetChunkId() uint32 { @@ -6134,7 +6316,7 @@ type GetVersionsRequest_MySQLd struct { func (x *GetVersionsRequest_MySQLd) Reset() { *x = GetVersionsRequest_MySQLd{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[81] + mi := &file_agentpb_agent_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6147,7 +6329,7 @@ func (x *GetVersionsRequest_MySQLd) String() string { func (*GetVersionsRequest_MySQLd) ProtoMessage() {} func (x *GetVersionsRequest_MySQLd) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[81] + mi := &file_agentpb_agent_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6160,7 +6342,7 @@ func (x *GetVersionsRequest_MySQLd) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_MySQLd.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_MySQLd) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 0} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 0} } // Xtrabackup is used for xtrabackup binary version retrieving. @@ -6173,7 +6355,7 @@ type GetVersionsRequest_Xtrabackup struct { func (x *GetVersionsRequest_Xtrabackup) Reset() { *x = GetVersionsRequest_Xtrabackup{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[82] + mi := &file_agentpb_agent_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6186,7 +6368,7 @@ func (x *GetVersionsRequest_Xtrabackup) String() string { func (*GetVersionsRequest_Xtrabackup) ProtoMessage() {} func (x *GetVersionsRequest_Xtrabackup) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[82] + mi := &file_agentpb_agent_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6199,7 +6381,7 @@ func (x *GetVersionsRequest_Xtrabackup) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_Xtrabackup.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_Xtrabackup) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 1} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 1} } // Xbcloud is used for xbcloud binary version retrieving. @@ -6212,7 +6394,7 @@ type GetVersionsRequest_Xbcloud struct { func (x *GetVersionsRequest_Xbcloud) Reset() { *x = GetVersionsRequest_Xbcloud{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[83] + mi := &file_agentpb_agent_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6225,7 +6407,7 @@ func (x *GetVersionsRequest_Xbcloud) String() string { func (*GetVersionsRequest_Xbcloud) ProtoMessage() {} func (x *GetVersionsRequest_Xbcloud) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[83] + mi := &file_agentpb_agent_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6238,7 +6420,7 @@ func (x *GetVersionsRequest_Xbcloud) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_Xbcloud.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_Xbcloud) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 2} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 2} } // Qpress is used for qpress binary version retrieving. @@ -6251,7 +6433,7 @@ type GetVersionsRequest_Qpress struct { func (x *GetVersionsRequest_Qpress) Reset() { *x = GetVersionsRequest_Qpress{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[84] + mi := &file_agentpb_agent_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6264,7 +6446,7 @@ func (x *GetVersionsRequest_Qpress) String() string { func (*GetVersionsRequest_Qpress) ProtoMessage() {} func (x *GetVersionsRequest_Qpress) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[84] + mi := &file_agentpb_agent_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6277,7 +6459,7 @@ func (x *GetVersionsRequest_Qpress) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_Qpress.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_Qpress) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 3} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 3} } // MongoDB is used for mongod binary version retrieving. @@ -6290,7 +6472,7 @@ type GetVersionsRequest_MongoDB struct { func (x *GetVersionsRequest_MongoDB) Reset() { *x = GetVersionsRequest_MongoDB{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[85] + mi := &file_agentpb_agent_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6303,7 +6485,7 @@ func (x *GetVersionsRequest_MongoDB) String() string { func (*GetVersionsRequest_MongoDB) ProtoMessage() {} func (x *GetVersionsRequest_MongoDB) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[85] + mi := &file_agentpb_agent_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6316,7 +6498,7 @@ func (x *GetVersionsRequest_MongoDB) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_MongoDB.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_MongoDB) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 4} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 4} } // PBM is used for pbm (Percona Backup for MongoDB) binary version retrieving. @@ -6329,7 +6511,7 @@ type GetVersionsRequest_PBM struct { func (x *GetVersionsRequest_PBM) Reset() { *x = GetVersionsRequest_PBM{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[86] + mi := &file_agentpb_agent_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6342,7 +6524,7 @@ func (x *GetVersionsRequest_PBM) String() string { func (*GetVersionsRequest_PBM) ProtoMessage() {} func (x *GetVersionsRequest_PBM) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[86] + mi := &file_agentpb_agent_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6355,7 +6537,7 @@ func (x *GetVersionsRequest_PBM) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_PBM.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_PBM) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 5} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 5} } // Software is used to select software for which retrieve version. @@ -6378,7 +6560,7 @@ type GetVersionsRequest_Software struct { func (x *GetVersionsRequest_Software) Reset() { *x = GetVersionsRequest_Software{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[87] + mi := &file_agentpb_agent_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6391,7 +6573,7 @@ func (x *GetVersionsRequest_Software) String() string { func (*GetVersionsRequest_Software) ProtoMessage() {} func (x *GetVersionsRequest_Software) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[87] + mi := &file_agentpb_agent_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6404,7 +6586,7 @@ func (x *GetVersionsRequest_Software) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsRequest_Software.ProtoReflect.Descriptor instead. func (*GetVersionsRequest_Software) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{36, 6} + return file_agentpb_agent_proto_rawDescGZIP(), []int{38, 6} } func (m *GetVersionsRequest_Software) GetSoftware() isGetVersionsRequest_Software_Software { @@ -6510,7 +6692,7 @@ type GetVersionsResponse_Version struct { func (x *GetVersionsResponse_Version) Reset() { *x = GetVersionsResponse_Version{} if protoimpl.UnsafeEnabled { - mi := &file_agentpb_agent_proto_msgTypes[88] + mi := &file_agentpb_agent_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6523,7 +6705,7 @@ func (x *GetVersionsResponse_Version) String() string { func (*GetVersionsResponse_Version) ProtoMessage() {} func (x *GetVersionsResponse_Version) ProtoReflect() protoreflect.Message { - mi := &file_agentpb_agent_proto_msgTypes[88] + mi := &file_agentpb_agent_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6536,7 +6718,7 @@ func (x *GetVersionsResponse_Version) ProtoReflect() protoreflect.Message { // Deprecated: Use GetVersionsResponse_Version.ProtoReflect.Descriptor instead. func (*GetVersionsResponse_Version) Descriptor() ([]byte, []int) { - return file_agentpb_agent_proto_rawDescGZIP(), []int{37, 0} + return file_agentpb_agent_proto_rawDescGZIP(), []int{39, 0} } func (x *GetVersionsResponse_Version) GetVersion() string { @@ -7129,351 +7311,376 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, 0x66, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, - 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0x95, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x65, + 0x69, 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0x99, 0x01, 0x0a, 0x17, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3a, 0x0a, 0x05, 0x73, 0x74, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x3e, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x28, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, - 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x29, 0x0a, 0x10, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x29, 0x0a, 0x11, 0x4a, - 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x22, 0xb2, 0x01, 0x0a, 0x10, 0x53, 0x33, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, - 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x5f, 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x18, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xc3, 0x0f, 0x0a, 0x0f, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0c, 0x6d, - 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, - 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, - 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x12, 0x4d, 0x0a, 0x0e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x12, 0x63, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, - 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x93, 0x02, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, - 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, - 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, - 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xc3, 0x01, - 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, - 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x1a, 0xf9, 0x03, 0x0a, 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, - 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, - 0x18, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, - 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, - 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x69, - 0x74, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x50, 0x69, 0x74, 0x72, 0x12, 0x33, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x09, - 0x64, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, - 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, - 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, - 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, - 0xa8, 0x04, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, - 0x12, 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, - 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x69, 0x74, 0x72, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x70, 0x69, 0x74, 0x72, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, - 0x10, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0c, 0x70, 0x62, 0x6d, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x62, 0x6d, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x70, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, - 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x05, 0x0a, 0x03, 0x6a, 0x6f, - 0x62, 0x22, 0x28, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x27, 0x0a, 0x0e, 0x53, - 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, - 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, - 0x6f, 0x62, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x05, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, - 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x79, 0x73, - 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x28, 0x0a, 0x05, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x2f, + 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0f, 0x74, 0x6c, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x76, 0x65, 0x72, 0x69, + 0x66, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x74, 0x6c, 0x73, 0x53, 0x6b, 0x69, + 0x70, 0x56, 0x65, 0x72, 0x69, 0x66, 0x79, 0x22, 0x66, 0x0a, 0x13, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x12, 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, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x29, 0x0a, 0x10, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x29, 0x0a, 0x11, 0x4a, 0x6f, + 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x61, 0x6c, 0x69, 0x76, 0x65, 0x22, 0xb2, 0x01, 0x0a, 0x10, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x0b, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x62, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, + 0x72, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x62, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x67, 0x69, 0x6f, 0x6e, 0x22, 0x2e, 0x0a, 0x18, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xc3, 0x0f, 0x0a, 0x0f, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, + 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0c, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, + 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x12, 0x47, 0x0a, 0x0e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, - 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, - 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x16, 0x6d, - 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, - 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, - 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, - 0x75, 0x70, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x21, 0x0a, 0x05, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x6e, 0x0a, - 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2c, - 0x0a, 0x12, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x53, 0x68, - 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3e, 0x0a, - 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x08, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x0a, + 0x75, 0x70, 0x12, 0x4d, 0x0a, 0x0e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x12, 0x63, 0x0a, 0x16, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, + 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x93, 0x02, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, + 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, + 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, + 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xc3, 0x01, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x1a, 0x16, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x72, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa7, 0x03, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x43, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, - 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, - 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x59, 0x0a, 0x14, 0x6d, - 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, - 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x48, 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x73, 0x48, 0x00, 0x52, - 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x0d, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, - 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x14, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x49, 0x0a, 0x04, 0x4c, 0x6f, - 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, - 0x9d, 0x04, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, - 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x73, - 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x73, 0x1a, 0x08, 0x0a, 0x06, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x64, 0x1a, 0x0c, 0x0a, 0x0a, 0x58, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, - 0x1a, 0x09, 0x0a, 0x07, 0x58, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x51, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, - 0x1a, 0x05, 0x0a, 0x03, 0x50, 0x42, 0x4d, 0x1a, 0x85, 0x03, 0x0a, 0x08, 0x53, 0x6f, 0x66, 0x74, - 0x77, 0x61, 0x72, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x64, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, - 0x12, 0x46, 0x0a, 0x0a, 0x78, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x58, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x78, 0x74, - 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x3d, 0x0a, 0x07, 0x78, 0x62, 0x63, 0x6c, - 0x6f, 0x75, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x48, 0x00, 0x52, 0x07, - 0x78, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x51, 0x70, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x06, 0x71, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, + 0x6b, 0x75, 0x70, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, + 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4a, 0x04, 0x08, 0x0b, 0x10, 0x0c, 0x52, + 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x1a, 0xf9, 0x03, 0x0a, 0x0d, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x08, + 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, + 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, + 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x70, 0x69, 0x74, + 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x50, + 0x69, 0x74, 0x72, 0x12, 0x33, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x09, 0x64, + 0x61, 0x74, 0x61, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, + 0x78, 0x74, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0xa8, + 0x04, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, + 0x1e, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, + 0x1c, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, + 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, + 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x69, 0x74, 0x72, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x70, 0x69, 0x74, 0x72, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x33, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x33, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x08, 0x73, 0x33, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x4e, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x10, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0c, 0x70, 0x62, 0x6d, 0x5f, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x62, 0x6d, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0b, 0x70, 0x62, 0x6d, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x64, 0x73, 0x6e, 0x12, 0x2f, 0x0a, 0x0a, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x74, 0x65, 0x78, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x42, 0x11, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x05, 0x0a, 0x03, 0x6a, 0x6f, 0x62, + 0x22, 0x28, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x27, 0x0a, 0x0e, 0x53, 0x74, + 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, + 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, + 0x62, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x0f, 0x53, 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x05, 0x0a, 0x09, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2e, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, 0x79, 0x73, + 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x57, 0x0a, 0x14, 0x6d, 0x79, 0x73, 0x71, + 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x12, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x12, 0x47, 0x0a, 0x0e, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0d, 0x6d, 0x6f, 0x6e, + 0x67, 0x6f, 0x64, 0x62, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x5d, 0x0a, 0x16, 0x6d, 0x6f, + 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, + 0x70, 0x48, 0x00, 0x52, 0x14, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x21, 0x0a, 0x05, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x6e, 0x0a, 0x0d, + 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2c, 0x0a, + 0x12, 0x69, 0x73, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6c, 0x75, 0x73, + 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x53, 0x68, 0x61, + 0x72, 0x64, 0x65, 0x64, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x2f, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3e, 0x0a, 0x0b, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x0a, 0x12, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x1a, 0x16, 0x0a, 0x14, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa7, 0x03, 0x0a, 0x0b, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x43, 0x0a, 0x0c, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x5f, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0b, 0x6d, + 0x79, 0x73, 0x71, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x59, 0x0a, 0x14, 0x6d, 0x79, + 0x73, 0x71, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, + 0x75, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4d, 0x79, 0x53, + 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, + 0x00, 0x52, 0x12, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x42, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2d, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x14, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x2e, 0x4c, 0x6f, 0x67, 0x73, 0x48, 0x00, 0x52, 0x04, + 0x6c, 0x6f, 0x67, 0x73, 0x1a, 0x0d, 0x0a, 0x0b, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x42, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x1a, 0x14, 0x0a, 0x12, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, 0x49, 0x0a, 0x04, 0x4c, 0x6f, 0x67, + 0x73, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x07, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x6f, 0x6e, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x64, 0x6f, 0x6e, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0x9d, + 0x04, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x40, 0x0a, 0x09, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x52, 0x09, 0x73, 0x6f, + 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x73, 0x1a, 0x08, 0x0a, 0x06, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x64, 0x1a, 0x0c, 0x0a, 0x0a, 0x58, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x1a, + 0x09, 0x0a, 0x07, 0x58, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x1a, 0x08, 0x0a, 0x06, 0x51, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x1a, 0x09, 0x0a, 0x07, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x1a, + 0x05, 0x0a, 0x03, 0x50, 0x42, 0x4d, 0x1a, 0x85, 0x03, 0x0a, 0x08, 0x53, 0x6f, 0x66, 0x74, 0x77, + 0x61, 0x72, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, - 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x12, 0x31, 0x0a, 0x03, 0x70, 0x62, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x48, 0x00, 0x52, 0x03, - 0x70, 0x62, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, - 0x90, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x39, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0xbb, 0x08, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, - 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, - 0x69, 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x09, - 0x6a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, - 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, - 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, - 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, - 0x00, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, - 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, + 0x79, 0x53, 0x51, 0x4c, 0x64, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x64, 0x12, + 0x46, 0x0a, 0x0a, 0x78, 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x58, + 0x74, 0x72, 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x48, 0x00, 0x52, 0x0a, 0x78, 0x74, 0x72, + 0x61, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x3d, 0x0a, 0x07, 0x78, 0x62, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x2e, 0x58, 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x48, 0x00, 0x52, 0x07, 0x78, + 0x62, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x12, 0x3a, 0x0a, 0x06, 0x71, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x2e, 0x51, 0x70, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x06, 0x71, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x48, 0x00, 0x52, 0x06, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x12, + 0x31, 0x0a, 0x03, 0x70, 0x62, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x48, 0x00, 0x52, 0x03, 0x70, + 0x62, 0x6d, 0x42, 0x0a, 0x0a, 0x08, 0x73, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x22, 0x90, + 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x39, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0xfc, 0x08, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x21, 0x0a, 0x04, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, 0x70, 0x69, + 0x6e, 0x67, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x65, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x71, 0x61, 0x6e, 0x5f, 0x63, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x51, 0x41, 0x4e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x71, 0x61, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x31, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x72, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x09, 0x6a, + 0x6f, 0x62, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x37, 0x0a, 0x0c, 0x6a, 0x6f, 0x62, 0x5f, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x48, 0x00, 0x52, 0x0b, 0x6a, 0x6f, 0x62, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x21, 0x0a, 0x04, 0x70, 0x6f, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x04, + 0x70, 0x6f, 0x6e, 0x67, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x0c, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, - 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x10, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, - 0x62, 0x12, 0x33, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, - 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, - 0x74, 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x39, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x46, 0x0a, 0x0f, 0x70, 0x62, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, - 0x5f, 0x70, 0x69, 0x74, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, - 0x52, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, - 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x69, 0x74, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, - 0x22, 0xc9, 0x07, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, + 0x0b, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x41, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, + 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x10, 0x63, + 0x68, 0x65, 0x63, 0x6b, 0x5f, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, + 0x12, 0x33, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6a, 0x6f, 0x62, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x74, + 0x6f, 0x70, 0x4a, 0x6f, 0x62, 0x12, 0x39, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x3f, 0x0a, 0x0c, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x47, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x46, 0x0a, 0x0f, 0x70, 0x62, 0x6d, 0x5f, 0x73, 0x77, 0x69, 0x74, 0x63, 0x68, 0x5f, + 0x70, 0x69, 0x74, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x50, 0x42, 0x4d, 0x53, 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x49, 0x54, 0x52, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0d, 0x70, 0x62, 0x6d, 0x53, + 0x77, 0x69, 0x74, 0x63, 0x68, 0x50, 0x69, 0x74, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x22, 0x89, 0x08, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xff, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x72, 0x70, 0x63, @@ -7533,7 +7740,11 @@ var file_agentpb_agent_proto_rawDesc = []byte{ 0x5f, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, - 0x73, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2a, 0xc4, 0x01, 0x0a, + 0x73, 0x12, 0x3e, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, + 0x6f, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x42, 0x09, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x2a, 0xc4, 0x01, 0x0a, 0x18, 0x4d, 0x79, 0x73, 0x71, 0x6c, 0x45, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x23, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x45, 0x58, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x4f, 0x55, 0x54, 0x50, 0x55, @@ -7574,7 +7785,7 @@ func file_agentpb_agent_proto_rawDescGZIP() []byte { var ( file_agentpb_agent_proto_enumTypes = make([]protoimpl.EnumInfo, 2) - file_agentpb_agent_proto_msgTypes = make([]protoimpl.MessageInfo, 89) + file_agentpb_agent_proto_msgTypes = make([]protoimpl.MessageInfo, 91) file_agentpb_agent_proto_goTypes = []interface{}{ (MysqlExplainOutputFormat)(0), // 0: agent.MysqlExplainOutputFormat (StartActionRequest_RestartSystemServiceParams_SystemService)(0), // 1: agent.StartActionRequest.RestartSystemServiceParams.SystemService @@ -7604,226 +7815,233 @@ var ( (*AgentLogsResponse)(nil), // 25: agent.AgentLogsResponse (*CheckConnectionRequest)(nil), // 26: agent.CheckConnectionRequest (*CheckConnectionResponse)(nil), // 27: agent.CheckConnectionResponse - (*JobStatusRequest)(nil), // 28: agent.JobStatusRequest - (*JobStatusResponse)(nil), // 29: agent.JobStatusResponse - (*S3LocationConfig)(nil), // 30: agent.S3LocationConfig - (*FilesystemLocationConfig)(nil), // 31: agent.FilesystemLocationConfig - (*StartJobRequest)(nil), // 32: agent.StartJobRequest - (*StartJobResponse)(nil), // 33: agent.StartJobResponse - (*StopJobRequest)(nil), // 34: agent.StopJobRequest - (*StopJobResponse)(nil), // 35: agent.StopJobResponse - (*JobResult)(nil), // 36: agent.JobResult - (*JobProgress)(nil), // 37: agent.JobProgress - (*GetVersionsRequest)(nil), // 38: agent.GetVersionsRequest - (*GetVersionsResponse)(nil), // 39: agent.GetVersionsResponse - (*AgentMessage)(nil), // 40: agent.AgentMessage - (*ServerMessage)(nil), // 41: agent.ServerMessage - nil, // 42: agent.TextFiles.FilesEntry - (*SetStateRequest_AgentProcess)(nil), // 43: agent.SetStateRequest.AgentProcess - nil, // 44: agent.SetStateRequest.AgentProcessesEntry - (*SetStateRequest_BuiltinAgent)(nil), // 45: agent.SetStateRequest.BuiltinAgent - nil, // 46: agent.SetStateRequest.BuiltinAgentsEntry - nil, // 47: agent.SetStateRequest.AgentProcess.TextFilesEntry - nil, // 48: agent.QueryActionMap.MapEntry - (*StartActionRequest_MySQLExplainParams)(nil), // 49: agent.StartActionRequest.MySQLExplainParams - (*StartActionRequest_MySQLShowCreateTableParams)(nil), // 50: agent.StartActionRequest.MySQLShowCreateTableParams - (*StartActionRequest_MySQLShowTableStatusParams)(nil), // 51: agent.StartActionRequest.MySQLShowTableStatusParams - (*StartActionRequest_MySQLShowIndexParams)(nil), // 52: agent.StartActionRequest.MySQLShowIndexParams - (*StartActionRequest_PostgreSQLShowCreateTableParams)(nil), // 53: agent.StartActionRequest.PostgreSQLShowCreateTableParams - (*StartActionRequest_PostgreSQLShowIndexParams)(nil), // 54: agent.StartActionRequest.PostgreSQLShowIndexParams - (*StartActionRequest_MongoDBExplainParams)(nil), // 55: agent.StartActionRequest.MongoDBExplainParams - (*StartActionRequest_PTSummaryParams)(nil), // 56: agent.StartActionRequest.PTSummaryParams - (*StartActionRequest_PTPgSummaryParams)(nil), // 57: agent.StartActionRequest.PTPgSummaryParams - (*StartActionRequest_PTMongoDBSummaryParams)(nil), // 58: agent.StartActionRequest.PTMongoDBSummaryParams - (*StartActionRequest_PTMySQLSummaryParams)(nil), // 59: agent.StartActionRequest.PTMySQLSummaryParams - (*StartActionRequest_MySQLQueryShowParams)(nil), // 60: agent.StartActionRequest.MySQLQueryShowParams - (*StartActionRequest_MySQLQuerySelectParams)(nil), // 61: agent.StartActionRequest.MySQLQuerySelectParams - (*StartActionRequest_PostgreSQLQueryShowParams)(nil), // 62: agent.StartActionRequest.PostgreSQLQueryShowParams - (*StartActionRequest_PostgreSQLQuerySelectParams)(nil), // 63: agent.StartActionRequest.PostgreSQLQuerySelectParams - (*StartActionRequest_MongoDBQueryGetParameterParams)(nil), // 64: agent.StartActionRequest.MongoDBQueryGetParameterParams - (*StartActionRequest_MongoDBQueryBuildInfoParams)(nil), // 65: agent.StartActionRequest.MongoDBQueryBuildInfoParams - (*StartActionRequest_MongoDBQueryGetCmdLineOptsParams)(nil), // 66: agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams - (*StartActionRequest_MongoDBQueryReplSetGetStatusParams)(nil), // 67: agent.StartActionRequest.MongoDBQueryReplSetGetStatusParams - (*StartActionRequest_MongoDBQueryGetDiagnosticDataParams)(nil), // 68: agent.StartActionRequest.MongoDBQueryGetDiagnosticDataParams - (*StartActionRequest_RestartSystemServiceParams)(nil), // 69: agent.StartActionRequest.RestartSystemServiceParams - (*CheckConnectionResponse_Stats)(nil), // 70: agent.CheckConnectionResponse.Stats - (*StartJobRequest_MySQLBackup)(nil), // 71: agent.StartJobRequest.MySQLBackup - (*StartJobRequest_MySQLRestoreBackup)(nil), // 72: agent.StartJobRequest.MySQLRestoreBackup - (*StartJobRequest_MongoDBBackup)(nil), // 73: agent.StartJobRequest.MongoDBBackup - (*StartJobRequest_MongoDBRestoreBackup)(nil), // 74: agent.StartJobRequest.MongoDBRestoreBackup - (*JobResult_Error)(nil), // 75: agent.JobResult.Error - (*JobResult_MongoDBBackup)(nil), // 76: agent.JobResult.MongoDBBackup - (*JobResult_MySQLBackup)(nil), // 77: agent.JobResult.MySQLBackup - (*JobResult_MySQLRestoreBackup)(nil), // 78: agent.JobResult.MySQLRestoreBackup - (*JobResult_MongoDBRestoreBackup)(nil), // 79: agent.JobResult.MongoDBRestoreBackup - (*JobProgress_MySQLBackup)(nil), // 80: agent.JobProgress.MySQLBackup - (*JobProgress_MySQLRestoreBackup)(nil), // 81: agent.JobProgress.MySQLRestoreBackup - (*JobProgress_Logs)(nil), // 82: agent.JobProgress.Logs - (*GetVersionsRequest_MySQLd)(nil), // 83: agent.GetVersionsRequest.MySQLd - (*GetVersionsRequest_Xtrabackup)(nil), // 84: agent.GetVersionsRequest.Xtrabackup - (*GetVersionsRequest_Xbcloud)(nil), // 85: agent.GetVersionsRequest.Xbcloud - (*GetVersionsRequest_Qpress)(nil), // 86: agent.GetVersionsRequest.Qpress - (*GetVersionsRequest_MongoDB)(nil), // 87: agent.GetVersionsRequest.MongoDB - (*GetVersionsRequest_PBM)(nil), // 88: agent.GetVersionsRequest.PBM - (*GetVersionsRequest_Software)(nil), // 89: agent.GetVersionsRequest.Software - (*GetVersionsResponse_Version)(nil), // 90: agent.GetVersionsResponse.Version - (*timestamppb.Timestamp)(nil), // 91: google.protobuf.Timestamp - (*MetricsBucket)(nil), // 92: agent.MetricsBucket - (inventorypb.AgentStatus)(0), // 93: inventory.AgentStatus - (*durationpb.Duration)(nil), // 94: google.protobuf.Duration - (inventorypb.ServiceType)(0), // 95: inventory.ServiceType - (*status.Status)(nil), // 96: google.rpc.Status - (inventorypb.AgentType)(0), // 97: inventory.AgentType - (backup.DataModel)(0), // 98: backup.v1.DataModel - (*backup.PbmMetadata)(nil), // 99: backup.v1.PbmMetadata - (*backup.Metadata)(nil), // 100: backup.v1.Metadata + (*ServiceInfoRequest)(nil), // 28: agent.ServiceInfoRequest + (*ServiceInfoResponse)(nil), // 29: agent.ServiceInfoResponse + (*JobStatusRequest)(nil), // 30: agent.JobStatusRequest + (*JobStatusResponse)(nil), // 31: agent.JobStatusResponse + (*S3LocationConfig)(nil), // 32: agent.S3LocationConfig + (*FilesystemLocationConfig)(nil), // 33: agent.FilesystemLocationConfig + (*StartJobRequest)(nil), // 34: agent.StartJobRequest + (*StartJobResponse)(nil), // 35: agent.StartJobResponse + (*StopJobRequest)(nil), // 36: agent.StopJobRequest + (*StopJobResponse)(nil), // 37: agent.StopJobResponse + (*JobResult)(nil), // 38: agent.JobResult + (*JobProgress)(nil), // 39: agent.JobProgress + (*GetVersionsRequest)(nil), // 40: agent.GetVersionsRequest + (*GetVersionsResponse)(nil), // 41: agent.GetVersionsResponse + (*AgentMessage)(nil), // 42: agent.AgentMessage + (*ServerMessage)(nil), // 43: agent.ServerMessage + nil, // 44: agent.TextFiles.FilesEntry + (*SetStateRequest_AgentProcess)(nil), // 45: agent.SetStateRequest.AgentProcess + nil, // 46: agent.SetStateRequest.AgentProcessesEntry + (*SetStateRequest_BuiltinAgent)(nil), // 47: agent.SetStateRequest.BuiltinAgent + nil, // 48: agent.SetStateRequest.BuiltinAgentsEntry + nil, // 49: agent.SetStateRequest.AgentProcess.TextFilesEntry + nil, // 50: agent.QueryActionMap.MapEntry + (*StartActionRequest_MySQLExplainParams)(nil), // 51: agent.StartActionRequest.MySQLExplainParams + (*StartActionRequest_MySQLShowCreateTableParams)(nil), // 52: agent.StartActionRequest.MySQLShowCreateTableParams + (*StartActionRequest_MySQLShowTableStatusParams)(nil), // 53: agent.StartActionRequest.MySQLShowTableStatusParams + (*StartActionRequest_MySQLShowIndexParams)(nil), // 54: agent.StartActionRequest.MySQLShowIndexParams + (*StartActionRequest_PostgreSQLShowCreateTableParams)(nil), // 55: agent.StartActionRequest.PostgreSQLShowCreateTableParams + (*StartActionRequest_PostgreSQLShowIndexParams)(nil), // 56: agent.StartActionRequest.PostgreSQLShowIndexParams + (*StartActionRequest_MongoDBExplainParams)(nil), // 57: agent.StartActionRequest.MongoDBExplainParams + (*StartActionRequest_PTSummaryParams)(nil), // 58: agent.StartActionRequest.PTSummaryParams + (*StartActionRequest_PTPgSummaryParams)(nil), // 59: agent.StartActionRequest.PTPgSummaryParams + (*StartActionRequest_PTMongoDBSummaryParams)(nil), // 60: agent.StartActionRequest.PTMongoDBSummaryParams + (*StartActionRequest_PTMySQLSummaryParams)(nil), // 61: agent.StartActionRequest.PTMySQLSummaryParams + (*StartActionRequest_MySQLQueryShowParams)(nil), // 62: agent.StartActionRequest.MySQLQueryShowParams + (*StartActionRequest_MySQLQuerySelectParams)(nil), // 63: agent.StartActionRequest.MySQLQuerySelectParams + (*StartActionRequest_PostgreSQLQueryShowParams)(nil), // 64: agent.StartActionRequest.PostgreSQLQueryShowParams + (*StartActionRequest_PostgreSQLQuerySelectParams)(nil), // 65: agent.StartActionRequest.PostgreSQLQuerySelectParams + (*StartActionRequest_MongoDBQueryGetParameterParams)(nil), // 66: agent.StartActionRequest.MongoDBQueryGetParameterParams + (*StartActionRequest_MongoDBQueryBuildInfoParams)(nil), // 67: agent.StartActionRequest.MongoDBQueryBuildInfoParams + (*StartActionRequest_MongoDBQueryGetCmdLineOptsParams)(nil), // 68: agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams + (*StartActionRequest_MongoDBQueryReplSetGetStatusParams)(nil), // 69: agent.StartActionRequest.MongoDBQueryReplSetGetStatusParams + (*StartActionRequest_MongoDBQueryGetDiagnosticDataParams)(nil), // 70: agent.StartActionRequest.MongoDBQueryGetDiagnosticDataParams + (*StartActionRequest_RestartSystemServiceParams)(nil), // 71: agent.StartActionRequest.RestartSystemServiceParams + (*CheckConnectionResponse_Stats)(nil), // 72: agent.CheckConnectionResponse.Stats + (*StartJobRequest_MySQLBackup)(nil), // 73: agent.StartJobRequest.MySQLBackup + (*StartJobRequest_MySQLRestoreBackup)(nil), // 74: agent.StartJobRequest.MySQLRestoreBackup + (*StartJobRequest_MongoDBBackup)(nil), // 75: agent.StartJobRequest.MongoDBBackup + (*StartJobRequest_MongoDBRestoreBackup)(nil), // 76: agent.StartJobRequest.MongoDBRestoreBackup + (*JobResult_Error)(nil), // 77: agent.JobResult.Error + (*JobResult_MongoDBBackup)(nil), // 78: agent.JobResult.MongoDBBackup + (*JobResult_MySQLBackup)(nil), // 79: agent.JobResult.MySQLBackup + (*JobResult_MySQLRestoreBackup)(nil), // 80: agent.JobResult.MySQLRestoreBackup + (*JobResult_MongoDBRestoreBackup)(nil), // 81: agent.JobResult.MongoDBRestoreBackup + (*JobProgress_MySQLBackup)(nil), // 82: agent.JobProgress.MySQLBackup + (*JobProgress_MySQLRestoreBackup)(nil), // 83: agent.JobProgress.MySQLRestoreBackup + (*JobProgress_Logs)(nil), // 84: agent.JobProgress.Logs + (*GetVersionsRequest_MySQLd)(nil), // 85: agent.GetVersionsRequest.MySQLd + (*GetVersionsRequest_Xtrabackup)(nil), // 86: agent.GetVersionsRequest.Xtrabackup + (*GetVersionsRequest_Xbcloud)(nil), // 87: agent.GetVersionsRequest.Xbcloud + (*GetVersionsRequest_Qpress)(nil), // 88: agent.GetVersionsRequest.Qpress + (*GetVersionsRequest_MongoDB)(nil), // 89: agent.GetVersionsRequest.MongoDB + (*GetVersionsRequest_PBM)(nil), // 90: agent.GetVersionsRequest.PBM + (*GetVersionsRequest_Software)(nil), // 91: agent.GetVersionsRequest.Software + (*GetVersionsResponse_Version)(nil), // 92: agent.GetVersionsResponse.Version + (*timestamppb.Timestamp)(nil), // 93: google.protobuf.Timestamp + (*MetricsBucket)(nil), // 94: agent.MetricsBucket + (inventorypb.AgentStatus)(0), // 95: inventory.AgentStatus + (*durationpb.Duration)(nil), // 96: google.protobuf.Duration + (inventorypb.ServiceType)(0), // 97: inventory.ServiceType + (*status.Status)(nil), // 98: google.rpc.Status + (inventorypb.AgentType)(0), // 99: inventory.AgentType + (backup.DataModel)(0), // 100: backup.v1.DataModel + (*backup.PbmMetadata)(nil), // 101: backup.v1.PbmMetadata + (*backup.Metadata)(nil), // 102: backup.v1.Metadata } ) var file_agentpb_agent_proto_depIdxs = []int32{ - 42, // 0: agent.TextFiles.files:type_name -> agent.TextFiles.FilesEntry - 91, // 1: agent.Pong.current_time:type_name -> google.protobuf.Timestamp - 92, // 2: agent.QANCollectRequest.metrics_bucket:type_name -> agent.MetricsBucket - 93, // 3: agent.StateChangedRequest.status:type_name -> inventory.AgentStatus - 44, // 4: agent.SetStateRequest.agent_processes:type_name -> agent.SetStateRequest.AgentProcessesEntry - 46, // 5: agent.SetStateRequest.builtin_agents:type_name -> agent.SetStateRequest.BuiltinAgentsEntry - 91, // 6: agent.QueryActionValue.timestamp:type_name -> google.protobuf.Timestamp + 44, // 0: agent.TextFiles.files:type_name -> agent.TextFiles.FilesEntry + 93, // 1: agent.Pong.current_time:type_name -> google.protobuf.Timestamp + 94, // 2: agent.QANCollectRequest.metrics_bucket:type_name -> agent.MetricsBucket + 95, // 3: agent.StateChangedRequest.status:type_name -> inventory.AgentStatus + 46, // 4: agent.SetStateRequest.agent_processes:type_name -> agent.SetStateRequest.AgentProcessesEntry + 48, // 5: agent.SetStateRequest.builtin_agents:type_name -> agent.SetStateRequest.BuiltinAgentsEntry + 93, // 6: agent.QueryActionValue.timestamp:type_name -> google.protobuf.Timestamp 12, // 7: agent.QueryActionValue.slice:type_name -> agent.QueryActionSlice 13, // 8: agent.QueryActionValue.map:type_name -> agent.QueryActionMap 14, // 9: agent.QueryActionValue.binary:type_name -> agent.QueryActionBinary 11, // 10: agent.QueryActionSlice.slice:type_name -> agent.QueryActionValue - 48, // 11: agent.QueryActionMap.map:type_name -> agent.QueryActionMap.MapEntry + 50, // 11: agent.QueryActionMap.map:type_name -> agent.QueryActionMap.MapEntry 12, // 12: agent.QueryActionResult.rows:type_name -> agent.QueryActionSlice 13, // 13: agent.QueryActionResult.docs:type_name -> agent.QueryActionMap - 49, // 14: agent.StartActionRequest.mysql_explain_params:type_name -> agent.StartActionRequest.MySQLExplainParams - 50, // 15: agent.StartActionRequest.mysql_show_create_table_params:type_name -> agent.StartActionRequest.MySQLShowCreateTableParams - 51, // 16: agent.StartActionRequest.mysql_show_table_status_params:type_name -> agent.StartActionRequest.MySQLShowTableStatusParams - 52, // 17: agent.StartActionRequest.mysql_show_index_params:type_name -> agent.StartActionRequest.MySQLShowIndexParams - 53, // 18: agent.StartActionRequest.postgresql_show_create_table_params:type_name -> agent.StartActionRequest.PostgreSQLShowCreateTableParams - 54, // 19: agent.StartActionRequest.postgresql_show_index_params:type_name -> agent.StartActionRequest.PostgreSQLShowIndexParams - 55, // 20: agent.StartActionRequest.mongodb_explain_params:type_name -> agent.StartActionRequest.MongoDBExplainParams - 56, // 21: agent.StartActionRequest.pt_summary_params:type_name -> agent.StartActionRequest.PTSummaryParams - 57, // 22: agent.StartActionRequest.pt_pg_summary_params:type_name -> agent.StartActionRequest.PTPgSummaryParams - 58, // 23: agent.StartActionRequest.pt_mongodb_summary_params:type_name -> agent.StartActionRequest.PTMongoDBSummaryParams - 59, // 24: agent.StartActionRequest.pt_mysql_summary_params:type_name -> agent.StartActionRequest.PTMySQLSummaryParams - 60, // 25: agent.StartActionRequest.mysql_query_show_params:type_name -> agent.StartActionRequest.MySQLQueryShowParams - 61, // 26: agent.StartActionRequest.mysql_query_select_params:type_name -> agent.StartActionRequest.MySQLQuerySelectParams - 62, // 27: agent.StartActionRequest.postgresql_query_show_params:type_name -> agent.StartActionRequest.PostgreSQLQueryShowParams - 63, // 28: agent.StartActionRequest.postgresql_query_select_params:type_name -> agent.StartActionRequest.PostgreSQLQuerySelectParams - 64, // 29: agent.StartActionRequest.mongodb_query_getparameter_params:type_name -> agent.StartActionRequest.MongoDBQueryGetParameterParams - 65, // 30: agent.StartActionRequest.mongodb_query_buildinfo_params:type_name -> agent.StartActionRequest.MongoDBQueryBuildInfoParams - 66, // 31: agent.StartActionRequest.mongodb_query_getcmdlineopts_params:type_name -> agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams - 67, // 32: agent.StartActionRequest.mongodb_query_replsetgetstatus_params:type_name -> agent.StartActionRequest.MongoDBQueryReplSetGetStatusParams - 68, // 33: agent.StartActionRequest.mongodb_query_getdiagnosticdata_params:type_name -> agent.StartActionRequest.MongoDBQueryGetDiagnosticDataParams - 69, // 34: agent.StartActionRequest.restart_sys_service_params:type_name -> agent.StartActionRequest.RestartSystemServiceParams - 94, // 35: agent.StartActionRequest.timeout:type_name -> google.protobuf.Duration + 51, // 14: agent.StartActionRequest.mysql_explain_params:type_name -> agent.StartActionRequest.MySQLExplainParams + 52, // 15: agent.StartActionRequest.mysql_show_create_table_params:type_name -> agent.StartActionRequest.MySQLShowCreateTableParams + 53, // 16: agent.StartActionRequest.mysql_show_table_status_params:type_name -> agent.StartActionRequest.MySQLShowTableStatusParams + 54, // 17: agent.StartActionRequest.mysql_show_index_params:type_name -> agent.StartActionRequest.MySQLShowIndexParams + 55, // 18: agent.StartActionRequest.postgresql_show_create_table_params:type_name -> agent.StartActionRequest.PostgreSQLShowCreateTableParams + 56, // 19: agent.StartActionRequest.postgresql_show_index_params:type_name -> agent.StartActionRequest.PostgreSQLShowIndexParams + 57, // 20: agent.StartActionRequest.mongodb_explain_params:type_name -> agent.StartActionRequest.MongoDBExplainParams + 58, // 21: agent.StartActionRequest.pt_summary_params:type_name -> agent.StartActionRequest.PTSummaryParams + 59, // 22: agent.StartActionRequest.pt_pg_summary_params:type_name -> agent.StartActionRequest.PTPgSummaryParams + 60, // 23: agent.StartActionRequest.pt_mongodb_summary_params:type_name -> agent.StartActionRequest.PTMongoDBSummaryParams + 61, // 24: agent.StartActionRequest.pt_mysql_summary_params:type_name -> agent.StartActionRequest.PTMySQLSummaryParams + 62, // 25: agent.StartActionRequest.mysql_query_show_params:type_name -> agent.StartActionRequest.MySQLQueryShowParams + 63, // 26: agent.StartActionRequest.mysql_query_select_params:type_name -> agent.StartActionRequest.MySQLQuerySelectParams + 64, // 27: agent.StartActionRequest.postgresql_query_show_params:type_name -> agent.StartActionRequest.PostgreSQLQueryShowParams + 65, // 28: agent.StartActionRequest.postgresql_query_select_params:type_name -> agent.StartActionRequest.PostgreSQLQuerySelectParams + 66, // 29: agent.StartActionRequest.mongodb_query_getparameter_params:type_name -> agent.StartActionRequest.MongoDBQueryGetParameterParams + 67, // 30: agent.StartActionRequest.mongodb_query_buildinfo_params:type_name -> agent.StartActionRequest.MongoDBQueryBuildInfoParams + 68, // 31: agent.StartActionRequest.mongodb_query_getcmdlineopts_params:type_name -> agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams + 69, // 32: agent.StartActionRequest.mongodb_query_replsetgetstatus_params:type_name -> agent.StartActionRequest.MongoDBQueryReplSetGetStatusParams + 70, // 33: agent.StartActionRequest.mongodb_query_getdiagnosticdata_params:type_name -> agent.StartActionRequest.MongoDBQueryGetDiagnosticDataParams + 71, // 34: agent.StartActionRequest.restart_sys_service_params:type_name -> agent.StartActionRequest.RestartSystemServiceParams + 96, // 35: agent.StartActionRequest.timeout:type_name -> google.protobuf.Duration 2, // 36: agent.PBMSwitchPITRRequest.text_files:type_name -> agent.TextFiles - 95, // 37: agent.CheckConnectionRequest.type:type_name -> inventory.ServiceType - 94, // 38: agent.CheckConnectionRequest.timeout:type_name -> google.protobuf.Duration + 97, // 37: agent.CheckConnectionRequest.type:type_name -> inventory.ServiceType + 96, // 38: agent.CheckConnectionRequest.timeout:type_name -> google.protobuf.Duration 2, // 39: agent.CheckConnectionRequest.text_files:type_name -> agent.TextFiles - 70, // 40: agent.CheckConnectionResponse.stats:type_name -> agent.CheckConnectionResponse.Stats - 94, // 41: agent.StartJobRequest.timeout:type_name -> google.protobuf.Duration - 71, // 42: agent.StartJobRequest.mysql_backup:type_name -> agent.StartJobRequest.MySQLBackup - 72, // 43: agent.StartJobRequest.mysql_restore_backup:type_name -> agent.StartJobRequest.MySQLRestoreBackup - 73, // 44: agent.StartJobRequest.mongodb_backup:type_name -> agent.StartJobRequest.MongoDBBackup - 74, // 45: agent.StartJobRequest.mongodb_restore_backup:type_name -> agent.StartJobRequest.MongoDBRestoreBackup - 91, // 46: agent.JobResult.timestamp:type_name -> google.protobuf.Timestamp - 75, // 47: agent.JobResult.error:type_name -> agent.JobResult.Error - 77, // 48: agent.JobResult.mysql_backup:type_name -> agent.JobResult.MySQLBackup - 78, // 49: agent.JobResult.mysql_restore_backup:type_name -> agent.JobResult.MySQLRestoreBackup - 76, // 50: agent.JobResult.mongodb_backup:type_name -> agent.JobResult.MongoDBBackup - 79, // 51: agent.JobResult.mongodb_restore_backup:type_name -> agent.JobResult.MongoDBRestoreBackup - 91, // 52: agent.JobProgress.timestamp:type_name -> google.protobuf.Timestamp - 80, // 53: agent.JobProgress.mysql_backup:type_name -> agent.JobProgress.MySQLBackup - 81, // 54: agent.JobProgress.mysql_restore_backup:type_name -> agent.JobProgress.MySQLRestoreBackup - 82, // 55: agent.JobProgress.logs:type_name -> agent.JobProgress.Logs - 89, // 56: agent.GetVersionsRequest.softwares:type_name -> agent.GetVersionsRequest.Software - 90, // 57: agent.GetVersionsResponse.versions:type_name -> agent.GetVersionsResponse.Version - 96, // 58: agent.AgentMessage.status:type_name -> google.rpc.Status - 3, // 59: agent.AgentMessage.ping:type_name -> agent.Ping - 7, // 60: agent.AgentMessage.state_changed:type_name -> agent.StateChangedRequest - 5, // 61: agent.AgentMessage.qan_collect:type_name -> agent.QANCollectRequest - 20, // 62: agent.AgentMessage.action_result:type_name -> agent.ActionResultRequest - 36, // 63: agent.AgentMessage.job_result:type_name -> agent.JobResult - 37, // 64: agent.AgentMessage.job_progress:type_name -> agent.JobProgress - 4, // 65: agent.AgentMessage.pong:type_name -> agent.Pong - 10, // 66: agent.AgentMessage.set_state:type_name -> agent.SetStateResponse - 17, // 67: agent.AgentMessage.start_action:type_name -> agent.StartActionResponse - 19, // 68: agent.AgentMessage.stop_action:type_name -> agent.StopActionResponse - 27, // 69: agent.AgentMessage.check_connection:type_name -> agent.CheckConnectionResponse - 33, // 70: agent.AgentMessage.start_job:type_name -> agent.StartJobResponse - 35, // 71: agent.AgentMessage.stop_job:type_name -> agent.StopJobResponse - 29, // 72: agent.AgentMessage.job_status:type_name -> agent.JobStatusResponse - 39, // 73: agent.AgentMessage.get_versions:type_name -> agent.GetVersionsResponse - 23, // 74: agent.AgentMessage.pbm_switch_pitr:type_name -> agent.PBMSwitchPITRResponse - 25, // 75: agent.AgentMessage.agent_logs:type_name -> agent.AgentLogsResponse - 96, // 76: agent.ServerMessage.status:type_name -> google.rpc.Status - 4, // 77: agent.ServerMessage.pong:type_name -> agent.Pong - 8, // 78: agent.ServerMessage.state_changed:type_name -> agent.StateChangedResponse - 6, // 79: agent.ServerMessage.qan_collect:type_name -> agent.QANCollectResponse - 21, // 80: agent.ServerMessage.action_result:type_name -> agent.ActionResultResponse - 3, // 81: agent.ServerMessage.ping:type_name -> agent.Ping - 9, // 82: agent.ServerMessage.set_state:type_name -> agent.SetStateRequest - 16, // 83: agent.ServerMessage.start_action:type_name -> agent.StartActionRequest - 18, // 84: agent.ServerMessage.stop_action:type_name -> agent.StopActionRequest - 26, // 85: agent.ServerMessage.check_connection:type_name -> agent.CheckConnectionRequest - 32, // 86: agent.ServerMessage.start_job:type_name -> agent.StartJobRequest - 34, // 87: agent.ServerMessage.stop_job:type_name -> agent.StopJobRequest - 28, // 88: agent.ServerMessage.job_status:type_name -> agent.JobStatusRequest - 38, // 89: agent.ServerMessage.get_versions:type_name -> agent.GetVersionsRequest - 22, // 90: agent.ServerMessage.pbm_switch_pitr:type_name -> agent.PBMSwitchPITRRequest - 24, // 91: agent.ServerMessage.agent_logs:type_name -> agent.AgentLogsRequest - 97, // 92: agent.SetStateRequest.AgentProcess.type:type_name -> inventory.AgentType - 47, // 93: agent.SetStateRequest.AgentProcess.text_files:type_name -> agent.SetStateRequest.AgentProcess.TextFilesEntry - 43, // 94: agent.SetStateRequest.AgentProcessesEntry.value:type_name -> agent.SetStateRequest.AgentProcess - 97, // 95: agent.SetStateRequest.BuiltinAgent.type:type_name -> inventory.AgentType - 2, // 96: agent.SetStateRequest.BuiltinAgent.text_files:type_name -> agent.TextFiles - 45, // 97: agent.SetStateRequest.BuiltinAgentsEntry.value:type_name -> agent.SetStateRequest.BuiltinAgent - 11, // 98: agent.QueryActionMap.MapEntry.value:type_name -> agent.QueryActionValue - 0, // 99: agent.StartActionRequest.MySQLExplainParams.output_format:type_name -> agent.MysqlExplainOutputFormat - 2, // 100: agent.StartActionRequest.MySQLExplainParams.tls_files:type_name -> agent.TextFiles - 2, // 101: agent.StartActionRequest.MySQLShowCreateTableParams.tls_files:type_name -> agent.TextFiles - 2, // 102: agent.StartActionRequest.MySQLShowTableStatusParams.tls_files:type_name -> agent.TextFiles - 2, // 103: agent.StartActionRequest.MySQLShowIndexParams.tls_files:type_name -> agent.TextFiles - 2, // 104: agent.StartActionRequest.PostgreSQLShowCreateTableParams.tls_files:type_name -> agent.TextFiles - 2, // 105: agent.StartActionRequest.PostgreSQLShowIndexParams.tls_files:type_name -> agent.TextFiles - 2, // 106: agent.StartActionRequest.MongoDBExplainParams.text_files:type_name -> agent.TextFiles - 2, // 107: agent.StartActionRequest.MySQLQueryShowParams.tls_files:type_name -> agent.TextFiles - 2, // 108: agent.StartActionRequest.MySQLQuerySelectParams.tls_files:type_name -> agent.TextFiles - 2, // 109: agent.StartActionRequest.PostgreSQLQueryShowParams.tls_files:type_name -> agent.TextFiles - 2, // 110: agent.StartActionRequest.PostgreSQLQuerySelectParams.tls_files:type_name -> agent.TextFiles - 2, // 111: agent.StartActionRequest.MongoDBQueryGetParameterParams.text_files:type_name -> agent.TextFiles - 2, // 112: agent.StartActionRequest.MongoDBQueryBuildInfoParams.text_files:type_name -> agent.TextFiles - 2, // 113: agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams.text_files:type_name -> agent.TextFiles - 2, // 114: agent.StartActionRequest.MongoDBQueryReplSetGetStatusParams.text_files:type_name -> agent.TextFiles - 2, // 115: agent.StartActionRequest.MongoDBQueryGetDiagnosticDataParams.text_files:type_name -> agent.TextFiles - 1, // 116: agent.StartActionRequest.RestartSystemServiceParams.system_service:type_name -> agent.StartActionRequest.RestartSystemServiceParams.SystemService - 30, // 117: agent.StartJobRequest.MySQLBackup.s3_config:type_name -> agent.S3LocationConfig - 30, // 118: agent.StartJobRequest.MySQLRestoreBackup.s3_config:type_name -> agent.S3LocationConfig - 98, // 119: agent.StartJobRequest.MongoDBBackup.data_model:type_name -> backup.v1.DataModel - 30, // 120: agent.StartJobRequest.MongoDBBackup.s3_config:type_name -> agent.S3LocationConfig - 31, // 121: agent.StartJobRequest.MongoDBBackup.filesystem_config:type_name -> agent.FilesystemLocationConfig - 2, // 122: agent.StartJobRequest.MongoDBBackup.text_files:type_name -> agent.TextFiles - 91, // 123: agent.StartJobRequest.MongoDBRestoreBackup.pitr_timestamp:type_name -> google.protobuf.Timestamp - 30, // 124: agent.StartJobRequest.MongoDBRestoreBackup.s3_config:type_name -> agent.S3LocationConfig - 31, // 125: agent.StartJobRequest.MongoDBRestoreBackup.filesystem_config:type_name -> agent.FilesystemLocationConfig - 99, // 126: agent.StartJobRequest.MongoDBRestoreBackup.pbm_metadata:type_name -> backup.v1.PbmMetadata - 2, // 127: agent.StartJobRequest.MongoDBRestoreBackup.text_files:type_name -> agent.TextFiles - 100, // 128: agent.JobResult.MongoDBBackup.metadata:type_name -> backup.v1.Metadata - 100, // 129: agent.JobResult.MySQLBackup.metadata:type_name -> backup.v1.Metadata - 83, // 130: agent.GetVersionsRequest.Software.mysqld:type_name -> agent.GetVersionsRequest.MySQLd - 84, // 131: agent.GetVersionsRequest.Software.xtrabackup:type_name -> agent.GetVersionsRequest.Xtrabackup - 85, // 132: agent.GetVersionsRequest.Software.xbcloud:type_name -> agent.GetVersionsRequest.Xbcloud - 86, // 133: agent.GetVersionsRequest.Software.qpress:type_name -> agent.GetVersionsRequest.Qpress - 87, // 134: agent.GetVersionsRequest.Software.mongod:type_name -> agent.GetVersionsRequest.MongoDB - 88, // 135: agent.GetVersionsRequest.Software.pbm:type_name -> agent.GetVersionsRequest.PBM - 40, // 136: agent.Agent.Connect:input_type -> agent.AgentMessage - 41, // 137: agent.Agent.Connect:output_type -> agent.ServerMessage - 137, // [137:138] is the sub-list for method output_type - 136, // [136:137] is the sub-list for method input_type - 136, // [136:136] is the sub-list for extension type_name - 136, // [136:136] is the sub-list for extension extendee - 0, // [0:136] is the sub-list for field type_name + 72, // 40: agent.CheckConnectionResponse.stats:type_name -> agent.CheckConnectionResponse.Stats + 97, // 41: agent.ServiceInfoRequest.type:type_name -> inventory.ServiceType + 96, // 42: agent.ServiceInfoRequest.timeout:type_name -> google.protobuf.Duration + 2, // 43: agent.ServiceInfoRequest.text_files:type_name -> agent.TextFiles + 96, // 44: agent.StartJobRequest.timeout:type_name -> google.protobuf.Duration + 73, // 45: agent.StartJobRequest.mysql_backup:type_name -> agent.StartJobRequest.MySQLBackup + 74, // 46: agent.StartJobRequest.mysql_restore_backup:type_name -> agent.StartJobRequest.MySQLRestoreBackup + 75, // 47: agent.StartJobRequest.mongodb_backup:type_name -> agent.StartJobRequest.MongoDBBackup + 76, // 48: agent.StartJobRequest.mongodb_restore_backup:type_name -> agent.StartJobRequest.MongoDBRestoreBackup + 93, // 49: agent.JobResult.timestamp:type_name -> google.protobuf.Timestamp + 77, // 50: agent.JobResult.error:type_name -> agent.JobResult.Error + 79, // 51: agent.JobResult.mysql_backup:type_name -> agent.JobResult.MySQLBackup + 80, // 52: agent.JobResult.mysql_restore_backup:type_name -> agent.JobResult.MySQLRestoreBackup + 78, // 53: agent.JobResult.mongodb_backup:type_name -> agent.JobResult.MongoDBBackup + 81, // 54: agent.JobResult.mongodb_restore_backup:type_name -> agent.JobResult.MongoDBRestoreBackup + 93, // 55: agent.JobProgress.timestamp:type_name -> google.protobuf.Timestamp + 82, // 56: agent.JobProgress.mysql_backup:type_name -> agent.JobProgress.MySQLBackup + 83, // 57: agent.JobProgress.mysql_restore_backup:type_name -> agent.JobProgress.MySQLRestoreBackup + 84, // 58: agent.JobProgress.logs:type_name -> agent.JobProgress.Logs + 91, // 59: agent.GetVersionsRequest.softwares:type_name -> agent.GetVersionsRequest.Software + 92, // 60: agent.GetVersionsResponse.versions:type_name -> agent.GetVersionsResponse.Version + 98, // 61: agent.AgentMessage.status:type_name -> google.rpc.Status + 3, // 62: agent.AgentMessage.ping:type_name -> agent.Ping + 7, // 63: agent.AgentMessage.state_changed:type_name -> agent.StateChangedRequest + 5, // 64: agent.AgentMessage.qan_collect:type_name -> agent.QANCollectRequest + 20, // 65: agent.AgentMessage.action_result:type_name -> agent.ActionResultRequest + 38, // 66: agent.AgentMessage.job_result:type_name -> agent.JobResult + 39, // 67: agent.AgentMessage.job_progress:type_name -> agent.JobProgress + 4, // 68: agent.AgentMessage.pong:type_name -> agent.Pong + 10, // 69: agent.AgentMessage.set_state:type_name -> agent.SetStateResponse + 17, // 70: agent.AgentMessage.start_action:type_name -> agent.StartActionResponse + 19, // 71: agent.AgentMessage.stop_action:type_name -> agent.StopActionResponse + 27, // 72: agent.AgentMessage.check_connection:type_name -> agent.CheckConnectionResponse + 35, // 73: agent.AgentMessage.start_job:type_name -> agent.StartJobResponse + 37, // 74: agent.AgentMessage.stop_job:type_name -> agent.StopJobResponse + 31, // 75: agent.AgentMessage.job_status:type_name -> agent.JobStatusResponse + 41, // 76: agent.AgentMessage.get_versions:type_name -> agent.GetVersionsResponse + 23, // 77: agent.AgentMessage.pbm_switch_pitr:type_name -> agent.PBMSwitchPITRResponse + 25, // 78: agent.AgentMessage.agent_logs:type_name -> agent.AgentLogsResponse + 29, // 79: agent.AgentMessage.service_info:type_name -> agent.ServiceInfoResponse + 98, // 80: agent.ServerMessage.status:type_name -> google.rpc.Status + 4, // 81: agent.ServerMessage.pong:type_name -> agent.Pong + 8, // 82: agent.ServerMessage.state_changed:type_name -> agent.StateChangedResponse + 6, // 83: agent.ServerMessage.qan_collect:type_name -> agent.QANCollectResponse + 21, // 84: agent.ServerMessage.action_result:type_name -> agent.ActionResultResponse + 3, // 85: agent.ServerMessage.ping:type_name -> agent.Ping + 9, // 86: agent.ServerMessage.set_state:type_name -> agent.SetStateRequest + 16, // 87: agent.ServerMessage.start_action:type_name -> agent.StartActionRequest + 18, // 88: agent.ServerMessage.stop_action:type_name -> agent.StopActionRequest + 26, // 89: agent.ServerMessage.check_connection:type_name -> agent.CheckConnectionRequest + 34, // 90: agent.ServerMessage.start_job:type_name -> agent.StartJobRequest + 36, // 91: agent.ServerMessage.stop_job:type_name -> agent.StopJobRequest + 30, // 92: agent.ServerMessage.job_status:type_name -> agent.JobStatusRequest + 40, // 93: agent.ServerMessage.get_versions:type_name -> agent.GetVersionsRequest + 22, // 94: agent.ServerMessage.pbm_switch_pitr:type_name -> agent.PBMSwitchPITRRequest + 24, // 95: agent.ServerMessage.agent_logs:type_name -> agent.AgentLogsRequest + 28, // 96: agent.ServerMessage.service_info:type_name -> agent.ServiceInfoRequest + 99, // 97: agent.SetStateRequest.AgentProcess.type:type_name -> inventory.AgentType + 49, // 98: agent.SetStateRequest.AgentProcess.text_files:type_name -> agent.SetStateRequest.AgentProcess.TextFilesEntry + 45, // 99: agent.SetStateRequest.AgentProcessesEntry.value:type_name -> agent.SetStateRequest.AgentProcess + 99, // 100: agent.SetStateRequest.BuiltinAgent.type:type_name -> inventory.AgentType + 2, // 101: agent.SetStateRequest.BuiltinAgent.text_files:type_name -> agent.TextFiles + 47, // 102: agent.SetStateRequest.BuiltinAgentsEntry.value:type_name -> agent.SetStateRequest.BuiltinAgent + 11, // 103: agent.QueryActionMap.MapEntry.value:type_name -> agent.QueryActionValue + 0, // 104: agent.StartActionRequest.MySQLExplainParams.output_format:type_name -> agent.MysqlExplainOutputFormat + 2, // 105: agent.StartActionRequest.MySQLExplainParams.tls_files:type_name -> agent.TextFiles + 2, // 106: agent.StartActionRequest.MySQLShowCreateTableParams.tls_files:type_name -> agent.TextFiles + 2, // 107: agent.StartActionRequest.MySQLShowTableStatusParams.tls_files:type_name -> agent.TextFiles + 2, // 108: agent.StartActionRequest.MySQLShowIndexParams.tls_files:type_name -> agent.TextFiles + 2, // 109: agent.StartActionRequest.PostgreSQLShowCreateTableParams.tls_files:type_name -> agent.TextFiles + 2, // 110: agent.StartActionRequest.PostgreSQLShowIndexParams.tls_files:type_name -> agent.TextFiles + 2, // 111: agent.StartActionRequest.MongoDBExplainParams.text_files:type_name -> agent.TextFiles + 2, // 112: agent.StartActionRequest.MySQLQueryShowParams.tls_files:type_name -> agent.TextFiles + 2, // 113: agent.StartActionRequest.MySQLQuerySelectParams.tls_files:type_name -> agent.TextFiles + 2, // 114: agent.StartActionRequest.PostgreSQLQueryShowParams.tls_files:type_name -> agent.TextFiles + 2, // 115: agent.StartActionRequest.PostgreSQLQuerySelectParams.tls_files:type_name -> agent.TextFiles + 2, // 116: agent.StartActionRequest.MongoDBQueryGetParameterParams.text_files:type_name -> agent.TextFiles + 2, // 117: agent.StartActionRequest.MongoDBQueryBuildInfoParams.text_files:type_name -> agent.TextFiles + 2, // 118: agent.StartActionRequest.MongoDBQueryGetCmdLineOptsParams.text_files:type_name -> agent.TextFiles + 2, // 119: agent.StartActionRequest.MongoDBQueryReplSetGetStatusParams.text_files:type_name -> agent.TextFiles + 2, // 120: agent.StartActionRequest.MongoDBQueryGetDiagnosticDataParams.text_files:type_name -> agent.TextFiles + 1, // 121: agent.StartActionRequest.RestartSystemServiceParams.system_service:type_name -> agent.StartActionRequest.RestartSystemServiceParams.SystemService + 32, // 122: agent.StartJobRequest.MySQLBackup.s3_config:type_name -> agent.S3LocationConfig + 32, // 123: agent.StartJobRequest.MySQLRestoreBackup.s3_config:type_name -> agent.S3LocationConfig + 100, // 124: agent.StartJobRequest.MongoDBBackup.data_model:type_name -> backup.v1.DataModel + 32, // 125: agent.StartJobRequest.MongoDBBackup.s3_config:type_name -> agent.S3LocationConfig + 33, // 126: agent.StartJobRequest.MongoDBBackup.filesystem_config:type_name -> agent.FilesystemLocationConfig + 2, // 127: agent.StartJobRequest.MongoDBBackup.text_files:type_name -> agent.TextFiles + 93, // 128: agent.StartJobRequest.MongoDBRestoreBackup.pitr_timestamp:type_name -> google.protobuf.Timestamp + 32, // 129: agent.StartJobRequest.MongoDBRestoreBackup.s3_config:type_name -> agent.S3LocationConfig + 33, // 130: agent.StartJobRequest.MongoDBRestoreBackup.filesystem_config:type_name -> agent.FilesystemLocationConfig + 101, // 131: agent.StartJobRequest.MongoDBRestoreBackup.pbm_metadata:type_name -> backup.v1.PbmMetadata + 2, // 132: agent.StartJobRequest.MongoDBRestoreBackup.text_files:type_name -> agent.TextFiles + 102, // 133: agent.JobResult.MongoDBBackup.metadata:type_name -> backup.v1.Metadata + 102, // 134: agent.JobResult.MySQLBackup.metadata:type_name -> backup.v1.Metadata + 85, // 135: agent.GetVersionsRequest.Software.mysqld:type_name -> agent.GetVersionsRequest.MySQLd + 86, // 136: agent.GetVersionsRequest.Software.xtrabackup:type_name -> agent.GetVersionsRequest.Xtrabackup + 87, // 137: agent.GetVersionsRequest.Software.xbcloud:type_name -> agent.GetVersionsRequest.Xbcloud + 88, // 138: agent.GetVersionsRequest.Software.qpress:type_name -> agent.GetVersionsRequest.Qpress + 89, // 139: agent.GetVersionsRequest.Software.mongod:type_name -> agent.GetVersionsRequest.MongoDB + 90, // 140: agent.GetVersionsRequest.Software.pbm:type_name -> agent.GetVersionsRequest.PBM + 42, // 141: agent.Agent.Connect:input_type -> agent.AgentMessage + 43, // 142: agent.Agent.Connect:output_type -> agent.ServerMessage + 142, // [142:143] is the sub-list for method output_type + 141, // [141:142] is the sub-list for method input_type + 141, // [141:141] is the sub-list for extension type_name + 141, // [141:141] is the sub-list for extension extendee + 0, // [0:141] is the sub-list for field type_name } func init() { file_agentpb_agent_proto_init() } @@ -8146,7 +8364,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobStatusRequest); i { + switch v := v.(*ServiceInfoRequest); i { case 0: return &v.state case 1: @@ -8158,7 +8376,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobStatusResponse); i { + switch v := v.(*ServiceInfoResponse); i { case 0: return &v.state case 1: @@ -8170,7 +8388,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*S3LocationConfig); i { + switch v := v.(*JobStatusRequest); i { case 0: return &v.state case 1: @@ -8182,7 +8400,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FilesystemLocationConfig); i { + switch v := v.(*JobStatusResponse); i { case 0: return &v.state case 1: @@ -8194,7 +8412,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartJobRequest); i { + switch v := v.(*S3LocationConfig); i { case 0: return &v.state case 1: @@ -8206,7 +8424,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StartJobResponse); i { + switch v := v.(*FilesystemLocationConfig); i { case 0: return &v.state case 1: @@ -8218,7 +8436,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopJobRequest); i { + switch v := v.(*StartJobRequest); i { case 0: return &v.state case 1: @@ -8230,7 +8448,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StopJobResponse); i { + switch v := v.(*StartJobResponse); i { case 0: return &v.state case 1: @@ -8242,7 +8460,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobResult); i { + switch v := v.(*StopJobRequest); i { case 0: return &v.state case 1: @@ -8254,7 +8472,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobProgress); i { + switch v := v.(*StopJobResponse); i { case 0: return &v.state case 1: @@ -8266,7 +8484,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetVersionsRequest); i { + switch v := v.(*JobResult); i { case 0: return &v.state case 1: @@ -8278,7 +8496,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetVersionsResponse); i { + switch v := v.(*JobProgress); i { case 0: return &v.state case 1: @@ -8290,7 +8508,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AgentMessage); i { + switch v := v.(*GetVersionsRequest); i { case 0: return &v.state case 1: @@ -8302,7 +8520,19 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServerMessage); i { + switch v := v.(*GetVersionsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_agentpb_agent_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*AgentMessage); i { case 0: return &v.state case 1: @@ -8314,7 +8544,7 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetStateRequest_AgentProcess); i { + switch v := v.(*ServerMessage); i { case 0: return &v.state case 1: @@ -8326,6 +8556,18 @@ func file_agentpb_agent_proto_init() { } } file_agentpb_agent_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*SetStateRequest_AgentProcess); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_agentpb_agent_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SetStateRequest_BuiltinAgent); i { case 0: return &v.state @@ -8337,7 +8579,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MySQLExplainParams); i { case 0: return &v.state @@ -8349,7 +8591,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MySQLShowCreateTableParams); i { case 0: return &v.state @@ -8361,7 +8603,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MySQLShowTableStatusParams); i { case 0: return &v.state @@ -8373,7 +8615,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MySQLShowIndexParams); i { case 0: return &v.state @@ -8385,7 +8627,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PostgreSQLShowCreateTableParams); i { case 0: return &v.state @@ -8397,7 +8639,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PostgreSQLShowIndexParams); i { case 0: return &v.state @@ -8409,7 +8651,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MongoDBExplainParams); i { case 0: return &v.state @@ -8421,7 +8663,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PTSummaryParams); i { case 0: return &v.state @@ -8433,7 +8675,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PTPgSummaryParams); i { case 0: return &v.state @@ -8445,7 +8687,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PTMongoDBSummaryParams); i { case 0: return &v.state @@ -8457,7 +8699,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PTMySQLSummaryParams); i { case 0: return &v.state @@ -8469,7 +8711,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MySQLQueryShowParams); i { case 0: return &v.state @@ -8481,7 +8723,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MySQLQuerySelectParams); i { case 0: return &v.state @@ -8493,7 +8735,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PostgreSQLQueryShowParams); i { case 0: return &v.state @@ -8505,7 +8747,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_PostgreSQLQuerySelectParams); i { case 0: return &v.state @@ -8517,7 +8759,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MongoDBQueryGetParameterParams); i { case 0: return &v.state @@ -8529,7 +8771,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MongoDBQueryBuildInfoParams); i { case 0: return &v.state @@ -8541,7 +8783,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MongoDBQueryGetCmdLineOptsParams); i { case 0: return &v.state @@ -8553,7 +8795,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MongoDBQueryReplSetGetStatusParams); i { case 0: return &v.state @@ -8565,7 +8807,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_MongoDBQueryGetDiagnosticDataParams); i { case 0: return &v.state @@ -8577,7 +8819,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartActionRequest_RestartSystemServiceParams); i { case 0: return &v.state @@ -8589,7 +8831,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CheckConnectionResponse_Stats); i { case 0: return &v.state @@ -8601,7 +8843,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartJobRequest_MySQLBackup); i { case 0: return &v.state @@ -8613,7 +8855,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartJobRequest_MySQLRestoreBackup); i { case 0: return &v.state @@ -8625,7 +8867,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartJobRequest_MongoDBBackup); i { case 0: return &v.state @@ -8637,7 +8879,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StartJobRequest_MongoDBRestoreBackup); i { case 0: return &v.state @@ -8649,7 +8891,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobResult_Error); i { case 0: return &v.state @@ -8661,7 +8903,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobResult_MongoDBBackup); i { case 0: return &v.state @@ -8673,7 +8915,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobResult_MySQLBackup); i { case 0: return &v.state @@ -8685,7 +8927,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobResult_MySQLRestoreBackup); i { case 0: return &v.state @@ -8697,7 +8939,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobResult_MongoDBRestoreBackup); i { case 0: return &v.state @@ -8709,7 +8951,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobProgress_MySQLBackup); i { case 0: return &v.state @@ -8721,7 +8963,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobProgress_MySQLRestoreBackup); i { case 0: return &v.state @@ -8733,7 +8975,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*JobProgress_Logs); i { case 0: return &v.state @@ -8745,7 +8987,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_MySQLd); i { case 0: return &v.state @@ -8757,7 +8999,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_Xtrabackup); i { case 0: return &v.state @@ -8769,7 +9011,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_Xbcloud); i { case 0: return &v.state @@ -8781,7 +9023,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_Qpress); i { case 0: return &v.state @@ -8793,7 +9035,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_MongoDB); i { case 0: return &v.state @@ -8805,7 +9047,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_PBM); i { case 0: return &v.state @@ -8817,7 +9059,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsRequest_Software); i { case 0: return &v.state @@ -8829,7 +9071,7 @@ func file_agentpb_agent_proto_init() { return nil } } - file_agentpb_agent_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_agentpb_agent_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetVersionsResponse_Version); i { case 0: return &v.state @@ -8877,25 +9119,25 @@ func file_agentpb_agent_proto_init() { (*StartActionRequest_MongodbQueryGetdiagnosticdataParams)(nil), (*StartActionRequest_RestartSysServiceParams)(nil), } - file_agentpb_agent_proto_msgTypes[30].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[32].OneofWrappers = []interface{}{ (*StartJobRequest_MysqlBackup)(nil), (*StartJobRequest_MysqlRestoreBackup)(nil), (*StartJobRequest_MongodbBackup)(nil), (*StartJobRequest_MongodbRestoreBackup)(nil), } - file_agentpb_agent_proto_msgTypes[34].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[36].OneofWrappers = []interface{}{ (*JobResult_Error_)(nil), (*JobResult_MysqlBackup)(nil), (*JobResult_MysqlRestoreBackup)(nil), (*JobResult_MongodbBackup)(nil), (*JobResult_MongodbRestoreBackup)(nil), } - file_agentpb_agent_proto_msgTypes[35].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[37].OneofWrappers = []interface{}{ (*JobProgress_MysqlBackup)(nil), (*JobProgress_MysqlRestoreBackup)(nil), (*JobProgress_Logs_)(nil), } - file_agentpb_agent_proto_msgTypes[38].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[40].OneofWrappers = []interface{}{ (*AgentMessage_Ping)(nil), (*AgentMessage_StateChanged)(nil), (*AgentMessage_QanCollect)(nil), @@ -8913,8 +9155,9 @@ func file_agentpb_agent_proto_init() { (*AgentMessage_GetVersions)(nil), (*AgentMessage_PbmSwitchPitr)(nil), (*AgentMessage_AgentLogs)(nil), + (*AgentMessage_ServiceInfo)(nil), } - file_agentpb_agent_proto_msgTypes[39].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[41].OneofWrappers = []interface{}{ (*ServerMessage_Pong)(nil), (*ServerMessage_StateChanged)(nil), (*ServerMessage_QanCollect)(nil), @@ -8930,22 +9173,23 @@ func file_agentpb_agent_proto_init() { (*ServerMessage_GetVersions)(nil), (*ServerMessage_PbmSwitchPitr)(nil), (*ServerMessage_AgentLogs)(nil), + (*ServerMessage_ServiceInfo)(nil), } - file_agentpb_agent_proto_msgTypes[69].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[71].OneofWrappers = []interface{}{ (*StartJobRequest_MySQLBackup_S3Config)(nil), } - file_agentpb_agent_proto_msgTypes[70].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[72].OneofWrappers = []interface{}{ (*StartJobRequest_MySQLRestoreBackup_S3Config)(nil), } - file_agentpb_agent_proto_msgTypes[71].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[73].OneofWrappers = []interface{}{ (*StartJobRequest_MongoDBBackup_S3Config)(nil), (*StartJobRequest_MongoDBBackup_FilesystemConfig)(nil), } - file_agentpb_agent_proto_msgTypes[72].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[74].OneofWrappers = []interface{}{ (*StartJobRequest_MongoDBRestoreBackup_S3Config)(nil), (*StartJobRequest_MongoDBRestoreBackup_FilesystemConfig)(nil), } - file_agentpb_agent_proto_msgTypes[87].OneofWrappers = []interface{}{ + file_agentpb_agent_proto_msgTypes[89].OneofWrappers = []interface{}{ (*GetVersionsRequest_Software_Mysqld)(nil), (*GetVersionsRequest_Software_Xtrabackup)(nil), (*GetVersionsRequest_Software_Xbcloud)(nil), @@ -8959,7 +9203,7 @@ func file_agentpb_agent_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_agentpb_agent_proto_rawDesc, NumEnums: 2, - NumMessages: 89, + NumMessages: 91, NumExtensions: 0, NumServices: 1, }, diff --git a/api/agentpb/agent.pb.validate.go b/api/agentpb/agent.pb.validate.go index 75971959e9..ea4507ce88 100644 --- a/api/agentpb/agent.pb.validate.go +++ b/api/agentpb/agent.pb.validate.go @@ -4278,6 +4278,280 @@ var _ interface { ErrorName() string } = CheckConnectionResponseValidationError{} +// Validate checks the field values on ServiceInfoRequest 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 *ServiceInfoRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ServiceInfoRequest 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 +// ServiceInfoRequestMultiError, or nil if none found. +func (m *ServiceInfoRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *ServiceInfoRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Type + + // no validation rules for Dsn + + if all { + switch v := interface{}(m.GetTimeout()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ServiceInfoRequestValidationError{ + field: "Timeout", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ServiceInfoRequestValidationError{ + field: "Timeout", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetTimeout()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ServiceInfoRequestValidationError{ + field: "Timeout", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if all { + switch v := interface{}(m.GetTextFiles()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ServiceInfoRequestValidationError{ + field: "TextFiles", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ServiceInfoRequestValidationError{ + field: "TextFiles", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetTextFiles()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ServiceInfoRequestValidationError{ + field: "TextFiles", + reason: "embedded message failed validation", + cause: err, + } + } + } + + // no validation rules for TlsSkipVerify + + if len(errors) > 0 { + return ServiceInfoRequestMultiError(errors) + } + + return nil +} + +// ServiceInfoRequestMultiError is an error wrapping multiple validation errors +// returned by ServiceInfoRequest.ValidateAll() if the designated constraints +// aren't met. +type ServiceInfoRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ServiceInfoRequestMultiError) 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 ServiceInfoRequestMultiError) AllErrors() []error { return m } + +// ServiceInfoRequestValidationError is the validation error returned by +// ServiceInfoRequest.Validate if the designated constraints aren't met. +type ServiceInfoRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ServiceInfoRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ServiceInfoRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ServiceInfoRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ServiceInfoRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ServiceInfoRequestValidationError) ErrorName() string { + return "ServiceInfoRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e ServiceInfoRequestValidationError) 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 %sServiceInfoRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ServiceInfoRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ServiceInfoRequestValidationError{} + +// Validate checks the field values on ServiceInfoResponse 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 *ServiceInfoResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ServiceInfoResponse 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 +// ServiceInfoResponseMultiError, or nil if none found. +func (m *ServiceInfoResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *ServiceInfoResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Error + + // no validation rules for TableCount + + // no validation rules for Version + + if len(errors) > 0 { + return ServiceInfoResponseMultiError(errors) + } + + return nil +} + +// ServiceInfoResponseMultiError is an error wrapping multiple validation +// errors returned by ServiceInfoResponse.ValidateAll() if the designated +// constraints aren't met. +type ServiceInfoResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ServiceInfoResponseMultiError) 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 ServiceInfoResponseMultiError) AllErrors() []error { return m } + +// ServiceInfoResponseValidationError is the validation error returned by +// ServiceInfoResponse.Validate if the designated constraints aren't met. +type ServiceInfoResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ServiceInfoResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ServiceInfoResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ServiceInfoResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ServiceInfoResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ServiceInfoResponseValidationError) ErrorName() string { + return "ServiceInfoResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e ServiceInfoResponseValidationError) 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 %sServiceInfoResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ServiceInfoResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ServiceInfoResponseValidationError{} + // Validate checks the field values on JobStatusRequest 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. @@ -6923,6 +7197,47 @@ func (m *AgentMessage) validate(all bool) error { } } + case *AgentMessage_ServiceInfo: + if v == nil { + err := AgentMessageValidationError{ + field: "Payload", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetServiceInfo()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, AgentMessageValidationError{ + field: "ServiceInfo", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, AgentMessageValidationError{ + field: "ServiceInfo", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetServiceInfo()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return AgentMessageValidationError{ + field: "ServiceInfo", + reason: "embedded message failed validation", + cause: err, + } + } + } + default: _ = v // ensures v is used } @@ -7673,6 +7988,47 @@ func (m *ServerMessage) validate(all bool) error { } } + case *ServerMessage_ServiceInfo: + if v == nil { + err := ServerMessageValidationError{ + field: "Payload", + reason: "oneof value cannot be a typed-nil", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetServiceInfo()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ServerMessageValidationError{ + field: "ServiceInfo", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ServerMessageValidationError{ + field: "ServiceInfo", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetServiceInfo()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ServerMessageValidationError{ + field: "ServiceInfo", + reason: "embedded message failed validation", + cause: err, + } + } + } + default: _ = v // ensures v is used } diff --git a/api/agentpb/agent.proto b/api/agentpb/agent.proto index 737640c198..e03d76109e 100644 --- a/api/agentpb/agent.proto +++ b/api/agentpb/agent.proto @@ -438,7 +438,7 @@ message CheckConnectionRequest { bool tls_skip_verify = 5; } -// CheckConnectionResponse is an AgentMessage containing a result of connection check. +// CheckConnectionResponse is an AgentMessage containing the result of a connection check. message CheckConnectionResponse { // Stats contains various Service statistics. message Stats { @@ -447,7 +447,31 @@ message CheckConnectionResponse { } // Error message if connection check failed. string error = 1; - Stats stats = 2; + Stats stats = 2 [deprecated = true]; +} + +// ServiceInfoRequest is a ServerMessage that queries pmm-agent for database information. +message ServiceInfoRequest { + // Service type. + inventory.ServiceType type = 1; + // DSN for the service. May contain connection (dial) timeout. + string dsn = 2; + // Timeout for the whole request. + google.protobuf.Duration timeout = 3; + // Contains files and their contents which can be used in DSN. + TextFiles text_files = 4; + // TLS certificate wont be verified. + bool tls_skip_verify = 5; +} + +// ServiceInfoResponse is an AgentMessage containing information gathered from a service. +message ServiceInfoResponse { + // Error message if the request failed. + string error = 1; + // A number of MySQL tables, 0 if unknown. + int32 table_count = 2; + // Database server version. + string version = 3; } // JobStatusRequest is a ServerMessage asking pmm-agent for job status. @@ -710,8 +734,6 @@ message GetVersionsResponse { } message AgentMessage { - // TODO https://jira.percona.com/browse/PMM-3449 - uint32 id = 1; // The responder sets the status field in two situations: // 1. When it received a request with the payload field not set. @@ -739,12 +761,11 @@ message AgentMessage { GetVersionsResponse get_versions = 18; PBMSwitchPITRResponse pbm_switch_pitr = 19; AgentLogsResponse agent_logs = 21; + ServiceInfoResponse service_info = 22; } } message ServerMessage { - // TODO https://jira.percona.com/browse/PMM-3449 - uint32 id = 1; // The responder sets the status field in two situations: // 1. When it received a request with the payload field not set. @@ -770,6 +791,7 @@ message ServerMessage { GetVersionsRequest get_versions = 16; PBMSwitchPITRRequest pbm_switch_pitr = 17; AgentLogsRequest agent_logs = 19; + ServiceInfoRequest service_info = 20; } } diff --git a/api/inventorypb/json/client/services/add_mongo_db_service_responses.go b/api/inventorypb/json/client/services/add_mongo_db_service_responses.go index 2f0a715d74..9bc049120f 100644 --- a/api/inventorypb/json/client/services/add_mongo_db_service_responses.go +++ b/api/inventorypb/json/client/services/add_mongo_db_service_responses.go @@ -449,6 +449,9 @@ type AddMongoDBServiceOKBodyMongodb struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MongoDB version. + Version string `json:"version,omitempty"` } // Validate validates this add mongo DB service OK body mongodb diff --git a/api/inventorypb/json/client/services/add_my_sql_service_responses.go b/api/inventorypb/json/client/services/add_my_sql_service_responses.go index d3e8511769..ea4d4bc211 100644 --- a/api/inventorypb/json/client/services/add_my_sql_service_responses.go +++ b/api/inventorypb/json/client/services/add_my_sql_service_responses.go @@ -449,6 +449,9 @@ type AddMySQLServiceOKBodyMysql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MySQL version. + Version string `json:"version,omitempty"` } // Validate validates this add my SQL service OK body mysql diff --git a/api/inventorypb/json/client/services/add_postgre_sql_service_responses.go b/api/inventorypb/json/client/services/add_postgre_sql_service_responses.go index c704610153..334dedbf33 100644 --- a/api/inventorypb/json/client/services/add_postgre_sql_service_responses.go +++ b/api/inventorypb/json/client/services/add_postgre_sql_service_responses.go @@ -452,6 +452,9 @@ type AddPostgreSQLServiceOKBodyPostgresql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // PostgreSQL version. + Version string `json:"version,omitempty"` } // Validate validates this add postgre SQL service OK body postgresql diff --git a/api/inventorypb/json/client/services/add_proxy_sql_service_responses.go b/api/inventorypb/json/client/services/add_proxy_sql_service_responses.go index 4bd65d4a30..a8e751259e 100644 --- a/api/inventorypb/json/client/services/add_proxy_sql_service_responses.go +++ b/api/inventorypb/json/client/services/add_proxy_sql_service_responses.go @@ -449,6 +449,9 @@ type AddProxySQLServiceOKBodyProxysql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // ProxySQL version. + Version string `json:"version,omitempty"` } // Validate validates this add proxy SQL service OK body proxysql diff --git a/api/inventorypb/json/client/services/get_service_responses.go b/api/inventorypb/json/client/services/get_service_responses.go index 5249f7e578..da75bcd52b 100644 --- a/api/inventorypb/json/client/services/get_service_responses.go +++ b/api/inventorypb/json/client/services/get_service_responses.go @@ -760,6 +760,9 @@ type GetServiceOKBodyMongodb struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MongoDB version. + Version string `json:"version,omitempty"` } // Validate validates this get service OK body mongodb @@ -827,6 +830,9 @@ type GetServiceOKBodyMysql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MySQL version. + Version string `json:"version,omitempty"` } // Validate validates this get service OK body mysql @@ -897,6 +903,9 @@ type GetServiceOKBodyPostgresql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // PostgreSQL version. + Version string `json:"version,omitempty"` } // Validate validates this get service OK body postgresql @@ -964,6 +973,9 @@ type GetServiceOKBodyProxysql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // ProxySQL version. + Version string `json:"version,omitempty"` } // Validate validates this get service OK body proxysql diff --git a/api/inventorypb/json/client/services/list_services_responses.go b/api/inventorypb/json/client/services/list_services_responses.go index d7d093f09d..13c39e0205 100644 --- a/api/inventorypb/json/client/services/list_services_responses.go +++ b/api/inventorypb/json/client/services/list_services_responses.go @@ -889,6 +889,9 @@ type ListServicesOKBodyMongodbItems0 struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MongoDB version. + Version string `json:"version,omitempty"` } // Validate validates this list services OK body mongodb items0 @@ -956,6 +959,9 @@ type ListServicesOKBodyMysqlItems0 struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MySQL version. + Version string `json:"version,omitempty"` } // Validate validates this list services OK body mysql items0 @@ -1026,6 +1032,9 @@ type ListServicesOKBodyPostgresqlItems0 struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // PostgreSQL version. + Version string `json:"version,omitempty"` } // Validate validates this list services OK body postgresql items0 @@ -1093,6 +1102,9 @@ type ListServicesOKBodyProxysqlItems0 struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // ProxySQL version. + Version string `json:"version,omitempty"` } // Validate validates this list services OK body proxysql items0 diff --git a/api/inventorypb/json/inventorypb.json b/api/inventorypb/json/inventorypb.json index f1cbb4024b..bb4239d488 100644 --- a/api/inventorypb/json/inventorypb.json +++ b/api/inventorypb/json/inventorypb.json @@ -11604,6 +11604,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -11777,6 +11782,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -11955,6 +11965,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 6 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 0 @@ -12128,6 +12143,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -12581,6 +12601,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 1 @@ -12642,6 +12667,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -12708,6 +12738,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 6 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 2 @@ -12769,6 +12804,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 3 @@ -13021,6 +13061,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } } }, @@ -13085,6 +13130,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -13154,6 +13204,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 6 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } } }, @@ -13218,6 +13273,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } } }, diff --git a/api/inventorypb/services.pb.go b/api/inventorypb/services.pb.go index bf39b9164e..46aabb2016 100644 --- a/api/inventorypb/services.pb.go +++ b/api/inventorypb/services.pb.go @@ -115,6 +115,8 @@ type MySQLService struct { ReplicationSet string `protobuf:"bytes,8,opt,name=replication_set,json=replicationSet,proto3" json:"replication_set,omitempty"` // Custom user-assigned labels. CustomLabels map[string]string `protobuf:"bytes,9,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // MySQL version. + Version string `protobuf:"bytes,11,opt,name=version,proto3" json:"version,omitempty"` } func (x *MySQLService) Reset() { @@ -219,6 +221,13 @@ func (x *MySQLService) GetCustomLabels() map[string]string { return nil } +func (x *MySQLService) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + // MongoDBService represents a generic MongoDB instance. type MongoDBService struct { state protoimpl.MessageState @@ -248,6 +257,8 @@ type MongoDBService struct { ReplicationSet string `protobuf:"bytes,8,opt,name=replication_set,json=replicationSet,proto3" json:"replication_set,omitempty"` // Custom user-assigned labels. CustomLabels map[string]string `protobuf:"bytes,9,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // MongoDB version. + Version string `protobuf:"bytes,11,opt,name=version,proto3" json:"version,omitempty"` } func (x *MongoDBService) Reset() { @@ -352,6 +363,13 @@ func (x *MongoDBService) GetCustomLabels() map[string]string { return nil } +func (x *MongoDBService) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + // PostgreSQLService represents a generic PostgreSQL instance. type PostgreSQLService struct { state protoimpl.MessageState @@ -383,6 +401,8 @@ type PostgreSQLService struct { ReplicationSet string `protobuf:"bytes,8,opt,name=replication_set,json=replicationSet,proto3" json:"replication_set,omitempty"` // Custom user-assigned labels. CustomLabels map[string]string `protobuf:"bytes,9,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // PostgreSQL version. + Version string `protobuf:"bytes,12,opt,name=version,proto3" json:"version,omitempty"` } func (x *PostgreSQLService) Reset() { @@ -494,6 +514,13 @@ func (x *PostgreSQLService) GetCustomLabels() map[string]string { return nil } +func (x *PostgreSQLService) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + // ProxySQLService represents a generic ProxySQL instance. type ProxySQLService struct { state protoimpl.MessageState @@ -523,6 +550,8 @@ type ProxySQLService struct { ReplicationSet string `protobuf:"bytes,8,opt,name=replication_set,json=replicationSet,proto3" json:"replication_set,omitempty"` // Custom user-assigned labels. CustomLabels map[string]string `protobuf:"bytes,9,rep,name=custom_labels,json=customLabels,proto3" json:"custom_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // ProxySQL version. + Version string `protobuf:"bytes,11,opt,name=version,proto3" json:"version,omitempty"` } func (x *ProxySQLService) Reset() { @@ -627,6 +656,13 @@ func (x *ProxySQLService) GetCustomLabels() map[string]string { return nil } +func (x *ProxySQLService) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + // HAProxyService represents a generic HAProxy service instance. type HAProxyService struct { state protoimpl.MessageState @@ -2647,7 +2683,7 @@ var file_inventorypb_services_proto_rawDesc = []byte{ 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, 0xa5, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xbf, 0x03, 0x0a, 0x0c, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, @@ -2670,305 +2706,214 @@ var file_inventorypb_services_proto_rawDesc = []byte{ 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 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, 0x03, 0x0a, 0x0e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, + 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 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, 0xa9, 0x03, 0x0a, 0x0e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, - 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, - 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, - 0x50, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 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, 0xd4, 0x03, 0x0a, 0x11, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, - 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x61, - 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x74, 0x12, 0x53, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, - 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0xab, 0x03, 0x0a, 0x0f, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x74, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xee, 0x03, 0x0a, 0x11, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, + 0x0a, 0x0d, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x64, 0x61, 0x74, 0x61, 0x62, 0x61, 0x73, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, + 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x53, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, + 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 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, 0xe3, 0x02, 0x0a, 0x0e, 0x48, 0x41, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, - 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x48, 0x41, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0xfb, 0x02, - 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, - 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc5, 0x03, 0x0a, 0x0f, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, + 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, + 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 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, 0x90, 0x01, 0x0a, 0x13, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0c, - 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xdd, - 0x02, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x12, 0x33, 0x0a, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, - 0x62, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x12, 0x3c, 0x0a, 0x0a, 0x70, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, - 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x70, - 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x12, 0x36, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, - 0x6c, 0x12, 0x33, 0x0a, 0x07, 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x07, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x48, - 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x68, - 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x36, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x1f, - 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x5d, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x3b, - 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, - 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x22, 0xf2, 0x02, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x05, 0x6d, 0x79, - 0x73, 0x71, 0x6c, 0x12, 0x35, 0x0a, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, - 0x00, 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x12, 0x3e, 0x0a, 0x0a, 0x70, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, - 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x12, 0x38, 0x0a, 0x08, 0x70, 0x72, - 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, - 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x78, - 0x79, 0x73, 0x71, 0x6c, 0x12, 0x35, 0x0a, 0x07, 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x48, 0x00, 0x52, 0x07, 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x38, 0x0a, 0x08, 0x65, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x08, 0x65, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x42, 0x09, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x22, 0xac, 0x03, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 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, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x74, 0x12, 0x58, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, + 0x62, 0x65, 0x6c, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 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, - 0x48, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x6d, 0x79, + 0xe3, 0x02, 0x0a, 0x0e, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, + 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x74, 0x12, 0x50, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 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, 0xfb, 0x02, 0x0a, 0x0f, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, + 0x64, 0x65, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x51, 0x0a, 0x0d, 0x63, 0x75, 0x73, + 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x14, 0x0a, 0x05, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, + 0x75, 0x70, 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, 0x90, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, + 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, + 0x64, 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, + 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xdd, 0x02, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2d, 0x0a, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x12, 0x33, + 0x0a, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, + 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x67, + 0x6f, 0x64, 0x62, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, + 0x6c, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, + 0x6c, 0x12, 0x36, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x12, 0x33, 0x0a, 0x07, 0x68, 0x61, 0x70, + 0x72, 0x6f, 0x78, 0x79, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x36, + 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x1f, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5d, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x41, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0d, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x22, 0x3b, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x22, 0xf2, 0x02, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x22, 0xb0, 0x03, 0x0a, 0x18, 0x41, 0x64, - 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 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, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, - 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 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, 0x50, 0x0a, 0x19, - 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x6d, 0x6f, 0x6e, - 0x67, 0x6f, 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x22, 0xb6, - 0x03, 0x0a, 0x1b, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, - 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 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, 0x18, 0x0a, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, - 0x63, 0x6b, 0x65, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, - 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, - 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x5d, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x5c, 0x0a, 0x1c, 0x41, 0x64, 0x64, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, - 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, - 0x72, 0x65, 0x73, 0x71, 0x6c, 0x22, 0xb2, 0x03, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, - 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x63, 0x65, 0x48, 0x00, 0x52, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x12, 0x35, 0x0a, 0x07, 0x6d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, + 0x64, 0x62, 0x12, 0x3e, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, + 0x71, 0x6c, 0x12, 0x38, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x48, 0x00, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x12, 0x35, 0x0a, 0x07, + 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x48, 0x00, 0x52, 0x07, 0x68, 0x61, 0x70, 0x72, + 0x6f, 0x78, 0x79, 0x12, 0x38, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x48, 0x00, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x42, 0x09, 0x0a, + 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x22, 0xac, 0x03, 0x0a, 0x16, 0x41, 0x64, 0x64, + 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, @@ -2984,322 +2929,420 @@ var file_inventorypb_services_proto_rawDesc = []byte{ 0x73, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, - 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x5b, 0x0a, 0x0d, + 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x58, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 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, 0x54, 0x0a, 0x1a, 0x41, 0x64, - 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x78, - 0x79, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, - 0x22, 0xea, 0x02, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, - 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 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, 0x20, 0x0a, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, - 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x50, 0x0a, - 0x19, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x68, 0x61, - 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x22, - 0x82, 0x03, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, - 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 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, 0x20, 0x0a, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, - 0x12, 0x5b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, - 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x14, 0x0a, - 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, - 0x6f, 0x75, 0x70, 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, 0x54, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x54, 0x0a, 0x14, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 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, 0x14, 0x0a, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x22, 0x17, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x01, 0x0a, 0x16, 0x41, 0x64, - 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 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, 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, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, + 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x19, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x6f, 0x0a, 0x19, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 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, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x4b, - 0x65, 0x79, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0xa1, 0x02, 0x0a, 0x14, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x48, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x6d, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, 0x79, + 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, 0x6d, 0x79, 0x73, 0x71, + 0x6c, 0x22, 0xb0, 0x03, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, + 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 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, 0x18, 0x0a, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, + 0x63, 0x6b, 0x65, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, + 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, + 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x50, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, + 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x33, 0x0a, 0x07, 0x6d, 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4d, + 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, 0x6d, + 0x6f, 0x6e, 0x67, 0x6f, 0x64, 0x62, 0x22, 0xb6, 0x03, 0x0a, 0x1b, 0x41, 0x64, 0x64, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 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, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, + 0x5d, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, + 0x5c, 0x0a, 0x1c, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x3c, 0x0a, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x0a, 0x70, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x73, 0x71, 0x6c, 0x22, 0xb2, 0x03, + 0x0a, 0x19, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 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, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x63, 0x6b, 0x65, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x27, 0x0a, 0x0f, 0x72, + 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x65, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, + 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x54, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, + 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x36, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, + 0x70, 0x72, 0x6f, 0x78, 0x79, 0x73, 0x71, 0x6c, 0x22, 0xea, 0x02, 0x0a, 0x18, 0x41, 0x64, 0x64, + 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 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, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, + 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x5a, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x35, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x48, + 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x50, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x33, 0x0a, 0x07, 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x07, + 0x68, 0x61, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x22, 0x82, 0x03, 0x0a, 0x19, 0x41, 0x64, 0x64, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, + 0x72, 0x02, 0x10, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 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, 0x20, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, + 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x5b, 0x0a, 0x0d, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x36, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x14, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 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, 0x54, 0x0a, 0x1a, + 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x65, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x22, 0x54, 0x0a, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 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, 0x25, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, - 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x63, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, - 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x02, 0x52, 0x0e, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, - 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x88, - 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, - 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x12, - 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, - 0x65, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x17, 0x0a, 0x15, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0xa8, - 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, - 0x0a, 0x14, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x59, 0x53, 0x51, - 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x4d, - 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x02, - 0x12, 0x16, 0x0a, 0x12, 0x50, 0x4f, 0x53, 0x54, 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x5f, 0x53, - 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x50, 0x52, 0x4f, 0x58, - 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x04, 0x12, 0x13, - 0x0a, 0x0f, 0x48, 0x41, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, - 0x45, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x45, 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, - 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x05, 0x32, 0xaa, 0x15, 0x0a, 0x08, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0xb7, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x66, 0x92, 0x41, 0x3d, 0x12, 0x0d, 0x4c, - 0x69, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x2c, 0x52, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, - 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x79, 0x70, 0x65, 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, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0xe1, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x72, 0x92, 0x41, 0x44, 0x12, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x41, 0x63, 0x74, 0x69, - 0x76, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x1a, 0x27, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, - 0x20, 0x6f, 0x66, 0x20, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 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, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x12, 0xa1, 0x01, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x1c, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x56, 0x92, 0x41, 0x2e, 0x12, 0x0b, 0x47, 0x65, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x1a, 0x1f, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, - 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x62, 0x79, 0x20, - 0x49, 0x44, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x76, - 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x2f, 0x47, 0x65, 0x74, 0x12, 0xaf, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, - 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, - 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, - 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x55, 0x92, 0x41, 0x28, 0x12, 0x11, 0x41, 0x64, 0x64, 0x20, 0x4d, 0x79, - 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x13, 0x41, 0x64, 0x64, - 0x73, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x12, 0xbb, 0x01, 0x0a, 0x11, 0x41, - 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, - 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5b, 0x92, 0x41, 0x2c, - 0x12, 0x13, 0x41, 0x64, 0x64, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x15, 0x41, 0x64, 0x64, 0x73, 0x20, 0x4d, 0x6f, 0x6e, 0x67, - 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, - 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x12, 0xcd, 0x01, 0x0a, 0x14, 0x41, 0x64, 0x64, - 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, - 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, - 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x64, 0x92, 0x41, 0x32, 0x12, 0x16, 0x41, 0x64, 0x64, 0x20, 0x50, 0x6f, 0x73, - 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, - 0x18, 0x41, 0x64, 0x64, 0x73, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, - 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x50, 0x6f, - 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x12, 0xc1, 0x01, 0x0a, 0x12, 0x41, 0x64, 0x64, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, - 0x2e, 0x12, 0x14, 0x41, 0x64, 0x64, 0x20, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x16, 0x41, 0x64, 0x64, 0x73, 0x20, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, 0x22, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x2f, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x12, 0xc2, 0x01, 0x0a, - 0x11, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, - 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, 0x92, - 0x41, 0x2c, 0x12, 0x13, 0x41, 0x64, 0x64, 0x20, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x15, 0x41, 0x64, 0x64, 0x73, 0x20, 0x48, 0x41, - 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, - 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0xc8, 0x01, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x65, 0x92, 0x41, 0x2e, 0x12, 0x14, 0x41, 0x64, 0x64, 0x20, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x1a, 0x16, 0x41, 0x64, 0x64, 0x73, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xa1, 0x01, 0x0a, - 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 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, 0x17, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x4d, 0x92, 0x41, 0x22, 0x12, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x10, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, - 0x2a, 0x22, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x12, 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x65, 0x22, 0xdb, 0x01, 0x0a, 0x16, 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 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, 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, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 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, + 0x19, 0x0a, 0x17, 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6f, 0x0a, 0x19, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 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, + 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa1, 0x02, 0x0a, 0x14, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x01, 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, 0x25, 0x0a, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x88, 0x01, + 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x88, 0x01, 0x01, + 0x12, 0x2c, 0x0a, 0x0f, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0e, 0x72, 0x65, 0x70, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x88, 0x01, 0x01, 0x12, 0x2a, + 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x88, 0x01, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x65, + 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x72, 0x65, 0x70, 0x6c, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x17, 0x0a, + 0x15, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0xa8, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, + 0x12, 0x11, 0x0a, 0x0d, 0x4d, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x4f, 0x4e, 0x47, 0x4f, 0x44, 0x42, 0x5f, 0x53, + 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x4f, 0x53, 0x54, + 0x47, 0x52, 0x45, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, + 0x12, 0x14, 0x0a, 0x10, 0x50, 0x52, 0x4f, 0x58, 0x59, 0x53, 0x51, 0x4c, 0x5f, 0x53, 0x45, 0x52, + 0x56, 0x49, 0x43, 0x45, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x48, 0x41, 0x50, 0x52, 0x4f, 0x58, + 0x59, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x06, 0x12, 0x14, 0x0a, 0x10, 0x45, + 0x58, 0x54, 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, + 0x05, 0x32, 0xaa, 0x15, 0x0a, 0x08, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0xb7, + 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, + 0x1e, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x66, 0x92, 0x41, 0x3d, 0x12, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x1a, 0x2c, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x79, 0x70, + 0x65, 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, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x12, 0xe1, 0x01, 0x0a, 0x16, 0x4c, 0x69, 0x73, + 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x73, 0x12, 0x28, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x72, 0x92, 0x41, 0x44, 0x12, 0x19, 0x4c, + 0x69, 0x73, 0x74, 0x20, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x20, 0x54, 0x79, 0x70, 0x65, 0x73, 0x1a, 0x27, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, + 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, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0xa1, 0x01, 0x0a, + 0x0a, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1c, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, 0x92, 0x41, 0x2e, 0x12, 0x0b, 0x47, + 0x65, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x1f, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x73, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x20, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1f, 0x3a, 0x01, 0x2a, 0x22, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x47, 0x65, 0x74, + 0x12, 0xaf, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x21, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, - 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x01, 0x92, 0x41, - 0x5e, 0x12, 0x19, 0x41, 0x64, 0x64, 0x2f, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x63, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x41, 0x41, 0x64, - 0x64, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x20, 0x28, - 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, - 0x73, 0x29, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x2f, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2f, 0x41, 0x64, - 0x64, 0x12, 0xdf, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, 0x92, 0x41, 0x44, 0x12, 0x14, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x1a, 0x2c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x62, 0x79, 0x20, 0x6b, 0x65, 0x79, 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, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2f, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x12, 0xd0, 0x02, 0x0a, 0x0d, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, - 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xfb, 0x01, 0x92, 0x41, 0xcf, 0x01, 0x12, - 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, - 0xbc, 0x01, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x20, 0x49, 0x66, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, - 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2f, 0x72, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x65, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x20, 0x46, 0x61, - 0x69, 0x6c, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, - 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2f, - 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x8a, 0x01, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x2e, 0x69, - 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x42, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 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, + 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x55, 0x92, 0x41, 0x28, + 0x12, 0x11, 0x41, 0x64, 0x64, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x1a, 0x13, 0x41, 0x64, 0x64, 0x73, 0x20, 0x4d, 0x79, 0x53, 0x51, 0x4c, 0x20, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, + 0x2a, 0x22, 0x1f, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4d, 0x79, 0x53, + 0x51, 0x4c, 0x12, 0xbb, 0x01, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, + 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, + 0x67, 0x6f, 0x44, 0x42, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x5b, 0x92, 0x41, 0x2c, 0x12, 0x13, 0x41, 0x64, 0x64, 0x20, 0x4d, 0x6f, + 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x15, 0x41, + 0x64, 0x64, 0x73, 0x20, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, 0x20, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x26, 0x3a, 0x01, 0x2a, 0x22, 0x21, 0x2f, + 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x4d, 0x6f, 0x6e, 0x67, 0x6f, 0x44, 0x42, + 0x12, 0xcd, 0x01, 0x0a, 0x14, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, + 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x26, 0x2e, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, + 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, + 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x64, 0x92, 0x41, 0x32, 0x12, + 0x16, 0x41, 0x64, 0x64, 0x20, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x18, 0x41, 0x64, 0x64, 0x73, 0x20, 0x50, 0x6f, + 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 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, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x73, 0x74, 0x67, 0x72, 0x65, 0x53, 0x51, 0x4c, + 0x12, 0xc1, 0x01, 0x0a, 0x12, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x53, 0x51, 0x4c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x2e, 0x12, 0x14, 0x41, 0x64, 0x64, 0x20, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, + 0x16, 0x41, 0x64, 0x64, 0x73, 0x20, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x51, 0x4c, 0x20, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x3a, 0x01, 0x2a, + 0x22, 0x22, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x51, 0x4c, 0x12, 0xc2, 0x01, 0x0a, 0x11, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, + 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x23, 0x2e, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, + 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x48, + 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x62, 0x92, 0x41, 0x2c, 0x12, 0x13, 0x41, 0x64, 0x64, 0x20, + 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, + 0x15, 0x41, 0x64, 0x64, 0x73, 0x20, 0x48, 0x41, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x20, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x48, 0x41, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xc8, 0x01, 0x0a, 0x12, 0x41, 0x64, + 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x65, 0x92, + 0x41, 0x2e, 0x12, 0x14, 0x41, 0x64, 0x64, 0x20, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x16, 0x41, 0x64, 0x64, 0x73, 0x20, 0x45, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2f, 0x41, 0x64, 0x64, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0xa1, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x92, 0x41, 0x22, 0x12, 0x0e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0x10, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x2f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0xee, 0x01, 0x0a, 0x0f, 0x41, 0x64, 0x64, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x21, 0x2e, 0x69, + 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x22, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x41, 0x64, 0x64, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x93, 0x01, 0x92, 0x41, 0x5e, 0x12, 0x19, 0x41, 0x64, 0x64, 0x2f, 0x72, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x41, 0x41, 0x64, 0x64, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x73, 0x20, 0x28, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6b, + 0x65, 0x79, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x29, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x2f, 0x41, 0x64, 0x64, 0x12, 0xdf, 0x01, 0x0a, 0x12, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x12, 0x24, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, + 0x72, 0x79, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7c, 0x92, + 0x41, 0x44, 0x12, 0x14, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x2c, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x73, 0x20, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x20, + 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x61, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x62, + 0x79, 0x20, 0x6b, 0x65, 0x79, 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, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x2f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0xd0, 0x02, 0x0a, 0x0d, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1f, 0x2e, + 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0xfb, 0x01, 0x92, 0x41, 0xcf, 0x01, 0x12, 0x0e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x20, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x1a, 0xbc, 0x01, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x20, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x61, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x20, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x20, + 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x69, 0x74, + 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x62, 0x61, 0x63, + 0x6b, 0x75, 0x70, 0x2f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x20, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x73, 0x2e, 0x20, 0x46, 0x61, 0x69, 0x6c, 0x73, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, + 0x20, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x2f, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, + 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x22, 0x3a, 0x01, 0x2a, 0x22, + 0x1d, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2f, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2f, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x8a, + 0x01, 0x0a, 0x0d, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x42, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 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 ( diff --git a/api/inventorypb/services.pb.validate.go b/api/inventorypb/services.pb.validate.go index 65c779fbef..9cc886143c 100644 --- a/api/inventorypb/services.pb.validate.go +++ b/api/inventorypb/services.pb.validate.go @@ -77,6 +77,8 @@ func (m *MySQLService) validate(all bool) error { // no validation rules for CustomLabels + // no validation rules for Version + if len(errors) > 0 { return MySQLServiceMultiError(errors) } @@ -196,6 +198,8 @@ func (m *MongoDBService) validate(all bool) error { // no validation rules for CustomLabels + // no validation rules for Version + if len(errors) > 0 { return MongoDBServiceMultiError(errors) } @@ -318,6 +322,8 @@ func (m *PostgreSQLService) validate(all bool) error { // no validation rules for CustomLabels + // no validation rules for Version + if len(errors) > 0 { return PostgreSQLServiceMultiError(errors) } @@ -440,6 +446,8 @@ func (m *ProxySQLService) validate(all bool) error { // no validation rules for CustomLabels + // no validation rules for Version + if len(errors) > 0 { return ProxySQLServiceMultiError(errors) } diff --git a/api/inventorypb/services.proto b/api/inventorypb/services.proto index 199f6000c6..b74b11f969 100644 --- a/api/inventorypb/services.proto +++ b/api/inventorypb/services.proto @@ -44,6 +44,8 @@ message MySQLService { string replication_set = 8; // Custom user-assigned labels. map custom_labels = 9; + // MySQL version. + string version = 11; } // MongoDBService represents a generic MongoDB instance. @@ -71,6 +73,8 @@ message MongoDBService { string replication_set = 8; // Custom user-assigned labels. map custom_labels = 9; + // MongoDB version. + string version = 11; } // PostgreSQLService represents a generic PostgreSQL instance. @@ -100,6 +104,8 @@ message PostgreSQLService { string replication_set = 8; // Custom user-assigned labels. map custom_labels = 9; + // PostgreSQL version. + string version = 12; } // ProxySQLService represents a generic ProxySQL instance. @@ -127,6 +133,8 @@ message ProxySQLService { string replication_set = 8; // Custom user-assigned labels. map custom_labels = 9; + // ProxySQL version. + string version = 11; } // HAProxyService represents a generic HAProxy service instance. diff --git a/api/managementpb/backup/json/backup.json b/api/managementpb/backup/json/backup.json index dd5fd1afe0..f2773e4ff6 100644 --- a/api/managementpb/backup/json/backup.json +++ b/api/managementpb/backup/json/backup.json @@ -680,6 +680,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } } }, @@ -744,6 +749,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } } }, diff --git a/api/managementpb/backup/json/client/backups/list_artifact_compatible_services_responses.go b/api/managementpb/backup/json/client/backups/list_artifact_compatible_services_responses.go index cde43dc58d..9fcb9cb270 100644 --- a/api/managementpb/backup/json/client/backups/list_artifact_compatible_services_responses.go +++ b/api/managementpb/backup/json/client/backups/list_artifact_compatible_services_responses.go @@ -485,6 +485,9 @@ type ListArtifactCompatibleServicesOKBodyMongodbItems0 struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MongoDB version. + Version string `json:"version,omitempty"` } // Validate validates this list artifact compatible services OK body mongodb items0 @@ -552,6 +555,9 @@ type ListArtifactCompatibleServicesOKBodyMysqlItems0 struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MySQL version. + Version string `json:"version,omitempty"` } // Validate validates this list artifact compatible services OK body mysql items0 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 786557c464..451b8da408 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 @@ -1206,6 +1206,9 @@ type AddMongoDBOKBodyService struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MongoDB version. + Version string `json:"version,omitempty"` } // Validate validates this add mongo DB OK body service 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 97d0ea9998..57cc56d7f9 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 @@ -1494,6 +1494,9 @@ type AddMySQLOKBodyService struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MySQL version. + Version string `json:"version,omitempty"` } // Validate validates this add my SQL OK body service 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 ba2ec37478..a4b5e93c07 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 @@ -1444,6 +1444,9 @@ type AddPostgreSQLOKBodyService struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // PostgreSQL version. + Version string `json:"version,omitempty"` } // Validate validates this add postgre SQL OK body service 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 f653aa22f4..bf01c16222 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 @@ -907,6 +907,9 @@ type AddProxySQLOKBodyService struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // ProxySQL version. + Version string `json:"version,omitempty"` } // Validate validates this add proxy SQL OK body service diff --git a/api/managementpb/json/client/rds/add_rds_responses.go b/api/managementpb/json/client/rds/add_rds_responses.go index 739b758db0..22a74012d9 100644 --- a/api/managementpb/json/client/rds/add_rds_responses.go +++ b/api/managementpb/json/client/rds/add_rds_responses.go @@ -937,6 +937,9 @@ type AddRDSOKBodyMysql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // MySQL version. + Version string `json:"version,omitempty"` } // Validate validates this add RDS OK body mysql @@ -1290,6 +1293,9 @@ type AddRDSOKBodyPostgresql struct { // Custom user-assigned labels. CustomLabels map[string]string `json:"custom_labels,omitempty"` + + // PostgreSQL version. + Version string `json:"version,omitempty"` } // Validate validates this add RDS OK body postgresql diff --git a/api/managementpb/json/managementpb.json b/api/managementpb/json/managementpb.json index 57b8c1da00..5ad34a2a41 100644 --- a/api/managementpb/json/managementpb.json +++ b/api/managementpb/json/managementpb.json @@ -2833,6 +2833,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -3566,6 +3571,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -4550,6 +4560,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 6 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 0 @@ -4968,6 +4983,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -5259,6 +5279,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 5 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 2 @@ -5499,6 +5524,11 @@ "description": "Access unix socket.\nAddress (and port) or socket is required.", "type": "string", "x-order": 6 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 6 diff --git a/api/managementpb/service/json/client/mgmt_service/list_services_responses.go b/api/managementpb/service/json/client/mgmt_service/list_services_responses.go index fdc3b2c330..708c684e4f 100644 --- a/api/managementpb/service/json/client/mgmt_service/list_services_responses.go +++ b/api/managementpb/service/json/client/mgmt_service/list_services_responses.go @@ -538,6 +538,9 @@ type ListServicesOKBodyServicesItems0 struct { // - UNKNOWN: The service's status cannot be known (e.g. there are no metrics yet). // Enum: [STATUS_INVALID UP DOWN UNKNOWN] Status *string `json:"status,omitempty"` + + // The service/database version. + Version string `json:"version,omitempty"` } // Validate validates this list services OK body services items0 diff --git a/api/managementpb/service/json/service.json b/api/managementpb/service/json/service.json index 56aff3ce16..7fabf9ef74 100644 --- a/api/managementpb/service/json/service.json +++ b/api/managementpb/service/json/service.json @@ -490,6 +490,11 @@ "type": "string", "format": "date-time", "x-order": 15 + }, + "version": { + "description": "The service/database version.", + "type": "string", + "x-order": 18 } } }, diff --git a/api/managementpb/service/service.pb.go b/api/managementpb/service/service.pb.go index 46248b0da4..58fa930e33 100644 --- a/api/managementpb/service/service.pb.go +++ b/api/managementpb/service/service.pb.go @@ -128,6 +128,8 @@ type UniversalService struct { Agents []*agent.UniversalAgent `protobuf:"bytes,17,rep,name=agents,proto3" json:"agents,omitempty"` // The health status of the service. Status UniversalService_Status `protobuf:"varint,18,opt,name=status,proto3,enum=service.v1beta1.UniversalService_Status" json:"status,omitempty"` + // The service/database version. + Version string `protobuf:"bytes,19,opt,name=version,proto3" json:"version,omitempty"` } func (x *UniversalService) Reset() { @@ -288,6 +290,13 @@ func (x *UniversalService) GetStatus() UniversalService_Status { return UniversalService_STATUS_INVALID } +func (x *UniversalService) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + type ListServiceRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -420,7 +429,7 @@ var file_managementpb_service_service_proto_rawDesc = []byte{ 0x65, 0x6e, 0x74, 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, 0x22, 0xeb, 0x06, 0x0a, 0x10, 0x55, 0x6e, + 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x85, 0x07, 0x0a, 0x10, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, @@ -467,55 +476,56 @@ var file_managementpb_service_service_proto_rawDesc = []byte{ 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x28, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 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, 0x3b, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x55, 0x50, 0x10, 0x01, - 0x12, 0x08, 0x0a, 0x04, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, - 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x22, 0x8f, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, - 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x22, 0x54, 0x0a, 0x13, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3d, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x32, - 0xc9, 0x01, 0x0a, 0x0b, 0x4d, 0x67, 0x6d, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0xb9, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x12, 0x23, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x35, - 0x12, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, - 0x24, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, - 0x72, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, - 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x42, 0xc0, 0x01, 0x0a, 0x13, - 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x3e, 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, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x3b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0xa2, 0x02, 0x03, 0x53, 0x58, 0x58, 0xaa, 0x02, 0x0f, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x0f, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x1b, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x10, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 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, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, + 0x0a, 0x0e, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x55, 0x50, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x4f, + 0x57, 0x4e, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x03, 0x22, 0x8f, 0x01, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, + 0x64, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x22, 0x54, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x08, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x55, + 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x32, 0xc9, 0x01, 0x0a, 0x0b, 0x4d, 0x67, + 0x6d, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xb9, 0x01, 0x0a, 0x0c, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x23, 0x2e, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x24, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x35, 0x12, 0x0d, 0x4c, 0x69, 0x73, 0x74, + 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x24, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x73, 0x20, 0x61, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x65, 0x64, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x2e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x20, 0x3a, 0x01, 0x2a, 0x22, 0x1b, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2f, 0x4c, 0x69, 0x73, 0x74, 0x42, 0xc0, 0x01, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x2e, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x0c, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x3e, 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, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3b, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xa2, 0x02, 0x03, + 0x53, 0x58, 0x58, 0xaa, 0x02, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x56, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0xca, 0x02, 0x0f, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5c, + 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0xe2, 0x02, 0x1b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5c, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x3a, + 0x3a, 0x56, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/managementpb/service/service.pb.validate.go b/api/managementpb/service/service.pb.validate.go index 1591f5269c..f6ee4cd9fe 100644 --- a/api/managementpb/service/service.pb.validate.go +++ b/api/managementpb/service/service.pb.validate.go @@ -183,6 +183,8 @@ func (m *UniversalService) validate(all bool) error { // no validation rules for Status + // no validation rules for Version + if len(errors) > 0 { return UniversalServiceMultiError(errors) } diff --git a/api/managementpb/service/service.proto b/api/managementpb/service/service.proto index 218551fa62..69c71c0dcb 100644 --- a/api/managementpb/service/service.proto +++ b/api/managementpb/service/service.proto @@ -63,6 +63,8 @@ message UniversalService { repeated agent.v1beta1.UniversalAgent agents = 17; // The health status of the service. Status status = 18; + // The service/database version. + string version = 19; } message ListServiceRequest { diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index e8fd5acaa0..6c0b7d9b8f 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -15433,6 +15433,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -15606,6 +15611,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -15784,6 +15794,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 0 @@ -15957,6 +15972,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -16315,6 +16335,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -16376,6 +16401,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 1 @@ -16442,6 +16472,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 2 @@ -16503,6 +16538,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 3 @@ -16749,6 +16789,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -16813,6 +16858,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } } }, @@ -16882,6 +16932,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } } }, @@ -16946,6 +17001,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -20241,6 +20301,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -20821,6 +20886,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -22318,6 +22388,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 0 @@ -22931,6 +23006,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -23465,6 +23545,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 2 @@ -23781,6 +23866,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 6 @@ -25936,6 +26026,11 @@ "UNKNOWN" ], "x-order": 17 + }, + "version": { + "description": "The service/database version.", + "type": "string", + "x-order": 18 } } }, @@ -27770,6 +27865,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -27834,6 +27934,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } } }, diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index ef2f3be6fb..e5b3d63805 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -12589,6 +12589,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -12762,6 +12767,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -12940,6 +12950,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 0 @@ -13113,6 +13128,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -13471,6 +13491,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -13532,6 +13557,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 1 @@ -13598,6 +13628,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 2 @@ -13659,6 +13694,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 3 @@ -13905,6 +13945,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -13969,6 +14014,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } } }, @@ -14038,6 +14088,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } } }, @@ -14102,6 +14157,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -17001,6 +17061,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -17581,6 +17646,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -18632,6 +18702,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 0 @@ -19245,6 +19320,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "ProxySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 0 @@ -19779,6 +19859,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } }, "x-order": 2 @@ -20095,6 +20180,11 @@ "type": "string" }, "x-order": 10 + }, + "version": { + "description": "PostgreSQL version.", + "type": "string", + "x-order": 11 } }, "x-order": 6 @@ -22678,6 +22768,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MySQL version.", + "type": "string", + "x-order": 10 } } }, @@ -22742,6 +22837,11 @@ "type": "string" }, "x-order": 9 + }, + "version": { + "description": "MongoDB version.", + "type": "string", + "x-order": 10 } } }, diff --git a/build/docker/rpmbuild/Dockerfile b/build/docker/rpmbuild/Dockerfile index 27cca12914..13c90dfcb0 100644 --- a/build/docker/rpmbuild/Dockerfile +++ b/build/docker/rpmbuild/Dockerfile @@ -23,12 +23,12 @@ RUN yum update -y && \ yum clean all && rm -rf /var/cache/yum # keep that format for easier search -ENV GO_VERSION 1.21.1 -ENV GO_RELEASER_VERSION 1.15.2 +ENV GO_VERSION 1.21.3 +ENV GO_RELEASER_VERSION 1.21.2 RUN if [ `uname -i` == "x86_64" ]; then ARCH=amd64; else ARCH=arm64; fi && \ wget --progress=dot:giga https://dl.google.com/go/go${GO_VERSION}.linux-${ARCH}.tar.gz -O /tmp/golang.tar.gz && \ - wget --progress=dot:giga https://github.com/goreleaser/goreleaser/releases/download/v${GO_RELEASER_VERSION}/goreleaser-${GO_RELEASER_VERSION}.`uname -i`.rpm -O /tmp/goreleaser.rpm && \ + wget --progress=dot:giga https://github.com/goreleaser/goreleaser/releases/download/v${GO_RELEASER_VERSION}/goreleaser-${GO_RELEASER_VERSION}-1.`uname -i`.rpm -O /tmp/goreleaser.rpm && \ tar -C /usr/local -xzf /tmp/golang.tar.gz && \ yum install -y /tmp/goreleaser.rpm && \ rm /tmp/golang.tar.gz /tmp/goreleaser.rpm diff --git a/build/docker/rpmbuild/Dockerfile.el9 b/build/docker/rpmbuild/Dockerfile.el9 index 0a744c0a47..96555cfc2d 100644 --- a/build/docker/rpmbuild/Dockerfile.el9 +++ b/build/docker/rpmbuild/Dockerfile.el9 @@ -3,6 +3,7 @@ FROM oraclelinux:9-slim # enable nodesource repo for nodejs 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 microdnf install -y yum RUN yum update -y && \ yum install -y --setopt=skip_missing_names_on_install=False \ @@ -24,12 +25,12 @@ RUN yum update -y && \ yum clean all && rm -rf /var/cache/yum # keep that format for easier search -ENV GO_VERSION 1.21.1 -ENV GO_RELEASER_VERSION 1.15.2 +ENV GO_VERSION 1.21.3 +ENV GO_RELEASER_VERSION 1.21.2 RUN if [ `uname -i` == "x86_64" ]; then ARCH=amd64; else ARCH=arm64; fi && \ wget --progress=dot:giga https://dl.google.com/go/go${GO_VERSION}.linux-${ARCH}.tar.gz -O /tmp/golang.tar.gz && \ - wget --progress=dot:giga https://github.com/goreleaser/goreleaser/releases/download/v${GO_RELEASER_VERSION}/goreleaser-${GO_RELEASER_VERSION}.`uname -i`.rpm -O /tmp/goreleaser.rpm && \ + wget --progress=dot:giga https://github.com/goreleaser/goreleaser/releases/download/v${GO_RELEASER_VERSION}/goreleaser-${GO_RELEASER_VERSION}-1.`uname -i`.rpm -O /tmp/goreleaser.rpm && \ tar -C /usr/local -xzf /tmp/golang.tar.gz && \ yum install -y /tmp/goreleaser.rpm && \ rm /tmp/golang.tar.gz /tmp/goreleaser.rpm diff --git a/build/packages/rpm/server/SPECS/grafana-db-migrator.spec b/build/packages/rpm/server/SPECS/grafana-db-migrator.spec index 70de6bd075..c3f074740c 100644 --- a/build/packages/rpm/server/SPECS/grafana-db-migrator.spec +++ b/build/packages/rpm/server/SPECS/grafana-db-migrator.spec @@ -1,10 +1,10 @@ %undefine _missing_build_ids_terminate_build -%global release_hash 63e4bfdb7dd7162e238531c794f4ddef83173158 +%global release_hash 27b37c412e257bd8a5bcdbcaf52befa3fe555a9d Name: grafana-db-migrator -Version: 1.0.7 -Release: 1%{?dist} +Version: 1.0.8 +Release: 2%{?dist} Summary: A tool for Grafana database migration License: MIT URL: https://github.com/percona/grafana-db-migrator @@ -30,6 +30,9 @@ install -m 755 dist/grafana-db-migrator %{buildroot}%{_sbindir}/ %{_sbindir}/grafana-db-migrator %changelog +* Fri Oct 13 2023 Nurlan Moldomurov - 1.0.8-2 +- Fix issue with hexed values and folder fixes. + * Mon Feb 13 2023 Nikita Beletskii <2nikita.b@gmail.com> - 1.0.7-1 - Fix issue with convert_from() diff --git a/build/scripts/build-server-rpm b/build/scripts/build-server-rpm index 0ceccebb23..58f619ffda 100755 --- a/build/scripts/build-server-rpm +++ b/build/scripts/build-server-rpm @@ -148,6 +148,9 @@ build() { s3://pmm-build-cache/RELEASE/${rpmbuild_dist}/${spec_name}-${rpm_version} \ || : fi + + cp ${rpms_dir}/${spec_name}-${rpm_version}/*/*.rpm ${rpms_dir} + fi } diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index f3e552d229..607348b459 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -20,13 +20,13 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^6.7.0", - "@typescript-eslint/parser": "^6.7.0", - "eslint": "8.51", + "@typescript-eslint/eslint-plugin": "^6.9.0", + "@typescript-eslint/parser": "^6.9.0", + "eslint": "8.52", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", - "eslint-plugin-import": "^2.28.0", - "eslint-plugin-playwright": "^0.16.0" + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-playwright": "^0.18.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -86,21 +86,21 @@ } }, "node_modules/@eslint/js": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", - "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", + "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", - "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "version": "0.11.13", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", "dev": true, "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", + "@humanwhocodes/object-schema": "^2.0.1", "debug": "^4.1.1", "minimatch": "^3.0.5" }, @@ -122,9 +122,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", "dev": true }, "node_modules/@nodelib/fs.scandir": { @@ -202,9 +202,9 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "version": "7.0.14", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", "dev": true }, "node_modules/@types/json5": { @@ -245,9 +245,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ==", "dev": true }, "node_modules/@types/shelljs": { @@ -261,16 +261,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.0.tgz", - "integrity": "sha512-gUqtknHm0TDs1LhY12K2NA3Rmlmp88jK9Tx8vGZMfHeNMLE3GH2e9TRub+y+SOjuYgtOmok+wt1AyDPZqxbNag==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.0.tgz", + "integrity": "sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.7.0", - "@typescript-eslint/type-utils": "6.7.0", - "@typescript-eslint/utils": "6.7.0", - "@typescript-eslint/visitor-keys": "6.7.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/type-utils": "6.9.0", + "@typescript-eslint/utils": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -296,15 +296,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.0.tgz", - "integrity": "sha512-jZKYwqNpNm5kzPVP5z1JXAuxjtl2uG+5NpaMocFPTNC2EdYIgbXIPImObOkhbONxtFTTdoZstLZefbaK+wXZng==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz", + "integrity": "sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.7.0", - "@typescript-eslint/types": "6.7.0", - "@typescript-eslint/typescript-estree": "6.7.0", - "@typescript-eslint/visitor-keys": "6.7.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4" }, "engines": { @@ -324,13 +324,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.0.tgz", - "integrity": "sha512-lAT1Uau20lQyjoLUQ5FUMSX/dS07qux9rYd5FGzKz/Kf8W8ccuvMyldb8hadHdK/qOI7aikvQWqulnEq2nCEYA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz", + "integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.0", - "@typescript-eslint/visitor-keys": "6.7.0" + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -341,13 +341,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.0.tgz", - "integrity": "sha512-f/QabJgDAlpSz3qduCyQT0Fw7hHpmhOzY/Rv6zO3yO+HVIdPfIWhrQoAyG+uZVtWAIS85zAyzgAFfyEr+MgBpg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.0.tgz", + "integrity": "sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.7.0", - "@typescript-eslint/utils": "6.7.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/utils": "6.9.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -368,9 +368,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.0.tgz", - "integrity": "sha512-ihPfvOp7pOcN/ysoj0RpBPOx3HQTJTrIN8UZK+WFd3/iDeFHHqeyYxa4hQk4rMhsz9H9mXpR61IzwlBVGXtl9Q==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", + "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", "dev": true, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -381,13 +381,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.0.tgz", - "integrity": "sha512-dPvkXj3n6e9yd/0LfojNU8VMUGHWiLuBZvbM6V6QYD+2qxqInE7J+J/ieY2iGwR9ivf/R/haWGkIj04WVUeiSQ==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz", + "integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.0", - "@typescript-eslint/visitor-keys": "6.7.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -408,17 +408,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.0.tgz", - "integrity": "sha512-MfCq3cM0vh2slSikQYqK2Gq52gvOhe57vD2RM3V4gQRZYX4rDPnKLu5p6cm89+LJiGlwEXU8hkYxhqqEC/V3qA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.0.tgz", + "integrity": "sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==", "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": "6.7.0", - "@typescript-eslint/types": "6.7.0", - "@typescript-eslint/typescript-estree": "6.7.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", "semver": "^7.5.4" }, "engines": { @@ -433,12 +433,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.0.tgz", - "integrity": "sha512-/C1RVgKFDmGMcVGeD8HjKv2bd72oI1KxQDeY8uc66gw9R0OK0eMq48cA+jv9/2Ag6cdrsUGySm1yzYmfz0hxwQ==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", + "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.7.0", + "@typescript-eslint/types": "6.9.0", "eslint-visitor-keys": "^3.4.1" }, "engines": { @@ -449,6 +449,12 @@ "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", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, "node_modules/acorn": { "version": "8.10.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", @@ -530,15 +536,15 @@ } }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -558,16 +564,16 @@ } }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.2.tgz", - "integrity": "sha512-tb5thFFlUcp7NdNF6/MpDk/1r/4awWG1FIz3YqDf+/zJSTezBb+/5WViH41obXULHVpDzoiCLpJ/ZO9YbJMsdw==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -577,14 +583,14 @@ } }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -595,14 +601,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -898,12 +904,12 @@ } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -936,18 +942,19 @@ } }, "node_modules/eslint": { - "version": "8.51.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", - "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", + "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.51.0", - "@humanwhocodes/config-array": "^0.11.11", + "@eslint/js": "8.52.0", + "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", @@ -1033,14 +1040,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -1079,27 +1086,26 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz", - "integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.findlastindex": "^1.2.2", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", + "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.8.0", - "has": "^1.0.3", - "is-core-module": "^2.12.1", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.fromentries": "^2.0.6", - "object.groupby": "^1.0.0", - "object.values": "^1.1.6", - "resolve": "^1.22.3", + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", "semver": "^6.3.1", "tsconfig-paths": "^3.14.2" }, @@ -1141,10 +1147,13 @@ } }, "node_modules/eslint-plugin-playwright": { - "version": "0.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.16.0.tgz", - "integrity": "sha512-DcHpF0SLbNeh9MT4pMzUGuUSnJ7q5MWbP8sSEFIMS6j7Ggnduq8ghNlfhURgty4c1YFny7Ge9xYTO1FSAoV2Vw==", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.18.0.tgz", + "integrity": "sha512-VLvKOAaDvRTonUeI3J8plXIJQuReXjbjrgDGoNwsiydwdqk3lt+mbzgsBcxJscMJDHc9XgnLVo0nWTiaYHLGYQ==", "dev": true, + "dependencies": { + "globals": "^13.23.0" + }, "peerDependencies": { "eslint": ">=7", "eslint-plugin-jest": ">=25" @@ -1402,9 +1411,12 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -1496,9 +1508,9 @@ } }, "node_modules/globals": { - "version": "13.21.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", - "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -1567,6 +1579,7 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -1643,6 +1656,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/ignore": { "version": "5.2.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", @@ -1768,11 +1792,11 @@ } }, "node_modules/is-core-module": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", - "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2151,14 +2175,14 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -2168,26 +2192,26 @@ } }, "node_modules/object.groupby": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.0.tgz", - "integrity": "sha512-70MWG6NfRH9GnbZOikuhPPYzpUpof9iW2J9E4dW7FXTqPNb6rllE6u39SKwwiNh8lCwX3DDb5OgcKGiEBrTTyw==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "es-abstract": "^1.21.2", + "es-abstract": "^1.22.1", "get-intrinsic": "^1.2.1" } }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -2420,11 +2444,11 @@ } }, "node_modules/resolve": { - "version": "1.22.3", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", - "integrity": "sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dependencies": { - "is-core-module": "^2.12.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, diff --git a/cli-tests/package.json b/cli-tests/package.json index c2e713d27e..f8b01a3320 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -24,12 +24,12 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^6.7.0", - "@typescript-eslint/parser": "^6.7.0", - "eslint": "8.51", + "@typescript-eslint/eslint-plugin": "^6.9.0", + "@typescript-eslint/parser": "^6.9.0", + "eslint": "8.52", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", - "eslint-plugin-import": "^2.28.0", - "eslint-plugin-playwright": "^0.16.0" + "eslint-plugin-import": "^2.29.0", + "eslint-plugin-playwright": "^0.18.0" } } diff --git a/docs/api/pmm-server-config/troubleshooting/logs.md b/docs/api/pmm-server-config/troubleshooting/logs.md index bae8669358..7761796f25 100644 --- a/docs/api/pmm-server-config/troubleshooting/logs.md +++ b/docs/api/pmm-server-config/troubleshooting/logs.md @@ -13,7 +13,7 @@ The structure of the logs is as follows: { "codes": [ { - "code": "# tree\n├── alertmanager.base.yml\n├── alertmanager.ini\n├── alertmanager.log\n├── alertmanager.yml\n├── clickhouse-server.err.log\n├── clickhouse-server.log\n├── clickhouse-server.startup.log\n├── client\n│ ├── list.txt\n│ ├── pmm-admin-version.txt\n│ ├── pmm-agent-config.yaml\n│ ├── pmm-agent-version.txt\n│ └── status.json\n├── cron.log\n├── dashboard-upgrade.log\n├── grafana.log\n├── installed.json\n├── nginx.conf\n├── nginx.log\n├── nginx.startup.log\n├── pmm-agent.log\n├── pmm-agent.yaml\n├── pmm-managed.log\n├── pmm-ssl.conf\n├── pmm-update-perform-init.log\n├── pmm-update-perform.log\n├── pmm-version.txt\n├── pmm.conf\n├── pmm.ini\n├── postgresql.log\n├── postgresql.startup.log\n├── prometheus.base.yml\n├── prometheus.log\n├── qan-api2.ini\n├── qan-api2.log\n├── supervisorctl_status.log\n├── supervisord.conf\n├── supervisord.log\n├── systemctl_status.log\n├── victoriametrics-promscrape.yml\n├── victoriametrics.ini\n├── victoriametrics.log\n├── victoriametrics_targets.json\n├── vmalert.ini\n└── vmalert.log", + "code": "# tree\n├── alertmanager.ini\n├── alertmanager.log\n├── clickhouse-server.err.log\n├── clickhouse-server.log\n├── clickhouse-server.startup.log\n├── client\n│ ├── list.txt\n│ ├── pmm-admin-version.txt\n│ ├── pmm-agent-config.yaml\n│ ├── pmm-agent-version.txt\n│ └── status.json\n├── cron.log\n├── dashboard-upgrade.log\n├── grafana.log\n├── installed.json\n├── nginx.conf\n├── nginx.log\n├── nginx.startup.log\n├── pmm-agent.log\n├── pmm-agent.yaml\n├── pmm-managed.log\n├── pmm-ssl.conf\n├── pmm-update-perform-init.log\n├── pmm-update-perform.log\n├── pmm-version.txt\n├── pmm.conf\n├── pmm.ini\n├── postgresql.log\n├── postgresql.startup.log\n├── prometheus.base.yml\n├── prometheus.log\n├── qan-api2.ini\n├── qan-api2.log\n├── supervisorctl_status.log\n├── supervisord.conf\n├── supervisord.log\n├── systemctl_status.log\n├── victoriametrics-promscrape.yml\n├── victoriametrics.ini\n├── victoriametrics.log\n├── victoriametrics_targets.json\n├── vmalert.ini\n└── vmalert.log", "language": "text" } ] diff --git a/go.mod b/go.mod index a900e5bc6b..d0beb4c507 100644 --- a/go.mod +++ b/go.mod @@ -18,18 +18,18 @@ replace github.com/ClickHouse/clickhouse-go/151 => github.com/ClickHouse/clickho require ( github.com/AlekSi/pointer v1.2.0 github.com/ClickHouse/clickhouse-go/151 v0.0.0-00010101000000-000000000000 - github.com/ClickHouse/clickhouse-go/v2 v2.13.0 + github.com/ClickHouse/clickhouse-go/v2 v2.15.0 github.com/DATA-DOG/go-sqlmock v1.5.0 github.com/alecthomas/kong v0.8.0 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 - github.com/aws/aws-sdk-go v1.45.2 + github.com/aws/aws-sdk-go v1.47.0 github.com/blang/semver v3.5.1+incompatible - github.com/brianvoe/gofakeit/v6 v6.23.0 + github.com/brianvoe/gofakeit/v6 v6.24.0 github.com/charmbracelet/bubbles v0.16.1 github.com/charmbracelet/bubbletea v0.24.1 github.com/charmbracelet/lipgloss v0.9.0 github.com/davecgh/go-spew v1.1.1 - github.com/docker/docker v23.0.4+incompatible + github.com/docker/docker v24.0.6+incompatible github.com/docker/go-connections v0.4.0 github.com/envoyproxy/protoc-gen-validate v1.0.2 github.com/go-co-op/gocron v1.35.1 @@ -41,12 +41,13 @@ require ( github.com/go-sql-driver/mysql v1.7.1 github.com/golang-migrate/migrate/v4 v4.16.1 github.com/golang/protobuf v1.5.3 - github.com/google/uuid v1.3.1 - github.com/grafana/grafana-api-golang-client v0.24.0 + github.com/google/uuid v1.4.0 + github.com/grafana/grafana-api-golang-client v0.25.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 github.com/hashicorp/go-version v1.6.0 + github.com/jhunters/bigqueue v1.2.7 github.com/jmoiron/sqlx v1.3.5 github.com/jotaen/kong-completion v0.0.5 github.com/lib/pq v1.10.6 @@ -60,7 +61,7 @@ require ( github.com/pkg/errors v0.9.1 github.com/pmezard/go-difflib v1.0.0 github.com/prometheus/client_golang v1.17.0 - github.com/prometheus/common v0.44.0 + github.com/prometheus/common v0.45.0 github.com/ramr/go-reaper v0.2.1 github.com/robfig/cron/v3 v3.0.1 github.com/sirupsen/logrus v1.9.3 @@ -75,12 +76,11 @@ require ( golang.org/x/tools v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d - google.golang.org/grpc v1.58.0 + google.golang.org/grpc v1.59.0 google.golang.org/protobuf v1.31.0 gopkg.in/alecthomas/kingpin.v2 v2.2.6 gopkg.in/reform.v1 v1.5.1 gopkg.in/yaml.v3 v3.0.1 - modernc.org/sqlite v1.26.0 ) require ( @@ -88,25 +88,15 @@ require ( github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mwitkow/go-proto-validators v0.3.2 // indirect github.com/posener/complete v1.2.3 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect + go.opentelemetry.io/otel/metric v1.19.0 // indirect go.uber.org/atomic v1.11.0 // indirect golang.org/x/time v0.3.0 // indirect - google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 // indirect + google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect gopkg.in/ini.v1 v1.67.0 // indirect - lukechampine.com/uint128 v1.2.0 // indirect - modernc.org/cc/v3 v3.40.0 // indirect - modernc.org/ccgo/v3 v3.16.13 // indirect - modernc.org/libc v1.24.1 // indirect - modernc.org/mathutil v1.5.0 // indirect - modernc.org/memory v1.6.0 // indirect - modernc.org/opt v0.1.3 // indirect - modernc.org/strutil v1.1.3 // indirect - modernc.org/token v1.0.1 // indirect ) require ( @@ -115,12 +105,12 @@ require ( github.com/Azure/azure-sdk-for-go/sdk/internal v1.3.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resourcegraph/armresourcegraph v0.8.0 github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 // indirect - github.com/ClickHouse/ch-go v0.52.1 // indirect + github.com/ClickHouse/ch-go v0.58.2 // indirect github.com/ClickHouse/clickhouse-go v1.5.4 // indirect github.com/HdrHistogram/hdrhistogram-go v1.1.2 github.com/Microsoft/go-winio v0.6.1 // indirect github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 // indirect - github.com/andybalholm/brotli v1.0.5 // indirect + github.com/andybalholm/brotli v1.0.6 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/charmbracelet/harmonica v0.2.0 // indirect @@ -145,7 +135,7 @@ require ( github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect - github.com/klauspost/compress v1.16.5 // indirect + github.com/klauspost/compress v1.16.7 // indirect github.com/klauspost/cpuid/v2 v2.2.4 // indirect github.com/kylelemons/godebug v1.1.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect @@ -153,7 +143,6 @@ require ( github.com/mattn/go-isatty v0.0.18 // indirect github.com/mattn/go-localereader v0.0.1 // indirect github.com/mattn/go-runewidth v0.0.15 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/minio/md5-simd v1.1.2 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -166,10 +155,10 @@ require ( github.com/muesli/termenv v0.15.2 // indirect github.com/oklog/ulid v1.3.1 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect - github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 // indirect + github.com/opencontainers/image-spec v1.1.0-rc4 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/paulmach/orb v0.10.0 // indirect - github.com/pierrec/lz4/v4 v4.1.17 // indirect + github.com/pierrec/lz4/v4 v4.1.18 // indirect github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16 // indirect github.com/prometheus/procfs v0.11.1 // indirect @@ -181,10 +170,10 @@ require ( github.com/xdg-go/scram v1.1.2 // indirect github.com/xdg-go/stringprep v1.0.4 // indirect github.com/youmark/pkcs8 v0.0.0-20201027041543-1326539a0a0a // indirect - go.opentelemetry.io/otel v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect + go.opentelemetry.io/otel v1.19.0 // indirect + go.opentelemetry.io/otel/trace v1.19.0 // indirect golang.org/x/mod v0.13.0 // indirect - golang.org/x/net v0.16.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/term v0.13.0 // 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 2ed1ee893a..14dd084526 100644 --- a/go.sum +++ b/go.sum @@ -48,14 +48,14 @@ github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0 h1:OBhqkivkhkM github.com/AzureAD/microsoft-authentication-library-for-go v1.0.0/go.mod h1:kgDmCTgBzIEPFElEF+FK0SdjAor06dRq2Go927dnQ6o= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/ClickHouse/ch-go v0.52.1 h1:nucdgfD1BDSHjbNaG3VNebonxJzD8fX8jbuBpfo5VY0= -github.com/ClickHouse/ch-go v0.52.1/go.mod h1:B9htMJ0hii/zrC2hljUKdnagRBuLqtRG/GrU3jqCwRk= +github.com/ClickHouse/ch-go v0.58.2 h1:jSm2szHbT9MCAB1rJ3WuCJqmGLi5UTjlNu+f530UTS0= +github.com/ClickHouse/ch-go v0.58.2/go.mod h1:Ap/0bEmiLa14gYjCiRkYGbXvbe8vwdrfTYWhsuQ99aw= github.com/ClickHouse/clickhouse-go v1.5.1 h1:I8zVFZTz80crCs0FFEBJooIxsPcV0xfthzK1YrkpJTc= github.com/ClickHouse/clickhouse-go v1.5.1/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= github.com/ClickHouse/clickhouse-go v1.5.4 h1:cKjXeYLNWVJIx2J1K6H2CqyRmfwVJVY1OV1coaaFcI0= github.com/ClickHouse/clickhouse-go v1.5.4/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI= -github.com/ClickHouse/clickhouse-go/v2 v2.13.0 h1:oP1OlTQIbQKKLnqLzyDhiyNFvN3pbOtM+e/3qdexG9k= -github.com/ClickHouse/clickhouse-go/v2 v2.13.0/go.mod h1:xyL0De2K54/n+HGsdtPuyYJq76wefafaHfGUXTDEq/0= +github.com/ClickHouse/clickhouse-go/v2 v2.15.0 h1:G0hTKyO8fXXR1bGnZ0DY3vTG01xYfOGW76zgjg5tmC4= +github.com/ClickHouse/clickhouse-go/v2 v2.15.0/go.mod h1:kXt1SRq0PIRa6aKZD7TnFnY9PQKmc2b13sHtOYcK6cQ= github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60= github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= @@ -84,14 +84,14 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF 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/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= -github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= +github.com/andybalholm/brotli v1.0.6 h1:Yf9fFpf49Zrxb9NlQaluyE92/+X7UVHlhMNJN2sxfOI= +github.com/andybalholm/brotli v1.0.6/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/asaskevich/govalidator v0.0.0-20200907205600-7a23bdc65eef/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/aws/aws-sdk-go v1.45.2 h1:hTong9YUklQKqzrGk3WnKABReb5R8GjbG4Y6dEQfjnk= -github.com/aws/aws-sdk-go v1.45.2/go.mod h1:aVsgQcEevwlmQ7qHE9I3h+dtQgpqhFB+i8Phjh7fkwI= +github.com/aws/aws-sdk-go v1.47.0 h1:/JUg9V1+xh+qBn8A6ec/l15ETPaMaBqxkjz+gg63dNk= +github.com/aws/aws-sdk-go v1.47.0/go.mod h1:DlEaEbWKZmsITVbqlSVvekPARM1HzeV9PMYg15ymSDA= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= @@ -105,8 +105,8 @@ github.com/blang/semver v3.5.1+incompatible h1:cQNTCjp13qL8KC3Nbxr/y2Bqb63oX6wdn github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/brianvoe/gofakeit v3.18.0+incompatible h1:wDOmHc9DLG4nRjUVVaxA+CEglKOW72Y5+4WNxUIkjM8= github.com/brianvoe/gofakeit v3.18.0+incompatible/go.mod h1:kfwdRA90vvNhPutZWfH7WPaDzUjz+CZFqG+rPkOjGOc= -github.com/brianvoe/gofakeit/v6 v6.23.0 h1:pgVhyWpYq4e0GEVCh2gdZnS/nBX+8SnyTBliHg5xjks= -github.com/brianvoe/gofakeit/v6 v6.23.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8= +github.com/brianvoe/gofakeit/v6 v6.24.0 h1:74yq7RRz/noddscZHRS2T84oHZisW9muwbb8sRnU52A= +github.com/brianvoe/gofakeit/v6 v6.24.0/go.mod h1:Ow6qC71xtwm79anlwKRlWZW6zVq9D2XHE4QSSMP/rU8= 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= @@ -141,8 +141,8 @@ github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v23.0.4+incompatible h1:Kd3Bh9V/rO+XpTP/BLqM+gx8z7+Yb0AA2Ibj+nNo4ek= -github.com/docker/docker v23.0.4+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= +github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= @@ -253,8 +253,8 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe h1:lXe2qZdvpiX5WZ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= +github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= +github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -310,16 +310,17 @@ github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= +github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/grafana/grafana-api-golang-client v0.24.0 h1:9cUvft7xCMnnL/Uscwy7eoldn16Gz5TH4T1MymuVs8E= -github.com/grafana/grafana-api-golang-client v0.24.0/go.mod h1:24W29gPe9yl0/3A9X624TPkAOR8DpHno490cPwnkv8E= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/grafana/grafana-api-golang-client v0.25.0 h1:jDxnR0U5xgIwKzE+IliZJvjMUUTQxGq+c1s+3M46flI= +github.com/grafana/grafana-api-golang-client v0.25.0/go.mod h1:24W29gPe9yl0/3A9X624TPkAOR8DpHno490cPwnkv8E= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= @@ -343,6 +344,8 @@ github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANyt github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgx v3.6.2+incompatible h1:2zP5OD7kiyR3xzRYMhOcXVvkDZsImVXfj+yIyTQf3/o= github.com/jackc/pgx v3.6.2+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= +github.com/jhunters/bigqueue v1.2.7 h1:vwuQMWPBPxhnytZr0ydkzpZdQnnGd/WZmQsJSIJVGsw= +github.com/jhunters/bigqueue v1.2.7/go.mod h1:bHuCzOuSk3Q/Rc74d0pyF1PCPOiDDdr/Ugxu60awYpI= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= @@ -364,19 +367,19 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/karrick/godirwalk v1.8.0/go.mod h1:H5KPZjojv4lE+QYImBI8xVtrBRgYrIVsaRPx4tDPEn4= github.com/karrick/godirwalk v1.10.3/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= -github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= -github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= +github.com/klauspost/compress v1.16.7 h1:2mk3MPGNzKyxErAw8YaohYh69+pa4sIQSC0fPGCFR9I= +github.com/klauspost/compress v1.16.7/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= github.com/klauspost/cpuid/v2 v2.0.1/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk= github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= @@ -422,8 +425,8 @@ github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= github.com/minio/minio-go/v7 v7.0.55 h1:ZXqUO/8cgfHzI+08h/zGuTTFpISSA32BZmBE3FCLJas= @@ -466,8 +469,8 @@ github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= -github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799 h1:rc3tiVYb5z54aKaDfakKn0dDjIyPpTtszkjuMzyt7ec= -github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.1.0-rc4 h1:oOxKUJWnFC4YGHCCMNql1x4YaDfYBTS5Y4x/Cgeo1E0= +github.com/opencontainers/image-spec v1.1.0-rc4/go.mod h1:X4pATf0uXsnn3g5aiGIsVnJBR4mxhKzfwmvK/B2NTm8= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= @@ -491,8 +494,8 @@ github.com/pganalyze/pg_query_go/v2 v2.2.0 h1:OW+reH+ZY7jdEuPyuLGlf1m7dLbE+fDudK github.com/pganalyze/pg_query_go/v2 v2.2.0/go.mod h1:XAxmVqz1tEGqizcQ3YSdN90vCOHBWjJi8URL1er5+cA= github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pierrec/lz4/v4 v4.1.17 h1:kV4Ip+/hUBC+8T6+2EgburRtkE9ef4nbY3f4dFhGjMc= -github.com/pierrec/lz4/v4 v4.1.17/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= +github.com/pierrec/lz4/v4 v4.1.18 h1:xaKrnTkyoqfh1YItXl56+6KJNVYWlEEPuAQW9xsplYQ= +github.com/pierrec/lz4/v4 v4.1.18/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= @@ -520,8 +523,8 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 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.31.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY= -github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -530,9 +533,6 @@ github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwa github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= github.com/ramr/go-reaper v0.2.1 h1:zww+wlQOvTjBZuk1920R/e0GFEb6O7+B0WQLV6dM924= github.com/ramr/go-reaper v0.2.1/go.mod h1:AVypdzrcCXjSc/JYnlXl8TsB+z84WyFzxWE8Jh0MOJc= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.2.0 h1:S1pD9weZBuJdFmowNwbpi7BJ8TNftyUImj/0WQi72jY= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -561,6 +561,10 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/smartystreets/assertions v1.2.0 h1:42S6lae5dvLc7BrLu/0ugRtcFVjoJNMC/N3yZFZkDFs= +github.com/smartystreets/assertions v1.2.0/go.mod h1:tcbTF8ujkAEcZ8TElKY+i30BzYlVhC/LOxJk7iOWnoo= +github.com/smartystreets/goconvey v1.7.2 h1:9RBaZCeXEQ3UselpuwUQHltGVXvdwm6cv1hgR6gDIPg= +github.com/smartystreets/goconvey v1.7.2/go.mod h1:Vw0tHAZW6lzCRk3xgdin6fKYcG+G3Pg9vgXWeJpQFMM= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -609,14 +613,14 @@ go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= -go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY= -go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/otel v1.19.0 h1:MuS/TNf4/j4IXsZuJegVzI1cwut7Qc00344rgH7p8bs= +go.opentelemetry.io/otel v1.19.0/go.mod h1:i0QyjOq3UPoTzff0PJB2N66fb4S0+rSbSB15/oyH9fY= +go.opentelemetry.io/otel/metric v1.19.0 h1:aTzpGtV0ar9wlV4Sna9sdJyII5jTVJEvKETPiOKwvpE= +go.opentelemetry.io/otel/metric v1.19.0/go.mod h1:L5rUsV9kM1IxCj1MmSdS+JQAcVm319EUrDVLrt7jqt8= +go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= +go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= +go.opentelemetry.io/otel/trace v1.19.0 h1:DFVQmlVbfVeOuBRrwdtaehRrWiL1JoVs9CPIQ1Dzxpg= +go.opentelemetry.io/otel/trace v1.19.0/go.mod h1:mfaSyvGyEJEI0nyV2I4qhNQnbBOUUmYZpYojqMnX2vo= go.starlark.net v0.0.0-20230717150657-8a3343210976 h1:7ljYNcZU84T2N0tZdDgvL7U3M4iFmglAUUU1gRFE/2Q= go.starlark.net v0.0.0-20230717150657-8a3343210976/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -697,9 +701,8 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= -golang.org/x/net v0.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= 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= @@ -776,7 +779,6 @@ golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.13.0 h1:bb+I9cTfFazGW51MZqBVmZy7+JEJMouUHTUSKVQLBek= golang.org/x/term v0.13.0/go.mod h1:LTmsnFJwVN6bCy1rVCoS+qHT1HhALEFxKncY3WNNh4U= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -789,7 +791,6 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= @@ -915,8 +916,8 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5 h1:L6iMMGrtzgHsWofoFcihmDEMYeDR9KN/ThbPWGrh++g= -google.golang.org/genproto v0.0.0-20230803162519-f966b187b2e5/go.mod h1:oH/ZOT02u4kWEp7oYBGYFFkCdKS/uYR9Z7+0/xuuFp8= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= @@ -933,8 +934,8 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= -google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= @@ -984,34 +985,6 @@ honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWh honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= -lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= -modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= -modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= -modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= -modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= -modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= -modernc.org/libc v1.24.1 h1:uvJSeCKL/AgzBo2yYIPPTy82v21KgGnizcGYfBHaNuM= -modernc.org/libc v1.24.1/go.mod h1:FmfO1RLrU3MHJfyi9eYYmZBfi/R+tqZ6+hQ3yQQUkak= -modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.6.0 h1:i6mzavxrE9a30whzMfwf7XWVODx2r5OYXvU46cirX7o= -modernc.org/memory v1.6.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= -modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= -modernc.org/sqlite v1.26.0 h1:SocQdLRSYlA8W99V8YH0NES75thx19d9sB/aFc4R8Lw= -modernc.org/sqlite v1.26.0/go.mod h1:FL3pVXie73rg3Rii6V/u5BoHlSoyeZeIgKZEgHARyCU= -modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= -modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= -modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= -modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c= -modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= -modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= -modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= -modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/managed/README.md b/managed/README.md index 3a496ad092..bab621bbf7 100644 --- a/managed/README.md +++ b/managed/README.md @@ -1,5 +1,5 @@ # Percona Monitoring and Management (PMM) management daemon **pmm-managed** manages the configuration of [PMM](https://docs.percona.com/percona-monitoring-and-management/index.html) -server components (VictoriaMetrics, Grafana, etc.) and exposes APIs for interacting with them. Those APIs are also used by -[pmm-admin tool](https://github.com/percona/pmm-admin). +server components (VictoriaMetrics, Grafana, QAN, etc.) and exposes APIs for interacting with them. Those APIs are also used by +[pmm-admin tool](https://github.com/percona/pmm/tree/main/admin). diff --git a/managed/cmd/pmm-managed/main.go b/managed/cmd/pmm-managed/main.go index dfcbadb960..f95e42c3ac 100644 --- a/managed/cmd/pmm-managed/main.go +++ b/managed/cmd/pmm-managed/main.go @@ -188,6 +188,7 @@ type gRPCServerDeps struct { actions *agents.ActionsService agentsStateUpdater *agents.StateUpdater connectionCheck *agents.ConnectionChecker + serviceInfoBroker *agents.ServiceInfoBroker grafanaClient *grafana.Client checksService *checks.Service alertmanager *alertmanager.Service @@ -247,7 +248,7 @@ func runGRPCServer(ctx context.Context, deps *gRPCServerDeps) { servicesSvc := inventory.NewServicesService(deps.db, deps.agentsRegistry, deps.agentsStateUpdater, deps.vmdb, deps.versionCache) agentsSvc := inventory.NewAgentsService( deps.db, deps.agentsRegistry, deps.agentsStateUpdater, - deps.vmdb, deps.connectionCheck, deps.agentService) + deps.vmdb, deps.connectionCheck, deps.serviceInfoBroker, deps.agentService) mgmtBackupsService := managementbackup.NewBackupsService(deps.db, deps.backupService, deps.compatibilityService, deps.schedulerService) mgmtArtifactsService := managementbackup.NewArtifactsService(deps.db, deps.backupRemovalService, deps.pbmPITRService) @@ -261,10 +262,10 @@ func runGRPCServer(ctx context.Context, deps *gRPCServerDeps) { nodeSvc := management.NewNodeService(deps.db, deps.grafanaClient) agentSvc := management.NewAgentService(deps.db, deps.agentsRegistry) serviceSvc := management.NewServiceService(deps.db, deps.agentsRegistry, deps.agentsStateUpdater, deps.vmdb) - mysqlSvc := management.NewMySQLService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.versionCache) - mongodbSvc := management.NewMongoDBService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.versionCache) - postgresqlSvc := management.NewPostgreSQLService(deps.db, deps.agentsStateUpdater, deps.connectionCheck) - proxysqlSvc := management.NewProxySQLService(deps.db, deps.agentsStateUpdater, deps.connectionCheck) + mysqlSvc := management.NewMySQLService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.serviceInfoBroker, deps.versionCache) + mongodbSvc := management.NewMongoDBService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.serviceInfoBroker, deps.versionCache) + postgresqlSvc := management.NewPostgreSQLService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.serviceInfoBroker) + proxysqlSvc := management.NewProxySQLService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.serviceInfoBroker) managementpb.RegisterNodeServer(gRPCServer, managementgrpc.NewManagementNodeServer(nodeSvc)) agentv1beta1.RegisterAgentServer(gRPCServer, agentSvc) @@ -276,8 +277,8 @@ func runGRPCServer(ctx context.Context, deps *gRPCServerDeps) { managementpb.RegisterPostgreSQLServer(gRPCServer, managementgrpc.NewManagementPostgreSQLServer(postgresqlSvc)) managementpb.RegisterProxySQLServer(gRPCServer, managementgrpc.NewManagementProxySQLServer(proxysqlSvc)) managementpb.RegisterActionsServer(gRPCServer, managementgrpc.NewActionsServer(deps.actions, deps.db)) - managementpb.RegisterRDSServer(gRPCServer, management.NewRDSService(deps.db, deps.agentsStateUpdater, deps.connectionCheck)) - azurev1beta1.RegisterAzureDatabaseServer(gRPCServer, management.NewAzureDatabaseService(deps.db, deps.agentsRegistry, deps.agentsStateUpdater, deps.connectionCheck)) + managementpb.RegisterRDSServer(gRPCServer, management.NewRDSService(deps.db, deps.agentsStateUpdater, deps.connectionCheck, deps.serviceInfoBroker)) + azurev1beta1.RegisterAzureDatabaseServer(gRPCServer, management.NewAzureDatabaseService(deps.db, deps.agentsRegistry, deps.agentsStateUpdater, deps.connectionCheck, deps.serviceInfoBroker)) managementpb.RegisterHAProxyServer(gRPCServer, management.NewHAProxyService(deps.db, deps.vmdb, deps.agentsStateUpdater, deps.connectionCheck)) managementpb.RegisterExternalServer(gRPCServer, management.NewExternalService(deps.db, deps.vmdb, deps.agentsStateUpdater, deps.connectionCheck)) managementpb.RegisterAnnotationServer(gRPCServer, managementgrpc.NewAnnotationServer(deps.db, deps.grafanaClient)) @@ -738,6 +739,12 @@ func main() { //nolint:cyclop,maintidx } pmmdb.DSN.Params = q.Encode() + grafanadb := ds.GrafanaDBSelect + grafanadb.DSN.Scheme = "postgres" + grafanadb.DSN.Host = *postgresAddrF + grafanadb.DSN.DB = "grafana" + grafanadb.DSN.Params = q.Encode() + clickhouseDSN := "tcp://" + *clickhouseAddrF + "/" + *clickHouseDatabaseF qanDB := ds.QanDBSelect @@ -809,6 +816,7 @@ func main() { //nolint:cyclop,maintidx prom.MustRegister(inventoryMetricsCollector) connectionCheck := agents.NewConnectionChecker(agentsRegistry) + serviceInfoBroker := agents.NewServiceInfoBroker(agentsRegistry) alertManager := alertmanager.New(db) // Alertmanager is special due to being added to PMM with invalid /etc/alertmanager.yml. @@ -1047,34 +1055,36 @@ func main() { //nolint:cyclop,maintidx defer wg.Done() runGRPCServer(ctx, &gRPCServerDeps{ - db: db, - vmdb: vmdb, - platformClient: platformClient, - server: server, - agentsRegistry: agentsRegistry, - handler: agentsHandler, actions: actionsService, + agentService: agentService, + agentService: agentService, + agentsRegistry: agentsRegistry, agentsStateUpdater: agentsStateUpdater, - connectionCheck: connectionCheck, - grafanaClient: grafanaClient, - checksService: checksService, alertmanager: alertManager, - vmalert: vmalert, - settings: settings, - templatesService: alertingService, - jobsService: jobsService, - schedulerService: schedulerService, + backupRemovalService: backupRemovalService, backupService: backupService, + checksService: checksService, compatibilityService: compatibilityService, - backupRemovalService: backupRemovalService, - pbmPITRService: pbmPITRService, + config: &cfg.Config, + connectionCheck: connectionCheck, + db: db, + grafanaClient: grafanaClient, + handler: agentsHandler, + jobsService: jobsService, minioClient: minioClient, - versionCache: versionCache, + pbmPITRService: pbmPITRService, + platformClient: platformClient, + schedulerService: schedulerService, + server: server, + serviceInfoBroker: serviceInfoBroker, + settings: settings, supervisord: supervisord, - config: &cfg.Config, - agentService: agentService, + templatesService: alertingService, uieventsService: uieventsService, + versionCache: versionCache, + vmalert: vmalert, vmClient: &vmClient, + vmdb: vmdb, }) }() diff --git a/managed/models/database.go b/managed/models/database.go index 764f177439..ac10639c30 100644 --- a/managed/models/database.go +++ b/managed/models/database.go @@ -916,7 +916,7 @@ var databaseSchema = [][]string{ ALTER COLUMN comments_parsing_disabled DROP DEFAULT`, }, 85: { - `UPDATE services SET cluster = service_name WHERE cluster = ''`, + `ALTER TABLE services ADD COLUMN version VARCHAR`, }, 86: { `DROP TABLE kubernetes_clusters`, @@ -934,7 +934,7 @@ var databaseSchema = [][]string{ // aleksi: Go's zero values and non-zero default values in database do play nicely together in INSERTs and UPDATEs. // OpenDB returns configured connection pool for PostgreSQL. -// OpenDB just validate its arguments without creating a connection to the database. +// OpenDB just validates its arguments without creating a connection to the database. func OpenDB(params SetupDBParams) (*sql.DB, error) { q := make(url.Values) if params.SSLMode == "" { diff --git a/managed/models/job_helpers_test.go b/managed/models/job_helpers_test.go index c554b04e7a..7b179faba7 100644 --- a/managed/models/job_helpers_test.go +++ b/managed/models/job_helpers_test.go @@ -73,7 +73,7 @@ func TestJobs(t *testing.T) { t.Run("find", func(t *testing.T) { findTX, err := db.Begin() require.NoError(t, err) - defer findTX.Rollback() + defer findTX.Rollback() //nolint:errcheck const jobsCount = 3 jobs := make([]*models.Job, 0, jobsCount) diff --git a/managed/models/percona_sso_model_helpers.go b/managed/models/percona_sso_model_helpers.go index 55cda53440..5d4063a7e2 100644 --- a/managed/models/percona_sso_model_helpers.go +++ b/managed/models/percona_sso_model_helpers.go @@ -87,7 +87,7 @@ func (s *PerconaSSODetails) refreshAndGetAccessToken(ctx context.Context, q *ref if err != nil { return nil, err } - defer res.Body.Close() //nolint:gosec + defer res.Body.Close() //nolint:gosec,errcheck bodyBytes, err := io.ReadAll(res.Body) if err != nil { diff --git a/managed/models/service_model.go b/managed/models/service_model.go index 3842f9a808..f05446e945 100644 --- a/managed/models/service_model.go +++ b/managed/models/service_model.go @@ -58,6 +58,7 @@ type Service struct { ReplicationSet string `reform:"replication_set"` CustomLabels []byte `reform:"custom_labels"` ExternalGroup string `reform:"external_group"` + Version *string `reform:"version"` CreatedAt time.Time `reform:"created_at"` UpdatedAt time.Time `reform:"updated_at"` diff --git a/managed/models/service_model_reform.go b/managed/models/service_model_reform.go index 51d2869b47..8169bd6dd5 100644 --- a/managed/models/service_model_reform.go +++ b/managed/models/service_model_reform.go @@ -38,6 +38,7 @@ func (v *serviceTableType) Columns() []string { "replication_set", "custom_labels", "external_group", + "version", "created_at", "updated_at", "address", @@ -77,6 +78,7 @@ var ServiceTable = &serviceTableType{ {Name: "ReplicationSet", Type: "string", Column: "replication_set"}, {Name: "CustomLabels", Type: "[]uint8", Column: "custom_labels"}, {Name: "ExternalGroup", Type: "string", Column: "external_group"}, + {Name: "Version", Type: "*string", Column: "version"}, {Name: "CreatedAt", Type: "time.Time", Column: "created_at"}, {Name: "UpdatedAt", Type: "time.Time", Column: "updated_at"}, {Name: "Address", Type: "*string", Column: "address"}, @@ -90,7 +92,7 @@ var ServiceTable = &serviceTableType{ // String returns a string representation of this struct or record. func (s Service) String() string { - res := make([]string, 15) + res := make([]string, 16) res[0] = "ServiceID: " + reform.Inspect(s.ServiceID, true) res[1] = "ServiceType: " + reform.Inspect(s.ServiceType, true) res[2] = "ServiceName: " + reform.Inspect(s.ServiceName, true) @@ -101,11 +103,12 @@ func (s Service) String() string { res[7] = "ReplicationSet: " + reform.Inspect(s.ReplicationSet, true) res[8] = "CustomLabels: " + reform.Inspect(s.CustomLabels, true) res[9] = "ExternalGroup: " + reform.Inspect(s.ExternalGroup, true) - res[10] = "CreatedAt: " + reform.Inspect(s.CreatedAt, true) - res[11] = "UpdatedAt: " + reform.Inspect(s.UpdatedAt, true) - res[12] = "Address: " + reform.Inspect(s.Address, true) - res[13] = "Port: " + reform.Inspect(s.Port, true) - res[14] = "Socket: " + reform.Inspect(s.Socket, true) + res[10] = "Version: " + reform.Inspect(s.Version, true) + res[11] = "CreatedAt: " + reform.Inspect(s.CreatedAt, true) + res[12] = "UpdatedAt: " + reform.Inspect(s.UpdatedAt, true) + res[13] = "Address: " + reform.Inspect(s.Address, true) + res[14] = "Port: " + reform.Inspect(s.Port, true) + res[15] = "Socket: " + reform.Inspect(s.Socket, true) return strings.Join(res, ", ") } @@ -123,6 +126,7 @@ func (s *Service) Values() []interface{} { s.ReplicationSet, s.CustomLabels, s.ExternalGroup, + s.Version, s.CreatedAt, s.UpdatedAt, s.Address, @@ -145,6 +149,7 @@ func (s *Service) Pointers() []interface{} { &s.ReplicationSet, &s.CustomLabels, &s.ExternalGroup, + &s.Version, &s.CreatedAt, &s.UpdatedAt, &s.Address, diff --git a/managed/services/agents/channel/channel.go b/managed/services/agents/channel/channel.go index 1229ab6fab..cb2b6a66b5 100644 --- a/managed/services/agents/channel/channel.go +++ b/managed/services/agents/channel/channel.go @@ -201,7 +201,7 @@ func (c *Channel) send(msg *agentpb.ServerMessage) { atomic.AddUint32(&c.mSent, 1) } -// runReader receives messages from server. +// runReceiver receives messages from server. func (c *Channel) runReceiver() { defer func() { close(c.requests) @@ -285,6 +285,8 @@ func (c *Channel) runReceiver() { c.publish(msg.Id, msg.Status, p.PbmSwitchPitr) case *agentpb.AgentMessage_AgentLogs: c.publish(msg.Id, msg.Status, p.AgentLogs) + case *agentpb.AgentMessage_ServiceInfo: + c.publish(msg.Id, msg.Status, p.ServiceInfo) case nil: c.cancel(msg.Id, errors.Errorf("unimplemented: failed to handle received message %s", msg)) @@ -296,7 +298,7 @@ func (c *Channel) runReceiver() { } c.Send(&ServerResponse{ ID: msg.Id, - Status: grpcstatus.New(codes.Unimplemented, "can't handle message type send, it is not implemented"), + Status: grpcstatus.New(codes.Unimplemented, "can't handle message type sent, it is not implemented"), }) } } diff --git a/managed/services/agents/connection_checker.go b/managed/services/agents/connection_checker.go index 256481be3b..283fc95669 100644 --- a/managed/services/agents/connection_checker.go +++ b/managed/services/agents/connection_checker.go @@ -49,7 +49,7 @@ func NewConnectionChecker(r *Registry) *ConnectionChecker { } } -// CheckConnectionToService sends request to pmm-agent to check connection to service. +// CheckConnectionToService sends a request to pmm-agent to check connection to service. func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error { l := logger.Get(ctx) start := time.Now() @@ -91,6 +91,7 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref sanitizedDSN = strings.ReplaceAll(request.Dsn, word, "****") } l.Infof("CheckConnectionRequest: type: %s, DSN: %s timeout: %s.", request.Type, sanitizedDSN, request.Timeout) + resp, err := pmmAgent.channel.SendAndWaitResponse(request) if err != nil { return err @@ -99,16 +100,25 @@ func (c *ConnectionChecker) CheckConnectionToService(ctx context.Context, q *ref switch service.ServiceType { case models.MySQLServiceType: - tableCount := resp.(*agentpb.CheckConnectionResponse).GetStats().GetTableCount() //nolint:forcetypeassert - agent.TableCount = &tableCount - l.Debugf("Updating table count: %d.", tableCount) - if err = q.Update(agent); err != nil { - return errors.Wrap(err, "failed to update table count") + // TODO: remove the whole block after v3 release. + isSibSupported, err := isServiceInfoBrokerSupported(q, pmmAgentID) + if err != nil { + l.Warnf("Failed to check if serviceInfoBroker is supported: %s.", err) } - case models.ExternalServiceType, models.HAProxyServiceType: - case models.PostgreSQLServiceType: - case models.MongoDBServiceType: - case models.ProxySQLServiceType: + // In newer clients this gets handled by the ServiceInfoBroker. + if !isSibSupported { + tableCount := resp.(*agentpb.CheckConnectionResponse).GetStats().GetTableCount() //nolint:forcetypeassert,staticcheck + agent.TableCount = &tableCount + l.Debugf("Updating table count: %d.", tableCount) + if err = q.Update(agent); err != nil { + return errors.Wrap(err, "failed to update table count") + } + } + case models.ExternalServiceType, + models.HAProxyServiceType, + models.PostgreSQLServiceType, + models.MongoDBServiceType, + models.ProxySQLServiceType: // nothing yet default: diff --git a/managed/services/agents/service_info_broker.go b/managed/services/agents/service_info_broker.go new file mode 100644 index 0000000000..c329a11266 --- /dev/null +++ b/managed/services/agents/service_info_broker.go @@ -0,0 +1,237 @@ +// Copyright (C) 2023 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package agents + +import ( + "context" + "fmt" + "strings" + "time" + + "github.com/AlekSi/pointer" + "github.com/pkg/errors" + "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/agentpb" + "github.com/percona/pmm/api/inventorypb" + "github.com/percona/pmm/managed/models" + "github.com/percona/pmm/utils/logger" + "github.com/percona/pmm/version" +) + +var sericeInfoBrokerPMMVersion = version.MustParse("2.40.99") + +// ServiceInfoBroker helps query various information from services. +type ServiceInfoBroker struct { + r *Registry +} + +// NewServiceInfoBroker creates a new ServiceInfoBroker. +func NewServiceInfoBroker(r *Registry) *ServiceInfoBroker { + return &ServiceInfoBroker{ + r: r, + } +} + +// 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 + switch service.ServiceType { + case models.MySQLServiceType: + tdp := agent.TemplateDelimiters(service) + request = &agentpb.ServiceInfoRequest{ + Type: inventorypb.ServiceType_MYSQL_SERVICE, + Dsn: agent.DSN(service, 2*time.Second, service.DatabaseName, nil), + Timeout: durationpb.New(3 * time.Second), + TextFiles: &agentpb.TextFiles{ + Files: agent.Files(), + TemplateLeftDelim: tdp.Left, + TemplateRightDelim: tdp.Right, + }, + TlsSkipVerify: agent.TLSSkipVerify, + } + case models.PostgreSQLServiceType: + tdp := agent.TemplateDelimiters(service) + request = &agentpb.ServiceInfoRequest{ + Type: inventorypb.ServiceType_POSTGRESQL_SERVICE, + Dsn: agent.DSN(service, 2*time.Second, service.DatabaseName, nil), + Timeout: durationpb.New(3 * time.Second), + TextFiles: &agentpb.TextFiles{ + Files: agent.Files(), + TemplateLeftDelim: tdp.Left, + TemplateRightDelim: tdp.Right, + }, + } + case models.MongoDBServiceType: + tdp := agent.TemplateDelimiters(service) + request = &agentpb.ServiceInfoRequest{ + Type: inventorypb.ServiceType_MONGODB_SERVICE, + Dsn: agent.DSN(service, 2*time.Second, service.DatabaseName, nil), + Timeout: durationpb.New(3 * time.Second), + TextFiles: &agentpb.TextFiles{ + Files: agent.Files(), + TemplateLeftDelim: tdp.Left, + TemplateRightDelim: tdp.Right, + }, + } + case models.ProxySQLServiceType: + request = &agentpb.ServiceInfoRequest{ + Type: inventorypb.ServiceType_PROXYSQL_SERVICE, + Dsn: agent.DSN(service, 2*time.Second, service.DatabaseName, nil), + Timeout: durationpb.New(3 * time.Second), + } + case models.ExternalServiceType: + exporterURL, err := agent.ExporterURL(q) + if err != nil { + return nil, err + } + + request = &agentpb.ServiceInfoRequest{ + Type: inventorypb.ServiceType_EXTERNAL_SERVICE, + Dsn: exporterURL, + Timeout: durationpb.New(3 * time.Second), + } + case models.HAProxyServiceType: + exporterURL, err := agent.ExporterURL(q) + if err != nil { + return nil, err + } + + request = &agentpb.ServiceInfoRequest{ + Type: inventorypb.ServiceType_HAPROXY_SERVICE, + Dsn: exporterURL, + Timeout: durationpb.New(3 * time.Second), + } + default: + return nil, errors.Errorf("unhandled Service type %s", service.ServiceType) + } + return request, nil +} + +// GetInfoFromService sends a request to pmm-agent to query information from a service. +func (c *ServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error { + l := logger.Get(ctx) + start := time.Now() + defer func() { + if dur := time.Since(start); dur > 4*time.Second { + l.Warnf("GetInfoFromService took %s.", dur) + } + }() + + // External exporters and haproxy do not support this functionality. + if service.ServiceType == models.ExternalServiceType || service.ServiceType == models.HAProxyServiceType { + return nil + } + + pmmAgentID := pointer.GetString(agent.PMMAgentID) + isSibSupported, err := isServiceInfoBrokerSupported(q, pmmAgentID) + if err != nil { + return err + } + + if !isSibSupported { + return nil + } + + pmmAgent, err := c.r.get(pmmAgentID) + if err != nil { + return err + } + + request, err := serviceInfoRequest(q, service, agent) + if err != nil { + return err + } + + var sanitizedDSN string + for _, word := range redactWords(agent) { + sanitizedDSN = strings.ReplaceAll(request.Dsn, word, "****") + } + l.Infof("ServiceInfoRequest: type: %s, DSN: %s timeout: %s.", request.Type, sanitizedDSN, request.Timeout) + + resp, err := pmmAgent.channel.SendAndWaitResponse(request) + if err != nil { + return err + } + l.Infof("ServiceInfo response: %+v.", resp) + + sInfo, ok := resp.(*agentpb.ServiceInfoResponse) + if !ok { + return status.Error(codes.Internal, "failed to cast response to *agentpb.ServiceInfoResponse") + } + + msg := sInfo.Error + if msg == context.Canceled.Error() || msg == context.DeadlineExceeded.Error() { + msg = fmt.Sprintf("timeout (%s)", msg) + return status.Error(codes.FailedPrecondition, fmt.Sprintf("Connection check failed: %s.", msg)) + } + + stype := service.ServiceType + switch stype { + case models.MySQLServiceType: + agent.TableCount = &sInfo.TableCount + l.Debugf("Updating table count: %d.", sInfo.TableCount) + if err = q.Update(agent); err != nil { + return errors.Wrap(err, "failed to update table count") + } + return updateServiceVersion(ctx, q, resp, service) + case models.PostgreSQLServiceType, + models.MongoDBServiceType, + models.ProxySQLServiceType: + return updateServiceVersion(ctx, q, resp, service) + case models.ExternalServiceType, models.HAProxyServiceType: + return nil + default: + return errors.Errorf("unhandled Service type %s", service.ServiceType) + } +} + +func updateServiceVersion(ctx context.Context, q *reform.Querier, resp agentpb.AgentResponsePayload, service *models.Service) error { + l := logger.Get(ctx) + + version := resp.(*agentpb.ServiceInfoResponse).Version //nolint:forcetypeassert + if version == "" { + return nil + } + + l.Debugf("Updating service version: %s.", version) + service.Version = &version + if err := q.Update(service); err != nil { + return errors.Wrap(err, "failed to update service version") + } + + return nil +} + +// isServiceInfoBrokerSupported checks if PMM Agent supports ServiceInfoBroker. +func isServiceInfoBrokerSupported(q *reform.Querier, pmmAgentID string) (bool, error) { + pmmAgent, err := models.FindAgentByID(q, pmmAgentID) + if err != nil { + return false, fmt.Errorf("failed to get PMM Agent: %w", err) + } + pmmAgentVersion, err := version.Parse(*pmmAgent.Version) + if err != nil { + return false, fmt.Errorf("failed to parse PMM agent version %q: %w", *pmmAgent.Version, err) + } + + if pmmAgentVersion.Less(sericeInfoBrokerPMMVersion) { + return false, nil + } + return true, nil +} diff --git a/managed/services/alertmanager/alertmanager.go b/managed/services/alertmanager/alertmanager.go index 37027a72c8..3eaa5b54a3 100644 --- a/managed/services/alertmanager/alertmanager.go +++ b/managed/services/alertmanager/alertmanager.go @@ -209,7 +209,7 @@ func (svc *Service) reload(ctx context.Context) error { if err != nil { return errors.WithStack(err) } - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck b, err := io.ReadAll(resp.Body) svc.l.Debugf("Alertmanager reload: %s", b) @@ -483,7 +483,7 @@ func (svc *Service) IsReady(ctx context.Context) error { if err != nil { return errors.WithStack(err) } - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck b, err := io.ReadAll(resp.Body) svc.l.Debugf("Alertmanager ready: %s", b) diff --git a/managed/services/backup/mock_agent_service_test.go b/managed/services/backup/mock_agent_service_test.go index a00def9b4d..7f3940e50b 100644 --- a/managed/services/backup/mock_agent_service_test.go +++ b/managed/services/backup/mock_agent_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package backup diff --git a/managed/services/backup/mock_compatibility_service_test.go b/managed/services/backup/mock_compatibility_service_test.go index d557a6b11f..a7db3db17c 100644 --- a/managed/services/backup/mock_compatibility_service_test.go +++ b/managed/services/backup/mock_compatibility_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package backup diff --git a/managed/services/backup/mock_jobs_service_test.go b/managed/services/backup/mock_jobs_service_test.go index 280a49ad56..cc048818f3 100644 --- a/managed/services/backup/mock_jobs_service_test.go +++ b/managed/services/backup/mock_jobs_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package backup diff --git a/managed/services/backup/mock_pbm_pitr_service_test.go b/managed/services/backup/mock_pbm_pitr_service_test.go index 32ee811879..c0255e8763 100644 --- a/managed/services/backup/mock_pbm_pitr_service_test.go +++ b/managed/services/backup/mock_pbm_pitr_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package backup diff --git a/managed/services/backup/mock_removal_service_test.go b/managed/services/backup/mock_removal_service_test.go index 1d28662667..c3364c75c9 100644 --- a/managed/services/backup/mock_removal_service_test.go +++ b/managed/services/backup/mock_removal_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package backup diff --git a/managed/services/backup/mock_storage_test.go b/managed/services/backup/mock_storage_test.go index 73a0332051..150f5a7c21 100644 --- a/managed/services/backup/mock_storage_test.go +++ b/managed/services/backup/mock_storage_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package backup diff --git a/managed/services/backup/mock_versioner_test.go b/managed/services/backup/mock_versioner_test.go index 082051952b..bb1443d3c1 100644 --- a/managed/services/backup/mock_versioner_test.go +++ b/managed/services/backup/mock_versioner_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package backup diff --git a/managed/services/checks/checks.go b/managed/services/checks/checks.go index 4a58993930..c3e95f0302 100644 --- a/managed/services/checks/checks.go +++ b/managed/services/checks/checks.go @@ -1490,24 +1490,24 @@ func (s *Service) filterSupportedChecks(advisors []check.Advisor) []check.Adviso for _, advisor := range advisors { checks := make([]check.Check, 0, len(advisor.Checks)) - loop: + LOOP: for _, c := range advisor.Checks { if c.Version > maxSupportedVersion { s.l.Warnf("Unsupported checks version: %d, max supported version: %d.", c.Version, maxSupportedVersion) - continue loop + continue } switch c.Version { case 1: if ok := isQueryTypeSupported(c.Type); !ok { s.l.Warnf("Unsupported check type: %s.", c.Type) - continue loop + continue } case 2: for _, query := range c.Queries { if ok := isQueryTypeSupported(query.Type); !ok { s.l.Warnf("Unsupported query type: %s.", query.Type) - continue loop + continue LOOP } } } diff --git a/managed/services/checks/mock_agents_registry_test.go b/managed/services/checks/mock_agents_registry_test.go index 50fa4c8614..52d0f05d89 100644 --- a/managed/services/checks/mock_agents_registry_test.go +++ b/managed/services/checks/mock_agents_registry_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package checks diff --git a/managed/services/config/config.go b/managed/services/config/config.go index da63fa58e7..fd4cedf7b5 100644 --- a/managed/services/config/config.go +++ b/managed/services/config/config.go @@ -73,7 +73,7 @@ func (s *Service) Load() error { var cfg Config if _, err := os.Stat(configPath); err == nil { - s.l.Trace("config exist, reading file") + s.l.Trace("config exists, reading file") buf, err := os.ReadFile(configPath) //nolint:gosec if err != nil { return errors.Wrapf(err, "error while reading config [%s]", configPath) diff --git a/managed/services/config/pmm-managed.yaml b/managed/services/config/pmm-managed.yaml index d9341b020f..133d1bfc78 100644 --- a/managed/services/config/pmm-managed.yaml +++ b/managed/services/config/pmm-managed.yaml @@ -19,7 +19,12 @@ services: GRAFANADB_SELECT: enabled: true timeout: 5s - db_file: /srv/grafana/grafana.db + use_separate_credentials: true + separate_credentials: + username: grafana + password: grafana + ENV_VARS: + enabled: true reporting: send: true send_on_start: false diff --git a/managed/services/grafana/auth_server_test.go b/managed/services/grafana/auth_server_test.go index 77d341a36b..6a3994538d 100644 --- a/managed/services/grafana/auth_server_test.go +++ b/managed/services/grafana/auth_server_test.go @@ -80,7 +80,7 @@ func TestAuthServerMustSetup(t *testing.T) { assert.True(t, s.mustSetup(rw, req, logrus.WithField("test", t.Name()))) resp := rw.Result() - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck assert.Equal(t, 401, resp.StatusCode) assert.Equal(t, "1", resp.Header.Get("X-Must-Setup")) assert.Equal(t, "", resp.Header.Get("Location")) @@ -97,7 +97,7 @@ func TestAuthServerMustSetup(t *testing.T) { assert.True(t, s.mustSetup(rw, req, logrus.WithField("test", t.Name()))) resp := rw.Result() - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck assert.Equal(t, 303, resp.StatusCode) assert.Equal(t, "", resp.Header.Get("X-Must-Setup")) assert.Equal(t, "/setup", resp.Header.Get("Location")) @@ -123,7 +123,7 @@ func TestAuthServerMustSetup(t *testing.T) { assert.False(t, s.mustSetup(rw, req, logrus.WithField("test", t.Name()))) resp := rw.Result() - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck assert.Equal(t, 200, resp.StatusCode) assert.Equal(t, "", resp.Header.Get("X-Must-Setup")) assert.Equal(t, "", resp.Header.Get("Location")) @@ -148,7 +148,7 @@ func TestAuthServerMustSetup(t *testing.T) { assert.False(t, s.mustSetup(rw, req, logrus.WithField("test", t.Name()))) resp := rw.Result() - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck assert.Equal(t, 200, resp.StatusCode) assert.Equal(t, "", resp.Header.Get("X-Must-Setup")) assert.Equal(t, "", resp.Header.Get("Location")) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 684fe94864..0035176d77 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -132,7 +132,7 @@ func (c *Client) do(ctx context.Context, method, path, rawQuery string, headers if err != nil { return errors.WithStack(err) } - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck b, err := io.ReadAll(resp.Body) if err != nil { diff --git a/managed/services/grafana/mock_aws_instance_checker_test.go b/managed/services/grafana/mock_aws_instance_checker_test.go index 899d3257b8..6fc2958b5c 100644 --- a/managed/services/grafana/mock_aws_instance_checker_test.go +++ b/managed/services/grafana/mock_aws_instance_checker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package grafana diff --git a/managed/services/inventory/agents.go b/managed/services/inventory/agents.go index 6a27106db9..3e36deecc4 100644 --- a/managed/services/inventory/agents.go +++ b/managed/services/inventory/agents.go @@ -38,10 +38,11 @@ type AgentsService struct { vmdb prometheusService db *reform.DB cc connectionChecker + sib serviceInfoBroker } // NewAgentsService creates new AgentsService. -func NewAgentsService(db *reform.DB, r agentsRegistry, state agentsStateUpdater, vmdb prometheusService, cc connectionChecker, a agentService) *AgentsService { +func NewAgentsService(db *reform.DB, r agentsRegistry, state agentsStateUpdater, vmdb prometheusService, cc connectionChecker, sib serviceInfoBroker, a agentService) *AgentsService { //nolint:lll return &AgentsService{ r: r, a: a, @@ -49,6 +50,7 @@ func NewAgentsService(db *reform.DB, r agentsRegistry, state agentsStateUpdater, vmdb: vmdb, db: db, cc: cc, + sib: sib, } } @@ -259,6 +261,7 @@ func (as *AgentsService) AddMySQLdExporter(ctx context.Context, req *inventorypb if err != nil { return err } + if !req.SkipConnectionCheck { service, err := models.FindServiceByID(tx.Querier, req.ServiceId) if err != nil { @@ -268,6 +271,10 @@ func (as *AgentsService) AddMySQLdExporter(ctx context.Context, req *inventorypb if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } + + if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) @@ -319,6 +326,7 @@ func (as *AgentsService) AddMongoDBExporter(ctx context.Context, req *inventoryp if err != nil { return err } + if !req.SkipConnectionCheck { service, err := models.FindServiceByID(tx.Querier, req.ServiceId) if err != nil { @@ -328,6 +336,10 @@ func (as *AgentsService) AddMongoDBExporter(ctx context.Context, req *inventoryp if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } + + if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) @@ -508,6 +520,7 @@ func (as *AgentsService) AddPostgresExporter(ctx context.Context, req *inventory if err != nil { return err } + if !req.SkipConnectionCheck { service, err := models.FindServiceByID(tx.Querier, req.ServiceId) if err != nil { @@ -517,6 +530,10 @@ func (as *AgentsService) AddPostgresExporter(ctx context.Context, req *inventory if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } + + if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) @@ -631,6 +648,7 @@ func (as *AgentsService) AddProxySQLExporter(ctx context.Context, req *inventory if err != nil { return err } + if !req.SkipConnectionCheck { service, err := models.FindServiceByID(tx.Querier, req.ServiceId) if err != nil { @@ -640,6 +658,10 @@ func (as *AgentsService) AddProxySQLExporter(ctx context.Context, req *inventory if err = as.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } + + if err = as.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) diff --git a/managed/services/inventory/agents_test.go b/managed/services/inventory/agents_test.go index 6157ea2d9a..0b27c9a19e 100644 --- a/managed/services/inventory/agents_test.go +++ b/managed/services/inventory/agents_test.go @@ -50,6 +50,10 @@ func TestAgents(t *testing.T) { mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, + mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) as.vmdb.(*mockPrometheusService).On("RequestConfigurationUpdate").Return() pmmAgent, err := as.AddPMMAgent(ctx, &inventorypb.AddPMMAgentRequest{ @@ -453,6 +457,10 @@ func TestAgents(t *testing.T) { mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, + mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) pmmAgent, err := as.AddPMMAgent(ctx, &inventorypb.AddPMMAgentRequest{ RunsOnNodeId: models.PMMServerNodeID, @@ -539,6 +547,10 @@ func TestAgents(t *testing.T) { mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, + mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) pmmAgent, err := as.AddPMMAgent(ctx, &inventorypb.AddPMMAgentRequest{ RunsOnNodeId: models.PMMServerNodeID, @@ -590,6 +602,10 @@ func TestAgents(t *testing.T) { mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, + mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) pmmAgent, err := as.AddPMMAgent(ctx, &inventorypb.AddPMMAgentRequest{ RunsOnNodeId: models.PMMServerNodeID, diff --git a/managed/services/inventory/deps.go b/managed/services/inventory/deps.go index 37c2faab3e..caa8ee81b8 100644 --- a/managed/services/inventory/deps.go +++ b/managed/services/inventory/deps.go @@ -28,6 +28,7 @@ import ( //go:generate ../../../bin/mockery --name=agentsStateUpdater --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=prometheusService --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=connectionChecker --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=serviceInfoBroker --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=versionCache --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=inventoryMetrics --case=snake --inpackage --testonly @@ -64,6 +65,11 @@ type connectionChecker interface { CheckConnectionToService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error } +// serviceInfoBroker is a subset of methods of serviceinfobroker.ServiceInfoBroker used by this package. +type serviceInfoBroker interface { + GetInfoFromService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error +} + // versionCache is a subset of methods of versioncache.Service used by this package. // We use it instead of real type for testing and to avoid dependency cycle. type versionCache interface { diff --git a/managed/services/inventory/inventory_metrics_test.go b/managed/services/inventory/inventory_metrics_test.go index 939ccc7b07..c5addf6dc8 100644 --- a/managed/services/inventory/inventory_metrics_test.go +++ b/managed/services/inventory/inventory_metrics_test.go @@ -33,30 +33,6 @@ import ( ) func TestNewInventoryMetricsCollector(t *testing.T) { - metricsMock := &mockInventoryMetrics{} - inventoryCollector := NewInventoryMetricsCollector(metricsMock) - - agentMetrics := []Metric{ - { - labels: []string{"A1", string(models.PMMAgentType), "S1", "N1", "NN1", "PA1", strconv.Itoa(1), "V1"}, - value: float64(1), - }, - } - - nodeMetrics := []Metric{ - { - labels: []string{"N1", string(models.GenericNodeType), "N1", "C1"}, - value: float64(1), - }, - } - - serviceMetrics := []Metric{ - { - labels: []string{"C1", string(models.ProxySQLServiceType), "N1"}, - value: float64(1), - }, - } - t.Run("Metrics returns inventory metrics", func(t *testing.T) { client := http.Client{} @@ -67,7 +43,7 @@ func TestNewInventoryMetricsCollector(t *testing.T) { require.NoError(t, err) resp, err := client.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck body, err := io.ReadAll(resp.Body) require.NoError(t, err) @@ -80,6 +56,34 @@ func TestNewInventoryMetricsCollector(t *testing.T) { }) t.Run("Collector", func(t *testing.T) { + metricsMock := &mockInventoryMetrics{} + metricsMock.Test(t) + + t.Cleanup(func() { metricsMock.AssertExpectations(t) }) + + inventoryCollector := NewInventoryMetricsCollector(metricsMock) + + agentMetrics := []Metric{ + { + labels: []string{"A1", string(models.PMMAgentType), "S1", "N1", "NN1", "PA1", strconv.Itoa(1), "V1"}, + value: float64(1), + }, + } + + nodeMetrics := []Metric{ + { + labels: []string{"N1", string(models.GenericNodeType), "N1", "C1"}, + value: float64(1), + }, + } + + serviceMetrics := []Metric{ + { + labels: []string{"C1", string(models.ProxySQLServiceType), "N1"}, + value: float64(1), + }, + } + metricsMock.On("GetAgentMetrics", mock.Anything).Return(agentMetrics, nil) metricsMock.On("GetNodeMetrics", mock.Anything).Return(nodeMetrics, nil) metricsMock.On("GetServiceMetrics", mock.Anything).Return(serviceMetrics, nil) @@ -122,7 +126,5 @@ func TestNewInventoryMetricsCollector(t *testing.T) { "pmm_managed_inventory_services"); err != nil { t.Errorf("Unexpected collecting result:\n%s", err) } - - metricsMock.AssertExpectations(t) }) } diff --git a/managed/services/inventory/mock_agent_service_test.go b/managed/services/inventory/mock_agent_service_test.go index 0507ce816e..9f84a3a905 100644 --- a/managed/services/inventory/mock_agent_service_test.go +++ b/managed/services/inventory/mock_agent_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package inventory diff --git a/managed/services/inventory/mock_agents_registry_test.go b/managed/services/inventory/mock_agents_registry_test.go index 1626036cbf..63a6e4a727 100644 --- a/managed/services/inventory/mock_agents_registry_test.go +++ b/managed/services/inventory/mock_agents_registry_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package inventory diff --git a/managed/services/inventory/mock_agents_state_updater_test.go b/managed/services/inventory/mock_agents_state_updater_test.go index 66a553aa98..368ec148e5 100644 --- a/managed/services/inventory/mock_agents_state_updater_test.go +++ b/managed/services/inventory/mock_agents_state_updater_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package inventory diff --git a/managed/services/inventory/mock_connection_checker_test.go b/managed/services/inventory/mock_connection_checker_test.go index ab70948108..d110f2d021 100644 --- a/managed/services/inventory/mock_connection_checker_test.go +++ b/managed/services/inventory/mock_connection_checker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package inventory diff --git a/managed/services/inventory/mock_inventory_metrics_test.go b/managed/services/inventory/mock_inventory_metrics_test.go index 2585fb82c9..8696dcf22c 100644 --- a/managed/services/inventory/mock_inventory_metrics_test.go +++ b/managed/services/inventory/mock_inventory_metrics_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package inventory diff --git a/managed/services/inventory/mock_prometheus_service_test.go b/managed/services/inventory/mock_prometheus_service_test.go index 993fc3621b..b28b989a14 100644 --- a/managed/services/inventory/mock_prometheus_service_test.go +++ b/managed/services/inventory/mock_prometheus_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package inventory diff --git a/managed/services/inventory/mock_service_info_broker_test.go b/managed/services/inventory/mock_service_info_broker_test.go new file mode 100644 index 0000000000..b3e711ade0 --- /dev/null +++ b/managed/services/inventory/mock_service_info_broker_test.go @@ -0,0 +1,46 @@ +// Code generated by mockery v2.36.0. DO NOT EDIT. + +package inventory + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" + reform "gopkg.in/reform.v1" + + models "github.com/percona/pmm/managed/models" +) + +// mockServiceInfoBroker is an autogenerated mock type for the serviceInfoBroker type +type mockServiceInfoBroker struct { + mock.Mock +} + +// GetInfoFromService provides a mock function with given fields: ctx, q, service, agent +func (_m *mockServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error { + ret := _m.Called(ctx, q, service, agent) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *reform.Querier, *models.Service, *models.Agent) error); ok { + r0 = rf(ctx, q, service, agent) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// newMockServiceInfoBroker creates a new instance of mockServiceInfoBroker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockServiceInfoBroker(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockServiceInfoBroker { + mock := &mockServiceInfoBroker{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/inventory/mock_version_cache_test.go b/managed/services/inventory/mock_version_cache_test.go index 5011497cdc..d72ad3d0d3 100644 --- a/managed/services/inventory/mock_version_cache_test.go +++ b/managed/services/inventory/mock_version_cache_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package inventory diff --git a/managed/services/inventory/services_test.go b/managed/services/inventory/services_test.go index 3d091d7091..d2402fc47c 100644 --- a/managed/services/inventory/services_test.go +++ b/managed/services/inventory/services_test.go @@ -64,6 +64,9 @@ func setup(t *testing.T) (*ServicesService, *AgentsService, *NodesService, func( as := &mockAgentService{} as.Test(t) + sib := &mockServiceInfoBroker{} + sib.Test(t) + teardown := func(t *testing.T) { t.Helper() uuid.SetRand(nil) @@ -73,11 +76,12 @@ func setup(t *testing.T) (*ServicesService, *AgentsService, *NodesService, func( r.AssertExpectations(t) vmdb.AssertExpectations(t) state.AssertExpectations(t) - cc.Test(t) + cc.AssertExpectations(t) + sib.AssertExpectations(t) } return NewServicesService(db, r, state, vmdb, vc), - NewAgentsService(db, r, state, vmdb, cc, as), + NewAgentsService(db, r, state, vmdb, cc, sib, as), NewNodesService(db, r, state, vmdb), teardown, logger.Set(context.Background(), t.Name()), @@ -140,6 +144,10 @@ func TestServices(t *testing.T) { mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, + mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) node, err := ns.AddRemoteRDSNode(ctx, &inventorypb.AddRemoteRDSNodeRequest{NodeName: "test1", Region: "test-region", Address: "test"}) require.NoError(t, err) @@ -198,6 +206,10 @@ func TestServices(t *testing.T) { mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) + as.sib.(*mockServiceInfoBroker).On("GetInfoFromService", ctx, + mock.AnythingOfType(reflect.TypeOf(&reform.TX{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Service{}).Name()), + mock.AnythingOfType(reflect.TypeOf(&models.Agent{}).Name())).Return(nil) node, err := ns.AddRemoteAzureDatabaseNode(ctx, &inventorypb.AddRemoteAzureDatabaseNodeRequest{NodeName: "test1", Region: "test-region", Address: "test"}) require.NoError(t, err) diff --git a/managed/services/management/alerting/mock_grafana_client_test.go b/managed/services/management/alerting/mock_grafana_client_test.go index 64db7ab724..8373945736 100644 --- a/managed/services/management/alerting/mock_grafana_client_test.go +++ b/managed/services/management/alerting/mock_grafana_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package alerting diff --git a/managed/services/management/azure_database.go b/managed/services/management/azure_database.go index dda84b4fae..0fce250174 100644 --- a/managed/services/management/azure_database.go +++ b/managed/services/management/azure_database.go @@ -59,18 +59,20 @@ type AzureDatabaseService struct { registry agentsRegistry state agentsStateUpdater cc connectionChecker + sib serviceInfoBroker azurev1beta1.UnimplementedAzureDatabaseServer } // NewAzureDatabaseService creates new instance discovery service. -func NewAzureDatabaseService(db *reform.DB, registry agentsRegistry, state agentsStateUpdater, cc connectionChecker) *AzureDatabaseService { +func NewAzureDatabaseService(db *reform.DB, registry agentsRegistry, state agentsStateUpdater, cc connectionChecker, sib serviceInfoBroker) *AzureDatabaseService { //nolint:lll return &AzureDatabaseService{ l: logrus.WithField("component", "management/azure_database"), db: db, registry: registry, state: state, cc: cc, + sib: sib, } } @@ -301,6 +303,9 @@ func (s *AzureDatabaseService) AddAzureDatabase(ctx context.Context, req *azurev if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, metricsExporter); err != nil { return err } + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, metricsExporter); err != nil { + return err + } } if req.Qan { diff --git a/managed/services/management/backup/mock_aws_s3_test.go b/managed/services/management/backup/mock_aws_s3_test.go index 5497756d75..1247a97643 100644 --- a/managed/services/management/backup/mock_aws_s3_test.go +++ b/managed/services/management/backup/mock_aws_s3_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package backup diff --git a/managed/services/management/backup/mock_backup_service_test.go b/managed/services/management/backup/mock_backup_service_test.go index e8cdd88799..87354324b2 100644 --- a/managed/services/management/backup/mock_backup_service_test.go +++ b/managed/services/management/backup/mock_backup_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package backup diff --git a/managed/services/management/backup/mock_pbm_pitr_service_test.go b/managed/services/management/backup/mock_pbm_pitr_service_test.go index 6aa1cb1910..aa853c4746 100644 --- a/managed/services/management/backup/mock_pbm_pitr_service_test.go +++ b/managed/services/management/backup/mock_pbm_pitr_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package backup diff --git a/managed/services/management/backup/mock_removal_service_test.go b/managed/services/management/backup/mock_removal_service_test.go index 4993d2d856..84786c689c 100644 --- a/managed/services/management/backup/mock_removal_service_test.go +++ b/managed/services/management/backup/mock_removal_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package backup diff --git a/managed/services/management/backup/mock_schedule_service_test.go b/managed/services/management/backup/mock_schedule_service_test.go index 8790e0a0ae..e85951c13f 100644 --- a/managed/services/management/backup/mock_schedule_service_test.go +++ b/managed/services/management/backup/mock_schedule_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package backup diff --git a/managed/services/management/deps.go b/managed/services/management/deps.go index 9849a0c2f6..012cbd5fd6 100644 --- a/managed/services/management/deps.go +++ b/managed/services/management/deps.go @@ -35,6 +35,7 @@ import ( //go:generate ../../../bin/mockery --name=grafanaClient --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=jobsService --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=connectionChecker --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=serviceInfoBroker --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=versionCache --case=snake --inpackage --testonly //go:generate ../../../bin/mockery --name=victoriaMetricsClient --case=snake --inpackage --testonly @@ -91,6 +92,11 @@ type connectionChecker interface { CheckConnectionToService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error } +// serviceInfoBroker is a subset of methods of serviceinfobroker.ServiceInfoBroker used by this package. +type serviceInfoBroker interface { + GetInfoFromService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error +} + // versionCache is a subset of methods of versioncache.Service used by this package. // We use it instead of real type for testing and to avoid dependency cycle. type versionCache interface { diff --git a/managed/services/management/mock_agents_registry_test.go b/managed/services/management/mock_agents_registry_test.go index ee002ee6f8..2432241b46 100644 --- a/managed/services/management/mock_agents_registry_test.go +++ b/managed/services/management/mock_agents_registry_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package management diff --git a/managed/services/management/mock_agents_state_updater_test.go b/managed/services/management/mock_agents_state_updater_test.go index 5ed25557ce..a4b409e07c 100644 --- a/managed/services/management/mock_agents_state_updater_test.go +++ b/managed/services/management/mock_agents_state_updater_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package management diff --git a/managed/services/management/mock_api_key_provider_test.go b/managed/services/management/mock_api_key_provider_test.go index 751456b11d..7e3c8a64ef 100644 --- a/managed/services/management/mock_api_key_provider_test.go +++ b/managed/services/management/mock_api_key_provider_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package management diff --git a/managed/services/management/mock_checks_service_test.go b/managed/services/management/mock_checks_service_test.go index 218a79d079..f6e0f6a91a 100644 --- a/managed/services/management/mock_checks_service_test.go +++ b/managed/services/management/mock_checks_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package management diff --git a/managed/services/management/mock_connection_checker_test.go b/managed/services/management/mock_connection_checker_test.go index f0d5b7de28..dd82f7775f 100644 --- a/managed/services/management/mock_connection_checker_test.go +++ b/managed/services/management/mock_connection_checker_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package management diff --git a/managed/services/management/mock_grafana_client_test.go b/managed/services/management/mock_grafana_client_test.go index e242cdcb93..c7c14095e6 100644 --- a/managed/services/management/mock_grafana_client_test.go +++ b/managed/services/management/mock_grafana_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package management diff --git a/managed/services/management/mock_jobs_service_test.go b/managed/services/management/mock_jobs_service_test.go index 72b58e2c25..51f1f55ade 100644 --- a/managed/services/management/mock_jobs_service_test.go +++ b/managed/services/management/mock_jobs_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package management diff --git a/managed/services/management/mock_prometheus_service_test.go b/managed/services/management/mock_prometheus_service_test.go index ff38f56099..3a4447fe25 100644 --- a/managed/services/management/mock_prometheus_service_test.go +++ b/managed/services/management/mock_prometheus_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package management diff --git a/managed/services/management/mock_service_info_broker_test.go b/managed/services/management/mock_service_info_broker_test.go new file mode 100644 index 0000000000..c626e893d4 --- /dev/null +++ b/managed/services/management/mock_service_info_broker_test.go @@ -0,0 +1,46 @@ +// Code generated by mockery v2.36.0. DO NOT EDIT. + +package management + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" + reform "gopkg.in/reform.v1" + + models "github.com/percona/pmm/managed/models" +) + +// mockServiceInfoBroker is an autogenerated mock type for the serviceInfoBroker type +type mockServiceInfoBroker struct { + mock.Mock +} + +// GetInfoFromService provides a mock function with given fields: ctx, q, service, agent +func (_m *mockServiceInfoBroker) GetInfoFromService(ctx context.Context, q *reform.Querier, service *models.Service, agent *models.Agent) error { + ret := _m.Called(ctx, q, service, agent) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, *reform.Querier, *models.Service, *models.Agent) error); ok { + r0 = rf(ctx, q, service, agent) + } else { + r0 = ret.Error(0) + } + + return r0 +} + +// newMockServiceInfoBroker creates a new instance of mockServiceInfoBroker. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockServiceInfoBroker(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockServiceInfoBroker { + mock := &mockServiceInfoBroker{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/mock_version_cache_test.go b/managed/services/management/mock_version_cache_test.go index f0fadcf33f..bc45f23e4f 100644 --- a/managed/services/management/mock_version_cache_test.go +++ b/managed/services/management/mock_version_cache_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package management diff --git a/managed/services/management/mock_victoria_metrics_client_test.go b/managed/services/management/mock_victoria_metrics_client_test.go index 36a1d03242..b19d56ef8b 100644 --- a/managed/services/management/mock_victoria_metrics_client_test.go +++ b/managed/services/management/mock_victoria_metrics_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package management diff --git a/managed/services/management/mongodb.go b/managed/services/management/mongodb.go index e016d47aa5..450b526fd4 100644 --- a/managed/services/management/mongodb.go +++ b/managed/services/management/mongodb.go @@ -32,15 +32,17 @@ type MongoDBService struct { db *reform.DB state agentsStateUpdater cc connectionChecker + sib serviceInfoBroker vc versionCache } // NewMongoDBService creates new MongoDB Management Service. -func NewMongoDBService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, vc versionCache) *MongoDBService { +func NewMongoDBService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, sib serviceInfoBroker, vc versionCache) *MongoDBService { return &MongoDBService{ db: db, state: state, cc: cc, + sib: sib, vc: vc, } } @@ -103,6 +105,10 @@ func (s *MongoDBService) Add(ctx context.Context, req *managementpb.AddMongoDBRe if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } + + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) @@ -122,7 +128,7 @@ func (s *MongoDBService) Add(ctx context.Context, req *managementpb.AddMongoDBRe MongoDBOptions: mongoDBOptions, MaxQueryLength: req.MaxQueryLength, LogLevel: services.SpecifyLogLevel(req.LogLevel, inventorypb.LogLevel_fatal), - // TODO QueryExamplesDisabled https://jira.percona.com/browse/PMM-4650 + // TODO QueryExamplesDisabled https://jira.percona.com/browse/PMM-7860 }) if err != nil { return err diff --git a/managed/services/management/mysql.go b/managed/services/management/mysql.go index e67f05eced..ac9292fac2 100644 --- a/managed/services/management/mysql.go +++ b/managed/services/management/mysql.go @@ -38,14 +38,16 @@ type MySQLService struct { state agentsStateUpdater cc connectionChecker vc versionCache + sib serviceInfoBroker } // NewMySQLService creates new MySQL Management Service. -func NewMySQLService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, vc versionCache) *MySQLService { +func NewMySQLService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, sib serviceInfoBroker, vc versionCache) *MySQLService { return &MySQLService{ db: db, state: state, cc: cc, + sib: sib, vc: vc, } } @@ -125,7 +127,11 @@ func (s *MySQLService) Add(ctx context.Context, req *managementpb.AddMySQLReques if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } - // CheckConnectionToService updates the table count in row so, let's also update the response + + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } + // GetInfoFromService updates the table count in row so, let's also update the response res.TableCount = *row.TableCount } diff --git a/managed/services/management/postgresql.go b/managed/services/management/postgresql.go index 536d593b42..33e7c002ef 100644 --- a/managed/services/management/postgresql.go +++ b/managed/services/management/postgresql.go @@ -32,14 +32,16 @@ type PostgreSQLService struct { db *reform.DB state agentsStateUpdater cc connectionChecker + sib serviceInfoBroker } // NewPostgreSQLService creates new PostgreSQL Management Service. -func NewPostgreSQLService(db *reform.DB, state agentsStateUpdater, cc connectionChecker) *PostgreSQLService { +func NewPostgreSQLService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, sib serviceInfoBroker) *PostgreSQLService { return &PostgreSQLService{ db: db, state: state, cc: cc, + sib: sib, } } @@ -101,6 +103,10 @@ func (s *PostgreSQLService) Add(ctx context.Context, req *managementpb.AddPostgr if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } + + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) diff --git a/managed/services/management/proxysql.go b/managed/services/management/proxysql.go index d356b8b321..b6809c925a 100644 --- a/managed/services/management/proxysql.go +++ b/managed/services/management/proxysql.go @@ -32,14 +32,16 @@ type ProxySQLService struct { db *reform.DB state agentsStateUpdater cc connectionChecker + sib serviceInfoBroker } // NewProxySQLService creates new ProxySQL Management Service. -func NewProxySQLService(db *reform.DB, state agentsStateUpdater, cc connectionChecker) *ProxySQLService { +func NewProxySQLService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, sib serviceInfoBroker) *ProxySQLService { return &ProxySQLService{ db: db, state: state, cc: cc, + sib: sib, } } @@ -98,6 +100,10 @@ func (s *ProxySQLService) Add(ctx context.Context, req *managementpb.AddProxySQL if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, row); err != nil { return err } + + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, row); err != nil { + return err + } } agent, err := services.ToAPIAgent(tx.Querier, row) diff --git a/managed/services/management/rds.go b/managed/services/management/rds.go index a669e2c472..e6724ce421 100644 --- a/managed/services/management/rds.go +++ b/managed/services/management/rds.go @@ -52,16 +52,18 @@ type RDSService struct { db *reform.DB state agentsStateUpdater cc connectionChecker + sib serviceInfoBroker managementpb.UnimplementedRDSServer } // NewRDSService creates new instance discovery service. -func NewRDSService(db *reform.DB, state agentsStateUpdater, cc connectionChecker) *RDSService { +func NewRDSService(db *reform.DB, state agentsStateUpdater, cc connectionChecker, sib serviceInfoBroker) *RDSService { return &RDSService{ db: db, state: state, cc: cc, + sib: sib, } } @@ -349,7 +351,10 @@ func (s *RDSService) AddRDS(ctx context.Context, req *managementpb.AddRDSRequest if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, mysqldExporter); err != nil { return err } - // CheckConnectionToService updates the table count in row so, let's also update the response + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, mysqldExporter); err != nil { + return err + } + // GetInfoFromService gets additional info in row, let's also update the response res.TableCount = *mysqldExporter.TableCount } @@ -426,6 +431,9 @@ func (s *RDSService) AddRDS(ctx context.Context, req *managementpb.AddRDSRequest if err = s.cc.CheckConnectionToService(ctx, tx.Querier, service, postgresExporter); err != nil { return err } + if err = s.sib.GetInfoFromService(ctx, tx.Querier, service, postgresExporter); err != nil { + return err + } } // add MySQL PerfSchema QAN Agent diff --git a/managed/services/management/rds_test.go b/managed/services/management/rds_test.go index 3cac4518e4..2474f75fe4 100644 --- a/managed/services/management/rds_test.go +++ b/managed/services/management/rds_test.go @@ -55,13 +55,15 @@ func TestRDSService(t *testing.T) { cc := &mockConnectionChecker{} cc.Test(t) + sib := &mockServiceInfoBroker{} + sib.Test(t) state := &mockAgentsStateUpdater{} state.Test(t) defer func() { cc.AssertExpectations(t) state.AssertExpectations(t) }() - s := NewRDSService(db, state, cc) + s := NewRDSService(db, state, cc, sib) t.Run("DiscoverRDS", func(t *testing.T) { t.Run("ListRegions", func(t *testing.T) { diff --git a/managed/services/management/service_mgmt.go b/managed/services/management/service_mgmt.go index 73f3febf5d..d0ae57addf 100644 --- a/managed/services/management/service_mgmt.go +++ b/managed/services/management/service_mgmt.go @@ -178,6 +178,7 @@ func (s *MgmtServiceService) ListServices(ctx context.Context, req *servicev1bet ServiceName: service.ServiceName, Socket: pointer.GetString(service.Socket), UpdatedAt: timestamppb.New(service.UpdatedAt), + Version: pointer.GetString(service.Version), } if metric, ok := metrics[service.ServiceID]; ok { diff --git a/managed/services/qan/mock_qan_collector_client_test.go b/managed/services/qan/mock_qan_collector_client_test.go index ca9f9131f7..05f0fa6fb4 100644 --- a/managed/services/qan/mock_qan_collector_client_test.go +++ b/managed/services/qan/mock_qan_collector_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package qan diff --git a/managed/services/scheduler/mock_backup_service_test.go b/managed/services/scheduler/mock_backup_service_test.go index 83c9632858..db100056e9 100644 --- a/managed/services/scheduler/mock_backup_service_test.go +++ b/managed/services/scheduler/mock_backup_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package scheduler diff --git a/managed/services/server/mock_agents_state_updater_test.go b/managed/services/server/mock_agents_state_updater_test.go index 9ea9078a1b..9242bd4f73 100644 --- a/managed/services/server/mock_agents_state_updater_test.go +++ b/managed/services/server/mock_agents_state_updater_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package server diff --git a/managed/services/server/mock_alertmanager_service_test.go b/managed/services/server/mock_alertmanager_service_test.go index 321657f84a..fe2984bd70 100644 --- a/managed/services/server/mock_alertmanager_service_test.go +++ b/managed/services/server/mock_alertmanager_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package server diff --git a/managed/services/server/mock_checks_service_test.go b/managed/services/server/mock_checks_service_test.go index 5b823d9c77..acb7e72b2a 100644 --- a/managed/services/server/mock_checks_service_test.go +++ b/managed/services/server/mock_checks_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package server diff --git a/managed/services/server/mock_grafana_client_test.go b/managed/services/server/mock_grafana_client_test.go index 5538b8ed16..f7c18124f2 100644 --- a/managed/services/server/mock_grafana_client_test.go +++ b/managed/services/server/mock_grafana_client_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package server diff --git a/managed/services/server/mock_prometheus_service_test.go b/managed/services/server/mock_prometheus_service_test.go index af2a5af62e..b11015fc30 100644 --- a/managed/services/server/mock_prometheus_service_test.go +++ b/managed/services/server/mock_prometheus_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package server diff --git a/managed/services/server/mock_supervisord_service_test.go b/managed/services/server/mock_supervisord_service_test.go index 398d081b22..64195d9f88 100644 --- a/managed/services/server/mock_supervisord_service_test.go +++ b/managed/services/server/mock_supervisord_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package server diff --git a/managed/services/server/mock_telemetry_service_test.go b/managed/services/server/mock_telemetry_service_test.go index f52a126e84..e8d72eb101 100644 --- a/managed/services/server/mock_telemetry_service_test.go +++ b/managed/services/server/mock_telemetry_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package server diff --git a/managed/services/server/mock_templates_service_test.go b/managed/services/server/mock_templates_service_test.go index ab8a151619..f9625aa42e 100644 --- a/managed/services/server/mock_templates_service_test.go +++ b/managed/services/server/mock_templates_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package server diff --git a/managed/services/server/mock_vm_alert_external_rules_test.go b/managed/services/server/mock_vm_alert_external_rules_test.go index 3ea3367386..1c4d605dec 100644 --- a/managed/services/server/mock_vm_alert_external_rules_test.go +++ b/managed/services/server/mock_vm_alert_external_rules_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package server diff --git a/managed/services/supervisord/logs.go b/managed/services/supervisord/logs.go index 0445ab97cd..951b12a071 100644 --- a/managed/services/supervisord/logs.go +++ b/managed/services/supervisord/logs.go @@ -32,10 +32,8 @@ import ( "sync" "time" - "github.com/percona/promconfig/alertmanager" "github.com/pkg/errors" "golang.org/x/sys/unix" - "gopkg.in/yaml.v3" pprofUtils "github.com/percona/pmm/managed/utils/pprof" "github.com/percona/pmm/utils/logger" @@ -149,23 +147,6 @@ func (l *Logs) files(ctx context.Context, pprofConfig *PprofConfig) []fileConten Err: err, }) } - for _, f := range []string{ - "/etc/alertmanager.yml", - "/srv/alertmanager/alertmanager.base.yml", - } { - b, m, err := readFile(f) - if err == nil { - b, err = maskAlertManagerSensitiveValues(b) - files = append(files, fileContent{ - Name: filepath.Base(f), - Modified: m, - Data: b, - Err: err, - }) - } else { - logger.Get(ctx).WithField("component", "logs").Error(err) - } - } // add configs for _, f := range []string{ "/etc/nginx/nginx.conf", @@ -374,7 +355,7 @@ func readURL(ctx context.Context, url string) ([]byte, error) { if err != nil { return nil, errors.WithStack(err) } - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck b, err := io.ReadAll(resp.Body) if err != nil { @@ -443,16 +424,3 @@ func addAdminSummary(ctx context.Context, zw *zip.Writer) error { return nil } - -func maskAlertManagerSensitiveValues(data []byte) ([]byte, error) { - var c alertmanager.Config - err := yaml.Unmarshal(data, &c) - if err != nil { - return data, err - } - nc, err := c.Mask() - if err != nil { - return data, err - } - return yaml.Marshal(nc) -} diff --git a/managed/services/supervisord/logs_test.go b/managed/services/supervisord/logs_test.go index d1805e8a68..6fef01a770 100644 --- a/managed/services/supervisord/logs_test.go +++ b/managed/services/supervisord/logs_test.go @@ -36,10 +36,8 @@ import ( ) var commonExpectedFiles = []string{ - "alertmanager.base.yml", "alertmanager.ini", "alertmanager.log", - "alertmanager.yml", "clickhouse-server.log", "grafana.log", "installed.json", diff --git a/managed/services/telemetry/config.default.yml b/managed/services/telemetry/config.default.yml index 9c49134f0d..bd2fe3995b 100644 --- a/managed/services/telemetry/config.default.yml +++ b/managed/services/telemetry/config.default.yml @@ -353,7 +353,7 @@ telemetry: - id: GrafanaStatDailyActiveUsers source: GRAFANADB_SELECT - query: count(*) AS count FROM user WHERE last_seen_at > datetime('now', '-1 day') + query: count(*) AS count FROM public.user WHERE last_seen_at > now() - interval '1 day' summary: "Daily active users" data: - metric_name: "pmm_server_grafana_stat_daily_active_users" @@ -726,7 +726,7 @@ telemetry: #Grafana - id: GrafanaUsersCount source: GRAFANADB_SELECT - query: count(*) AS count FROM user + query: count(*) AS count FROM public.user summary: "Grafana Users Count" data: - metric_name: "grafana_users_count" @@ -734,7 +734,7 @@ telemetry: - id: GrafanaDarkThemeUsersCount source: GRAFANADB_SELECT - query: count(u.id) as count from user u left join preferences p on p.user_id = u.id where p.theme = 'dark' + query: count(u.id) as count from public.user u left join preferences p on p.user_id = u.id where p.theme = 'dark' summary: "Grafana Dark Theme Users Count" data: - metric_name: "grafana_dark_theme_users_count" @@ -742,7 +742,7 @@ telemetry: - id: GrafanaLightThemeUsersCount source: GRAFANADB_SELECT - query: count(u.id) as count from user u left join preferences p on p.user_id = u.id where p.theme = 'light' + query: count(u.id) as count from public.user u left join preferences p on p.user_id = u.id where p.theme = 'light' summary: "Grafana Light Theme Users Count" data: - metric_name: "grafana_light_theme_users_count" @@ -750,7 +750,7 @@ telemetry: - id: GrafanaDefaultThemeUsersCount source: GRAFANADB_SELECT - query: count(u.id) as count from user u left join preferences p on p.user_id = u.id where p.theme = '' or p.theme is null + query: count(u.id) as count from public.user u left join preferences p on p.user_id = u.id where p.theme = '' or p.theme is null summary: "Grafana Default Theme Users Count" data: - metric_name: "grafana_default_theme_users_count" @@ -758,7 +758,7 @@ telemetry: - id: GrafanaCustomDashboardsCount source: GRAFANADB_SELECT - query: count(*) as count from dashboard where created_by != -1 and is_folder = 0 + query: count(*) as count from dashboard where created_by != -1 and is_folder = false summary: "Grafana Custom Dashboards Count" data: - metric_name: "grafana_custom_dashboards_count" @@ -766,7 +766,7 @@ telemetry: - id: GrafanaCustomDashboardsPerPillar source: GRAFANADB_SELECT - query: inn.title as pillar, count(d.title) as count from dashboard d left join dashboard inn ON d.folder_id = inn.id where d.created_by != -1 and d.is_folder = 0 group by inn.title + query: inn.title as pillar, count(d.title) as count from dashboard d left join dashboard inn ON d.folder_id = inn.id where d.created_by != -1 and d.is_folder = false group by inn.title summary: "Grafana Custom Dashboards Count By Pillar" transform: type: JSON @@ -775,6 +775,7 @@ telemetry: - metric_name: "pillar" column: "pillar" - metric_name: "count" + column: "count" # API usage - id: APIUsageMetrics @@ -901,3 +902,36 @@ telemetry: data: - metric_name: "postgresql_db_count" value: 1 + + # Note: use these for testing and PMM-12462 + # - id: PMMServerFeatureToggles + # source: ENV_VARS + # summary: "Use of feature toggles in PMM Server" + # data: + # - metric_name: "pmm_server_disable_telemetry" + # column: "DISABLE_TELEMETRY" + # - metric_name: "pmm_server_enable_alerting" + # column: "ENABLE_ALERTING" + # - metric_name: "pmm_server_enable_backup_management" + # column: "ENABLE_BACKUP_MANAGEMENT" + # - metric_name: "pmm_server_enable_debug" + # column: "ENABLE_DEBUG" + # - metric_name: "pmm_server_enable_rbac" + # column: "ENABLE_RBAC" + + # - id: PMMServerFeatureTogglesStripValues + # source: ENV_VARS + # summary: "Use of feature toggles in PMM Server" + # transform: + # type: StripValues + # data: + # - metric_name: "pmm_server_disable_telemetry" + # column: "DISABLE_TELEMETRY" + # - metric_name: "pmm_server_enable_alerting" + # column: "ENABLE_ALERTING" + # - metric_name: "pmm_server_enable_backup_management" + # column: "ENABLE_BACKUP_MANAGEMENT" + # - metric_name: "pmm_server_enable_debug" + # column: "ENABLE_DEBUG" + # - metric_name: "pmm_server_enable_rbac" + # column: "ENABLE_RBAC" diff --git a/managed/services/telemetry/config.go b/managed/services/telemetry/config.go index 40372b297f..361aa4a561 100644 --- a/managed/services/telemetry/config.go +++ b/managed/services/telemetry/config.go @@ -37,19 +37,31 @@ const ( envReportingRetryBackoff = "PERCONA_TEST_TELEMETRY_RETRY_BACKOFF" ) +const ( + dsVM = DataSourceName("VM") + dsQANDBSelect = DataSourceName("QANDB_SELECT") + dsPMMDBSelect = DataSourceName("PMMDB_SELECT") + dsGRAFANADBSelect = DataSourceName("GRAFANADB_SELECT") + dsEnvVars = DataSourceName("ENV_VARS") +) + +// DataSources holds all possible data source types. +type DataSources struct { + VM *DSConfigVM `yaml:"VM"` + QanDBSelect *DSConfigQAN `yaml:"QANDB_SELECT"` + PmmDBSelect *DSConfigPMMDB `yaml:"PMMDB_SELECT"` + GrafanaDBSelect *DSConfigGrafanaDB `yaml:"GRAFANADB_SELECT"` + EnvVars *DSConfigEnvVars `yaml:"ENV_VARS"` +} + // ServiceConfig telemetry config. type ServiceConfig struct { l *logrus.Entry - Enabled bool `yaml:"enabled"` - telemetry []Config `yaml:"-"` - SaasHostname string `yaml:"saas_hostname"` - DataSources struct { - VM *DataSourceVictoriaMetrics `yaml:"VM"` - QanDBSelect *DSConfigQAN `yaml:"QANDB_SELECT"` - PmmDBSelect *DSConfigPMMDB `yaml:"PMMDB_SELECT"` - GrafanaDBSelect *DSGrafanaSqliteDB `yaml:"GRAFANADB_SELECT"` - } `yaml:"datasources"` - Reporting ReportingConfig `yaml:"reporting"` + Enabled bool `yaml:"enabled"` + telemetry []Config `yaml:"-"` + SaasHostname string `yaml:"saas_hostname"` + DataSources DataSources `yaml:"datasources"` + Reporting ReportingConfig `yaml:"reporting"` } // FileConfig top level telemetry config element. @@ -64,32 +76,25 @@ type DSConfigQAN struct { DSN string `yaml:"-"` } -// DataSourceVictoriaMetrics telemetry config. -type DataSourceVictoriaMetrics struct { +// DSConfigVM telemetry config. +type DSConfigVM struct { Enabled bool `yaml:"enabled"` Timeout time.Duration `yaml:"timeout"` Address string `yaml:"address"` } -// DSGrafanaSqliteDB telemetry config. -type DSGrafanaSqliteDB struct { - Enabled bool `yaml:"enabled"` - Timeout time.Duration `yaml:"timeout"` - DBFile string `yaml:"db_file"` -} - // DSConfigPMMDB telemetry config. type DSConfigPMMDB struct { //nolint:musttag Enabled bool `yaml:"enabled"` Timeout time.Duration `yaml:"timeout"` UseSeparateCredentials bool `yaml:"use_separate_credentials"` - // Credentials used by PMM - DSN struct { + DSN struct { Scheme string Host string DB string Params string } `yaml:"-"` + // Credentials used by PMM Credentials struct { Username string Password string @@ -100,6 +105,14 @@ type DSConfigPMMDB struct { //nolint:musttag } `yaml:"separate_credentials"` } +// DSConfigGrafanaDB is a Grafana telemetry config. +type DSConfigGrafanaDB DSConfigPMMDB + +// DSConfigEnvVars is an env variable telemetry config. +type DSConfigEnvVars struct { + Enabled bool `yaml:"enabled"` +} + // Config telemetry config. type Config struct { ID string `yaml:"id"` @@ -111,21 +124,23 @@ type Config struct { Data []ConfigData } -// ConfigTransform telemetry config transformation. +// ConfigTransform is a telemetry config transformation. type ConfigTransform struct { Type ConfigTransformType `yaml:"type"` Metric string `yaml:"metric"` } -// ConfigTransformType config transform type. +// ConfigTransformType is a config transform type. type ConfigTransformType string const ( - // JSONTransformType JSON type. - JSONTransformType = ConfigTransformType("JSON") + // JSONTransform converts multiple metrics in one formatted as JSON. + JSONTransform = ConfigTransformType("JSON") + // StripValuesTransform strips values from metrics, replacing them with 1 to indicate presence. + StripValuesTransform = ConfigTransformType("StripValues") ) -// ConfigData telemetry config. +// ConfigData is a telemetry data config. type ConfigData struct { MetricName string `yaml:"metric_name"` Label string `yaml:"label"` diff --git a/managed/services/telemetry/config_test.go b/managed/services/telemetry/config_test.go index 5d497688d0..445e716427 100644 --- a/managed/services/telemetry/config_test.go +++ b/managed/services/telemetry/config_test.go @@ -47,8 +47,12 @@ datasources: GRAFANADB_SELECT: enabled: true timeout: 2s - db_file: /srv/grafana/grafana.db - + use_separate_credentials: true + separate_credentials: + username: grafana + password: grafana + ENV_VARS: + enabled: true reporting: send: true send_on_start: true @@ -71,13 +75,8 @@ reporting: RetryCount: 2, SendTimeout: time.Second * 10, }, - DataSources: struct { - VM *DataSourceVictoriaMetrics `yaml:"VM"` - QanDBSelect *DSConfigQAN `yaml:"QANDB_SELECT"` - PmmDBSelect *DSConfigPMMDB `yaml:"PMMDB_SELECT"` - GrafanaDBSelect *DSGrafanaSqliteDB `yaml:"GRAFANADB_SELECT"` - }{ - VM: &DataSourceVictoriaMetrics{ + DataSources: DataSources{ + VM: &DSConfigVM{ Enabled: true, Timeout: time.Second * 2, Address: "http://localhost:80/victoriametrics/", @@ -98,10 +97,20 @@ reporting: Password: "pmm-managed", }, }, - GrafanaDBSelect: &DSGrafanaSqliteDB{ + GrafanaDBSelect: &DSConfigGrafanaDB{ + Enabled: true, + Timeout: time.Second * 2, + UseSeparateCredentials: true, + SeparateCredentials: struct { + Username string `yaml:"username"` + Password string `yaml:"password"` + }{ + Username: "grafana", + Password: "grafana", + }, + }, + EnvVars: &DSConfigEnvVars{ Enabled: true, - Timeout: time.Second * 2, - DBFile: "/srv/grafana/grafana.db", }, }, } diff --git a/managed/services/telemetry/datasource_envvars.go b/managed/services/telemetry/datasource_envvars.go new file mode 100644 index 0000000000..4dc320a51c --- /dev/null +++ b/managed/services/telemetry/datasource_envvars.go @@ -0,0 +1,84 @@ +// Copyright (C) 2023 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Package telemetry provides telemetry functionality. +package telemetry + +import ( + "context" + "os" + + pmmv1 "github.com/percona-platform/saas/gen/telemetry/events/pmm" + "github.com/sirupsen/logrus" +) + +type dsEnvvars struct { + l *logrus.Entry + config DSConfigEnvVars +} + +// check interfaces. +var ( + _ DataSource = (*dsEnvvars)(nil) +) + +// NewDataSourceEnvVars makes a new data source for collecting envvars. +func NewDataSourceEnvVars(config DSConfigEnvVars, l *logrus.Entry) DataSource { + return &dsEnvvars{ + l: l, + config: config, + } +} + +// Enabled flag that determines if data source is enabled. +func (d *dsEnvvars) Enabled() bool { + return d.config.Enabled +} + +func (d *dsEnvvars) Init(_ context.Context) error { + return nil +} + +func (d *dsEnvvars) FetchMetrics(_ context.Context, config Config) ([]*pmmv1.ServerMetric_Metric, error) { + var metrics []*pmmv1.ServerMetric_Metric + + check := make(map[string]bool, len(config.Data)) + + for _, col := range config.Data { + if col.Column == "" { + d.l.Warnf("no column defined or empty column name in config %s", config.ID) + continue + } + if value, ok := os.LookupEnv(col.Column); ok && value != "" { + if _, alreadyHasItem := check[col.MetricName]; alreadyHasItem { + d.l.Warnf("repeated metric key %s found in config %s, the last will win", col.MetricName, config.ID) + continue + } + + check[col.MetricName] = true + + metrics = append(metrics, &pmmv1.ServerMetric_Metric{ + Key: col.MetricName, + Value: value, + }) + } + } + + return metrics, nil +} + +func (d *dsEnvvars) Dispose(_ context.Context) error { + return nil +} diff --git a/managed/services/telemetry/datasource_envvars_test.go b/managed/services/telemetry/datasource_envvars_test.go new file mode 100644 index 0000000000..5139d68c48 --- /dev/null +++ b/managed/services/telemetry/datasource_envvars_test.go @@ -0,0 +1,151 @@ +// Copyright (C) 2023 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Package telemetry provides telemetry functionality. +package telemetry + +import ( + "context" + "os" + "testing" + + pmmv1 "github.com/percona-platform/saas/gen/telemetry/events/pmm" + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestEnvVarsDatasource(t *testing.T) { + // NOTE: t.Parallel() is not possible when using a different set of envvars for each test. + t.Parallel() + + type testEnvVars map[string]string + + ctx, cancel := context.WithCancel(context.Background()) + logger := logrus.StandardLogger() + logger.SetLevel(logrus.DebugLevel) + logEntry := logrus.NewEntry(logger) + + setup := func(t *testing.T, envVars testEnvVars) (DataSource, func()) { + t.Helper() + for key, val := range envVars { + os.Setenv(key, val) //nolint:errcheck + } + + evConf := &DSConfigEnvVars{ + Enabled: true, + } + dsEnvVars := NewDataSourceEnvVars(*evConf, logEntry) + + return dsEnvVars, func() { + for key := range envVars { + os.Unsetenv(key) //nolint:errcheck + } + err := dsEnvVars.Dispose(ctx) + require.NoError(t, err) + } + } + + t.Cleanup(func() { + cancel() + }) + + t.Run("Basic", func(t *testing.T) { + t.Parallel() + + envVars := testEnvVars{ + "TEST_ENV_VAR1": "1", + "TEST_ENV_VAR2": "test", + "TEST_ENV_VAR3": "true", + "TEST_ENV_VAR4": "1.1", + "TEST_ENV_VAR5": "", + } + config := &Config{ + ID: "test", + Source: "ENV_VARS", + Summary: "EnvVar test query", + Data: []ConfigData{ + {MetricName: "test_env_var1", Column: "TEST_ENV_VAR1"}, + {MetricName: "test_env_var2", Column: "TEST_ENV_VAR2"}, + {MetricName: "test_env_var3", Column: "TEST_ENV_VAR3"}, + {MetricName: "test_env_var4", Column: "TEST_ENV_VAR4"}, + {MetricName: "test_env_var5", Column: "TEST_ENV_VAR5"}, + }, + } + + dsEnvVars, dispose := setup(t, envVars) + t.Cleanup(func() { dispose() }) + + err := dsEnvVars.Init(ctx) + require.NoError(t, err) + + metrics, err := dsEnvVars.FetchMetrics(ctx, *config) + require.NoError(t, err) + + expected := []*pmmv1.ServerMetric_Metric{ + {Key: "test_env_var1", Value: "1"}, + {Key: "test_env_var2", Value: "test"}, + {Key: "test_env_var3", Value: "true"}, + {Key: "test_env_var4", Value: "1.1"}, + } + assert.Equal(t, expected, metrics) + }) + + t.Run("StripValues", func(t *testing.T) { + t.Parallel() + + envVars := testEnvVars{ + "TEST_ENV_VAR6": "1", + "TEST_ENV_VAR7": "test", + "TEST_ENV_VAR8": "true", + "TEST_ENV_VAR9": "1.1", + "TEST_ENV_VAR10": "", + } + config := &Config{ + ID: "test", + Source: "ENV_VARS", + Summary: "EnvVar test query", + Transform: &ConfigTransform{ + Type: "StripValues", + }, + Data: []ConfigData{ + {MetricName: "test_env_var6", Column: "TEST_ENV_VAR6"}, + {MetricName: "test_env_var7", Column: "TEST_ENV_VAR7"}, + {MetricName: "test_env_var8", Column: "TEST_ENV_VAR8"}, + {MetricName: "test_env_var9", Column: "TEST_ENV_VAR9"}, + {MetricName: "test_env_var10", Column: "TEST_ENV_VAR10"}, + }, + } + + dsEnvVars, dispose := setup(t, envVars) + t.Cleanup(func() { dispose() }) + + err := dsEnvVars.Init(ctx) + require.NoError(t, err) + + metrics, err := dsEnvVars.FetchMetrics(ctx, *config) + require.NoError(t, err) + + expected := []*pmmv1.ServerMetric_Metric{ + {Key: "test_env_var6", Value: "1"}, + {Key: "test_env_var7", Value: "1"}, + {Key: "test_env_var8", Value: "1"}, + {Key: "test_env_var9", Value: "1"}, + } + metrics, err = transformExportValues(config, metrics) + require.NoError(t, err) + assert.Equal(t, expected, metrics) + }) +} diff --git a/managed/services/telemetry/datasource_grafana_sqlitedb.go b/managed/services/telemetry/datasource_grafana_sqlitedb.go deleted file mode 100644 index 689a3decfd..0000000000 --- a/managed/services/telemetry/datasource_grafana_sqlitedb.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -// Package telemetry provides telemetry functionality. -package telemetry - -import ( - "context" - "database/sql" - "io" - "os" - - // Events, errors and driver for grafana sqlite database. - pmmv1 "github.com/percona-platform/saas/gen/telemetry/events/pmm" - "github.com/pkg/errors" - "github.com/sirupsen/logrus" - _ "modernc.org/sqlite" -) - -type dsGrafanaSelect struct { - l *logrus.Entry - config DSGrafanaSqliteDB - db *sql.DB - tempFile string -} - -// check interfaces. -var ( - _ DataSource = (*dsGrafanaSelect)(nil) -) - -// Enabled flag that determines if data source is enabled. -func (d *dsGrafanaSelect) Enabled() bool { - return d.config.Enabled -} - -// NewDataSourceGrafanaSqliteDB makes new data source for grafana sqlite database metrics. -func NewDataSourceGrafanaSqliteDB(config DSGrafanaSqliteDB, l *logrus.Entry) DataSource { //nolint:ireturn - return &dsGrafanaSelect{ - l: l, - config: config, - db: nil, - tempFile: "", - } -} - -func (d *dsGrafanaSelect) Init(ctx context.Context) error { - // validate source file db - sourceFileStat, err := os.Stat(d.config.DBFile) - if err != nil { - return err - } - - if sourceFileStat.Size() == 0 { - return errors.Errorf("Sourcefile %s is empty.", d.config.DBFile) - } - - if !sourceFileStat.Mode().IsRegular() { - return errors.Wrapf(err, "%s is not a regular file", d.config.DBFile) - } - - source, err := os.Open(d.config.DBFile) - if err != nil { - return err - } - - tempFile, err := os.CreateTemp(os.TempDir(), "grafana") - if err != nil { - return err - } - - defer func() { - if err := source.Close(); err != nil { - d.l.Errorf("Error closing file. %s", err) - } - }() - - nBytes, err := io.Copy(tempFile, source) - d.l.Debugf("grafana sqlitedb copied with total bytes: %d", nBytes) - if err != nil || nBytes == 0 { - return errors.Wrapf(err, "cannot create copy of database file %s", d.config.DBFile) - } - - db, err := sql.Open("sqlite", tempFile.Name()) - if err != nil { - return err - } - - d.tempFile = tempFile.Name() - d.db = db - - return nil -} - -func (d *dsGrafanaSelect) FetchMetrics(ctx context.Context, config Config) ([]*pmmv1.ServerMetric_Metric, error) { - if d.db == nil { - return nil, errors.Errorf("temporary grafana database is not initialized: %s", d.config.DBFile) - } - return fetchMetricsFromDB(ctx, d.l, d.config.Timeout, d.db, config) -} - -func (d *dsGrafanaSelect) Dispose(ctx context.Context) error { - err := d.db.Close() - if err != nil { - return err - } - - err = os.Remove(d.tempFile) - if err != nil { - return errors.Wrapf(err, "failed to remove sqlite database file") - } - - return nil -} diff --git a/managed/services/telemetry/datasource_grafana_sqlitedb_test.go b/managed/services/telemetry/datasource_grafana_sqlitedb_test.go deleted file mode 100644 index 4877c9263d..0000000000 --- a/managed/services/telemetry/datasource_grafana_sqlitedb_test.go +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -// Package telemetry provides telemetry functionality. -package telemetry - -import ( - "context" - "path/filepath" - "testing" - "time" - - "github.com/sirupsen/logrus" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" -) - -func TestDatasource(t *testing.T) { - t.Parallel() - logger := logrus.StandardLogger() - logger.SetLevel(logrus.DebugLevel) - logEntry := logrus.NewEntry(logger) - - ctx, cancel := context.WithCancel(context.Background()) - t.Cleanup(func() { - cancel() - }) - - config := &Config{ - ID: "test", - Source: "GRAFANADB_SELECT", - Query: "count(*) AS total from user", - Summary: "Simple query", - Data: []ConfigData{ - { - MetricName: "total_users_in_database", - Column: "total", - }, - }, - } - - t.Run("get metrics from db", func(t *testing.T) { - t.Parallel() - databaseFile, err := filepath.Abs("../../testdata/telemetry/grafana_sqlite.db") - require.NoError(t, err) - - conf := &DSGrafanaSqliteDB{ - Enabled: true, - Timeout: time.Second * 10, - DBFile: databaseFile, - } - grafanaDB := NewDataSourceGrafanaSqliteDB(*conf, logEntry) - - err = grafanaDB.Init(ctx) - require.NoError(t, err) - - metrics, err := grafanaDB.FetchMetrics(ctx, *config) - require.NoError(t, err) - assert.Equal(t, len(metrics), 1) - - err = grafanaDB.Dispose(ctx) - require.NoError(t, err) - - serviceMetric := metrics[0] - assert.Equal(t, serviceMetric.Key, "total_users_in_database") - assert.Equal(t, serviceMetric.Value, "1") - }) - - t.Run("file not found", func(t *testing.T) { - t.Parallel() - conf := &DSGrafanaSqliteDB{ - Enabled: true, - Timeout: time.Second * 10, - DBFile: "/invalid/path/", - } - - grafanaDB := NewDataSourceGrafanaSqliteDB(*conf, logEntry) - - err := grafanaDB.Init(ctx) - assert.Error(t, err, "no such file or directory") - - metrics, err := grafanaDB.FetchMetrics(ctx, *config) - assert.Error(t, err, "temporary grafana database is not initialized") - assert.Nil(t, metrics) - }) -} diff --git a/managed/services/telemetry/datasource_grafanadb_select.go b/managed/services/telemetry/datasource_grafanadb_select.go new file mode 100644 index 0000000000..9361ff93c4 --- /dev/null +++ b/managed/services/telemetry/datasource_grafanadb_select.go @@ -0,0 +1,104 @@ +// Copyright (C) 2023 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Package telemetry provides telemetry functionality. +package telemetry + +import ( + "context" + "database/sql" + "net/url" + "time" + + // Events, errors and driver for grafana database. + pmmv1 "github.com/percona-platform/saas/gen/telemetry/events/pmm" + "github.com/pkg/errors" + "github.com/sirupsen/logrus" +) + +type dsGrafanaDBSelect struct { + l *logrus.Entry + config DSConfigGrafanaDB + db *sql.DB +} + +// check interfaces. +var ( + _ DataSource = (*dsGrafanaDBSelect)(nil) +) + +// Enabled flag that determines if the data source is enabled. +func (d *dsGrafanaDBSelect) Enabled() bool { + return d.config.Enabled +} + +// NewDsGrafanaDBSelect makes a new data source to collect grafana metrics. +func NewDsGrafanaDBSelect(config DSConfigGrafanaDB, l *logrus.Entry) DataSource { + return &dsGrafanaDBSelect{ + l: l, + config: config, + } +} + +func (d *dsGrafanaDBSelect) Init(ctx context.Context) error { + db, err := openGrafanaDBConnection(d.config, d.l) + if err != nil { + return err + } + + d.db = db + return nil +} + +func openGrafanaDBConnection(config DSConfigGrafanaDB, l *logrus.Entry) (*sql.DB, error) { + var user *url.Userinfo + if config.UseSeparateCredentials { + user = url.UserPassword(config.SeparateCredentials.Username, config.SeparateCredentials.Password) + } else { + user = url.UserPassword(config.Credentials.Username, config.Credentials.Password) + } + uri := url.URL{ + Scheme: config.DSN.Scheme, + User: user, + Host: config.DSN.Host, + Path: config.DSN.DB, + RawQuery: config.DSN.Params, + } + dsn := uri.String() + + db, err := sql.Open("postgres", dsn) + if err != nil { + return nil, errors.Wrap(err, "failed to create a connection pool to PostgreSQL") + } + + db.SetConnMaxIdleTime(time.Second * 30) + db.SetConnMaxLifetime(time.Second * 180) + db.SetMaxIdleConns(1) + db.SetMaxOpenConns(1) + + if err := db.Ping(); err != nil { + l.Warnf("Grafana DB is not reachable [%s]: %s", config.DSN.Host, err) + } + + return db, nil +} + +func (d *dsGrafanaDBSelect) FetchMetrics(ctx context.Context, config Config) ([]*pmmv1.ServerMetric_Metric, error) { + return fetchMetricsFromDB(ctx, d.l, d.config.Timeout, d.db, config) +} + +func (d *dsGrafanaDBSelect) Dispose(ctx context.Context) error { + return d.db.Close() +} diff --git a/managed/services/telemetry/datasource_pmmdb_select.go b/managed/services/telemetry/datasource_pmmdb_select.go index 08e6485e36..09c9249b8c 100644 --- a/managed/services/telemetry/datasource_pmmdb_select.go +++ b/managed/services/telemetry/datasource_pmmdb_select.go @@ -44,7 +44,7 @@ func (d *dsPmmDBSelect) Enabled() bool { } // NewDsPmmDBSelect make new PMM DB Select data source. -func NewDsPmmDBSelect(config DSConfigPMMDB, l *logrus.Entry) (DataSource, error) { //nolint:ireturn +func NewDsPmmDBSelect(config DSConfigPMMDB, l *logrus.Entry) (DataSource, error) { db, err := openPMMDBConnection(config, l) if err != nil { return nil, err @@ -88,7 +88,7 @@ func openPMMDBConnection(config DSConfigPMMDB, l *logrus.Entry) (*sql.DB, error) db.SetMaxOpenConns(1) if err := db.Ping(); err != nil { - l.Warnf("DB is not reachable [%s]: %s", config.DSN.DB, err) + l.Warnf("PMM DB is not reachable at [%s]: %s", config.DSN.Host, err) } return db, nil diff --git a/managed/services/telemetry/datasource_qandb_select.go b/managed/services/telemetry/datasource_qandb_select.go index 3f80053282..b458a0872c 100644 --- a/managed/services/telemetry/datasource_qandb_select.go +++ b/managed/services/telemetry/datasource_qandb_select.go @@ -42,7 +42,7 @@ func (d *dsQanDBSelect) Enabled() bool { } // NewDsQanDBSelect make new QAN DB Select data source. -func NewDsQanDBSelect(config DSConfigQAN, l *logrus.Entry) (DataSource, error) { //nolint:ireturn +func NewDsQanDBSelect(config DSConfigQAN, l *logrus.Entry) (DataSource, error) { db, err := openQANDBConnection(config.DSN, config.Enabled, l) if err != nil { return nil, err @@ -64,7 +64,7 @@ func openQANDBConnection(dsn string, enabled bool, l *logrus.Entry) (*sql.DB, er return nil, errors.Wrap(err, "Failed to open connection to QAN DB") } if err := db.Ping(); err != nil { - l.Warnf("DB is not reachable [%s]: %s", dsn, err) + l.Warnf("ClickHouse DB is not reachable [%s]: %s", dsn, err) } return db, nil } diff --git a/managed/services/telemetry/datasource_victoria_metrics.go b/managed/services/telemetry/datasource_victoria_metrics.go index 359032aa5c..f1b9e9d931 100644 --- a/managed/services/telemetry/datasource_victoria_metrics.go +++ b/managed/services/telemetry/datasource_victoria_metrics.go @@ -29,7 +29,7 @@ import ( type dataSourceVictoriaMetrics struct { l *logrus.Entry - config DataSourceVictoriaMetrics + config DSConfigVM vm v1.API } @@ -43,7 +43,7 @@ func (d *dataSourceVictoriaMetrics) Enabled() bool { } // NewDataSourceVictoriaMetrics makes new data source for victoria metrics. -func NewDataSourceVictoriaMetrics(config DataSourceVictoriaMetrics, l *logrus.Entry) (DataSource, error) { //nolint:ireturn +func NewDataSourceVictoriaMetrics(config DSConfigVM, l *logrus.Entry) (DataSource, error) { if !config.Enabled { return &dataSourceVictoriaMetrics{ l: l, diff --git a/managed/services/telemetry/datasources.go b/managed/services/telemetry/datasources.go index 01f5e75996..39eaa3ad61 100644 --- a/managed/services/telemetry/datasources.go +++ b/managed/services/telemetry/datasources.go @@ -52,15 +52,18 @@ func NewDataSourceRegistry(config ServiceConfig, l *logrus.Entry) (DataSourceLoc return nil, err } - grafanaDB := NewDataSourceGrafanaSqliteDB(*config.DataSources.GrafanaDBSelect, l) + grafanaDB := NewDsGrafanaDBSelect(*config.DataSources.GrafanaDBSelect, l) + + envVars := NewDataSourceEnvVars(*config.DataSources.EnvVars, l) return &dataSourceRegistry{ l: l, dataSources: map[DataSourceName]DataSource{ - "VM": vmDB, - "PMMDB_SELECT": pmmDB, - "QANDB_SELECT": qanDB, - "GRAFANADB_SELECT": grafanaDB, + dsVM: vmDB, + dsPMMDBSelect: pmmDB, + dsQANDBSelect: qanDB, + dsGRAFANADBSelect: grafanaDB, + dsEnvVars: envVars, }, }, nil } @@ -88,7 +91,7 @@ func fetchMetricsFromDB(ctx context.Context, l *logrus.Entry, timeout time.Durat if err != nil { return nil, err } - defer rows.Close() + defer rows.Close() //nolint:errcheck columns, err := rows.Columns() if err != nil { diff --git a/managed/services/telemetry/mock_data_source_locator_test.go b/managed/services/telemetry/mock_data_source_locator_test.go index 1997c5c219..4d4acc6924 100644 --- a/managed/services/telemetry/mock_data_source_locator_test.go +++ b/managed/services/telemetry/mock_data_source_locator_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package telemetry diff --git a/managed/services/telemetry/mock_data_source_test.go b/managed/services/telemetry/mock_data_source_test.go index 048a8d3a97..6d6fad1407 100644 --- a/managed/services/telemetry/mock_data_source_test.go +++ b/managed/services/telemetry/mock_data_source_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package telemetry diff --git a/managed/services/telemetry/mock_distribution_util_service_test.go b/managed/services/telemetry/mock_distribution_util_service_test.go index 620a1a0d37..fcc2a75f9b 100644 --- a/managed/services/telemetry/mock_distribution_util_service_test.go +++ b/managed/services/telemetry/mock_distribution_util_service_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package telemetry diff --git a/managed/services/telemetry/mock_sender_test.go b/managed/services/telemetry/mock_sender_test.go index d04ee87e62..21dc086eb3 100644 --- a/managed/services/telemetry/mock_sender_test.go +++ b/managed/services/telemetry/mock_sender_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package telemetry diff --git a/managed/services/telemetry/telemetry.go b/managed/services/telemetry/telemetry.go index 99b491b0e9..d6951ae405 100644 --- a/managed/services/telemetry/telemetry.go +++ b/managed/services/telemetry/telemetry.go @@ -56,7 +56,7 @@ type Service struct { sDistributionMethod serverpb.DistributionMethod tDistributionMethod pmmv1.DistributionMethod sendCh chan *pmmv1.ServerMetric - dataSourcesMap map[string]DataSource + dataSourcesMap map[DataSourceName]DataSource extensions map[ExtensionType]Extension @@ -101,7 +101,7 @@ func NewService(db *reform.DB, portalClient *platform.Client, pmmVersion string, } // LocateTelemetryDataSource retrieves DataSource by name. -func (s *Service) LocateTelemetryDataSource(name string) (DataSource, error) { //nolint:ireturn +func (s *Service) LocateTelemetryDataSource(name string) (DataSource, error) { return s.dsRegistry.LocateTelemetryDataSource(name) } @@ -117,7 +117,7 @@ func (s *Service) Run(ctx context.Context) { doSend := func() { var settings *models.Settings - err := s.db.InTransaction(func(tx *reform.TX) error { + err := s.db.InTransactionContext(ctx, nil, func(tx *reform.TX) error { var e error if settings, e = models.GetSettings(tx); e != nil { return e @@ -140,12 +140,12 @@ func (s *Service) Run(ctx context.Context) { if s.config.Reporting.Send { s.sendCh <- report } else { - s.l.Info("Telemetry sent is disabled.") + s.l.Info("Sending telemetry is disabled.") } } if s.config.Reporting.SendOnStart { - s.l.Debug("Telemetry on start is enabled, sending...") + s.l.Debug("Sending telemetry on start is enabled, in progress...") doSend() } @@ -213,15 +213,19 @@ func (s *Service) processSendCh(ctx context.Context) { } func (s *Service) prepareReport(ctx context.Context) *pmmv1.ServerMetric { - initializedDataSources := make(map[string]DataSource) + initializedDataSources := make(map[DataSourceName]DataSource) telemetryMetric, _ := s.makeMetric(ctx) var totalTime time.Duration // initialize datasources for sourceName, dataSource := range s.dataSourcesMap { + if !dataSource.Enabled() { + s.l.Warnf("Datasource %s is disabled, skipping initialization.", sourceName) + continue + } err := dataSource.Init(ctx) if err != nil { - s.l.Warnf("Telemetry datasource %s init failed: %v", sourceName, err) + s.l.Warnf("Telemetry datasource %s init failed: %s", sourceName, err) continue } initializedDataSources[sourceName] = dataSource @@ -246,13 +250,13 @@ func (s *Service) prepareReport(ctx context.Context) *pmmv1.ServerMetric { } // locate DS in initialized state - ds := initializedDataSources[telemetry.Source] + ds := initializedDataSources[DataSourceName(telemetry.Source)] if ds == nil { - s.l.Debugf("cannot find initialized telemetry datasource: %s", telemetry.Source) + s.l.Debugf("Cannot find initialized telemetry datasource: %s", telemetry.Source) continue } if !ds.Enabled() { - s.l.Debugf("datasource %s is disabled", telemetry.Source) + s.l.Debugf("Datasource %s is disabled", telemetry.Source) continue } @@ -263,20 +267,28 @@ func (s *Service) prepareReport(ctx context.Context) *pmmv1.ServerMetric { s.l.Debugf("fetching [%s] took [%s]", telemetry.ID, metricFetchTook) totalTime += metricFetchTook if err != nil { - s.l.Debugf("failed to extract metric from datasource for [%s]:[%s]: %v", telemetry.Source, telemetry.ID, err) + s.l.Debugf("Failed to extract metric from datasource for [%s]:[%s]: %s", telemetry.Source, telemetry.ID, err) continue } if telemetry.Transform != nil { - if telemetry.Transform.Type == JSONTransformType { + switch telemetry.Transform.Type { + case JSONTransform: telemetryCopy := telemetry // G601: Implicit memory aliasing in for loop. (gosec) metrics, err = transformToJSON(&telemetryCopy, metrics) if err != nil { - s.l.Debugf("failed to transform to JSON: %s", err) + s.l.Debugf("Failed to transform to JSON: %s", err) + continue + } + case StripValuesTransform: + telemetryCopy := telemetry // G601: Implicit memory aliasing in for loop. (gosec) + metrics, err = transformExportValues(&telemetryCopy, metrics) + if err != nil { + s.l.Debugf("failed to strip values: %s", err) continue } - } else { - s.l.Errorf("Unsupported transform type: %s", telemetry.Transform.Type) + default: + s.l.Errorf("unsupported transform type: %s", telemetry.Transform.Type) } } @@ -287,27 +299,27 @@ func (s *Service) prepareReport(ctx context.Context) *pmmv1.ServerMetric { for sourceName, dataSource := range initializedDataSources { err := dataSource.Dispose(ctx) if err != nil { - s.l.Debugf("Dispose of %s datasource failed: %v", sourceName, err) + s.l.Debugf("Disposing of %s datasource failed: %s", sourceName, err) continue } } telemetryMetric.Metrics = removeEmpty(telemetryMetric.Metrics) - s.l.Debugf("fetching all metrics took [%s]", totalTime) + s.l.Debugf("Fetching all metrics took [%s]", totalTime) return telemetryMetric } -func (s *Service) locateDataSources(telemetryConfig []Config) map[string]DataSource { - dataSources := make(map[string]DataSource) +func (s *Service) locateDataSources(telemetryConfig []Config) map[DataSourceName]DataSource { + dataSources := make(map[DataSourceName]DataSource) for _, telemetry := range telemetryConfig { ds, err := s.LocateTelemetryDataSource(telemetry.Source) if err != nil { - s.l.Debugf("failed to lookup telemetry datasource for [%s]:[%s]", telemetry.Source, telemetry.ID) + s.l.Debugf("Failed to lookup telemetry datasource for [%s]:[%s]", telemetry.Source, telemetry.ID) continue } - dataSources[telemetry.Source] = ds + dataSources[DataSourceName(telemetry.Source)] = ds } return dataSources @@ -346,7 +358,7 @@ func (s *Service) makeMetric(ctx context.Context) (*pmmv1.ServerMetric, error) { serverID, err := hex.DecodeString(serverIDToUse) if err != nil { - return nil, errors.Wrapf(err, "failed to decode UUID %q", serverIDToUse) + return nil, errors.Wrapf(err, "failed to decode UUID %s", serverIDToUse) } _, distMethod, _ := s.dus.getDistributionMethodAndOS() @@ -379,7 +391,7 @@ func (s *Service) send(ctx context.Context, report *reporter.ReportRequest) erro s.l.Debugf("Using %s as telemetry host.", s.config.SaasHostname) err = s.portalClient.SendTelemetry(ctx, report) attempt++ - s.l.Debugf("sendV2Request (attempt %d/%d) result: %v", attempt, s.config.Reporting.RetryCount, err) + s.l.Debugf("SendV2Request (attempt %d/%d) result: %s", attempt, s.config.Reporting.RetryCount, err) if err == nil { return nil } diff --git a/managed/services/telemetry/telemetry_test.go b/managed/services/telemetry/telemetry_test.go index 726e80cbaa..62bbcec44e 100644 --- a/managed/services/telemetry/telemetry_test.go +++ b/managed/services/telemetry/telemetry_test.go @@ -193,13 +193,8 @@ func getServiceConfig(pgPortHost string, qanDSN string, vmDSN string) ServiceCon RetryCount: 2, SendTimeout: time.Second * 10, }, - DataSources: struct { - VM *DataSourceVictoriaMetrics `yaml:"VM"` - QanDBSelect *DSConfigQAN `yaml:"QANDB_SELECT"` - PmmDBSelect *DSConfigPMMDB `yaml:"PMMDB_SELECT"` - GrafanaDBSelect *DSGrafanaSqliteDB `yaml:"GRAFANADB_SELECT"` - }{ - VM: &DataSourceVictoriaMetrics{ + DataSources: DataSources{ + VM: &DSConfigVM{ Enabled: true, Timeout: time.Second * 2, Address: vmDSN, @@ -232,10 +227,31 @@ func getServiceConfig(pgPortHost string, qanDSN string, vmDSN string) ServiceCon Params: "sslmode=disable", }, }, - GrafanaDBSelect: &DSGrafanaSqliteDB{ + GrafanaDBSelect: &DSConfigGrafanaDB{ + Enabled: true, + Timeout: time.Second * 2, + UseSeparateCredentials: true, + SeparateCredentials: struct { + Username string `yaml:"username"` + Password string `yaml:"password"` + }{ + Username: "grafana", + Password: "grafana", + }, + DSN: struct { + Scheme string + Host string + DB string + Params string + }{ + Scheme: "postgres", + Host: pgPortHost, + DB: "grafana", + Params: "sslmode=disable", + }, + }, + EnvVars: &DSConfigEnvVars{ Enabled: true, - Timeout: time.Second * 2, - DBFile: "/srv/grafana/grafana.db", }, }, } @@ -302,12 +318,7 @@ func getTestConfig(sendOnStart bool, testSourceName string, reportingInterval ti }, }, SaasHostname: "", - DataSources: struct { - VM *DataSourceVictoriaMetrics `yaml:"VM"` - QanDBSelect *DSConfigQAN `yaml:"QANDB_SELECT"` - PmmDBSelect *DSConfigPMMDB `yaml:"PMMDB_SELECT"` - GrafanaDBSelect *DSGrafanaSqliteDB `yaml:"GRAFANADB_SELECT"` - }{}, + DataSources: DataSources{}, Reporting: ReportingConfig{ Send: true, SendOnStart: sendOnStart, diff --git a/managed/services/telemetry/transform.go b/managed/services/telemetry/transform.go index b9ab4c7ac6..2616c7317b 100644 --- a/managed/services/telemetry/transform.go +++ b/managed/services/telemetry/transform.go @@ -33,8 +33,8 @@ func transformToJSON(config *Config, metrics []*pmmv1.ServerMetric_Metric) ([]*p return nil, errors.Errorf("no transformation config is set") } - if config.Transform.Type != JSONTransformType { - return nil, errors.Errorf("not supported transformation type [%s], it must be [%s]", config.Transform.Type, JSONTransformType) + if config.Transform.Type != JSONTransform { + return nil, errors.Errorf("unsupported transformation type [%s], it must be [%s]", config.Transform.Type, JSONTransform) } if len(config.Data) == 0 || config.Data[0].MetricName == "" { @@ -86,6 +86,27 @@ func transformToJSON(config *Config, metrics []*pmmv1.ServerMetric_Metric) ([]*p }, nil } +func transformExportValues(config *Config, metrics []*pmmv1.ServerMetric_Metric) ([]*pmmv1.ServerMetric_Metric, error) { + if len(metrics) == 0 { + return metrics, nil + } + + if config.Transform.Type != StripValuesTransform { + return nil, errors.Errorf("unspported transformation type [%s], it must be [%s]", config.Transform.Type, StripValuesTransform) + } + + if config.Source != string(dsEnvVars) { + return nil, errors.Errorf("this transform can only be used for %s data source", dsEnvVars) + } + + for _, metric := range metrics { + // Here we replace the metric value with "1", which stands for "present". + metric.Value = "1" + } + + return metrics, nil +} + func removeEmpty(metrics []*pmmv1.ServerMetric_Metric) []*pmmv1.ServerMetric_Metric { result := make([]*pmmv1.ServerMetric_Metric, 0, len(metrics)) diff --git a/managed/services/telemetry/transform_test.go b/managed/services/telemetry/transform_test.go index 6e4e8f2cbc..65a59fe6bd 100644 --- a/managed/services/telemetry/transform_test.go +++ b/managed/services/telemetry/transform_test.go @@ -16,18 +16,18 @@ package telemetry import ( - "fmt" "testing" pmmv1 "github.com/percona-platform/saas/gen/telemetry/events/pmm" "github.com/stretchr/testify/assert" ) -func Test_transformToJSON(t *testing.T) { +func TestTransformToJSON(t *testing.T) { type args struct { config *Config metrics []*pmmv1.ServerMetric_Metric } + noMetrics := []*pmmv1.ServerMetric_Metric{} tests := []struct { @@ -39,7 +39,7 @@ func Test_transformToJSON(t *testing.T) { { name: "nil metrics", args: args{ - config: config(), + config: configJSON(), metrics: nil, }, want: nil, @@ -48,7 +48,7 @@ func Test_transformToJSON(t *testing.T) { { name: "empty metrics", args: args{ - config: config(), + config: configJSON(), metrics: noMetrics, }, want: noMetrics, @@ -57,7 +57,7 @@ func Test_transformToJSON(t *testing.T) { { name: "no Transform in config", args: args{ - config: config().noTransform(), + config: configJSON().noTransform(), metrics: noMetrics, }, want: noMetrics, @@ -66,7 +66,7 @@ func Test_transformToJSON(t *testing.T) { { name: "no Metrics config", args: args{ - config: config().noFirstMetricConfig(), + config: configJSON().noFirstMetricConfig(), metrics: noMetrics, }, want: noMetrics, @@ -75,7 +75,7 @@ func Test_transformToJSON(t *testing.T) { { name: "no Metric Name config", args: args{ - config: config().noFirstMetricNameConfig(), + config: configJSON().noFirstMetricNameConfig(), metrics: noMetrics, }, want: noMetrics, @@ -84,7 +84,7 @@ func Test_transformToJSON(t *testing.T) { { name: "invalid seq", args: args{ - config: config(), + config: configJSON(), metrics: []*pmmv1.ServerMetric_Metric{ {Key: "my-metric", Value: "v1"}, {Key: "b", Value: "v1"}, @@ -98,7 +98,7 @@ func Test_transformToJSON(t *testing.T) { { name: "correct seq", args: args{ - config: config(), + config: configJSON(), metrics: []*pmmv1.ServerMetric_Metric{ {Key: "my-metric", Value: "v1"}, {Key: "b", Value: "v1"}, @@ -107,29 +107,32 @@ func Test_transformToJSON(t *testing.T) { }, }, want: []*pmmv1.ServerMetric_Metric{ - {Key: config().Transform.Metric, Value: `{"v":[{"b":"v1","my-metric":"v1"},{"b":"v1","my-metric":"v1"}]}`}, + {Key: configJSON().Transform.Metric, Value: `{"v":[{"b":"v1","my-metric":"v1"},{"b":"v1","my-metric":"v1"}]}`}, }, wantErr: assert.NoError, }, { name: "happy path", args: args{ - config: config(), + config: configJSON(), metrics: []*pmmv1.ServerMetric_Metric{ - {Key: config().Data[0].MetricName, Value: "v1"}, - {Key: config().Data[0].MetricName, Value: "v2"}, + {Key: configJSON().Data[0].MetricName, Value: "v1"}, + {Key: configJSON().Data[0].MetricName, Value: "v2"}, }, }, want: []*pmmv1.ServerMetric_Metric{ - {Key: config().Transform.Metric, Value: `{"v":[{"my-metric":"v1"},{"my-metric":"v2"}]}`}, + {Key: configJSON().Transform.Metric, Value: `{"v":[{"my-metric":"v1"},{"my-metric":"v2"}]}`}, }, wantErr: assert.NoError, }, } + for _, tt := range tests { + tt := tt t.Run(tt.name, func(t *testing.T) { got, err := transformToJSON(tt.args.config, tt.args.metrics) - if !tt.wantErr(t, err, fmt.Sprintf("transformToJSON(%v, %v)", tt.args.config, tt.args.metrics)) { + if !tt.wantErr(t, err) { + t.Logf("config: %v", tt.args.config) return } assert.Equalf(t, tt.want, got, "transformToJSON(%v, %v)", tt.args.config, tt.args.metrics) @@ -137,11 +140,103 @@ func Test_transformToJSON(t *testing.T) { } } -func config() *Config { +func TestTransformExportValues(t *testing.T) { + type args struct { + config *Config + metrics []*pmmv1.ServerMetric_Metric + } + + noMetrics := []*pmmv1.ServerMetric_Metric{} + + tests := []struct { + name string + args args + want []*pmmv1.ServerMetric_Metric + wantErr assert.ErrorAssertionFunc + }{ + { + name: "nil metrics", + args: args{ + config: configEnvVars(), + metrics: nil, + }, + want: nil, + wantErr: assert.NoError, + }, + { + name: "empty metrics", + args: args{ + config: configEnvVars(), + metrics: noMetrics, + }, + want: noMetrics, + wantErr: assert.NoError, + }, + { + name: "no Transform in config", + args: args{ + config: configEnvVars().noTransform(), + metrics: noMetrics, + }, + want: noMetrics, + wantErr: assert.NoError, + }, + { + name: "no Metrics config", + args: args{ + config: configEnvVars().noFirstMetricConfig(), + metrics: noMetrics, + }, + want: noMetrics, + wantErr: assert.NoError, + }, + { + name: "invalid data source", + args: args{ + config: configEnvVars().changeDataSource(dsPMMDBSelect), + metrics: []*pmmv1.ServerMetric_Metric{ + {Key: "metric-a", Value: "v1"}, + {Key: "metric-b", Value: "v2"}, + }, + }, + want: nil, + wantErr: assert.Error, + }, + { + name: "happy path", + args: args{ + config: configEnvVars(), + metrics: []*pmmv1.ServerMetric_Metric{ + {Key: "metric-a", Value: "v1"}, + {Key: "metric-b", Value: "v2"}, + }, + }, + want: []*pmmv1.ServerMetric_Metric{ + {Key: "metric-a", Value: "1"}, + {Key: "metric-b", Value: "1"}, + }, + wantErr: assert.NoError, + }, + } + + for _, tt := range tests { + tt := tt + t.Run(tt.name, func(t *testing.T) { + got, err := transformExportValues(tt.args.config, tt.args.metrics) + if !tt.wantErr(t, err) { + t.Logf("config: %v", tt.args.config) + return + } + assert.Equalf(t, tt.want, got, "transformExportValues(%v, %v)", tt.args.config, tt.args.metrics) + }) + } +} + +func configJSON() *Config { return &Config{ Transform: &ConfigTransform{ Metric: "metric", - Type: JSONTransformType, + Type: JSONTransform, }, Data: []ConfigData{ {MetricName: "my-metric", Label: "label"}, @@ -149,6 +244,15 @@ func config() *Config { } } +func configEnvVars() *Config { + return &Config{ + Source: "ENV_VARS", + Transform: &ConfigTransform{ + Type: StripValuesTransform, + }, + } +} + func (c *Config) noTransform() *Config { c.Transform = nil return c @@ -164,7 +268,12 @@ func (c *Config) noFirstMetricNameConfig() *Config { return c } -func Test_removeEmpty(t *testing.T) { +func (c *Config) changeDataSource(s DataSourceName) *Config { + c.Source = string(s) + return c +} + +func TestRemoveEmpty(t *testing.T) { type args struct { metrics []*pmmv1.ServerMetric_Metric } diff --git a/managed/services/versioncache/mock_versioner_test.go b/managed/services/versioncache/mock_versioner_test.go index c4b8c7f443..b1f487374c 100644 --- a/managed/services/versioncache/mock_versioner_test.go +++ b/managed/services/versioncache/mock_versioner_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package versioncache diff --git a/managed/services/victoriametrics/victoriametrics.go b/managed/services/victoriametrics/victoriametrics.go index 8cef7cf9bc..9508b3f145 100644 --- a/managed/services/victoriametrics/victoriametrics.go +++ b/managed/services/victoriametrics/victoriametrics.go @@ -440,7 +440,7 @@ func (svc *Service) IsReady(ctx context.Context) error { if err != nil { return errors.WithStack(err) } - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck b, err := io.ReadAll(resp.Body) svc.l.Debugf("VM health: %s", b) diff --git a/managed/services/vmalert/vmalert.go b/managed/services/vmalert/vmalert.go index f5c86c03e0..382821243f 100644 --- a/managed/services/vmalert/vmalert.go +++ b/managed/services/vmalert/vmalert.go @@ -159,7 +159,7 @@ func (svc *Service) reload(ctx context.Context) error { if err != nil { return errors.WithStack(err) } - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck b, err := io.ReadAll(resp.Body) svc.l.Debugf("VMAlert reload: %s", b) @@ -185,7 +185,7 @@ func (svc *Service) IsReady(ctx context.Context) error { if err != nil { return errors.WithStack(err) } - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck b, err := io.ReadAll(resp.Body) svc.l.Debugf("VMAlert health: %s", b) diff --git a/managed/testdata/telemetry/grafana_sqlite.db b/managed/testdata/telemetry/grafana_sqlite.db deleted file mode 100644 index f2a5c296c0..0000000000 Binary files a/managed/testdata/telemetry/grafana_sqlite.db and /dev/null differ diff --git a/managed/utils/platform/client.go b/managed/utils/platform/client.go index c199e501e0..685c044d92 100644 --- a/managed/utils/platform/client.go +++ b/managed/utils/platform/client.go @@ -259,7 +259,7 @@ func (c *Client) makeRequest(ctx context.Context, accessToken, method, path stri return nil, err } - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck bodyBytes, err := io.ReadAll(resp.Body) if err != nil { diff --git a/qan-api2/db.go b/qan-api2/db.go index 8c87408258..d121ba6cb6 100644 --- a/qan-api2/db.go +++ b/qan-api2/db.go @@ -88,7 +88,7 @@ func createDB(dsn string) error { if err != nil { return err } - defer defaultDB.Close() + defer defaultDB.Close() //nolint:errcheck result, err := defaultDB.Exec(fmt.Sprintf(`CREATE DATABASE %s ENGINE = Atomic`, databaseName)) if err != nil { diff --git a/qan-api2/main.go b/qan-api2/main.go index c155e85c1e..5b151202e4 100644 --- a/qan-api2/main.go +++ b/qan-api2/main.go @@ -186,7 +186,7 @@ func runJSONServer(ctx context.Context, grpcBindF, jsonBindF string) { ctx, cancel := context.WithTimeout(context.Background(), shutdownTimeout) if err := server.Shutdown(ctx); err != nil { //nolint:contextcheck l.Errorf("Failed to shutdown gracefully: %s \n", err) - server.Close() + server.Close() //nolint:errcheck } cancel() } @@ -228,7 +228,7 @@ func runDebugServer(ctx context.Context, debugBindF string) { l.Panic(err) } http.HandleFunc("/debug", func(rw http.ResponseWriter, req *http.Request) { - rw.Write(buf.Bytes()) + rw.Write(buf.Bytes()) //nolint:errcheck }) l.Infof("Starting server on http://%s/debug\nRegistered handlers:\n\t%s", debugBindF, strings.Join(handlers, "\n\t")) diff --git a/qan-api2/models/metrics.go b/qan-api2/models/metrics.go index 70dac41689..6daea0014f 100644 --- a/qan-api2/models/metrics.go +++ b/qan-api2/models/metrics.go @@ -1168,7 +1168,7 @@ func (m *Metrics) GetSelectedQueryMetadata(ctx context.Context, periodStartFromS if err != nil { return res, errors.Wrap(err, cannotExecute) } - defer rows.Close() + defer rows.Close() //nolint:errcheck metadata := make(map[string]map[string]struct{}) columnNames, err := rows.Columns() diff --git a/tools/go.mod b/tools/go.mod index 3648fafc05..1abf527001 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -20,7 +20,7 @@ require ( github.com/quasilyte/go-consistent v0.6.0 github.com/reviewdog/reviewdog v0.15.0 github.com/vburenin/ifacemaker v1.2.1 - github.com/vektra/mockery/v2 v2.35.1 + github.com/vektra/mockery/v2 v2.36.0 golang.org/x/perf v0.0.0-20230717203022-1ba3a21238c9 golang.org/x/tools v0.14.0 google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 @@ -61,7 +61,7 @@ require ( github.com/distribution/reference v0.5.0 // indirect github.com/docker/cli v24.0.6+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect - github.com/docker/docker v24.0.6+incompatible // indirect + github.com/docker/docker v24.0.7+incompatible // indirect github.com/docker/docker-credential-helpers v0.8.0 // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.5.0 // indirect @@ -201,7 +201,7 @@ require ( golang.org/x/crypto v0.14.0 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect golang.org/x/mod v0.13.0 // indirect - golang.org/x/net v0.16.0 // indirect + golang.org/x/net v0.17.0 // indirect golang.org/x/oauth2 v0.12.0 // indirect golang.org/x/sync v0.4.0 // indirect golang.org/x/sys v0.13.0 // indirect @@ -214,7 +214,7 @@ require ( google.golang.org/genproto v0.0.0-20230821184602-ccc8af3d0e93 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/grpc v1.58.0 // indirect + google.golang.org/grpc v1.58.3 // indirect gopkg.in/alecthomas/kingpin.v2 v2.2.6 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect diff --git a/tools/go.sum b/tools/go.sum index 56db5f8def..3be0978014 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -180,8 +180,8 @@ github.com/docker/cli v24.0.6+incompatible h1:fF+XCQCgJjjQNIMjzaSmiKJSCcfcXb3TWT github.com/docker/cli v24.0.6+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.6+incompatible h1:hceabKCtUgDqPu+qm0NgsaXf28Ljf4/pWFL7xjWWDgE= -github.com/docker/docker v24.0.6+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= +github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.8.0 h1:YQFtbBQb4VrpoPxhFuzEBPQ9E16qz5SpHLS+uswaCp8= github.com/docker/docker-credential-helpers v0.8.0/go.mod h1:UGFXcuoQ5TxPiB54nHOZ32AWRqQdECoh/Mg0AlEYb40= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -774,8 +774,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.35.1 h1:qwtqPU04WEsKsG0PjBKSCzUZonD0TXtiB46jt9Yu5f0= -github.com/vektra/mockery/v2 v2.35.1/go.mod h1:diB13hxXG6QrTR0ol2Rk8s2dRMftzvExSvPDKr+IYKk= +github.com/vektra/mockery/v2 v2.36.0 h1:TO4tST9f7lm4DHybPI2MC4Vb74bL89PtWvRhpNPAVo4= +github.com/vektra/mockery/v2 v2.36.0/go.mod h1:diB13hxXG6QrTR0ol2Rk8s2dRMftzvExSvPDKr+IYKk= 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.91.1 h1:gnV57IPGYywWer32oXKBcdmc8dVxeKl3AauV8Bu17rw= @@ -950,8 +950,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.16.0 h1:7eBu7KsSvFDtSXUIDbh3aqlK4DPsZ1rByC8PFfBThos= -golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= +golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= 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= @@ -1250,8 +1250,8 @@ google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA5 google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= -google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= +google.golang.org/grpc v1.58.3 h1:BjnpXut1btbtgN/6sp+brB2Kbm2LjNXnidYujAVbSoQ= +google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0 h1:rNBFJjBCOgVr9pWD7rs/knKL4FRTKgpZmsRfV214zcA= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.3.0/go.mod h1:Dk1tviKTvMCz5tvh7t+fh94dhmQVHuCt2OzJB3CTW9Y= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/update/ansible/playbook/tasks/roles/clickhouse/defaults/main.yml b/update/ansible/playbook/tasks/roles/clickhouse/defaults/main.yml index cbed66f833..d3fdd3aa69 100644 --- a/update/ansible/playbook/tasks/roles/clickhouse/defaults/main.yml +++ b/update/ansible/playbook/tasks/roles/clickhouse/defaults/main.yml @@ -1 +1 @@ -clickhouse_version: 21.3.20.1-2 +clickhouse_version: 23.8.2.7 diff --git a/update/ansible/playbook/tasks/roles/clickhouse/files/config.xml b/update/ansible/playbook/tasks/roles/clickhouse/files/config.xml index 4998380847..0ccb6ae4bf 100644 --- a/update/ansible/playbook/tasks/roles/clickhouse/files/config.xml +++ b/update/ansible/playbook/tasks/roles/clickhouse/files/config.xml @@ -1,11 +1,10 @@ - - + information 1 - + /srv/logs/clickhouse-server.log @@ -57,8 +59,59 @@ --> + + + + + + @@ -124,12 +177,13 @@ + + - 0.0.0.0 + + + + + @@ -169,7 +228,7 @@ --> - + 4096 @@ -191,13 +250,12 @@ /path/to/ssl_ca_cert_file - - deflate + deflate - - medium + + 2 -1 @@ -224,6 +282,13 @@ true sslv2,sslv3 true + + + + RejectCertificateHandler + @@ -244,8 +309,15 @@
]]>
--> + + 0 + 0 + - 100 + 1000 + + 0.9 @@ -318,7 +404,7 @@ The amount of data in mapped files can be monitored in system.metrics, system.metric_log by the MMappedFiles, MMappedFileBytes metrics and in system.asynchronous_metrics, system.asynchronous_metrics_log by the MMapCacheCells metric, - and also in system.events, system.processes, system.query_log, system.query_thread_log by the + and also in system.events, system.processes, system.query_log, system.query_thread_log, system.query_views_log by the CreatedReadBufferMMap, CreatedReadBufferMMapFailed, MMappedFileCacheHits, MMappedFileCacheMisses events. Note that the amount of data in mapped files does not consume memory directly and is not accounted in query or server memory usage - because this memory can be discarded similar to OS page cache. @@ -327,15 +413,110 @@ --> 1000 - - 1073741824 + + 134217728 + + + 10000 + + false /srv/clickhouse/ + + + + /srv/clickhouse/tmp/ + + 1 + 1 + 1 + + + sha256_password + + + 12 + + + + + + + false + + + false + + + false + + + false + + + false + + + 600 + + default - + @@ -537,9 +757,9 @@ If not specified, system time zone at server startup is used. Please note, that server could display time zone alias instead of specified name. - Example: W-SU is an alias for Europe/Moscow and Zulu is an alias for UTC. + Example: Zulu is an alias for UTC. --> - + - + + + - - - - - localhost - 9000 - - - - - localhost - 9000 - - - - - - - 127.0.0.1 - 9000 - - - - - 127.0.0.2 - 9000 - - - - - - true - - 127.0.0.1 - 9000 - - - - true - - 127.0.0.2 - 9000 - - - - - - - localhost - 9440 - 1 - - - - - - - localhost - 9000 - - - - - localhost - 1 - - - + - + - + + + + toYYYYMM(event_date) + + 7500 + + 1048576 + + 8192 + + 524288 + + false + + + + false + + system + query_views_log
+ toYYYYMM(event_date) + 7500 +
+ system part_log
+ toYYYYMM(event_date) 7500 + 1048576 + 8192 + 524288 + false
- --> @@ -899,7 +1111,11 @@ system metric_log
7500 + 1048576 + 8192 + 524288 1000 + false - 60000 + 7000 + 1048576 + 8192 + 524288 + false + - + toYYYYMM(event_date) + 7500 + 1048576 + 8192 + 524288 + false + --> + + + + system + processors_profile_log
- - + toYYYYMM(event_date) + 7500 + 1048576 + 8192 + 524288 + false +
+ + + + system + asynchronous_insert_log
+ 7500 + 1048576 + 8192 + 524288 + false + event_date + event_date + INTERVAL 3 DAY +
- *_dictionary.xml + *_dictionary.*ml + + + *_function.*ml + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1152,4 +1445,48 @@ -
\ No newline at end of file + + + + + + + 1073741824 + 1024 + 1048576 + 30000000 + + + + + + diff --git a/update/ansible/playbook/tasks/roles/clickhouse/tasks/main.yml b/update/ansible/playbook/tasks/roles/clickhouse/tasks/main.yml index 858ef5dc4f..53217aa149 100644 --- a/update/ansible/playbook/tasks/roles/clickhouse/tasks/main.yml +++ b/update/ansible/playbook/tasks/roles/clickhouse/tasks/main.yml @@ -33,6 +33,8 @@ - percona-clickhouse-server - percona-clickhouse-common-static - percona-clickhouse-server-common + - clickhouse-client-21.3.20.1-2 + - clickhouse-server-21.3.20.1-2 - name: Disable clickhouse-server in systemd when: not is_docker @@ -42,12 +44,21 @@ enabled: no ignore_errors: true +# This will implicitly create /srv/clickhouse - name: Create clickhouse data directory file: - path: "/srv/clickhouse" + path: "/srv/clickhouse/flags" state: directory owner: root group: pmm + recurse: true + +- name: Create empty file to convert clickhouse databases from ordinary to atomic + file: + path: "/srv/clickhouse/flags/convert_ordinary_to_atomic" + state: touch + owner: root + group: pmm - name: Add ClickHouse repository yum_repository: diff --git a/update/ansible/playbook/tasks/roles/initialization/tasks/main.yml b/update/ansible/playbook/tasks/roles/initialization/tasks/main.yml index 2476b13d68..021b246b2b 100644 --- a/update/ansible/playbook/tasks/roles/initialization/tasks/main.yml +++ b/update/ansible/playbook/tasks/roles/initialization/tasks/main.yml @@ -34,6 +34,15 @@ debug: msg: "Current version: {{ pmm_current_version }} Image Version: {{ pmm_image_version }}" +# We use current_version_file['failed'] because we don't want to run this on creating container +# and we use pmm_current_version is version(pmm_image_version, '>=') to run it only if upgrade is required +- name: Determine type of upgrade + set_fact: + docker_upgrade: "{{ not ui_upgrade and current_version_file['failed'] != true and not pmm_current_version is version(pmm_image_version, '>=') }}" + +- name: Print Docker upgrade fact + debug: + msg: "Docker upgrade: {{ docker_upgrade }}" # We use current_version_file['failed'] because we don't want to run this on creating container # and we use pmm_current_version is version(pmm_image_version, '>=') to run it only if upgrade is required @@ -42,7 +51,7 @@ src: maintenance.html dest: /usr/share/pmm-server/maintenance/ mode: 0644 - when: not ui_upgrade and current_version_file['failed'] == false and not pmm_current_version is version(pmm_image_version, '>=') + when: docker_upgrade # PMM-10858 - In certain environments, including AWS EC2, some of the # EPEL repository mirrors do not respond within the time limit defined @@ -60,11 +69,6 @@ become: true changed_when: True -- name: Check if we need an update or not - include_role: - name: dashboards_upgrade - when: not pmm_current_version is version(pmm_image_version, '>=') - - name: Create backup directory file: path: /srv/backup @@ -104,14 +108,14 @@ - name: Create empty configuration file for VictoriaMetrics file: path=/etc/victoriametrics-promscrape.yml state=touch owner=pmm group=pmm -- name: Run SQLite -> Postgres only for docker upgrade +- name: Run operations for docker-way upgrade block: - name: Check that the SQLite grafana database exists stat: path: /srv/grafana/grafana.db register: is_database_sqlite - - name: Temporary change database to SQLite + - name: Run SQLite -> Postgres only block: - name: Remove database options (SQLite is default) ini_file: @@ -160,6 +164,21 @@ - skip_ansible_lint # '503 Tasks that run when changed should likely be handlers'. when: is_database_sqlite.stat.exists + - name: Change default admin id + postgresql_query: + db: grafana + query: UPDATE "user" SET id='1' WHERE login='admin'; + when: not ansible_check_mode + + when: docker_upgrade + +- name: Check if we need an update or not + include_role: + name: dashboards_upgrade + when: not pmm_current_version is version(pmm_image_version, '>=') + +- name: Finalization + block: - name: Wait for PMM to be ready ansible.builtin.uri: url: "http://127.0.0.1:7772/v1/readyz" @@ -173,6 +192,6 @@ state: absent path: /usr/share/pmm-server/maintenance/maintenance.html # We use current_version_file['failed'] because we don't want to run this on creating container - when: not ui_upgrade and current_version_file['failed'] == false and not pmm_current_version is version(pmm_image_version, '>=') + when: docker_upgrade diff --git a/update/ansible/playbook/tasks/roles/nginx/files/conf.d/pmm.conf b/update/ansible/playbook/tasks/roles/nginx/files/conf.d/pmm.conf index dfdbfe8f11..1450c7c7fe 100644 --- a/update/ansible/playbook/tasks/roles/nginx/files/conf.d/pmm.conf +++ b/update/ansible/playbook/tasks/roles/nginx/files/conf.d/pmm.conf @@ -62,6 +62,7 @@ error_page 503 @maintenance; location @maintenance { + auth_request off; root /usr/share/pmm-server/maintenance; rewrite ^(.*)$ /maintenance.html break; } @@ -144,16 +145,22 @@ location /prometheus { proxy_pass http://127.0.0.1:9090; proxy_read_timeout 600; + proxy_http_version 1.1; + proxy_set_header Connection ""; } location /prometheus/api/v1 { proxy_pass http://vmproxy; proxy_read_timeout 600; + proxy_http_version 1.1; + proxy_set_header Connection ""; } # VictoriaMetrics location /victoriametrics/ { proxy_pass http://127.0.0.1:9090/prometheus/; proxy_read_timeout 600; + proxy_http_version 1.1; + proxy_set_header Connection ""; client_body_buffer_size 10m; } @@ -161,15 +168,21 @@ location /prometheus/rules { proxy_pass http://127.0.0.1:8880/api/v1/rules; proxy_read_timeout 600; + proxy_http_version 1.1; + proxy_set_header Connection ""; } location /prometheus/alerts { proxy_pass http://127.0.0.1:8880/api/v1/alerts; proxy_read_timeout 600; + proxy_http_version 1.1; + proxy_set_header Connection ""; } # Alertmanager location /alertmanager { proxy_pass http://127.0.0.1:9093; + proxy_http_version 1.1; + proxy_set_header Connection ""; } # Swagger UI diff --git a/update/ansible/playbook/tasks/roles/sqlite-to-postgres/tasks/main.yml b/update/ansible/playbook/tasks/roles/sqlite-to-postgres/tasks/main.yml index 490ce26c7f..8a905dcf3e 100644 --- a/update/ansible/playbook/tasks/roles/sqlite-to-postgres/tasks/main.yml +++ b/update/ansible/playbook/tasks/roles/sqlite-to-postgres/tasks/main.yml @@ -22,6 +22,37 @@ name: 'grafana' state: stopped +- name: Drop grafana database from postgres EL7 + command: dropdb -f grafana -U postgres + when: + - ansible_distribution == "CentOS" + - ansible_distribution_major_version == "7" + - not ansible_check_mode + +- name: Drop grafana database from postgres EL9 + postgresql_db: + name: grafana + state: absent + force: yes + when: + - ansible_distribution == 'OracleLinux' or ansible_distribution == 'AlmaLinux' + - ansible_distribution_major_version == '9' + +- name: Create grafana database in postgres + postgresql_db: + name: grafana + state: present + +- name: Create grafana user in postgres + postgresql_user: + db: grafana + name: grafana + password: grafana + priv: 'ALL' + expires: infinity + state: present + when: not ansible_check_mode + - name: Create backup for SQLite Grafana database copy: src: /srv/grafana/grafana.db @@ -84,6 +115,7 @@ register: psql_result until: psql_result.rowcount == 1 when: not ansible_check_mode + ignore_errors: yes - name: Wait for grafana database initialization pause: @@ -105,6 +137,12 @@ register: migrator_output changed_when: "'All done' in migrator_output.stdout" +- name: copy the output of grafana-db-migrator to file + copy: + content: "{{ migrator_output.stdout }}" + dest: "/srv/logs/grafana-db-migrator.log" + when: not ansible_check_mode + - name: Enable provisioning after change database ini_file: dest: /etc/grafana/grafana.ini @@ -126,6 +164,13 @@ register: migrator_output changed_when: "'All done' in migrator_output.stdout" +- name: Copy the output of grafana-db-migrator to file + ansible.builtin.blockinfile: + dest: /srv/logs/grafana-db-migrator.log + block: "{{ migrator_output.stdout }}" + backup: yes + when: not ansible_check_mode + - name: Remove SQLite Grafana database file: path: /srv/grafana/grafana.db diff --git a/update/ansible/playbook/tasks/update.yml b/update/ansible/playbook/tasks/update.yml index 3bcb34f34b..b20e866ef3 100644 --- a/update/ansible/playbook/tasks/update.yml +++ b/update/ansible/playbook/tasks/update.yml @@ -407,6 +407,12 @@ - ALTER TABLE api_key ALTER COLUMN name TYPE text; when: not ansible_check_mode + - name: Change default admin id + postgresql_query: + db: grafana + query: UPDATE "user" SET id='1' WHERE login='admin'; + when: not ansible_check_mode + # we need to put this step as one of the last steps, because it removes pmm.ini and /etc/alertmanager.yml - name: Remove old or redundant packages yum: diff --git a/vmproxy/proxy/proxy.go b/vmproxy/proxy/proxy.go index dbc1aa0730..4ad7655ae8 100644 --- a/vmproxy/proxy/proxy.go +++ b/vmproxy/proxy/proxy.go @@ -70,7 +70,7 @@ func failOnInvalidHeader(rw http.ResponseWriter, req *http.Request, headerName s if _, err := parseFilters(filters); err != nil { rw.Header().Set("Content-Type", "text/plain; charset=utf-8") rw.WriteHeader(http.StatusPreconditionFailed) - io.WriteString(rw, fmt.Sprintf("Failed to parse %s header", headerName)) + io.WriteString(rw, fmt.Sprintf("Failed to parse %s header", headerName)) //nolint:errcheck return true } } diff --git a/vmproxy/proxy/proxy_test.go b/vmproxy/proxy/proxy_test.go index daa35dbd5b..4252796010 100644 --- a/vmproxy/proxy/proxy_test.go +++ b/vmproxy/proxy/proxy_test.go @@ -65,7 +65,7 @@ func TestProxy(t *testing.T) { handler.ServeHTTP(rec, req) resp := rec.Result() - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck require.Equal(t, resp.StatusCode, http.StatusOK) }) @@ -138,7 +138,7 @@ func TestProxy(t *testing.T) { handler.ServeHTTP(rec, req) resp := rec.Result() - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck require.Equal(t, tc.expectedStatus, resp.StatusCode) })