diff --git a/Makefile b/Makefile index 18d33c40a..3521ba694 100644 --- a/Makefile +++ b/Makefile @@ -48,7 +48,7 @@ cloc: unit-test: go vet `go list ./... | grep -v '/vendor/' | grep -v '/tools'` && \ - go test -race -timeout 240s -count=1 -vet=off -cover ./utils/... \ + go test -race -timeout 600s -count=1 -vet=off -cover ./utils/... \ ./types/... \ ./store/etcdv3/. \ ./store/etcdv3/embedded/. \ @@ -67,7 +67,7 @@ unit-test: ./wal/kv/. \ ./store/redis/... \ ./lock/redis/... && \ - go test -timeout 240s -count=1 -cover ./cluster/calcium/... + go test -timeout 600s -count=1 -cover ./cluster/calcium/... lint: golangci-lint run diff --git a/client/clientpool.go b/client/clientpool.go index 078166a23..12d4b4496 100644 --- a/client/clientpool.go +++ b/client/clientpool.go @@ -106,6 +106,7 @@ func checkAlive(ctx context.Context, rpc *clientWithStatus, timeout time.Duratio func (c *Pool) updateClientsStatus(ctx context.Context, timeout time.Duration) { wg := &sync.WaitGroup{} + defer wg.Wait() for _, rpc := range c.rpcClients { wg.Add(1) go func(r *clientWithStatus) { @@ -113,5 +114,4 @@ func (c *Pool) updateClientsStatus(ctx context.Context, timeout time.Duration) { r.alive = checkAlive(ctx, r, timeout) }(rpc) } - wg.Wait() } diff --git a/cluster/calcium/build.go b/cluster/calcium/build.go index 5852e1032..6c94fc47e 100644 --- a/cluster/calcium/build.go +++ b/cluster/calcium/build.go @@ -61,16 +61,12 @@ func (c *Calcium) selectBuildNode(ctx context.Context) (*types.Node, error) { return nil, errors.WithStack(types.ErrNoBuildPod) } - // get node by scheduler - ch, err := c.ListPodNodes(ctx, &types.ListNodesOptions{Podname: c.config.Docker.BuildPod}) + // get nodes + nodes, err := c.store.GetNodesByPod(ctx, c.config.Docker.BuildPod, nil, false) if err != nil { return nil, err } - nodes := []*types.Node{} - for n := range ch { - nodes = append(nodes, n) - } if len(nodes) == 0 { return nil, errors.WithStack(types.ErrInsufficientNodes) } @@ -79,14 +75,14 @@ func (c *Calcium) selectBuildNode(ctx context.Context) (*types.Node, error) { } func (c *Calcium) getMostIdleNode(ctx context.Context, nodes []*types.Node) (*types.Node, error) { - nodeNames := []string{} + nodenames := []string{} nodeMap := map[string]*types.Node{} for _, node := range nodes { - nodeNames = append(nodeNames, node.Name) + nodenames = append(nodenames, node.Name) nodeMap[node.Name] = node } - mostIdleNode, err := c.rmgr.GetMostIdleNode(ctx, nodeNames) + mostIdleNode, err := c.rmgr.GetMostIdleNode(ctx, nodenames) if err != nil { return nil, err } @@ -194,6 +190,15 @@ func (c *Calcium) pushImageAndClean(ctx context.Context, resp io.ReadCloser, nod } +func (c *Calcium) getWorkloadNode(ctx context.Context, id string) (*types.Node, error) { + w, err := c.store.GetWorkload(ctx, id) + if err != nil { + return nil, err + } + node, err := c.store.GetNode(ctx, w.Nodename) + return node, err +} + func withImageBuiltChannel(f func(chan *types.BuildImageMessage)) chan *types.BuildImageMessage { ch := make(chan *types.BuildImageMessage) utils.SentryGo(func() { diff --git a/cluster/calcium/calcium.go b/cluster/calcium/calcium.go index f52c9a5ac..5a81808b1 100644 --- a/cluster/calcium/calcium.go +++ b/cluster/calcium/calcium.go @@ -106,7 +106,7 @@ func New(ctx context.Context, config types.Config, t *testing.T) (*Calcium, erro return nil, logger.ErrWithTracing(nil, errors.WithStack(err)) //nolint } - go cal.InitMetrics() + go cal.InitMetrics(ctx) return cal, logger.ErrWithTracing(nil, errors.WithStack(err)) //nolint } diff --git a/cluster/calcium/calcium_test.go b/cluster/calcium/calcium_test.go index d3a4f001c..82b269255 100644 --- a/cluster/calcium/calcium_test.go +++ b/cluster/calcium/calcium_test.go @@ -41,7 +41,7 @@ func NewTestCluster() *Calcium { ServiceDiscoveryPushInterval: 15 * time.Second, }, WALFile: filepath.Join(walDir, "core.wal.log"), - MaxConcurrency: 10, + MaxConcurrency: 100000, HAKeepaliveInterval: 16 * time.Second, } c.store = &storemocks.Store{} diff --git a/cluster/calcium/capacity.go b/cluster/calcium/capacity.go index 56168a2f6..009a745ee 100644 --- a/cluster/calcium/capacity.go +++ b/cluster/calcium/capacity.go @@ -8,6 +8,7 @@ import ( "github.com/projecteru2/core/strategy" "github.com/projecteru2/core/types" "github.com/sanity-io/litter" + "golang.org/x/exp/maps" "github.com/pkg/errors" ) @@ -15,21 +16,18 @@ import ( // CalculateCapacity calculates capacity func (c *Calcium) CalculateCapacity(ctx context.Context, opts *types.DeployOptions) (*types.CapacityMessage, error) { logger := log.WithField("Calcium", "CalculateCapacity").WithField("opts", opts) + logger.Infof(ctx, "[CalculateCapacity] Calculate capacity with options:\n%s", litter.Options{Compact: true}.Sdump(opts)) var err error - log.Infof(ctx, "[CalculateCapacity] Calculate capacity with options:\n%s", litter.Options{Compact: true}.Sdump(opts)) msg := &types.CapacityMessage{ Total: 0, NodeCapacities: map[string]int{}, } return msg, c.withNodesPodLocked(ctx, opts.NodeFilter, func(ctx context.Context, nodeMap map[string]*types.Node) error { - nodes := []string{} - for node := range nodeMap { - nodes = append(nodes, node) - } + nodenames := maps.Keys(nodeMap) if opts.DeployStrategy != strategy.Dummy { - if msg.NodeCapacities, err = c.doGetDeployMap(ctx, nodes, opts); err != nil { + if msg.NodeCapacities, err = c.doGetDeployStrategy(ctx, nodenames, opts); err != nil { logger.Errorf(ctx, "[Calcium.CalculateCapacity] doGetDeployMap failed: %+v", err) return err } @@ -37,19 +35,20 @@ func (c *Calcium) CalculateCapacity(ctx context.Context, opts *types.DeployOptio for _, capacity := range msg.NodeCapacities { msg.Total += capacity } - } else { - var infos map[string]*resources.NodeCapacityInfo - infos, msg.Total, err = c.rmgr.GetNodesDeployCapacity(ctx, nodes, opts.ResourceOpts) - if err != nil { - logger.Errorf(ctx, "[Calcium.CalculateCapacity] failed to get nodes capacity: %+v", err) - return err - } - if msg.Total <= 0 { - return errors.Wrap(types.ErrInsufficientRes, "no node meets all the resource requirements at the same time") - } - for node, info := range infos { - msg.NodeCapacities[node] = info.Capacity - } + return nil + } + + var infos map[string]*resources.NodeCapacityInfo + infos, msg.Total, err = c.rmgr.GetNodesDeployCapacity(ctx, nodenames, opts.ResourceOpts) + if err != nil { + logger.Errorf(ctx, "[Calcium.CalculateCapacity] failed to get nodes capacity: %+v", err) + return err + } + if msg.Total <= 0 { + return errors.Wrap(types.ErrInsufficientRes, "no node meets all the resource requirements at the same time") + } + for node, info := range infos { + msg.NodeCapacities[node] = info.Capacity } return nil }) diff --git a/cluster/calcium/capacity_test.go b/cluster/calcium/capacity_test.go index 283afe94e..5bd758da6 100644 --- a/cluster/calcium/capacity_test.go +++ b/cluster/calcium/capacity_test.go @@ -2,7 +2,6 @@ package calcium import ( "context" - "errors" "testing" enginemocks "github.com/projecteru2/core/engine/mocks" @@ -21,23 +20,22 @@ func TestCalculateCapacity(t *testing.T) { c := NewTestCluster() ctx := context.Background() store := c.store.(*storemocks.Store) - rmgr := c.rmgr.(*resourcemocks.Manager) - rmgr.On("GetNodeResourceInfo", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, nil, nil) - engine := &enginemocks.API{} - // pod1 := &types.Pod{Name: "p1"} + lock := &lockmocks.DistributedLock{} + lock.On("Lock", mock.Anything).Return(ctx, nil) + lock.On("Unlock", mock.Anything).Return(nil) + store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) + + engine := &enginemocks.API{} + name := "n1" node1 := &types.Node{ NodeMeta: types.NodeMeta{ - Name: "n1", + Name: name, }, Engine: engine, } store.On("GetNode", mock.Anything, mock.Anything).Return(node1, nil) - lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) - lock.On("Unlock", mock.Anything).Return(nil) - store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) - // failed by call plugin + opts := &types.DeployOptions{ Entrypoint: &types.Entrypoint{ Name: "entry", @@ -45,42 +43,63 @@ func TestCalculateCapacity(t *testing.T) { ResourceOpts: types.WorkloadResourceOpts{}, DeployStrategy: strategy.Auto, NodeFilter: types.NodeFilter{ - Includes: []string{"n1"}, + Includes: []string{name}, }, Count: 3, } - rmgr.On("GetNodesDeployCapacity", mock.Anything, mock.Anything, mock.Anything).Return(nil, 0, errors.New("not implemented")).Times(3) + + // failed by call plugin + rmgr := c.rmgr.(*resourcemocks.Manager) + rmgr.On("GetNodesDeployCapacity", mock.Anything, mock.Anything, mock.Anything).Return(nil, 0, types.ErrNoETCD).Once() _, err := c.CalculateCapacity(ctx, opts) assert.Error(t, err) // failed by get deploy status + nrim := map[string]*resources.NodeCapacityInfo{ + name: { + NodeName: name, + Capacity: 10, + Usage: 0.5, + Rate: 0.5, + Weight: 100, + }, + } + rmgr.On("GetNodesDeployCapacity", mock.Anything, mock.Anything, mock.Anything).Return( + nrim, 100, nil).Times(3) store.On("GetDeployStatus", mock.Anything, mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() _, err = c.CalculateCapacity(ctx, opts) assert.Error(t, err) - store.On("GetDeployStatus", mock.Anything, mock.Anything, mock.Anything).Return(map[string]int{"n1": 0}, nil) - // failed by get deploy plan - opts.DeployStrategy = "FAKE" + // failed by get deploy strategy + store.On("GetDeployStatus", mock.Anything, mock.Anything, mock.Anything).Return(map[string]int{name: 0}, nil) + opts.Count = -1 _, err = c.CalculateCapacity(ctx, opts) assert.Error(t, err) + // success + opts.Count = 1 + _, err = c.CalculateCapacity(ctx, opts) + assert.NoError(t, err) + // strategy: dummy opts.DeployStrategy = strategy.Dummy + + // failed by GetNodesDeployCapacity + rmgr.On("GetNodesDeployCapacity", mock.Anything, mock.Anything, mock.Anything).Return(nil, 0, types.ErrNoETCD).Once() + _, err = c.CalculateCapacity(ctx, opts) + assert.Error(t, err) + + // failed by total <= 0 + rmgr.On("GetNodesDeployCapacity", mock.Anything, mock.Anything, mock.Anything).Return(nil, -1, nil).Once() + _, err = c.CalculateCapacity(ctx, opts) + assert.Error(t, err) + + // success rmgr.On("GetNodesDeployCapacity", mock.Anything, mock.Anything, mock.Anything).Return( - map[string]*resources.NodeCapacityInfo{ - "n1": { - NodeName: "n1", - Capacity: 10, - Usage: 0.5, - Rate: 0.5, - Weight: 100, - }, - }, - 10, nil, - ) + nrim, 10, nil) msg, err := c.CalculateCapacity(ctx, opts) assert.NoError(t, err) - assert.Equal(t, msg.NodeCapacities["n1"], 10) + assert.Equal(t, msg.NodeCapacities[name], 10) assert.Equal(t, msg.Total, 10) rmgr.AssertExpectations(t) diff --git a/cluster/calcium/control.go b/cluster/calcium/control.go index 404791fae..81e04988f 100644 --- a/cluster/calcium/control.go +++ b/cluster/calcium/control.go @@ -22,6 +22,7 @@ func (c *Calcium) ControlWorkload(ctx context.Context, ids []string, t string, f defer close(ch) wg := &sync.WaitGroup{} wg.Add(len(ids)) + defer wg.Wait() for _, id := range ids { id := id _ = c.pool.Invoke(func() { @@ -59,7 +60,6 @@ func (c *Calcium) ControlWorkload(ctx context.Context, ids []string, t string, f } }) } - wg.Wait() }) return ch, nil diff --git a/cluster/calcium/control_test.go b/cluster/calcium/control_test.go index f562c3f78..486648730 100644 --- a/cluster/calcium/control_test.go +++ b/cluster/calcium/control_test.go @@ -21,7 +21,7 @@ func TestControlStart(t *testing.T) { ctx := context.Background() store := c.store.(*storemocks.Store) lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) // failed by GetWorkloads @@ -102,7 +102,7 @@ func TestControlStop(t *testing.T) { ctx := context.Background() store := c.store.(*storemocks.Store) lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) workload := &types.Workload{ @@ -146,7 +146,7 @@ func TestControlRestart(t *testing.T) { ctx := context.Background() store := c.store.(*storemocks.Store) lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) engine := &enginemocks.API{} diff --git a/cluster/calcium/copy.go b/cluster/calcium/copy.go index 8380df4fd..6d9437e8d 100644 --- a/cluster/calcium/copy.go +++ b/cluster/calcium/copy.go @@ -21,12 +21,12 @@ func (c *Calcium) Copy(ctx context.Context, opts *types.CopyOptions) (chan *type defer close(ch) wg := sync.WaitGroup{} + wg.Add(len(opts.Targets)) + defer wg.Wait() log.Infof(ctx, "[Copy] Copy %d workloads files", len(opts.Targets)) // workload one by one for id, paths := range opts.Targets { - wg.Add(1) - utils.SentryGo(func(id string, paths []string) func() { return func() { defer wg.Done() @@ -61,7 +61,6 @@ func (c *Calcium) Copy(ctx context.Context, opts *types.CopyOptions) (chan *type } }(id, paths)) } - wg.Wait() }) return ch, nil } diff --git a/cluster/calcium/copy_test.go b/cluster/calcium/copy_test.go index d831db89c..0e5b0e5b7 100644 --- a/cluster/calcium/copy_test.go +++ b/cluster/calcium/copy_test.go @@ -17,6 +17,7 @@ func TestCopy(t *testing.T) { c := NewTestCluster() ctx := context.Background() + // failed by target _, err := c.Copy(ctx, &types.CopyOptions{ Targets: map[string][]string{}, }) @@ -32,7 +33,7 @@ func TestCopy(t *testing.T) { } store := c.store.(*storemocks.Store) lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) // failed by GetWorkload @@ -47,7 +48,7 @@ func TestCopy(t *testing.T) { workload.Engine = engine store.On("GetWorkload", mock.Anything, mock.Anything).Return(workload, nil) // failed by VirtualizationCopyFrom - engine.On("VirtualizationCopyFrom", mock.Anything, mock.Anything, mock.Anything).Return(nil, 0, 0, int64(0), types.ErrNilEngine).Twice() + engine.On("VirtualizationCopyFrom", mock.Anything, mock.Anything, mock.Anything).Return(nil, 0, 0, int64(0), types.ErrNoETCD).Twice() ch, err = c.Copy(ctx, opts) assert.NoError(t, err) for r := range ch { diff --git a/cluster/calcium/create.go b/cluster/calcium/create.go index a7070103e..fa05710ac 100644 --- a/cluster/calcium/create.go +++ b/cluster/calcium/create.go @@ -99,10 +99,10 @@ func (c *Calcium) doCreateWorkloads(ctx context.Context, opts *types.DeployOptio } }() return c.withNodesPodLocked(ctx, opts.NodeFilter, func(ctx context.Context, nodeMap map[string]*types.Node) (err error) { - nodeNames := []string{} + nodenames := []string{} nodes := []*types.Node{} for nodename, node := range nodeMap { - nodeNames = append(nodeNames, nodename) + nodenames = append(nodenames, nodename) nodes = append(nodes, node) } @@ -110,7 +110,7 @@ func (c *Calcium) doCreateWorkloads(ctx context.Context, opts *types.DeployOptio return errors.WithStack(err) } - deployMap, err = c.doGetDeployMap(ctx, nodeNames, opts) + deployMap, err = c.doGetDeployStrategy(ctx, nodenames, opts) if err != nil { return err } @@ -275,7 +275,7 @@ func (c *Calcium) doDeployWorkloadsOnNode(ctx context.Context, } func (c *Calcium) doGetAndPrepareNode(ctx context.Context, nodename, image string) (*types.Node, error) { - node, err := c.GetNode(ctx, nodename) + node, err := c.store.GetNode(ctx, nodename) if err != nil { return nil, err } diff --git a/cluster/calcium/create_test.go b/cluster/calcium/create_test.go index 77b51c37e..ccf321fe4 100644 --- a/cluster/calcium/create_test.go +++ b/cluster/calcium/create_test.go @@ -20,7 +20,7 @@ import ( walmocks "github.com/projecteru2/core/wal/mocks" ) -func TestCreateWorkload(t *testing.T) { +func TestCreateWorkloadValidating(t *testing.T) { c := NewTestCluster() ctx := context.Background() opts := &types.DeployOptions{ @@ -32,11 +32,6 @@ func TestCreateWorkload(t *testing.T) { Name: "some-nice-entrypoint", }, } - store := c.store.(*storemocks.Store) - - store.On("CreateProcessing", mock.Anything, mock.Anything, mock.Anything).Return(nil) - store.On("DeleteProcessing", mock.Anything, mock.Anything, mock.Anything).Return(nil) - // failed by validating opts.Name = "" _, err := c.CreateWorkload(ctx, opts) @@ -81,7 +76,6 @@ func TestCreateWorkloadTxn(t *testing.T) { store := c.store.(*storemocks.Store) rmgr := c.rmgr.(*resourcemocks.Manager) - rmgr.On("GetNodeResourceInfo", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, nil, nil) mwal := &walmocks.WAL{} c.wal = mwal var walCommitted bool @@ -90,32 +84,10 @@ func TestCreateWorkloadTxn(t *testing.T) { return nil }) mwal.On("Log", mock.Anything, mock.Anything).Return(commit, nil) - node1, node2 := nodes[0], nodes[1] - store.On("CreateProcessing", mock.Anything, mock.Anything, mock.Anything).Return(nil) - store.On("DeleteProcessing", mock.Anything, mock.Anything, mock.Anything).Return(nil) // doAllocResource fails: GetNodesDeployCapacity - lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.Background(), nil) - lock.On("Unlock", mock.Anything).Return(nil) - store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) - store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nodes, nil) - store.On("GetNode", - mock.AnythingOfType("*context.emptyCtx"), - mock.AnythingOfType("string"), - ).Return( - func(_ context.Context, name string) (node *types.Node) { - node = node1 - if name == "n2" { - node = node2 - } - return - }, nil) - store.On("RemoveWorkload", mock.Anything, mock.Anything).Return(nil) - rmgr.On("GetNodesDeployCapacity", mock.Anything, mock.Anything, mock.Anything).Return( - nil, 0, types.ErrKeyIsEmpty, - ).Once() + rmgr.On("GetNodesDeployCapacity", mock.Anything, mock.Anything, mock.Anything).Return(nil, 0, types.ErrNoETCD).Once() ch, err := c.CreateWorkload(ctx, opts) assert.Nil(t, err) cnt := 0 @@ -290,20 +262,20 @@ func newCreateWorkloadCluster(t *testing.T) (*Calcium, []*types.Node) { } nodes := []*types.Node{node1, node2} + // for processing store := c.store.(*storemocks.Store) store.On("CreateProcessing", mock.Anything, mock.Anything, mock.Anything).Return(nil) store.On("DeleteProcessing", mock.Anything, mock.Anything, mock.Anything).Return(nil) - // doAllocResource fails: MakeDeployStatus + // for lock lock := &lockmocks.DistributedLock{} lock.On("Lock", mock.Anything).Return(context.Background(), nil) lock.On("Unlock", mock.Anything).Return(nil) store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) + + // for get node store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nodes, nil) - store.On("GetNode", - mock.AnythingOfType("*context.emptyCtx"), - mock.AnythingOfType("string"), - ).Return( + store.On("GetNode", mock.Anything, mock.Anything).Return( func(_ context.Context, name string) (node *types.Node) { node = node1 if name == "n2" { @@ -312,5 +284,7 @@ func newCreateWorkloadCluster(t *testing.T) (*Calcium, []*types.Node) { return }, nil) + store.On("RemoveWorkload", mock.Anything, mock.Anything).Return(nil) + return c, nodes } diff --git a/cluster/calcium/dissociate_test.go b/cluster/calcium/dissociate_test.go index ae37f2323..07d10ae0e 100644 --- a/cluster/calcium/dissociate_test.go +++ b/cluster/calcium/dissociate_test.go @@ -21,7 +21,7 @@ func TestDissociateWorkload(t *testing.T) { rmgr := c.rmgr.(*resourcemocks.Manager) lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) c1 := &types.Workload{ diff --git a/cluster/calcium/image.go b/cluster/calcium/image.go index e80f2bb2c..cb6067890 100644 --- a/cluster/calcium/image.go +++ b/cluster/calcium/image.go @@ -12,13 +12,14 @@ import ( "github.com/pkg/errors" ) -// RemoveImage remove images -func (c *Calcium) RemoveImage(ctx context.Context, opts *types.ImageOptions) (chan *types.RemoveImageMessage, error) { - logger := log.WithField("Calcium", "RemoveImage").WithField("opts", opts) +// CacheImage cache Image +// 在podname上cache这个image +// 实际上就是在所有的node上去pull一次 +func (c *Calcium) CacheImage(ctx context.Context, opts *types.ImageOptions) (chan *types.CacheImageMessage, error) { + logger := log.WithField("Calcium", "CacheImage").WithField("opts", opts) if err := opts.Validate(); err != nil { return nil, logger.ErrWithTracing(ctx, err) } - opts.Normalize() nodes, err := c.filterNodes(ctx, types.NodeFilter{Podname: opts.Podname, Includes: opts.Nodenames}) if err != nil { @@ -29,61 +30,43 @@ func (c *Calcium) RemoveImage(ctx context.Context, opts *types.ImageOptions) (ch return nil, logger.ErrWithTracing(ctx, errors.WithStack(types.ErrPodNoNodes)) } - ch := make(chan *types.RemoveImageMessage) + ch := make(chan *types.CacheImageMessage) utils.SentryGo(func() { defer close(ch) wg := sync.WaitGroup{} + wg.Add(len(nodes)) defer wg.Wait() - for i, node := range nodes { - wg.Add(1) - utils.SentryGo(func(node *types.Node) func() { - return func() { - defer wg.Done() - for _, image := range opts.Images { - m := &types.RemoveImageMessage{ - Success: false, - Image: image, - Messages: []string{}, - } - if removeItems, err := node.Engine.ImageRemove(ctx, image, false, true); err != nil { - m.Messages = append(m.Messages, logger.ErrWithTracing(ctx, err).Error()) - } else { - m.Success = true - for _, item := range removeItems { - m.Messages = append(m.Messages, fmt.Sprintf("Clean: %s", item)) - } - } - ch <- m + for _, node := range nodes { + node := node + _ = c.pool.Invoke(func() { + defer wg.Done() + for _, image := range opts.Images { + m := &types.CacheImageMessage{ + Image: image, + Success: true, + Nodename: node.Name, + Message: "", } - if opts.Prune { - if err := node.Engine.ImagesPrune(ctx); err != nil { - logger.Errorf(ctx, "[RemoveImage] Prune %s pod %s node failed: %+v", opts.Podname, node.Name, err) - } else { - log.Infof(ctx, "[RemoveImage] Prune %s pod %s node", opts.Podname, node.Name) - } + if err := pullImage(ctx, node, image); err != nil { + m.Success = false + m.Message = logger.ErrWithTracing(ctx, err).Error() } + ch <- m } - }(node)) - if (i+1)%opts.Step == 0 { - log.Info("[RemoveImage] Wait for previous cleaner done") - wg.Wait() - } + }) } }) return ch, nil } -// CacheImage cache Image -// 在podname上cache这个image -// 实际上就是在所有的node上去pull一次 -func (c *Calcium) CacheImage(ctx context.Context, opts *types.ImageOptions) (chan *types.CacheImageMessage, error) { - logger := log.WithField("Calcium", "CacheImage").WithField("opts", opts) +// RemoveImage remove images +func (c *Calcium) RemoveImage(ctx context.Context, opts *types.ImageOptions) (chan *types.RemoveImageMessage, error) { + logger := log.WithField("Calcium", "RemoveImage").WithField("opts", opts) if err := opts.Validate(); err != nil { return nil, logger.ErrWithTracing(ctx, err) } - opts.Normalize() nodes, err := c.filterNodes(ctx, types.NodeFilter{Podname: opts.Podname, Includes: opts.Nodenames}) if err != nil { @@ -94,36 +77,41 @@ func (c *Calcium) CacheImage(ctx context.Context, opts *types.ImageOptions) (cha return nil, logger.ErrWithTracing(ctx, errors.WithStack(types.ErrPodNoNodes)) } - ch := make(chan *types.CacheImageMessage) + ch := make(chan *types.RemoveImageMessage) utils.SentryGo(func() { defer close(ch) wg := sync.WaitGroup{} + wg.Add(len(nodes)) defer wg.Wait() - for i, node := range nodes { - wg.Add(1) - utils.SentryGo(func(node *types.Node) func() { - return func() { - defer wg.Done() - for _, image := range opts.Images { - m := &types.CacheImageMessage{ - Image: image, - Success: true, - Nodename: node.Name, - Message: "", - } - if err := pullImage(ctx, node, image); err != nil { - m.Success = false - m.Message = logger.ErrWithTracing(ctx, err).Error() + for _, node := range nodes { + node := node + _ = c.pool.Invoke(func() { + defer wg.Done() + for _, image := range opts.Images { + m := &types.RemoveImageMessage{ + Success: false, + Image: image, + Messages: []string{}, + } + if removeItems, err := node.Engine.ImageRemove(ctx, image, false, true); err != nil { + m.Messages = append(m.Messages, logger.ErrWithTracing(ctx, err).Error()) + } else { + m.Success = true + for _, item := range removeItems { + m.Messages = append(m.Messages, fmt.Sprintf("Clean: %s", item)) } - ch <- m } + ch <- m } - }(node)) - if (i+1)%opts.Step == 0 { - log.Info("[CacheImage] Wait for puller cleaner done") - wg.Wait() - } + if opts.Prune { + if err := node.Engine.ImagesPrune(ctx); err != nil { + logger.Errorf(ctx, "[RemoveImage] Prune %s pod %s node failed: %+v", opts.Podname, node.Name, err) + } else { + log.Infof(ctx, "[RemoveImage] Prune %s pod %s node", opts.Podname, node.Name) + } + } + }) } }) @@ -133,7 +121,6 @@ func (c *Calcium) CacheImage(ctx context.Context, opts *types.ImageOptions) (cha // ListImage list Image on a pod or some nodes. func (c *Calcium) ListImage(ctx context.Context, opts *types.ImageOptions) (chan *types.ListImageMessage, error) { logger := log.WithField("Calcium", "ListImage").WithField("opts", opts) - opts.Normalize() nodes, err := c.filterNodes(ctx, types.NodeFilter{Podname: opts.Podname, Includes: opts.Nodenames}) if err != nil { @@ -149,34 +136,29 @@ func (c *Calcium) ListImage(ctx context.Context, opts *types.ImageOptions) (chan utils.SentryGo(func() { defer close(ch) wg := sync.WaitGroup{} + wg.Add(len(nodes)) defer wg.Wait() - for i, node := range nodes { - wg.Add(1) - utils.SentryGo(func(node *types.Node) func() { - return func() { - defer wg.Done() - msg := &types.ListImageMessage{ - Images: []*types.Image{}, - Nodename: node.Name, - Error: nil, - } - if images, err := node.Engine.ImageList(ctx, opts.Filter); err != nil { - msg.Error = logger.ErrWithTracing(ctx, err) - } else { - for _, image := range images { - msg.Images = append(msg.Images, &types.Image{ - ID: image.ID, - Tags: image.Tags, - }) - } + for _, node := range nodes { + node := node + _ = c.pool.Invoke(func() { + defer wg.Done() + msg := &types.ListImageMessage{ + Images: []*types.Image{}, + Nodename: node.Name, + Error: nil, + } + if images, err := node.Engine.ImageList(ctx, opts.Filter); err != nil { + msg.Error = logger.ErrWithTracing(ctx, err) + } else { + for _, image := range images { + msg.Images = append(msg.Images, &types.Image{ + ID: image.ID, + Tags: image.Tags, + }) } - ch <- msg } - }(node)) - if (i+1)%opts.Step == 0 { - log.Info("[ListImage] Wait for image listed") - wg.Wait() - } + ch <- msg + }) } }) diff --git a/cluster/calcium/image_test.go b/cluster/calcium/image_test.go index f566a70ce..91f846f6f 100644 --- a/cluster/calcium/image_test.go +++ b/cluster/calcium/image_test.go @@ -7,7 +7,7 @@ import ( "testing" enginemocks "github.com/projecteru2/core/engine/mocks" - resourcemocks "github.com/projecteru2/core/resources/mocks" + enginetypes "github.com/projecteru2/core/engine/types" storemocks "github.com/projecteru2/core/store/mocks" "github.com/projecteru2/core/types" @@ -15,17 +15,60 @@ import ( "github.com/stretchr/testify/mock" ) +func TestCacheImage(t *testing.T) { + c := NewTestCluster() + ctx := context.Background() + store := c.store.(*storemocks.Store) + // fail by validating + _, err := c.CacheImage(ctx, &types.ImageOptions{Podname: ""}) + assert.Error(t, err) + // fail by get nodes + store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() + _, err = c.CacheImage(ctx, &types.ImageOptions{Podname: "podname"}) + assert.Error(t, err) + // fail 0 nodes + store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*types.Node{}, nil).Once() + _, err = c.CacheImage(ctx, &types.ImageOptions{Podname: "podname"}) + assert.Error(t, err) + engine := &enginemocks.API{} + nodes := []*types.Node{ + { + NodeMeta: types.NodeMeta{ + Name: "test", + }, + Engine: engine, + }, + } + store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nodes, nil) + // fail by ImageRemoteDigest + engine.On("ImageLocalDigests", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() + engine.On("ImageRemoteDigest", mock.Anything, mock.Anything).Return("", types.ErrNoETCD).Once() + engine.On("ImagePull", mock.Anything, mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() + ch, err := c.CacheImage(ctx, &types.ImageOptions{Podname: "podname", Images: []string{"xx"}}) + for c := range ch { + assert.False(t, c.Success) + } + // succ + engine.On("ImageRemoteDigest", mock.Anything, mock.Anything).Return("yy", nil) + engine.On("ImageLocalDigests", mock.Anything, mock.Anything).Return([]string{"xx"}, nil) + engine.On("ImagePull", mock.Anything, mock.Anything, mock.Anything).Return(ioutil.NopCloser(bytes.NewReader([]byte{})), nil) + ch, err = c.CacheImage(ctx, &types.ImageOptions{Podname: "podname", Images: []string{"xx"}}) + for c := range ch { + assert.True(t, c.Success) + } + store.AssertExpectations(t) + engine.AssertExpectations(t) +} + func TestRemoveImage(t *testing.T) { c := NewTestCluster() ctx := context.Background() store := c.store.(*storemocks.Store) - rmgr := c.rmgr.(*resourcemocks.Manager) - rmgr.On("GetNodeResourceInfo", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, nil, nil) // fail by validating _, err := c.RemoveImage(ctx, &types.ImageOptions{Podname: ""}) assert.Error(t, err) // fail by get nodes - store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, types.ErrBadCount).Once() + store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() _, err = c.RemoveImage(ctx, &types.ImageOptions{Podname: "podname"}) assert.Error(t, err) store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*types.Node{}, nil).Once() @@ -43,14 +86,14 @@ func TestRemoveImage(t *testing.T) { } store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nodes, nil) // fail remove - engine.On("ImageRemove", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, types.ErrBadCount).Once() + engine.On("ImageRemove", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() ch, err := c.RemoveImage(ctx, &types.ImageOptions{Podname: "podname", Images: []string{"xx"}}) for c := range ch { assert.False(t, c.Success) } engine.On("ImageRemove", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]string{"xx"}, nil) // success remove but prune fail - engine.On("ImagesPrune", mock.Anything).Return(types.ErrBadStorage).Once() + engine.On("ImagesPrune", mock.Anything).Return(types.ErrNoETCD).Once() ch, err = c.RemoveImage(ctx, &types.ImageOptions{Podname: "podname", Images: []string{"xx"}, Prune: true}) for c := range ch { assert.True(t, c.Success) @@ -60,24 +103,21 @@ func TestRemoveImage(t *testing.T) { for c := range ch { assert.True(t, c.Success) } + store.AssertExpectations(t) + engine.AssertExpectations(t) } -func TestCacheImage(t *testing.T) { +func TestListImage(t *testing.T) { c := NewTestCluster() ctx := context.Background() - rmgr := c.rmgr.(*resourcemocks.Manager) store := c.store.(*storemocks.Store) - rmgr.On("GetNodeResourceInfo", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, nil, nil) - // fail by validating - _, err := c.CacheImage(ctx, &types.ImageOptions{Podname: ""}) - assert.Error(t, err) // fail by get nodes - store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, types.ErrBadCount).Once() - _, err = c.CacheImage(ctx, &types.ImageOptions{Podname: "podname"}) + store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() + _, err := c.ListImage(ctx, &types.ImageOptions{Podname: "podname"}) assert.Error(t, err) - store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*types.Node{}, nil).Once() // fail 0 nodes - _, err = c.CacheImage(ctx, &types.ImageOptions{Podname: "podname"}) + store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*types.Node{}, nil).Once() + _, err = c.ListImage(ctx, &types.ImageOptions{Podname: "podname"}) assert.Error(t, err) engine := &enginemocks.API{} nodes := []*types.Node{ @@ -89,20 +129,18 @@ func TestCacheImage(t *testing.T) { }, } store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nodes, nil) - // fail by ImageRemoteDigest - engine.On("ImageRemoteDigest", mock.Anything, mock.Anything).Return("", types.ErrNoETCD).Once() - engine.On("ImageLocalDigests", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() - engine.On("ImagePull", mock.Anything, mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() - ch, err := c.CacheImage(ctx, &types.ImageOptions{Podname: "podname", Images: []string{"xx"}}) - for c := range ch { - assert.False(t, c.Success) - } - engine.On("ImageRemoteDigest", mock.Anything, mock.Anything).Return("yy", nil) - engine.On("ImageLocalDigests", mock.Anything, mock.Anything).Return([]string{"xx"}, nil) - engine.On("ImagePull", mock.Anything, mock.Anything, mock.Anything).Return(ioutil.NopCloser(bytes.NewReader([]byte{})), nil) - // succ - ch, err = c.CacheImage(ctx, &types.ImageOptions{Podname: "podname", Images: []string{"xx"}}) - for c := range ch { - assert.True(t, c.Success) - } + // fail by ImageList + engine.On("ImageList", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() + ch, err := c.ListImage(ctx, &types.ImageOptions{Podname: "podname"}) + msg := <-ch + assert.Error(t, msg.Error) + // success + engine.On("ImageList", mock.Anything, mock.Anything).Return( + []*enginetypes.Image{{ID: "123"}}, nil, + ) + ch, err = c.ListImage(ctx, &types.ImageOptions{Podname: "podname"}) + msg = <-ch + assert.Equal(t, msg.Images[0].ID, "123") + store.AssertExpectations(t) + engine.AssertExpectations(t) } diff --git a/cluster/calcium/lock_test.go b/cluster/calcium/lock_test.go index c7f49c0e1..5aa1197dd 100644 --- a/cluster/calcium/lock_test.go +++ b/cluster/calcium/lock_test.go @@ -32,7 +32,7 @@ func TestDoLock(t *testing.T) { _, _, err = c.doLock(ctx, "somename", 1) assert.Error(t, err) // success - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) _, _, err = c.doLock(ctx, "somename", 1) assert.NoError(t, err) } @@ -62,7 +62,7 @@ func TestWithWorkloadsLocked(t *testing.T) { err := c.withWorkloadsLocked(ctx, []string{"c1", "c2"}, func(ctx context.Context, workloads map[string]*types.Workload) error { return nil }) assert.Error(t, err) // success - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) // failed by getworkload store.On("GetWorkloads", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() err = c.withWorkloadsLocked(ctx, []string{"c1", "c2"}, func(ctx context.Context, workloads map[string]*types.Workload) error { return nil }) @@ -95,7 +95,7 @@ func TestWithWorkloadLocked(t *testing.T) { err := c.withWorkloadLocked(ctx, "c1", func(ctx context.Context, workload *types.Workload) error { return nil }) assert.Error(t, err) // success - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) // failed by getworkload store.On("GetWorkloads", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() err = c.withWorkloadLocked(ctx, "c1", func(ctx context.Context, workload *types.Workload) error { return nil }) @@ -158,7 +158,7 @@ func TestWithNodesPodLocked(t *testing.T) { lock.On("Lock", mock.Anything).Return(context.TODO(), types.ErrNoETCD).Once() err = c.withNodesPodLocked(ctx, types.NodeFilter{Podname: "test", Includes: []string{"test"}, All: false}, func(ctx context.Context, nodes map[string]*types.Node) error { return nil }) assert.Error(t, err) - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) // failed by get locked node store.On("GetNode", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() err = c.withNodesPodLocked(ctx, types.NodeFilter{Podname: "test", Includes: []string{"test"}, All: false}, func(ctx context.Context, nodes map[string]*types.Node) error { return nil }) @@ -193,7 +193,7 @@ func TestWithNodePodLocked(t *testing.T) { lock := &lockmocks.DistributedLock{} store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) lock.On("Unlock", mock.Anything).Return(nil) - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) // failed by get locked node store.On("GetNode", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() err := c.withNodePodLocked(ctx, "test", func(ctx context.Context, node *types.Node) error { return nil }) @@ -250,7 +250,7 @@ func TestWithNodesOperationLocked(t *testing.T) { lock.On("Lock", mock.Anything).Return(context.TODO(), types.ErrNoETCD).Once() err = c.withNodesOperationLocked(ctx, types.NodeFilter{Podname: "test", Includes: []string{"test"}, All: false}, func(ctx context.Context, nodes map[string]*types.Node) error { return nil }) assert.Error(t, err) - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) // failed by get locked node store.On("GetNode", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() err = c.withNodesOperationLocked(ctx, types.NodeFilter{Podname: "test", Includes: []string{"test"}, All: false}, func(ctx context.Context, nodes map[string]*types.Node) error { return nil }) @@ -284,7 +284,7 @@ func TestWithNodeOperationLocked(t *testing.T) { lock := &lockmocks.DistributedLock{} store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) lock.On("Unlock", mock.Anything).Return(nil) - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) // failed by get locked node store.On("GetNode", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() err := c.withNodeOperationLocked(ctx, "test", func(ctx context.Context, node *types.Node) error { return nil }) diff --git a/cluster/calcium/metrics.go b/cluster/calcium/metrics.go index 1930a03e6..3e5d1cdea 100644 --- a/cluster/calcium/metrics.go +++ b/cluster/calcium/metrics.go @@ -8,14 +8,10 @@ import ( "github.com/projecteru2/core/log" "github.com/projecteru2/core/metrics" "github.com/projecteru2/core/types" - "github.com/projecteru2/core/utils" ) // InitMetrics . -func (c *Calcium) InitMetrics() { - ctx, cancel := context.WithCancel(context.TODO()) - defer cancel() - +func (c *Calcium) InitMetrics(ctx context.Context) { metricsDescriptions, err := c.rmgr.GetMetricsDescription(ctx) if err != nil { log.Errorf(ctx, "[InitMetrics] failed to get metrics description, err: %v", err) @@ -28,21 +24,8 @@ func (c *Calcium) InitMetrics() { log.Infof(ctx, "[InitMetrics] init metrics %v success", litter.Sdump(metricsDescriptions)) } -// SendNodeMetrics . -func (c *Calcium) SendNodeMetrics(ctx context.Context, nodename string) { - ctx, cancel := context.WithTimeout(utils.InheritTracingInfo(ctx, context.TODO()), c.config.GlobalTimeout) - defer cancel() - node, err := c.GetNode(ctx, nodename) - if err != nil { - log.Errorf(ctx, "[SendNodeMetrics] get node %s failed, %v", nodename, err) - return - } - - c.doSendNodeMetrics(ctx, node) -} - func (c *Calcium) doSendNodeMetrics(ctx context.Context, node *types.Node) { - nodeMetrics, err := c.rmgr.ConvertNodeResourceInfoToMetrics(ctx, node.Podname, node.Name, node.ResourceCapacity, node.ResourceUsage) + nodeMetrics, err := c.rmgr.GetNodeMetrics(ctx, node) if err != nil { log.Errorf(ctx, "[SendNodeMetrics] convert node %s resource info to metrics failed, %v", node.Name, err) return diff --git a/cluster/calcium/network_test.go b/cluster/calcium/network_test.go index cf9eda47c..955af9f1e 100644 --- a/cluster/calcium/network_test.go +++ b/cluster/calcium/network_test.go @@ -14,70 +14,79 @@ import ( "github.com/stretchr/testify/mock" ) -func TestNetwork(t *testing.T) { +func TestListNetworks(t *testing.T) { c := NewTestCluster() ctx := context.Background() + store := c.store.(*storemocks.Store) - rmgr := c.rmgr.(*resourcemocks.Manager) - rmgr.On("GetNodeResourceInfo", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, nil, nil) + // failed by GetNodesByPod store.On("GetNodesByPod", mock.AnythingOfType("*context.emptyCtx"), mock.Anything, mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() _, err := c.ListNetworks(ctx, "", "") assert.Error(t, err) + // No nodes store.On("GetNodesByPod", mock.AnythingOfType("*context.emptyCtx"), mock.Anything, mock.Anything, mock.Anything).Return([]*types.Node{}, nil).Once() _, err = c.ListNetworks(ctx, "", "") assert.Error(t, err) + // vaild + name := "test" engine := &enginemocks.API{} + engine.On("NetworkList", mock.Anything, mock.Anything).Return([]*enginetypes.Network{{Name: name}}, nil) node := &types.Node{ NodeMeta: types.NodeMeta{ - Name: "test", + Name: name, }, Available: true, Engine: engine, } - name := "test" - engine.On("NetworkList", mock.Anything, mock.Anything).Return([]*enginetypes.Network{{Name: name}}, nil) + rmgr := c.rmgr.(*resourcemocks.Manager) + rmgr.On("GetNodeResourceInfo", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, nil, nil) store.On("GetNodesByPod", mock.AnythingOfType("*context.emptyCtx"), mock.Anything, mock.Anything, mock.Anything).Return([]*types.Node{node}, nil) ns, err := c.ListNetworks(ctx, "", "xx") assert.NoError(t, err) assert.Equal(t, len(ns), 1) assert.Equal(t, ns[0].Name, name) + store.AssertExpectations(t) } func TestConnectNetwork(t *testing.T) { c := NewTestCluster() ctx := context.Background() + store := c.store.(*storemocks.Store) - rmgr := c.rmgr.(*resourcemocks.Manager) - rmgr.On("GetNodeResourceInfo", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, nil, nil) - engine := &enginemocks.API{} - workload := &types.Workload{Engine: engine} - store.On("GetWorkload", mock.Anything, mock.Anything).Return(nil, types.ErrBadMeta).Once() + // failed by GetWorkload + store.On("GetWorkload", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() _, err := c.ConnectNetwork(ctx, "network", "123", "", "") assert.Error(t, err) - store.On("GetWorkload", mock.Anything, mock.Anything).Return(workload, nil) + + // success + engine := &enginemocks.API{} engine.On("NetworkConnect", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]string{}, nil) + workload := &types.Workload{Engine: engine} + store.On("GetWorkload", mock.Anything, mock.Anything).Return(workload, nil) _, err = c.ConnectNetwork(ctx, "network", "123", "", "") assert.NoError(t, err) + store.AssertExpectations(t) } func TestDisConnectNetwork(t *testing.T) { c := NewTestCluster() ctx := context.Background() + store := c.store.(*storemocks.Store) - rmgr := c.rmgr.(*resourcemocks.Manager) - rmgr.On("GetNodeResourceInfo", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, nil, nil) + + // failed by GetWorkload + store.On("GetWorkload", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() + assert.Error(t, c.DisconnectNetwork(ctx, "network", "123", true)) + + // success engine := &enginemocks.API{} + engine.On("NetworkDisconnect", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) workload := &types.Workload{Engine: engine} - - store.On("GetWorkload", mock.Anything, mock.Anything).Return(nil, types.ErrBadMeta).Once() - err := c.DisconnectNetwork(ctx, "network", "123", true) - assert.Error(t, err) store.On("GetWorkload", mock.Anything, mock.Anything).Return(workload, nil) - engine.On("NetworkDisconnect", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - err = c.DisconnectNetwork(ctx, "network", "123", true) - assert.NoError(t, err) + assert.NoError(t, c.DisconnectNetwork(ctx, "network", "123", true)) + store.AssertExpectations(t) } diff --git a/cluster/calcium/node.go b/cluster/calcium/node.go index 82925d1f5..3e96841e5 100644 --- a/cluster/calcium/node.go +++ b/cluster/calcium/node.go @@ -50,8 +50,8 @@ func (c *Calcium) AddNode(ctx context.Context, opts *types.AddNodeOptions) (*typ if err != nil { return errors.WithStack(err) } - node.ResourceCapacity = resourceCapacity - node.ResourceUsage = resourceUsage + node.Resource.Capacity = resourceCapacity + node.Resource.Usage = resourceUsage go c.doSendNodeMetrics(ctx, node) return nil }, @@ -114,12 +114,13 @@ func (c *Calcium) ListPodNodes(ctx context.Context, opts *types.ListNodesOptions defer close(ch) wg := &sync.WaitGroup{} wg.Add(len(nodes)) + defer wg.Wait() for _, node := range nodes { node := node _ = c.pool.Invoke(func() { defer wg.Done() var err error - if node.ResourceCapacity, node.ResourceUsage, node.Diffs, err = c.rmgr.GetNodeResourceInfo(ctx, node.Name, nil, false); err != nil { + if node.Resource.Capacity, node.Resource.Usage, node.Resource.Diffs, err = c.rmgr.GetNodeResourceInfo(ctx, node.Name, nil, false); err != nil { logger.Errorf(ctx, "failed to get node %v resource info: %+v", node.Name, err) } if opts.CallInfo { @@ -130,7 +131,6 @@ func (c *Calcium) ListPodNodes(ctx context.Context, opts *types.ListNodesOptions ch <- node }) } - wg.Wait() }) return ch, nil @@ -146,7 +146,7 @@ func (c *Calcium) GetNode(ctx context.Context, nodename string) (node *types.Nod if node, err = c.store.GetNode(ctx, nodename); err != nil { return nil, logger.ErrWithTracing(ctx, errors.WithStack(err)) } - if node.ResourceCapacity, node.ResourceUsage, node.Diffs, err = c.rmgr.GetNodeResourceInfo(ctx, node.Name, nil, false); err != nil { + if node.Resource.Capacity, node.Resource.Usage, node.Resource.Diffs, err = c.rmgr.GetNodeResourceInfo(ctx, node.Name, nil, false); err != nil { return nil, logger.ErrWithTracing(ctx, errors.WithStack(err)) } return node, nil @@ -178,7 +178,7 @@ func (c *Calcium) SetNode(ctx context.Context, opts *types.SetNodeOptions) (*typ logger.Infof(ctx, "set node") // update resource map var err error - node.ResourceCapacity, node.ResourceUsage, node.Diffs, err = c.rmgr.GetNodeResourceInfo(ctx, node.Name, nil, false) + node.Resource.Capacity, node.Resource.Usage, node.Resource.Diffs, err = c.rmgr.GetNodeResourceInfo(ctx, node.Name, nil, false) if err != nil { return err } @@ -225,7 +225,7 @@ func (c *Calcium) SetNode(ctx context.Context, opts *types.SetNodeOptions) (*typ // update resource // actually we can ignore err here, if update success if len(opts.ResourceOpts) != 0 { - n.ResourceCapacity, n.ResourceUsage, n.Diffs, _ = c.rmgr.GetNodeResourceInfo(ctx, node.Name, nil, false) + n.Resource.Capacity, n.Resource.Usage, n.Resource.Diffs, _ = c.rmgr.GetNodeResourceInfo(ctx, node.Name, nil, false) } // use send to update the usage go c.doSendNodeMetrics(ctx, n) @@ -251,7 +251,7 @@ func (c *Calcium) SetNode(ctx context.Context, opts *types.SetNodeOptions) (*typ // the filtering logic is introduced along with NodeFilter // NOTE: when nf.Includes is set, they don't need to belong to podname // update on 2021-06-21: sort and unique locks to avoid deadlock -// node without resource info +// node without resource info if batch get func (c *Calcium) filterNodes(ctx context.Context, nf types.NodeFilter) (ns []*types.Node, err error) { defer func() { if len(ns) == 0 { diff --git a/cluster/calcium/node_test.go b/cluster/calcium/node_test.go index 8f06f9a06..c3f4e1886 100644 --- a/cluster/calcium/node_test.go +++ b/cluster/calcium/node_test.go @@ -59,7 +59,7 @@ func TestAddNode(t *testing.T) { }, } store.On("AddNode", mock.Anything, mock.Anything).Return(node, nil) - rmgr.On("ConvertNodeResourceInfoToMetrics", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*resourcetypes.Metrics{}, nil) + rmgr.On("GetNodeMetrics", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*resourcetypes.Metrics{}, nil) n, err := c.AddNode(ctx, opts) assert.NoError(t, err) assert.Equal(t, n.Name, name) @@ -71,7 +71,7 @@ func TestRemoveNode(t *testing.T) { store := c.store.(*storemocks.Store) lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) name := "test" @@ -216,7 +216,7 @@ func TestSetNode(t *testing.T) { store := c.store.(*storemocks.Store) lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) name := "test" @@ -263,7 +263,7 @@ func TestSetNode(t *testing.T) { _, err = c.SetNode(ctx, opts) assert.Error(t, err) store.On("UpdateNodes", mock.Anything, mock.Anything).Return(nil) - rmgr.On("ConvertNodeResourceInfoToMetrics", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*resourcetypes.Metrics{}, nil) + rmgr.On("GetNodeMetrics", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*resourcetypes.Metrics{}, nil) // done node, err = c.SetNode(ctx, opts) diff --git a/cluster/calcium/pod_test.go b/cluster/calcium/pod_test.go index 5d88cd279..c1adcaaed 100644 --- a/cluster/calcium/pod_test.go +++ b/cluster/calcium/pod_test.go @@ -5,7 +5,6 @@ import ( "testing" lockmocks "github.com/projecteru2/core/lock/mocks" - resourcemocks "github.com/projecteru2/core/resources/mocks" storemocks "github.com/projecteru2/core/store/mocks" "github.com/projecteru2/core/types" @@ -36,38 +35,21 @@ func TestAddPod(t *testing.T) { func TestRemovePod(t *testing.T) { c := NewTestCluster() ctx := context.Background() - store := c.store.(*storemocks.Store) - rmgr := c.rmgr.(*resourcemocks.Manager) - rmgr.On("GetNodeResourceInfo", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, nil, nil) + // failed by validating assert.Error(t, c.RemovePod(ctx, "")) - store.On("RemovePod", mock.Anything, mock.Anything).Return(nil) - node := &types.Node{NodeMeta: types.NodeMeta{Name: "n1"}, Available: true} - store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*types.Node{node}, nil) - store.On("GetNode", mock.Anything, mock.Anything).Return(node, nil) + store := c.store.(*storemocks.Store) lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) - assert.NoError(t, c.RemovePod(ctx, "podname")) -} - -func TestListPods(t *testing.T) { - c := NewTestCluster() - ctx := context.Background() - name := "test" - pods := []*types.Pod{ - {Name: name}, - } - - store := c.store.(*storemocks.Store) - store.On("GetAllPods", mock.Anything).Return(pods, nil) + store.On("RemovePod", mock.Anything, mock.Anything).Return(nil) + store.On("GetNodesByPod", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return( + []*types.Node{{NodeMeta: types.NodeMeta{Name: "test"}}}, nil) - ps, err := c.ListPods(ctx) - assert.NoError(t, err) - assert.Equal(t, len(ps), 1) - assert.Equal(t, ps[0].Name, name) + assert.NoError(t, c.RemovePod(ctx, "podname")) + store.AssertExpectations(t) } func TestGetPod(t *testing.T) { @@ -86,3 +68,21 @@ func TestGetPod(t *testing.T) { assert.NoError(t, err) assert.Equal(t, p.Name, name) } + +func TestListPods(t *testing.T) { + c := NewTestCluster() + ctx := context.Background() + + name := "test" + pods := []*types.Pod{ + {Name: name}, + } + + store := c.store.(*storemocks.Store) + store.On("GetAllPods", mock.Anything).Return(pods, nil) + + ps, err := c.ListPods(ctx) + assert.NoError(t, err) + assert.Equal(t, len(ps), 1) + assert.Equal(t, ps[0].Name, name) +} diff --git a/cluster/calcium/realloc.go b/cluster/calcium/realloc.go index f384ae5be..2283aee3b 100644 --- a/cluster/calcium/realloc.go +++ b/cluster/calcium/realloc.go @@ -71,7 +71,6 @@ func (c *Calcium) doReallocOnNode(ctx context.Context, node *types.Node, workloa if err != nil { return errors.WithStack(err) } - go c.SendNodeMetrics(ctx, node.Name) go c.doRemapResourceAndLog(ctx, log.WithField("Calcium", "doReallocOnNode"), node) return nil } diff --git a/cluster/calcium/realloc_test.go b/cluster/calcium/realloc_test.go index 5ba4bbbab..b8e6d62f1 100644 --- a/cluster/calcium/realloc_test.go +++ b/cluster/calcium/realloc_test.go @@ -22,11 +22,11 @@ func TestRealloc(t *testing.T) { store := c.store.(*storemocks.Store) rmgr := c.rmgr.(*resourcemocks.Manager) rmgr.On("GetNodeResourceInfo", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, nil, nil, nil) - rmgr.On("ConvertNodeResourceInfoToMetrics", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*resourcetypes.Metrics{}, nil) + rmgr.On("GetNodeMetrics", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*resourcetypes.Metrics{}, nil) c.config.Scheduler.ShareBase = 100 lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) engine := &enginemocks.API{} diff --git a/cluster/calcium/remap_test.go b/cluster/calcium/remap_test.go index f6e4f884f..2be82689f 100644 --- a/cluster/calcium/remap_test.go +++ b/cluster/calcium/remap_test.go @@ -6,6 +6,7 @@ import ( enginemocks "github.com/projecteru2/core/engine/mocks" enginetypes "github.com/projecteru2/core/engine/types" + lockmocks "github.com/projecteru2/core/lock/mocks" "github.com/projecteru2/core/log" resourcemocks "github.com/projecteru2/core/resources/mocks" storemocks "github.com/projecteru2/core/store/mocks" @@ -41,5 +42,10 @@ func TestRemapResource(t *testing.T) { _, err := c.remapResource(context.Background(), node) assert.Nil(t, err) + store.On("GetNode", mock.Anything, mock.Anything).Return(node, nil) + lock := &lockmocks.DistributedLock{} + lock.On("Lock", mock.Anything).Return(context.Background(), nil) + lock.On("Unlock", mock.Anything).Return(nil) + store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) c.doRemapResourceAndLog(context.TODO(), log.WithField("test", "zc"), node) } diff --git a/cluster/calcium/remove.go b/cluster/calcium/remove.go index 343bedabc..74acc9722 100644 --- a/cluster/calcium/remove.go +++ b/cluster/calcium/remove.go @@ -77,7 +77,6 @@ func (c *Calcium) RemoveWorkload(ctx context.Context, ids []string, force bool) } ch <- ret } - go c.SendNodeMetrics(ctx, node.Name) go c.doRemapResourceAndLog(ctx, logger, node) return nil }); err != nil { diff --git a/cluster/calcium/remove_test.go b/cluster/calcium/remove_test.go index d174d8861..598007654 100644 --- a/cluster/calcium/remove_test.go +++ b/cluster/calcium/remove_test.go @@ -21,7 +21,7 @@ func TestRemoveWorkload(t *testing.T) { c := NewTestCluster() ctx := context.Background() lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) store := c.store.(*storemocks.Store) rmgr := c.rmgr.(*resourcemocks.Manager) @@ -31,7 +31,7 @@ func TestRemoveWorkload(t *testing.T) { map[string]types.NodeResourceArgs{}, nil, ) - rmgr.On("ConvertNodeResourceInfoToMetrics", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*resourcetypes.Metrics{}, nil) + rmgr.On("GetNodeMetrics", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*resourcetypes.Metrics{}, nil) // failed by GetWorkload store.On("GetWorkloads", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() diff --git a/cluster/calcium/replace.go b/cluster/calcium/replace.go index 4a105703d..dcd92ed76 100644 --- a/cluster/calcium/replace.go +++ b/cluster/calcium/replace.go @@ -42,12 +42,12 @@ func (c *Calcium) ReplaceWorkload(ctx context.Context, opts *types.ReplaceOption defer close(ch) // 并发控制 wg := sync.WaitGroup{} + wg.Add(len(opts.IDs)) defer wg.Wait() for index, id := range opts.IDs { - wg.Add(1) - utils.SentryGo( - func(replaceOpts types.ReplaceOptions, index int, id string) func() { - return func() { + utils.SentryGo(func(replaceOpts types.ReplaceOptions, index int, id string) func() { + return func() { + _ = c.pool.Invoke(func() { defer wg.Done() var createMessage *types.CreateWorkloadMessage removeMessage := &types.RemoveWorkloadMessage{WorkloadID: id} @@ -91,11 +91,9 @@ func (c *Calcium) ReplaceWorkload(ctx context.Context, opts *types.ReplaceOption log.Infof(ctx, "[ReplaceWorkload] New workload %s", createMessage.WorkloadID) } ch <- &types.ReplaceWorkloadMessage{Create: createMessage, Remove: removeMessage, Error: err} - } - }(*opts, index, id)) - if (index+1)%opts.Count == 0 { - wg.Wait() - } + }) + } + }(*opts, index, id)) } }) return ch, nil diff --git a/cluster/calcium/replace_test.go b/cluster/calcium/replace_test.go index 2c19a6e03..bc04ba8c6 100644 --- a/cluster/calcium/replace_test.go +++ b/cluster/calcium/replace_test.go @@ -19,7 +19,7 @@ func TestReplaceWorkload(t *testing.T) { c := NewTestCluster() ctx := context.Background() lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) store := c.store.(*storemocks.Store) rmgr := c.rmgr.(*resourcemocks.Manager) diff --git a/cluster/calcium/resource.go b/cluster/calcium/resource.go index 40a351a35..deb60a27e 100644 --- a/cluster/calcium/resource.go +++ b/cluster/calcium/resource.go @@ -26,6 +26,7 @@ func (c *Calcium) PodResource(ctx context.Context, podname string) (chan *types. defer close(ch) wg := &sync.WaitGroup{} wg.Add(len(nodes)) + defer wg.Wait() for _, node := range nodes { node := node _ = c.pool.Invoke(func() { @@ -39,7 +40,6 @@ func (c *Calcium) PodResource(ctx context.Context, podname string) (chan *types. ch <- nr }) } - wg.Wait() }) return ch, nil @@ -72,11 +72,11 @@ func (c *Calcium) doGetNodeResource(ctx context.Context, nodename string, inspec return err } nr = &types.NodeResource{ - Name: node.Name, - ResourceCapacity: resourceCapacity, - ResourceUsage: resourceUsage, - Diffs: resourceDiffs, - Workloads: workloads, + Name: node.Name, + Capacity: resourceCapacity, + Usage: resourceUsage, + Diffs: resourceDiffs, + Workloads: workloads, } if inspect { @@ -92,11 +92,11 @@ func (c *Calcium) doGetNodeResource(ctx context.Context, nodename string, inspec }) } -func (c *Calcium) doGetDeployMap(ctx context.Context, nodes []string, opts *types.DeployOptions) (map[string]int, error) { +func (c *Calcium) doGetDeployStrategy(ctx context.Context, nodenames []string, opts *types.DeployOptions) (map[string]int, error) { // get nodes with capacity > 0 - nodeResourceInfoMap, total, err := c.rmgr.GetNodesDeployCapacity(ctx, nodes, opts.ResourceOpts) + nodeResourceInfoMap, total, err := c.rmgr.GetNodesDeployCapacity(ctx, nodenames, opts.ResourceOpts) if err != nil { - log.Errorf(ctx, "[doGetDeployMap] failed to select available nodes, nodes %v, err %v", nodes, err) + log.Errorf(ctx, "[doGetDeployMap] failed to select available nodes, nodes %v, err %v", nodenames, err) return nil, errors.WithStack(err) } diff --git a/cluster/calcium/resource_test.go b/cluster/calcium/resource_test.go index 7d5fe5f01..e060d8601 100644 --- a/cluster/calcium/resource_test.go +++ b/cluster/calcium/resource_test.go @@ -22,7 +22,7 @@ func TestPodResource(t *testing.T) { store := c.store.(*storemocks.Store) rmgr := c.rmgr.(*resourcemocks.Manager) lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) // failed by GetNodesByPod @@ -85,7 +85,7 @@ func TestNodeResource(t *testing.T) { rmgr := c.rmgr.(*resourcemocks.Manager) lock := &lockmocks.DistributedLock{} store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) node := &types.Node{ diff --git a/cluster/calcium/send.go b/cluster/calcium/send.go index 2d97b1436..2cb8e1458 100644 --- a/cluster/calcium/send.go +++ b/cluster/calcium/send.go @@ -22,13 +22,12 @@ func (c *Calcium) Send(ctx context.Context, opts *types.SendOptions) (chan *type utils.SentryGo(func() { defer close(ch) wg := &sync.WaitGroup{} + wg.Add(len(opts.IDs)) for _, id := range opts.IDs { log.Infof(ctx, "[Send] Send files to %s", id) - wg.Add(1) utils.SentryGo(func(id string) func() { return func() { - defer wg.Done() if err := c.withWorkloadLocked(ctx, id, func(ctx context.Context, workload *types.Workload) error { for _, file := range opts.Files { @@ -41,7 +40,6 @@ func (c *Calcium) Send(ctx context.Context, opts *types.SendOptions) (chan *type } } }(id)) - } wg.Wait() }) diff --git a/cluster/calcium/send_test.go b/cluster/calcium/send_test.go index 218f09abb..1ae36192e 100644 --- a/cluster/calcium/send_test.go +++ b/cluster/calcium/send_test.go @@ -19,6 +19,7 @@ func TestSend(t *testing.T) { c := NewTestCluster() ctx := context.Background() + // failed by validating _, err := c.Send(ctx, &types.SendOptions{IDs: []string{}, Files: []types.LinuxFile{{Content: []byte("xxx")}}}) assert.Error(t, err) _, err = c.Send(ctx, &types.SendOptions{IDs: []string{"id"}}) @@ -39,7 +40,7 @@ func TestSend(t *testing.T) { } store := c.store.(*storemocks.Store) lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(ctx, nil) lock.On("Unlock", mock.Anything).Return(nil) store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) // failed by GetWorkload @@ -60,7 +61,7 @@ func TestSend(t *testing.T) { mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, - ).Return(types.ErrCannotGetEngine).Once() + ).Return(types.ErrNoETCD).Once() ch, err = c.Send(ctx, opts) assert.NoError(t, err) for r := range ch { diff --git a/cluster/calcium/status.go b/cluster/calcium/status.go index 133720ed8..1a41a77fb 100644 --- a/cluster/calcium/status.go +++ b/cluster/calcium/status.go @@ -10,6 +10,28 @@ import ( "github.com/pkg/errors" ) +// GetNodeStatus set status of a node +// it's used to report whether a node is still alive +func (c *Calcium) GetNodeStatus(ctx context.Context, nodename string) (*types.NodeStatus, error) { + return c.store.GetNodeStatus(ctx, nodename) +} + +// SetNodeStatus set status of a node +// it's used to report whether a node is still alive +func (c *Calcium) SetNodeStatus(ctx context.Context, nodename string, ttl int64) error { + logger := log.WithField("Calcium", "SetNodeStatus").WithField("nodename", nodename).WithField("ttl", ttl) + node, err := c.store.GetNode(ctx, nodename) + if err != nil { + return logger.ErrWithTracing(ctx, errors.WithStack(err)) + } + return logger.ErrWithTracing(ctx, errors.WithStack(c.store.SetNodeStatus(ctx, node, ttl))) +} + +// NodeStatusStream returns a stream of node status for subscribing +func (c *Calcium) NodeStatusStream(ctx context.Context) chan *types.NodeStatus { + return c.store.NodeStatusStream(ctx) +} + // GetWorkloadsStatus get workload status func (c *Calcium) GetWorkloadsStatus(ctx context.Context, ids []string) ([]*types.StatusMeta, error) { r := []*types.StatusMeta{} @@ -62,25 +84,3 @@ func (c *Calcium) SetWorkloadsStatus(ctx context.Context, statusMetas []*types.S func (c *Calcium) WorkloadStatusStream(ctx context.Context, appname, entrypoint, nodename string, labels map[string]string) chan *types.WorkloadStatus { return c.store.WorkloadStatusStream(ctx, appname, entrypoint, nodename, labels) } - -// SetNodeStatus set status of a node -// it's used to report whether a node is still alive -func (c *Calcium) SetNodeStatus(ctx context.Context, nodename string, ttl int64) error { - logger := log.WithField("Calcium", "SetNodeStatus").WithField("nodename", nodename).WithField("ttl", ttl) - node, err := c.store.GetNode(ctx, nodename) - if err != nil { - return logger.ErrWithTracing(ctx, errors.WithStack(err)) - } - return logger.ErrWithTracing(ctx, errors.WithStack(c.store.SetNodeStatus(ctx, node, ttl))) -} - -// GetNodeStatus set status of a node -// it's used to report whether a node is still alive -func (c *Calcium) GetNodeStatus(ctx context.Context, nodename string) (*types.NodeStatus, error) { - return c.store.GetNodeStatus(ctx, nodename) -} - -// NodeStatusStream returns a stream of node status for subscribing -func (c *Calcium) NodeStatusStream(ctx context.Context) chan *types.NodeStatus { - return c.store.NodeStatusStream(ctx) -} diff --git a/cluster/calcium/status_test.go b/cluster/calcium/status_test.go index 5df77931f..8854aca2e 100644 --- a/cluster/calcium/status_test.go +++ b/cluster/calcium/status_test.go @@ -11,150 +11,158 @@ import ( "github.com/stretchr/testify/mock" ) -func TestGetWorkloadsStatus(t *testing.T) { +func TestGetNodeStatus(t *testing.T) { c := NewTestCluster() ctx := context.Background() store := c.store.(*storemocks.Store) - cs := &types.StatusMeta{} + ns := &types.NodeStatus{ + Nodename: "test", + Podname: "test", + Alive: true, + } // failed - store.On("GetWorkloadStatus", mock.Anything, mock.Anything).Return(nil, types.ErrBadCount).Once() - _, err := c.GetWorkloadsStatus(ctx, []string{"a"}) + store.On("GetNodeStatus", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() + _, err := c.GetNodeStatus(ctx, "test") assert.Error(t, err) - store.On("GetWorkloadStatus", mock.Anything, mock.Anything).Return(cs, nil) - // succ - r, err := c.GetWorkloadsStatus(ctx, []string{"a"}) + + store.On("GetNodeStatus", mock.Anything, mock.Anything).Return(ns, nil) + s, err := c.GetNodeStatus(ctx, "test") assert.NoError(t, err) - assert.Len(t, r, 1) + assert.Equal(t, s.Nodename, "test") + assert.True(t, s.Alive) + store.AssertExpectations(t) } -func TestSetWorkloadsStatus(t *testing.T) { +func TestSetNodeStatus(t *testing.T) { c := NewTestCluster() ctx := context.Background() store := c.store.(*storemocks.Store) - // failed - store.On("GetWorkload", mock.Anything, mock.Anything).Return(nil, types.ErrBadCount).Once() - _, err := c.SetWorkloadsStatus(ctx, []*types.StatusMeta{{ID: "123"}}, nil) - assert.Error(t, err) - workload := &types.Workload{ - ID: "123", - Name: "a_b_c", + node := &types.Node{ + NodeMeta: types.NodeMeta{ + Name: "testname", + Endpoint: "ep", + }, } - store.On("GetWorkload", mock.Anything, mock.Anything).Return(workload, nil) + // failed by GetNode + store.On("GetNode", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() + assert.Error(t, c.SetNodeStatus(ctx, node.Name, 10)) // failed by SetWorkloadStatus - store.On("SetWorkloadStatus", + store.On("GetNode", mock.Anything, mock.Anything).Return(node, nil) + store.On("SetNodeStatus", mock.Anything, mock.Anything, mock.Anything, - ).Return(types.ErrBadCount).Once() - _, err = c.SetWorkloadsStatus(ctx, []*types.StatusMeta{{ID: "123"}}, nil) - assert.Error(t, err) + ).Return(types.ErrNoETCD).Once() + assert.Error(t, c.SetNodeStatus(ctx, node.Name, 10)) // success - store.On("SetWorkloadStatus", + store.On("SetNodeStatus", mock.Anything, mock.Anything, mock.Anything, ).Return(nil) - r, err := c.SetWorkloadsStatus(ctx, []*types.StatusMeta{{ID: "123"}}, nil) - assert.NoError(t, err) - assert.Len(t, r, 1) + assert.NoError(t, c.SetNodeStatus(ctx, node.Name, 10)) + store.AssertExpectations(t) } -func TestWorkloadStatusStream(t *testing.T) { +func TestNodeStatusStream(t *testing.T) { c := NewTestCluster() ctx := context.Background() - dataCh := make(chan *types.WorkloadStatus) + dataCh := make(chan *types.NodeStatus) store := c.store.(*storemocks.Store) + store.On("NodeStatusStream", mock.Anything).Return(dataCh) - store.On("WorkloadStatusStream", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(dataCh) go func() { - msg := &types.WorkloadStatus{ - Delete: true, + defer close(dataCh) + msg := &types.NodeStatus{ + Alive: true, } dataCh <- msg - close(dataCh) }() - ch := c.WorkloadStatusStream(ctx, "", "", "", nil) - for c := range ch { - assert.Equal(t, c.Delete, true) + for c := range c.NodeStatusStream(ctx) { + assert.True(t, c.Alive) } + store.AssertExpectations(t) } -func TestSetNodeStatus(t *testing.T) { - assert := assert.New(t) +func TestGetWorkloadsStatus(t *testing.T) { c := NewTestCluster() ctx := context.Background() store := c.store.(*storemocks.Store) + cs := &types.StatusMeta{} - node := &types.Node{ - NodeMeta: types.NodeMeta{ - Name: "testname", - Endpoint: "ep", - }, - } - // failed - store.On("GetNode", mock.Anything, mock.Anything).Return(nil, types.ErrBadCount).Once() - assert.Error(c.SetNodeStatus(ctx, node.Name, 10)) - store.On("GetNode", mock.Anything, mock.Anything).Return(node, nil) - // failed by SetWorkloadStatus - store.On("SetNodeStatus", - mock.Anything, - mock.Anything, - mock.Anything, - ).Return(types.ErrBadCount).Once() - assert.Error(c.SetNodeStatus(ctx, node.Name, 10)) + // failed GetWorkloadStatus + store.On("GetWorkloadStatus", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() + _, err := c.GetWorkloadsStatus(ctx, []string{"a"}) + assert.Error(t, err) // success - store.On("SetNodeStatus", - mock.Anything, - mock.Anything, - mock.Anything, - ).Return(nil) - assert.NoError(c.SetNodeStatus(ctx, node.Name, 10)) + store.On("GetWorkloadStatus", mock.Anything, mock.Anything).Return(cs, nil) + r, err := c.GetWorkloadsStatus(ctx, []string{"a"}) + assert.NoError(t, err) + assert.Len(t, r, 1) + store.AssertExpectations(t) } -func TestGetNodeStatus(t *testing.T) { - assert := assert.New(t) +func TestSetWorkloadsStatus(t *testing.T) { c := NewTestCluster() ctx := context.Background() store := c.store.(*storemocks.Store) - ns := &types.NodeStatus{ - Nodename: "test", - Podname: "test", - Alive: true, + // no meta, generate by id + store.On("GetWorkload", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() + _, err := c.SetWorkloadsStatus(ctx, []*types.StatusMeta{{ID: "123"}}, nil) + assert.Error(t, err) + + // failed by workload name + workload := &types.Workload{ + ID: "123", + Name: "invaild", } - // failed - store.On("GetNodeStatus", mock.Anything, mock.Anything).Return(nil, types.ErrBadCount).Once() - _, err := c.GetNodeStatus(ctx, "test") - assert.Error(err) + store.On("GetWorkload", mock.Anything, mock.Anything).Return(workload, nil).Once() + _, err = c.SetWorkloadsStatus(ctx, []*types.StatusMeta{{ID: "123"}}, nil) + assert.Error(t, err) - store.On("GetNodeStatus", mock.Anything, mock.Anything).Return(ns, nil) - s, err := c.GetNodeStatus(ctx, "test") - assert.NoError(err) - assert.Equal(s.Nodename, "test") - assert.True(s.Alive) + // failed by SetworkloadStatus + workload.Name = "a_b_c" + store.On("GetWorkload", mock.Anything, mock.Anything).Return(workload, nil) + store.On("SetWorkloadStatus", + mock.Anything, + mock.Anything, + mock.Anything, + ).Return(types.ErrNoETCD).Once() + _, err = c.SetWorkloadsStatus(ctx, []*types.StatusMeta{{ID: "123"}}, nil) + assert.Error(t, err) + + // success + store.On("SetWorkloadStatus", + mock.Anything, + mock.Anything, + mock.Anything, + ).Return(nil) + r, err := c.SetWorkloadsStatus(ctx, []*types.StatusMeta{{ID: "123"}}, nil) + assert.NoError(t, err) + assert.Len(t, r, 1) + store.AssertExpectations(t) } -func TestNodeStatusStream(t *testing.T) { - assert := assert.New(t) +func TestWorkloadStatusStream(t *testing.T) { c := NewTestCluster() ctx := context.Background() - dataCh := make(chan *types.NodeStatus) + dataCh := make(chan *types.WorkloadStatus) store := c.store.(*storemocks.Store) - store.On("NodeStatusStream", mock.Anything).Return(dataCh) + store.On("WorkloadStatusStream", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(dataCh) go func() { - msg := &types.NodeStatus{ - Alive: true, + defer close(dataCh) + msg := &types.WorkloadStatus{ + Delete: true, } dataCh <- msg - close(dataCh) }() - ch := c.NodeStatusStream(ctx) - for c := range ch { - assert.True(c.Alive) + for c := range c.WorkloadStatusStream(ctx, "", "", "", nil) { + assert.Equal(t, c.Delete, true) } } diff --git a/cluster/calcium/temp.go b/cluster/calcium/temp.go deleted file mode 100644 index b3749cfd6..000000000 --- a/cluster/calcium/temp.go +++ /dev/null @@ -1 +0,0 @@ -package calcium diff --git a/cluster/calcium/wal.go b/cluster/calcium/wal.go index 169c76ccb..bb9cb0d80 100644 --- a/cluster/calcium/wal.go +++ b/cluster/calcium/wal.go @@ -240,6 +240,7 @@ func (h *WorkloadResourceAllocatedHandler) Handle(ctx context.Context, raw inter wg := &sync.WaitGroup{} wg.Add(len(nodes)) + defer wg.Wait() for _, node := range nodes { node := node _ = h.pool.Invoke(func() { @@ -251,7 +252,6 @@ func (h *WorkloadResourceAllocatedHandler) Handle(ctx context.Context, raw inter logger.Infof(ctx, "fixed node resource: %s", node.Name) }) } - wg.Wait() return nil } diff --git a/cluster/calcium/wal_test.go b/cluster/calcium/wal_test.go index e90a4618a..ceebea58e 100644 --- a/cluster/calcium/wal_test.go +++ b/cluster/calcium/wal_test.go @@ -168,7 +168,7 @@ func TestHandleCreateLambda(t *testing.T) { map[string]types.NodeResourceArgs{}, nil, ) - rmgr.On("ConvertNodeResourceInfoToMetrics", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*resourcetypes.Metrics{}, nil) + rmgr.On("GetNodeMetrics", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return([]*resourcetypes.Metrics{}, nil) rmgr.On("GetRemapArgs", mock.Anything, mock.Anything, mock.Anything).Return( map[string]types.EngineArgs{}, nil, @@ -213,7 +213,7 @@ func TestHandleCreateLambda(t *testing.T) { Once() store.On("ListNodeWorkloads", mock.Anything, mock.Anything, mock.Anything).Return(nil, nil).Once() lock := &lockmocks.DistributedLock{} - lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Lock", mock.Anything).Return(context.Background(), nil) lock.On("Unlock", mock.Anything).Return(nil) store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) diff --git a/cluster/calcium/workload.go b/cluster/calcium/workload.go index 5b1a98bfc..36b7ad1dc 100644 --- a/cluster/calcium/workload.go +++ b/cluster/calcium/workload.go @@ -12,24 +12,6 @@ import ( "github.com/pkg/errors" ) -// ListWorkloads list workloads -func (c *Calcium) ListWorkloads(ctx context.Context, opts *types.ListWorkloadsOptions) (workloads []*types.Workload, err error) { - if workloads, err = c.store.ListWorkloads(ctx, opts.Appname, opts.Entrypoint, opts.Nodename, opts.Limit, opts.Labels); err != nil { - log.WithField("opts", opts).Errorf(ctx, "Calcium.ListWorkloads] store list failed: %+v", err) - } - return workloads, errors.WithStack(err) -} - -// ListNodeWorkloads list workloads belong to one node -func (c *Calcium) ListNodeWorkloads(ctx context.Context, nodename string, labels map[string]string) (workloads []*types.Workload, err error) { - logger := log.WithField("Calcium", "ListNodeWorkloads").WithField("nodename", nodename).WithField("labels", labels) - if nodename == "" { - return workloads, logger.ErrWithTracing(ctx, errors.WithStack(types.ErrEmptyNodeName)) - } - workloads, err = c.store.ListNodeWorkloads(ctx, nodename, labels) - return workloads, logger.ErrWithTracing(ctx, errors.WithStack(err)) -} - // GetWorkload get a workload func (c *Calcium) GetWorkload(ctx context.Context, id string) (workload *types.Workload, err error) { logger := log.WithField("Calcium", "GetWorkload").WithField("id", id) @@ -46,11 +28,20 @@ func (c *Calcium) GetWorkloads(ctx context.Context, ids []string) (workloads []* return workloads, log.WithField("Calcium", "GetWorkloads").WithField("ids", ids).ErrWithTracing(ctx, errors.WithStack(err)) } -func (c *Calcium) getWorkloadNode(ctx context.Context, id string) (*types.Node, error) { - w, err := c.GetWorkload(ctx, id) - if err != nil { - return nil, err +// ListWorkloads list workloads +func (c *Calcium) ListWorkloads(ctx context.Context, opts *types.ListWorkloadsOptions) (workloads []*types.Workload, err error) { + if workloads, err = c.store.ListWorkloads(ctx, opts.Appname, opts.Entrypoint, opts.Nodename, opts.Limit, opts.Labels); err != nil { + log.WithField("opts", opts).Errorf(ctx, "Calcium.ListWorkloads] store list failed: %+v", err) + } + return workloads, errors.WithStack(err) +} + +// ListNodeWorkloads list workloads belong to one node +func (c *Calcium) ListNodeWorkloads(ctx context.Context, nodename string, labels map[string]string) (workloads []*types.Workload, err error) { + logger := log.WithField("Calcium", "ListNodeWorkloads").WithField("nodename", nodename).WithField("labels", labels) + if nodename == "" { + return workloads, logger.ErrWithTracing(ctx, errors.WithStack(types.ErrEmptyNodeName)) } - node, err := c.GetNode(ctx, w.Nodename) - return node, err + workloads, err = c.store.ListNodeWorkloads(ctx, nodename, labels) + return workloads, logger.ErrWithTracing(ctx, errors.WithStack(err)) } diff --git a/cluster/calcium/workload_test.go b/cluster/calcium/workload_test.go index 8566c4903..8a826484a 100644 --- a/cluster/calcium/workload_test.go +++ b/cluster/calcium/workload_test.go @@ -11,50 +11,74 @@ import ( "github.com/stretchr/testify/mock" ) -func TestListWorkloads(t *testing.T) { +func TestGetWorkload(t *testing.T) { c := NewTestCluster() ctx := context.Background() + ID := "testID" - workloads := []*types.Workload{ - {ID: ID}, - } + workload := &types.Workload{ID: ID} + store := c.store.(*storemocks.Store) + store.On("GetWorkload", mock.Anything, mock.Anything).Return(workload, nil) + _, err := c.GetWorkload(ctx, "") + assert.Error(t, err) + + _, err = c.GetWorkload(ctx, ID) + assert.NoError(t, err) + +} + +func TestGetWorkloads(t *testing.T) { + c := NewTestCluster() + ctx := context.Background() + ID := "testID" + workload := &types.Workload{ID: ID} + workloads := []*types.Workload{workload} store := c.store.(*storemocks.Store) - store.On("ListWorkloads", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(workloads, nil) - store.On("ListNodeWorkloads", mock.Anything, mock.Anything, mock.Anything).Return(workloads, nil) + store.On("GetWorkloads", mock.Anything, mock.Anything).Return(workloads, nil) - cs, err := c.ListWorkloads(ctx, &types.ListWorkloadsOptions{Appname: "", Entrypoint: "", Nodename: ""}) + cs, err := c.GetWorkloads(ctx, []string{}) assert.NoError(t, err) assert.Equal(t, len(cs), 1) assert.Equal(t, cs[0].ID, ID) +} - _, err = c.ListNodeWorkloads(ctx, "", nil) +func TestListWorkloads(t *testing.T) { + c := NewTestCluster() + ctx := context.Background() + ID := "testID" + workloads := []*types.Workload{ + {ID: ID}, + } + + // failed by ListWorkloads + store := c.store.(*storemocks.Store) + store.On("ListWorkloads", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() + _, err := c.ListWorkloads(ctx, &types.ListWorkloadsOptions{Appname: "", Entrypoint: "", Nodename: ""}) assert.Error(t, err) - cs, err = c.ListNodeWorkloads(ctx, "nodename", nil) + // success + store.On("ListWorkloads", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(workloads, nil) + cs, err := c.ListWorkloads(ctx, &types.ListWorkloadsOptions{Appname: "", Entrypoint: "", Nodename: ""}) assert.NoError(t, err) assert.Equal(t, len(cs), 1) assert.Equal(t, cs[0].ID, ID) } -func TestGetWorkloads(t *testing.T) { +func TestListNodeWorkloads(t *testing.T) { c := NewTestCluster() ctx := context.Background() ID := "testID" - workload := &types.Workload{ID: ID} - workloads := []*types.Workload{workload} - - store := c.store.(*storemocks.Store) - store.On("GetWorkload", mock.Anything, mock.Anything).Return(workload, nil) - store.On("GetWorkloads", mock.Anything, mock.Anything).Return(workloads, nil) + workloads := []*types.Workload{ + {ID: ID}, + } - _, err := c.GetWorkload(ctx, "") + _, err := c.ListNodeWorkloads(ctx, "", nil) assert.Error(t, err) - savedWorkload, err := c.GetWorkload(ctx, "someid") - assert.NoError(t, err) - assert.Equal(t, savedWorkload.ID, ID) - cs, err := c.GetWorkloads(ctx, []string{}) + store := c.store.(*storemocks.Store) + store.On("ListNodeWorkloads", mock.Anything, mock.Anything, mock.Anything).Return(workloads, nil) + cs, err := c.ListNodeWorkloads(ctx, "nodename", nil) assert.NoError(t, err) assert.Equal(t, len(cs), 1) assert.Equal(t, cs[0].ID, ID) diff --git a/cluster/cluster.go b/cluster/cluster.go index 5c9aa23f5..e793a7557 100644 --- a/cluster/cluster.go +++ b/cluster/cluster.go @@ -63,7 +63,6 @@ type Cluster interface { NodeStatusStream(ctx context.Context) chan *types.NodeStatus // node resource NodeResource(ctx context.Context, nodename string, fix bool) (*types.NodeResource, error) - SendNodeMetrics(ctx context.Context, nodename string) // calculate capacity CalculateCapacity(context.Context, *types.DeployOptions) (*types.CapacityMessage, error) // meta workloads diff --git a/cluster/mocks/Cluster.go b/cluster/mocks/Cluster.go index e9d5af11e..39c478716 100644 --- a/cluster/mocks/Cluster.go +++ b/cluster/mocks/Cluster.go @@ -859,11 +859,6 @@ func (_m *Cluster) Send(ctx context.Context, opts *types.SendOptions) (chan *typ return r0, r1 } -// SendNodeMetrics provides a mock function with given fields: ctx, nodename -func (_m *Cluster) SendNodeMetrics(ctx context.Context, nodename string) { - _m.Called(ctx, nodename) -} - // SetNode provides a mock function with given fields: ctx, opts func (_m *Cluster) SetNode(ctx context.Context, opts *types.SetNodeOptions) (*types.Node, error) { ret := _m.Called(ctx, opts) diff --git a/engine/factory/factory.go b/engine/factory/factory.go index 8e9e48b91..5cb753436 100644 --- a/engine/factory/factory.go +++ b/engine/factory/factory.go @@ -159,7 +159,7 @@ func GetEngineFromCache(endpoint, ca, cert, key string) engine.API { // RemoveEngineFromCache . func RemoveEngineFromCache(endpoint, ca, cert, key string) { cacheKey := getEngineCacheKey(endpoint, ca, cert, key) - log.Infof(context.TODO(), "[RemoveEngineFromCache] remove engine %v from cache", cacheKey) + log.Infof(nil, "[RemoveEngineFromCache] remove engine %v from cache", cacheKey) // nolint engineCache.Delete(cacheKey) } diff --git a/metrics/handler.go b/metrics/handler.go index 433b11b37..6a9619d00 100644 --- a/metrics/handler.go +++ b/metrics/handler.go @@ -20,7 +20,12 @@ func (m *Metrics) ResourceMiddleware(cluster cluster.Cluster) func(http.Handler) log.Errorf(ctx, "[ResourceMiddleware] Get all nodes err %v", err) } for node := range nodes { - cluster.SendNodeMetrics(ctx, node.Name) + metrics, err := m.rmgr.GetNodeMetrics(ctx, node) + if err != nil { + log.Errorf(ctx, "[ResourceMiddleware] Get metrics failed %v", err) + continue + } + m.SendMetrics(metrics...) } h.ServeHTTP(w, r) }) diff --git a/metrics/metrics.go b/metrics/metrics.go index fb39e2601..ef9606b74 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -31,45 +31,8 @@ type Metrics struct { statsdClient *statsdlib.Client Collectors map[string]prometheus.Collector -} - -// Lazy connect -func (m *Metrics) checkConn() error { - if m.statsdClient != nil { - return nil - } - var err error - // We needn't try to renew/reconnect because of only supporting UDP protocol now - // We should add an `errorCount` to reconnect when implementing TCP protocol - if m.statsdClient, err = statsdlib.New(m.StatsdAddr, statsdlib.WithErrorHandler(func(err error) { - log.Errorf(nil, "[statsd] Sending statsd failed: %v", err) //nolint - })); err != nil { - log.Errorf(nil, "[statsd] Connect statsd failed: %v", err) //nolint - return err - } - return nil -} - -func (m *Metrics) gauge(key string, value float64) error { - if m.StatsdAddr == "" { - return nil - } - if err := m.checkConn(); err != nil { - return err - } - m.statsdClient.Gauge(key, value) - return nil -} -func (m *Metrics) count(key string, n int, rate float32) error { - if m.StatsdAddr == "" { - return nil - } - if err := m.checkConn(); err != nil { - return err - } - m.statsdClient.Count(key, n, rate) - return nil + rmgr resources.Manager } // SendDeployCount update deploy counter @@ -113,11 +76,50 @@ func (m *Metrics) SendMetrics(metrics ...*resources.Metrics) { log.Errorf(nil, "[SendMetrics] Error occurred while sending %v data to statsd: %v", metric.Name, err) //nolint } default: - log.Errorf(nil, "[SendMetrics] Unknown collector type: %T", collector) //nolint + log.Errorf(nil, "[SendMetrics] Unknown collector type: %T", collector) // nolint } } } +// Lazy connect +func (m *Metrics) checkConn() error { + if m.statsdClient != nil { + return nil + } + var err error + // We needn't try to renew/reconnect because of only supporting UDP protocol now + // We should add an `errorCount` to reconnect when implementing TCP protocol + if m.statsdClient, err = statsdlib.New(m.StatsdAddr, statsdlib.WithErrorHandler(func(err error) { + log.Errorf(nil, "[statsd] Sending statsd failed: %v", err) //nolint + })); err != nil { + log.Errorf(nil, "[statsd] Connect statsd failed: %v", err) //nolint + return err + } + return nil +} + +func (m *Metrics) gauge(key string, value float64) error { + if m.StatsdAddr == "" { + return nil + } + if err := m.checkConn(); err != nil { + return err + } + m.statsdClient.Gauge(key, value) + return nil +} + +func (m *Metrics) count(key string, n int, rate float32) error { + if m.StatsdAddr == "" { + return nil + } + if err := m.checkConn(); err != nil { + return err + } + m.statsdClient.Count(key, n, rate) + return nil +} + // Client is a metrics obj var Client = Metrics{} var once sync.Once @@ -128,11 +130,16 @@ func InitMetrics(config types.Config, metricsDescriptions []*resources.MetricsDe if err != nil { return err } + rmgr, err := resources.NewPluginsManager(config) + if err != nil { + return err + } Client = Metrics{ Config: config, StatsdAddr: config.Statsd, Hostname: utils.CleanStatsdMetrics(hostname), Collectors: map[string]prometheus.Collector{}, + rmgr: rmgr, } for _, desc := range metricsDescriptions { diff --git a/resources/binary.go b/resources/binary.go index ad8ac405f..48d7c5b07 100644 --- a/resources/binary.go +++ b/resources/binary.go @@ -164,9 +164,9 @@ func (bp *BinaryPlugin) RemoveNode(ctx context.Context, nodename string) (*Remov } // GetMostIdleNode . -func (bp *BinaryPlugin) GetMostIdleNode(ctx context.Context, nodeNames []string) (*GetMostIdleNodeResponse, error) { +func (bp *BinaryPlugin) GetMostIdleNode(ctx context.Context, nodenames []string) (*GetMostIdleNodeResponse, error) { req := GetMostIdleNodeRequest{ - NodeNames: nodeNames, + NodeNames: nodenames, } resp := &GetMostIdleNodeResponse{} return resp, bp.call(ctx, getMostIdleNodeCommand, req, resp) @@ -179,15 +179,15 @@ func (bp *BinaryPlugin) GetMetricsDescription(ctx context.Context) (*GetMetricsD return resp, bp.call(ctx, getMetricsDescriptionCommand, req, resp) } -// ConvertNodeResourceInfoToMetrics . -func (bp *BinaryPlugin) ConvertNodeResourceInfoToMetrics(ctx context.Context, podname string, nodename string, nodeResourceInfo *NodeResourceInfo) (*ConvertNodeResourceInfoToMetricsResponse, error) { - req := ConvertNodeResourceInfoToMetricsRequest{ +// GetNodeMetrics . +func (bp *BinaryPlugin) GetNodeMetrics(ctx context.Context, podname string, nodename string, nodeResourceInfo *NodeResourceInfo) (*GetNodeMetricsResponse, error) { + req := GetNodeMetricsRequest{ PodName: podname, NodeName: nodename, Capacity: nodeResourceInfo.Capacity, Usage: nodeResourceInfo.Usage, } - resp := &ConvertNodeResourceInfoToMetricsResponse{} + resp := &GetNodeMetricsResponse{} return resp, bp.call(ctx, resolveNodeResourceInfoToMetricsCommand, req, resp) } diff --git a/resources/cpumem/cpumem.go b/resources/cpumem/cpumem.go index 7141a08f5..248515a87 100644 --- a/resources/cpumem/cpumem.go +++ b/resources/cpumem/cpumem.go @@ -87,13 +87,13 @@ func (c *Plugin) GetRemapArgs(ctx context.Context, nodename string, workloadMap } // GetNodesDeployCapacity . -func (c *Plugin) GetNodesDeployCapacity(ctx context.Context, nodeNames []string, resourceOpts coretypes.WorkloadResourceOpts) (*resources.GetNodesDeployCapacityResponse, error) { +func (c *Plugin) GetNodesDeployCapacity(ctx context.Context, nodenames []string, resourceOpts coretypes.WorkloadResourceOpts) (*resources.GetNodesDeployCapacityResponse, error) { workloadResourceOpts := &types.WorkloadResourceOpts{} if err := workloadResourceOpts.ParseFromRawParams(coretypes.RawParams(resourceOpts)); err != nil { return nil, err } - nodesDeployCapacity, total, err := c.c.GetNodesDeployCapacity(ctx, nodeNames, workloadResourceOpts) + nodesDeployCapacity, total, err := c.c.GetNodesDeployCapacity(ctx, nodenames, workloadResourceOpts) if err != nil { return nil, err } @@ -106,8 +106,8 @@ func (c *Plugin) GetNodesDeployCapacity(ctx context.Context, nodeNames []string, } // GetMostIdleNode . -func (c *Plugin) GetMostIdleNode(ctx context.Context, nodeNames []string) (*resources.GetMostIdleNodeResponse, error) { - nodename, priority, err := c.c.GetMostIdleNode(ctx, nodeNames) +func (c *Plugin) GetMostIdleNode(ctx context.Context, nodenames []string) (*resources.GetMostIdleNodeResponse, error) { + nodename, priority, err := c.c.GetMostIdleNode(ctx, nodenames) if err != nil { return nil, err } @@ -302,8 +302,8 @@ func (c *Plugin) GetMetricsDescription(ctx context.Context) (*resources.GetMetri return resp, mapstructure.Decode(c.c.GetMetricsDescription(), resp) } -// ConvertNodeResourceInfoToMetrics . -func (c *Plugin) ConvertNodeResourceInfoToMetrics(ctx context.Context, podname string, nodename string, info *resources.NodeResourceInfo) (*resources.ConvertNodeResourceInfoToMetricsResponse, error) { +// GetNodeMetrics . +func (c *Plugin) GetNodeMetrics(ctx context.Context, podname string, nodename string, info *resources.NodeResourceInfo) (*resources.GetNodeMetricsResponse, error) { capacity, usage := &types.NodeResourceArgs{}, &types.NodeResourceArgs{} if err := capacity.ParseFromRawParams(coretypes.RawParams(info.Capacity)); err != nil { return nil, err @@ -312,7 +312,7 @@ func (c *Plugin) ConvertNodeResourceInfoToMetrics(ctx context.Context, podname s return nil, err } - metrics := c.c.ConvertNodeResourceInfoToMetrics(podname, nodename, capacity, usage) - resp := &resources.ConvertNodeResourceInfoToMetricsResponse{} + metrics := c.c.GetNodeMetrics(podname, nodename, capacity, usage) + resp := &resources.GetNodeMetricsResponse{} return resp, mapstructure.Decode(metrics, resp) } diff --git a/resources/cpumem/models/info.go b/resources/cpumem/models/info.go index 057738ed0..b31c9b488 100644 --- a/resources/cpumem/models/info.go +++ b/resources/cpumem/models/info.go @@ -75,7 +75,7 @@ func (c *CPUMem) GetNodeResourceInfo(ctx context.Context, node string, workloadR // calculateNodeResourceArgs priority: node resource opts > node resource args > workload resource args list func (c *CPUMem) calculateNodeResourceArgs(origin *types.NodeResourceArgs, nodeResourceOpts *types.NodeResourceOpts, nodeResourceArgs *types.NodeResourceArgs, workloadResourceArgs []*types.WorkloadResourceArgs, delta bool, incr bool) (res *types.NodeResourceArgs) { if origin == nil || !delta { - res = &types.NodeResourceArgs{} + res = (&types.NodeResourceArgs{}).DeepCopy() } else { res = origin.DeepCopy() } diff --git a/resources/cpumem/models/metrics.go b/resources/cpumem/models/metrics.go index f30a65e21..c5c2c0f73 100644 --- a/resources/cpumem/models/metrics.go +++ b/resources/cpumem/models/metrics.go @@ -37,7 +37,7 @@ func (c *CPUMem) GetMetricsDescription() []map[string]interface{} { } } -func (c *CPUMem) ConvertNodeResourceInfoToMetrics(podname string, nodename string, nodeResourceCapacity *types.NodeResourceArgs, nodeResourceUsage *types.NodeResourceArgs) []map[string]interface{} { +func (c *CPUMem) GetNodeMetrics(podname string, nodename string, nodeResourceCapacity *types.NodeResourceArgs, nodeResourceUsage *types.NodeResourceArgs) []map[string]interface{} { cleanedNodeName := strings.ReplaceAll(nodename, ".", "_") metrics := []map[string]interface{}{ { diff --git a/resources/manager.go b/resources/manager.go index 1c119b8a6..7916a0477 100644 --- a/resources/manager.go +++ b/resources/manager.go @@ -13,23 +13,23 @@ import ( ) // GetMostIdleNode . -func (pm *PluginsManager) GetMostIdleNode(ctx context.Context, nodeNames []string) (string, error) { +func (pm *PluginsManager) GetMostIdleNode(ctx context.Context, nodenames []string) (string, error) { var mostIdleNode *GetMostIdleNodeResponse - if len(nodeNames) == 0 { + if len(nodenames) == 0 { return "", errors.Wrap(types.ErrGetMostIdleNodeFailed, "empty node names") } respMap, err := callPlugins(ctx, pm.plugins, func(plugin Plugin) (*GetMostIdleNodeResponse, error) { - resp, err := plugin.GetMostIdleNode(ctx, nodeNames) + resp, err := plugin.GetMostIdleNode(ctx, nodenames) if err != nil { - log.Errorf(ctx, "[GetMostIdleNode] plugin %v failed to get the most idle node of %v, err: %v", plugin.Name(), nodeNames, err) + log.Errorf(ctx, "[GetMostIdleNode] plugin %v failed to get the most idle node of %v, err: %v", plugin.Name(), nodenames, err) } return resp, err }) if err != nil { - log.Errorf(ctx, "[GetMostIdleNode] failed to get the most idle node of %v", nodeNames) + log.Errorf(ctx, "[GetMostIdleNode] failed to get the most idle node of %v", nodenames) return "", err } @@ -48,13 +48,13 @@ func (pm *PluginsManager) GetMostIdleNode(ctx context.Context, nodeNames []strin // GetNodesDeployCapacity returns available nodes which meet all the requirements // the caller should require locks // pure calculation -func (pm *PluginsManager) GetNodesDeployCapacity(ctx context.Context, nodeNames []string, resourceOpts types.WorkloadResourceOpts) (map[string]*NodeCapacityInfo, int, error) { +func (pm *PluginsManager) GetNodesDeployCapacity(ctx context.Context, nodenames []string, resourceOpts types.WorkloadResourceOpts) (map[string]*NodeCapacityInfo, int, error) { var res map[string]*NodeCapacityInfo respMap, err := callPlugins(ctx, pm.plugins, func(plugin Plugin) (*GetNodesDeployCapacityResponse, error) { - resp, err := plugin.GetNodesDeployCapacity(ctx, nodeNames, resourceOpts) + resp, err := plugin.GetNodesDeployCapacity(ctx, nodenames, resourceOpts) if err != nil { - log.Errorf(ctx, "[GetNodesDeployCapacity] plugin %v failed to get available nodeNames, request %v, err %v", plugin.Name(), resourceOpts, err) + log.Errorf(ctx, "[GetNodesDeployCapacity] plugin %v failed to get available nodenames, request %v, err %v", plugin.Name(), resourceOpts, err) } return resp, err }) @@ -63,7 +63,7 @@ func (pm *PluginsManager) GetNodesDeployCapacity(ctx context.Context, nodeNames return nil, 0, err } - // get nodeNames with all resource capacities > 0 + // get nodenames with all resource capacities > 0 for _, infoMap := range respMap { res = pm.mergeNodeCapacityInfo(res, infoMap.Nodes) } @@ -377,20 +377,20 @@ func (pm *PluginsManager) GetMetricsDescription(ctx context.Context) ([]*Metrics return metricsDescriptions, nil } -// ConvertNodeResourceInfoToMetrics . -func (pm *PluginsManager) ConvertNodeResourceInfoToMetrics(ctx context.Context, podname string, nodename string, nodeResourceCapacity map[string]types.NodeResourceArgs, nodeResourceUsage map[string]types.NodeResourceArgs) ([]*Metrics, error) { +// GetNodeMetrics . +func (pm *PluginsManager) GetNodeMetrics(ctx context.Context, node *types.Node) ([]*Metrics, error) { var metrics []*Metrics - respMap, err := callPlugins(ctx, pm.plugins, func(plugin Plugin) (*ConvertNodeResourceInfoToMetricsResponse, error) { - capacity, usage := nodeResourceCapacity[plugin.Name()], nodeResourceUsage[plugin.Name()] - resp, err := plugin.ConvertNodeResourceInfoToMetrics(ctx, podname, nodename, &NodeResourceInfo{Capacity: capacity, Usage: usage}) + respMap, err := callPlugins(ctx, pm.plugins, func(plugin Plugin) (*GetNodeMetricsResponse, error) { + capacity, usage := node.Resource.Capacity[plugin.Name()], node.Resource.Usage[plugin.Name()] + resp, err := plugin.GetNodeMetrics(ctx, node.Podname, node.Name, &NodeResourceInfo{Capacity: capacity, Usage: usage}) if err != nil { - log.Errorf(ctx, "[ConvertNodeResourceInfoToMetrics] plugin %v failed to convert node resource info to metrics, err: %v", plugin.Name(), err) + log.Errorf(ctx, "[GetNodeMetrics] plugin %v failed to convert node resource info to metrics, err: %v", plugin.Name(), err) } return resp, err }) if err != nil { - log.Errorf(ctx, "[ConvertNodeResourceInfoToMetrics] failed to convert node resource info to metrics") + log.Errorf(ctx, "[GetNodeMetrics] failed to convert node resource info to metrics") return nil, err } diff --git a/resources/mocks/Manager.go b/resources/mocks/Manager.go index 66a4f135f..acac6d0c3 100644 --- a/resources/mocks/Manager.go +++ b/resources/mocks/Manager.go @@ -93,29 +93,6 @@ func (_m *Manager) Alloc(_a0 context.Context, _a1 string, _a2 int, _a3 types.Wor return r0, r1, r2 } -// ConvertNodeResourceInfoToMetrics provides a mock function with given fields: _a0, _a1, _a2, _a3, _a4 -func (_m *Manager) ConvertNodeResourceInfoToMetrics(_a0 context.Context, _a1 string, _a2 string, _a3 map[string]types.NodeResourceArgs, _a4 map[string]types.NodeResourceArgs) ([]*resources.Metrics, error) { - ret := _m.Called(_a0, _a1, _a2, _a3, _a4) - - var r0 []*resources.Metrics - if rf, ok := ret.Get(0).(func(context.Context, string, string, map[string]types.NodeResourceArgs, map[string]types.NodeResourceArgs) []*resources.Metrics); ok { - r0 = rf(_a0, _a1, _a2, _a3, _a4) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).([]*resources.Metrics) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, string, map[string]types.NodeResourceArgs, map[string]types.NodeResourceArgs) error); ok { - r1 = rf(_a0, _a1, _a2, _a3, _a4) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // GetMetricsDescription provides a mock function with given fields: _a0 func (_m *Manager) GetMetricsDescription(_a0 context.Context) ([]*resources.MetricsDescription, error) { ret := _m.Called(_a0) @@ -160,6 +137,29 @@ func (_m *Manager) GetMostIdleNode(_a0 context.Context, _a1 []string) (string, e return r0, r1 } +// GetNodeMetrics provides a mock function with given fields: _a0, _a1 +func (_m *Manager) GetNodeMetrics(_a0 context.Context, _a1 *types.Node) ([]*resources.Metrics, error) { + ret := _m.Called(_a0, _a1) + + var r0 []*resources.Metrics + if rf, ok := ret.Get(0).(func(context.Context, *types.Node) []*resources.Metrics); ok { + r0 = rf(_a0, _a1) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*resources.Metrics) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, *types.Node) error); ok { + r1 = rf(_a0, _a1) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + // GetNodeResourceInfo provides a mock function with given fields: _a0, _a1, _a2, _a3 func (_m *Manager) GetNodeResourceInfo(_a0 context.Context, _a1 string, _a2 []*types.Workload, _a3 bool) (map[string]types.NodeResourceArgs, map[string]types.NodeResourceArgs, []string, error) { ret := _m.Called(_a0, _a1, _a2, _a3) diff --git a/resources/mocks/Plugin.go b/resources/mocks/Plugin.go index decdcec71..468cd12fb 100644 --- a/resources/mocks/Plugin.go +++ b/resources/mocks/Plugin.go @@ -41,29 +41,6 @@ func (_m *Plugin) AddNode(ctx context.Context, nodename string, resourceOpts typ return r0, r1 } -// ConvertNodeResourceInfoToMetrics provides a mock function with given fields: ctx, podname, nodename, nodeResourceInfo -func (_m *Plugin) ConvertNodeResourceInfoToMetrics(ctx context.Context, podname string, nodename string, nodeResourceInfo *resources.NodeResourceInfo) (*resources.ConvertNodeResourceInfoToMetricsResponse, error) { - ret := _m.Called(ctx, podname, nodename, nodeResourceInfo) - - var r0 *resources.ConvertNodeResourceInfoToMetricsResponse - if rf, ok := ret.Get(0).(func(context.Context, string, string, *resources.NodeResourceInfo) *resources.ConvertNodeResourceInfoToMetricsResponse); ok { - r0 = rf(ctx, podname, nodename, nodeResourceInfo) - } else { - if ret.Get(0) != nil { - r0 = ret.Get(0).(*resources.ConvertNodeResourceInfoToMetricsResponse) - } - } - - var r1 error - if rf, ok := ret.Get(1).(func(context.Context, string, string, *resources.NodeResourceInfo) error); ok { - r1 = rf(ctx, podname, nodename, nodeResourceInfo) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - // GetDeployArgs provides a mock function with given fields: ctx, nodename, deployCount, resourceOpts func (_m *Plugin) GetDeployArgs(ctx context.Context, nodename string, deployCount int, resourceOpts types.WorkloadResourceOpts) (*resources.GetDeployArgsResponse, error) { ret := _m.Called(ctx, nodename, deployCount, resourceOpts) @@ -110,13 +87,13 @@ func (_m *Plugin) GetMetricsDescription(ctx context.Context) (*resources.GetMetr return r0, r1 } -// GetMostIdleNode provides a mock function with given fields: ctx, nodeNames -func (_m *Plugin) GetMostIdleNode(ctx context.Context, nodeNames []string) (*resources.GetMostIdleNodeResponse, error) { - ret := _m.Called(ctx, nodeNames) +// GetMostIdleNode provides a mock function with given fields: ctx, nodenames +func (_m *Plugin) GetMostIdleNode(ctx context.Context, nodenames []string) (*resources.GetMostIdleNodeResponse, error) { + ret := _m.Called(ctx, nodenames) var r0 *resources.GetMostIdleNodeResponse if rf, ok := ret.Get(0).(func(context.Context, []string) *resources.GetMostIdleNodeResponse); ok { - r0 = rf(ctx, nodeNames) + r0 = rf(ctx, nodenames) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*resources.GetMostIdleNodeResponse) @@ -125,7 +102,30 @@ func (_m *Plugin) GetMostIdleNode(ctx context.Context, nodeNames []string) (*res var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string) error); ok { - r1 = rf(ctx, nodeNames) + r1 = rf(ctx, nodenames) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// GetNodeMetrics provides a mock function with given fields: ctx, podname, nodename, nodeResourceInfo +func (_m *Plugin) GetNodeMetrics(ctx context.Context, podname string, nodename string, nodeResourceInfo *resources.NodeResourceInfo) (*resources.GetNodeMetricsResponse, error) { + ret := _m.Called(ctx, podname, nodename, nodeResourceInfo) + + var r0 *resources.GetNodeMetricsResponse + if rf, ok := ret.Get(0).(func(context.Context, string, string, *resources.NodeResourceInfo) *resources.GetNodeMetricsResponse); ok { + r0 = rf(ctx, podname, nodename, nodeResourceInfo) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*resources.GetNodeMetricsResponse) + } + } + + var r1 error + if rf, ok := ret.Get(1).(func(context.Context, string, string, *resources.NodeResourceInfo) error); ok { + r1 = rf(ctx, podname, nodename, nodeResourceInfo) } else { r1 = ret.Error(1) } @@ -156,13 +156,13 @@ func (_m *Plugin) GetNodeResourceInfo(ctx context.Context, nodename string, work return r0, r1 } -// GetNodesDeployCapacity provides a mock function with given fields: ctx, nodeNames, resourceOpts -func (_m *Plugin) GetNodesDeployCapacity(ctx context.Context, nodeNames []string, resourceOpts types.WorkloadResourceOpts) (*resources.GetNodesDeployCapacityResponse, error) { - ret := _m.Called(ctx, nodeNames, resourceOpts) +// GetNodesDeployCapacity provides a mock function with given fields: ctx, nodenames, resourceOpts +func (_m *Plugin) GetNodesDeployCapacity(ctx context.Context, nodenames []string, resourceOpts types.WorkloadResourceOpts) (*resources.GetNodesDeployCapacityResponse, error) { + ret := _m.Called(ctx, nodenames, resourceOpts) var r0 *resources.GetNodesDeployCapacityResponse if rf, ok := ret.Get(0).(func(context.Context, []string, types.WorkloadResourceOpts) *resources.GetNodesDeployCapacityResponse); ok { - r0 = rf(ctx, nodeNames, resourceOpts) + r0 = rf(ctx, nodenames, resourceOpts) } else { if ret.Get(0) != nil { r0 = ret.Get(0).(*resources.GetNodesDeployCapacityResponse) @@ -171,7 +171,7 @@ func (_m *Plugin) GetNodesDeployCapacity(ctx context.Context, nodeNames []string var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string, types.WorkloadResourceOpts) error); ok { - r1 = rf(ctx, nodeNames, resourceOpts) + r1 = rf(ctx, nodenames, resourceOpts) } else { r1 = ret.Error(1) } diff --git a/resources/plugin.go b/resources/plugin.go index 067d80ab8..0ffb14079 100644 --- a/resources/plugin.go +++ b/resources/plugin.go @@ -47,10 +47,10 @@ type Plugin interface { GetRemapArgs(ctx context.Context, nodename string, workloadMap map[string]*coretypes.Workload) (*GetRemapArgsResponse, error) // GetNodesDeployCapacity returns available nodes and total capacity - GetNodesDeployCapacity(ctx context.Context, nodeNames []string, resourceOpts coretypes.WorkloadResourceOpts) (*GetNodesDeployCapacityResponse, error) + GetNodesDeployCapacity(ctx context.Context, nodenames []string, resourceOpts coretypes.WorkloadResourceOpts) (*GetNodesDeployCapacityResponse, error) // GetMostIdleNode returns the most idle node for building - GetMostIdleNode(ctx context.Context, nodeNames []string) (*GetMostIdleNodeResponse, error) + GetMostIdleNode(ctx context.Context, nodenames []string) (*GetMostIdleNodeResponse, error) // GetNodeResourceInfo returns total resource info and available resource info of the node, format: {"cpu": 2} // also returns diffs, format: ["node.VolumeUsed != sum(workload.VolumeRequest"] @@ -78,8 +78,8 @@ type Plugin interface { // GetMetricsDescription returns metrics description GetMetricsDescription(ctx context.Context) (*GetMetricsDescriptionResponse, error) - // ConvertNodeResourceInfoToMetrics resolves node resource info to metrics - ConvertNodeResourceInfoToMetrics(ctx context.Context, podname string, nodename string, nodeResourceInfo *NodeResourceInfo) (*ConvertNodeResourceInfoToMetricsResponse, error) + // GetNodeMetrics resolves node resource info to metrics + GetNodeMetrics(ctx context.Context, podname string, nodename string, nodeResourceInfo *NodeResourceInfo) (*GetNodeMetricsResponse, error) // Name returns the name of plugin Name() string @@ -104,7 +104,7 @@ type Manager interface { RollbackRealloc(context.Context, string, map[string]types.WorkloadResourceArgs) error GetMetricsDescription(context.Context) ([]*MetricsDescription, error) - ConvertNodeResourceInfoToMetrics(context.Context, string, string, map[string]types.NodeResourceArgs, map[string]types.NodeResourceArgs) ([]*Metrics, error) + GetNodeMetrics(context.Context, *types.Node) ([]*Metrics, error) AddNode(context.Context, string, types.NodeResourceOpts, *enginetypes.Info) (map[string]types.NodeResourceArgs, map[string]types.NodeResourceArgs, error) RemoveNode(context.Context, string) error diff --git a/resources/types.go b/resources/types.go index 06afaf998..9219a1409 100644 --- a/resources/types.go +++ b/resources/types.go @@ -170,8 +170,8 @@ type MetricsDescription struct { // GetMetricsDescriptionResponse . type GetMetricsDescriptionResponse []*MetricsDescription -// ConvertNodeResourceInfoToMetricsRequest . -type ConvertNodeResourceInfoToMetricsRequest struct { +// GetNodeMetricsRequest . +type GetNodeMetricsRequest struct { PodName string `json:"pod"` NodeName string `json:"node"` Capacity types.NodeResourceArgs `json:"capacity"` @@ -186,5 +186,5 @@ type Metrics struct { Value string `json:"value"` } -// ConvertNodeResourceInfoToMetricsResponse . -type ConvertNodeResourceInfoToMetricsResponse []*Metrics +// GetNodeMetricsResponse . +type GetNodeMetricsResponse []*Metrics diff --git a/resources/volume/models/metrics.go b/resources/volume/models/metrics.go index 7f793454d..ac5f4e394 100644 --- a/resources/volume/models/metrics.go +++ b/resources/volume/models/metrics.go @@ -25,7 +25,7 @@ func (v *Volume) GetMetricsDescription() []map[string]interface{} { } } -func (v *Volume) ConvertNodeResourceInfoToMetrics(podname string, nodename string, nodeResourceCapacity *types.NodeResourceArgs, nodeResourceUsage *types.NodeResourceArgs) []map[string]interface{} { +func (v *Volume) GetNodeMetrics(podname string, nodename string, nodeResourceCapacity *types.NodeResourceArgs, nodeResourceUsage *types.NodeResourceArgs) []map[string]interface{} { cleanedNodeName := strings.ReplaceAll(nodename, ".", "_") metrics := []map[string]interface{}{ { diff --git a/resources/volume/volume.go b/resources/volume/volume.go index 182933fe1..d6c67a39c 100644 --- a/resources/volume/volume.go +++ b/resources/volume/volume.go @@ -86,13 +86,13 @@ func (v *Plugin) GetRemapArgs(ctx context.Context, nodename string, workloadMap } // GetNodesDeployCapacity . -func (v *Plugin) GetNodesDeployCapacity(ctx context.Context, nodeNames []string, resourceOpts coretypes.WorkloadResourceOpts) (*resources.GetNodesDeployCapacityResponse, error) { +func (v *Plugin) GetNodesDeployCapacity(ctx context.Context, nodenames []string, resourceOpts coretypes.WorkloadResourceOpts) (*resources.GetNodesDeployCapacityResponse, error) { workloadResourceOpts := &types.WorkloadResourceOpts{} if err := workloadResourceOpts.ParseFromRawParams(coretypes.RawParams(resourceOpts)); err != nil { return nil, err } - nodesDeployCapacity, total, err := v.v.GetNodesDeployCapacity(ctx, nodeNames, workloadResourceOpts) + nodesDeployCapacity, total, err := v.v.GetNodesDeployCapacity(ctx, nodenames, workloadResourceOpts) if err != nil { return nil, err } @@ -105,8 +105,8 @@ func (v *Plugin) GetNodesDeployCapacity(ctx context.Context, nodeNames []string, } // GetMostIdleNode . -func (v *Plugin) GetMostIdleNode(ctx context.Context, nodeNames []string) (*resources.GetMostIdleNodeResponse, error) { - nodename, priority, err := v.v.GetMostIdleNode(ctx, nodeNames) +func (v *Plugin) GetMostIdleNode(ctx context.Context, nodenames []string) (*resources.GetMostIdleNodeResponse, error) { + nodename, priority, err := v.v.GetMostIdleNode(ctx, nodenames) if err != nil { return nil, err } @@ -292,8 +292,8 @@ func (v *Plugin) GetMetricsDescription(ctx context.Context) (*resources.GetMetri return resp, mapstructure.Decode(v.v.GetMetricsDescription(), resp) } -// ConvertNodeResourceInfoToMetrics . -func (v *Plugin) ConvertNodeResourceInfoToMetrics(ctx context.Context, podname string, nodename string, info *resources.NodeResourceInfo) (*resources.ConvertNodeResourceInfoToMetricsResponse, error) { +// GetNodeMetrics . +func (v *Plugin) GetNodeMetrics(ctx context.Context, podname string, nodename string, info *resources.NodeResourceInfo) (*resources.GetNodeMetricsResponse, error) { capacity, usage := &types.NodeResourceArgs{}, &types.NodeResourceArgs{} if err := capacity.ParseFromRawParams(coretypes.RawParams(info.Capacity)); err != nil { return nil, err @@ -302,7 +302,7 @@ func (v *Plugin) ConvertNodeResourceInfoToMetrics(ctx context.Context, podname s return nil, err } - metrics := v.v.ConvertNodeResourceInfoToMetrics(podname, nodename, capacity, usage) - resp := &resources.ConvertNodeResourceInfoToMetricsResponse{} + metrics := v.v.GetNodeMetrics(podname, nodename, capacity, usage) + resp := &resources.GetNodeMetricsResponse{} return resp, mapstructure.Decode(metrics, resp) } diff --git a/rpc/gen/core.pb.go b/rpc/gen/core.pb.go index 621d0c2ad..5b55e44ec 100644 --- a/rpc/gen/core.pb.go +++ b/rpc/gen/core.pb.go @@ -2090,19 +2090,18 @@ type Workload struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Podname string `protobuf:"bytes,2,opt,name=podname,proto3" json:"podname,omitempty"` - Nodename string `protobuf:"bytes,3,opt,name=nodename,proto3" json:"nodename,omitempty"` - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - Privileged bool `protobuf:"varint,5,opt,name=privileged,proto3" json:"privileged,omitempty"` - Labels map[string]string `protobuf:"bytes,6,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Publish map[string]string `protobuf:"bytes,7,rep,name=publish,proto3" json:"publish,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Image string `protobuf:"bytes,8,opt,name=image,proto3" json:"image,omitempty"` - Status *WorkloadStatus `protobuf:"bytes,9,opt,name=status,proto3" json:"status,omitempty"` - // Resource resource = 10; - CreateTime int64 `protobuf:"varint,11,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` - Env []string `protobuf:"bytes,12,rep,name=env,proto3" json:"env,omitempty"` - ResourceArgs string `protobuf:"bytes,13,opt,name=resource_args,json=resourceArgs,proto3" json:"resource_args,omitempty"` + Id string `protobuf:"bytes,1001,opt,name=id,proto3" json:"id,omitempty"` + Podname string `protobuf:"bytes,1002,opt,name=podname,proto3" json:"podname,omitempty"` + Nodename string `protobuf:"bytes,1003,opt,name=nodename,proto3" json:"nodename,omitempty"` + Name string `protobuf:"bytes,1004,opt,name=name,proto3" json:"name,omitempty"` + Privileged bool `protobuf:"varint,1005,opt,name=privileged,proto3" json:"privileged,omitempty"` + Labels map[string]string `protobuf:"bytes,1006,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Publish map[string]string `protobuf:"bytes,1007,rep,name=publish,proto3" json:"publish,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Image string `protobuf:"bytes,1008,opt,name=image,proto3" json:"image,omitempty"` + Status *WorkloadStatus `protobuf:"bytes,1009,opt,name=status,proto3" json:"status,omitempty"` + CreateTime int64 `protobuf:"varint,1010,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` + Env []string `protobuf:"bytes,1011,rep,name=env,proto3" json:"env,omitempty"` + ResourceArgs string `protobuf:"bytes,1012,opt,name=resource_args,json=resourceArgs,proto3" json:"resource_args,omitempty"` } func (x *Workload) Reset() { @@ -2226,16 +2225,16 @@ type WorkloadStatus struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Running bool `protobuf:"varint,2,opt,name=running,proto3" json:"running,omitempty"` - Healthy bool `protobuf:"varint,3,opt,name=healthy,proto3" json:"healthy,omitempty"` - Networks map[string]string `protobuf:"bytes,4,rep,name=networks,proto3" json:"networks,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Extension []byte `protobuf:"bytes,5,opt,name=extension,proto3" json:"extension,omitempty"` - Ttl int64 `protobuf:"varint,6,opt,name=ttl,proto3" json:"ttl,omitempty"` + Id string `protobuf:"bytes,1001,opt,name=id,proto3" json:"id,omitempty"` + Running bool `protobuf:"varint,1002,opt,name=running,proto3" json:"running,omitempty"` + Healthy bool `protobuf:"varint,1003,opt,name=healthy,proto3" json:"healthy,omitempty"` + Networks map[string]string `protobuf:"bytes,1004,rep,name=networks,proto3" json:"networks,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Extension []byte `protobuf:"bytes,1005,opt,name=extension,proto3" json:"extension,omitempty"` + Ttl int64 `protobuf:"varint,1006,opt,name=ttl,proto3" json:"ttl,omitempty"` // extra fields used to set workload status - Appname string `protobuf:"bytes,7,opt,name=appname,proto3" json:"appname,omitempty"` - Nodename string `protobuf:"bytes,8,opt,name=nodename,proto3" json:"nodename,omitempty"` - Entrypoint string `protobuf:"bytes,9,opt,name=entrypoint,proto3" json:"entrypoint,omitempty"` + Appname string `protobuf:"bytes,1007,opt,name=appname,proto3" json:"appname,omitempty"` + Nodename string `protobuf:"bytes,1008,opt,name=nodename,proto3" json:"nodename,omitempty"` + Entrypoint string `protobuf:"bytes,1009,opt,name=entrypoint,proto3" json:"entrypoint,omitempty"` } func (x *WorkloadStatus) Reset() { @@ -2338,7 +2337,7 @@ type WorkloadsStatus struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Status []*WorkloadStatus `protobuf:"bytes,1,rep,name=status,proto3" json:"status,omitempty"` + Status []*WorkloadStatus `protobuf:"bytes,1001,rep,name=status,proto3" json:"status,omitempty"` } func (x *WorkloadsStatus) Reset() { @@ -2385,7 +2384,7 @@ type SetWorkloadsStatusOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Status []*WorkloadStatus `protobuf:"bytes,1,rep,name=status,proto3" json:"status,omitempty"` + Status []*WorkloadStatus `protobuf:"bytes,1001,rep,name=status,proto3" json:"status,omitempty"` } func (x *SetWorkloadsStatusOptions) Reset() { @@ -2432,10 +2431,10 @@ type WorkloadStatusStreamOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Appname string `protobuf:"bytes,1,opt,name=appname,proto3" json:"appname,omitempty"` - Entrypoint string `protobuf:"bytes,2,opt,name=entrypoint,proto3" json:"entrypoint,omitempty"` - Nodename string `protobuf:"bytes,3,opt,name=nodename,proto3" json:"nodename,omitempty"` - Labels map[string]string `protobuf:"bytes,4,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Appname string `protobuf:"bytes,1001,opt,name=appname,proto3" json:"appname,omitempty"` + Entrypoint string `protobuf:"bytes,1002,opt,name=entrypoint,proto3" json:"entrypoint,omitempty"` + Nodename string `protobuf:"bytes,1003,opt,name=nodename,proto3" json:"nodename,omitempty"` + Labels map[string]string `protobuf:"bytes,1004,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *WorkloadStatusStreamOptions) Reset() { @@ -2503,11 +2502,11 @@ type WorkloadStatusStreamMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Workload *Workload `protobuf:"bytes,2,opt,name=workload,proto3" json:"workload,omitempty"` - Status *WorkloadStatus `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - Delete bool `protobuf:"varint,5,opt,name=delete,proto3" json:"delete,omitempty"` + Id string `protobuf:"bytes,1001,opt,name=id,proto3" json:"id,omitempty"` + Workload *Workload `protobuf:"bytes,1002,opt,name=workload,proto3" json:"workload,omitempty"` + Status *WorkloadStatus `protobuf:"bytes,1003,opt,name=status,proto3" json:"status,omitempty"` + Error string `protobuf:"bytes,1004,opt,name=error,proto3" json:"error,omitempty"` + Delete bool `protobuf:"varint,1005,opt,name=delete,proto3" json:"delete,omitempty"` } func (x *WorkloadStatusStreamMessage) Reset() { @@ -2582,7 +2581,7 @@ type Workloads struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Workloads []*Workload `protobuf:"bytes,1,rep,name=workloads,proto3" json:"workloads,omitempty"` + Workloads []*Workload `protobuf:"bytes,1001,rep,name=workloads,proto3" json:"workloads,omitempty"` } func (x *Workloads) Reset() { @@ -2629,7 +2628,7 @@ type WorkloadID struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Id string `protobuf:"bytes,1001,opt,name=id,proto3" json:"id,omitempty"` } func (x *WorkloadID) Reset() { @@ -2676,7 +2675,7 @@ type WorkloadIDs struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` + Ids []string `protobuf:"bytes,1001,rep,name=ids,proto3" json:"ids,omitempty"` } func (x *WorkloadIDs) Reset() { @@ -2723,8 +2722,8 @@ type RemoveWorkloadOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` - Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` + Ids []string `protobuf:"bytes,1001,rep,name=ids,proto3" json:"ids,omitempty"` + Force bool `protobuf:"varint,1002,opt,name=force,proto3" json:"force,omitempty"` } func (x *RemoveWorkloadOptions) Reset() { @@ -2778,7 +2777,7 @@ type DissociateWorkloadOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` + Ids []string `protobuf:"bytes,1001,rep,name=ids,proto3" json:"ids,omitempty"` } func (x *DissociateWorkloadOptions) Reset() { @@ -2880,19 +2879,19 @@ type Build struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Base string `protobuf:"bytes,1,opt,name=base,proto3" json:"base,omitempty"` - Repo string `protobuf:"bytes,2,opt,name=repo,proto3" json:"repo,omitempty"` - Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` - Dir string `protobuf:"bytes,4,opt,name=dir,proto3" json:"dir,omitempty"` - Submodule bool `protobuf:"varint,5,opt,name=submodule,proto3" json:"submodule,omitempty"` - Commands []string `protobuf:"bytes,6,rep,name=commands,proto3" json:"commands,omitempty"` - Envs map[string]string `protobuf:"bytes,7,rep,name=envs,proto3" json:"envs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Args map[string]string `protobuf:"bytes,8,rep,name=args,proto3" json:"args,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Labels map[string]string `protobuf:"bytes,9,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Artifacts map[string]string `protobuf:"bytes,10,rep,name=artifacts,proto3" json:"artifacts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Cache map[string]string `protobuf:"bytes,11,rep,name=cache,proto3" json:"cache,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - StopSignal string `protobuf:"bytes,12,opt,name=stop_signal,json=stopSignal,proto3" json:"stop_signal,omitempty"` - Security bool `protobuf:"varint,13,opt,name=security,proto3" json:"security,omitempty"` + Base string `protobuf:"bytes,1001,opt,name=base,proto3" json:"base,omitempty"` + Repo string `protobuf:"bytes,1002,opt,name=repo,proto3" json:"repo,omitempty"` + Version string `protobuf:"bytes,1003,opt,name=version,proto3" json:"version,omitempty"` + Dir string `protobuf:"bytes,1004,opt,name=dir,proto3" json:"dir,omitempty"` + Submodule bool `protobuf:"varint,1005,opt,name=submodule,proto3" json:"submodule,omitempty"` + Commands []string `protobuf:"bytes,1006,rep,name=commands,proto3" json:"commands,omitempty"` + Envs map[string]string `protobuf:"bytes,1007,rep,name=envs,proto3" json:"envs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Args map[string]string `protobuf:"bytes,1008,rep,name=args,proto3" json:"args,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Labels map[string]string `protobuf:"bytes,1009,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Artifacts map[string]string `protobuf:"bytes,1010,rep,name=artifacts,proto3" json:"artifacts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Cache map[string]string `protobuf:"bytes,1011,rep,name=cache,proto3" json:"cache,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + StopSignal string `protobuf:"bytes,1012,opt,name=stop_signal,json=stopSignal,proto3" json:"stop_signal,omitempty"` + Security bool `protobuf:"varint,1013,opt,name=security,proto3" json:"security,omitempty"` } func (x *Build) Reset() { @@ -3023,8 +3022,8 @@ type Builds struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Stages []string `protobuf:"bytes,1,rep,name=stages,proto3" json:"stages,omitempty"` - Builds map[string]*Build `protobuf:"bytes,2,rep,name=builds,proto3" json:"builds,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Stages []string `protobuf:"bytes,1001,rep,name=stages,proto3" json:"stages,omitempty"` + Builds map[string]*Build `protobuf:"bytes,1002,rep,name=builds,proto3" json:"builds,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *Builds) Reset() { @@ -3078,14 +3077,14 @@ type BuildImageOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - User string `protobuf:"bytes,2,opt,name=user,proto3" json:"user,omitempty"` - Uid int32 `protobuf:"varint,3,opt,name=uid,proto3" json:"uid,omitempty"` - Tags []string `protobuf:"bytes,4,rep,name=tags,proto3" json:"tags,omitempty"` - Builds *Builds `protobuf:"bytes,5,opt,name=builds,proto3" json:"builds,omitempty"` - Tar []byte `protobuf:"bytes,6,opt,name=tar,proto3" json:"tar,omitempty"` - BuildMethod BuildImageOptions_BuildMethod `protobuf:"varint,7,opt,name=build_method,json=buildMethod,proto3,enum=pb.BuildImageOptions_BuildMethod" json:"build_method,omitempty"` - ExistId string `protobuf:"bytes,8,opt,name=exist_id,json=existId,proto3" json:"exist_id,omitempty"` + Name string `protobuf:"bytes,1001,opt,name=name,proto3" json:"name,omitempty"` + User string `protobuf:"bytes,1002,opt,name=user,proto3" json:"user,omitempty"` + Uid int32 `protobuf:"varint,1003,opt,name=uid,proto3" json:"uid,omitempty"` + Tags []string `protobuf:"bytes,1004,rep,name=tags,proto3" json:"tags,omitempty"` + Builds *Builds `protobuf:"bytes,1005,opt,name=builds,proto3" json:"builds,omitempty"` + Tar []byte `protobuf:"bytes,1006,opt,name=tar,proto3" json:"tar,omitempty"` + BuildMethod BuildImageOptions_BuildMethod `protobuf:"varint,1007,opt,name=build_method,json=buildMethod,proto3,enum=pb.BuildImageOptions_BuildMethod" json:"build_method,omitempty"` + ExistId string `protobuf:"bytes,1008,opt,name=exist_id,json=existId,proto3" json:"exist_id,omitempty"` } func (x *BuildImageOptions) Reset() { @@ -3181,9 +3180,9 @@ type HookOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - AfterStart []string `protobuf:"bytes,1,rep,name=after_start,json=afterStart,proto3" json:"after_start,omitempty"` - BeforeStop []string `protobuf:"bytes,2,rep,name=before_stop,json=beforeStop,proto3" json:"before_stop,omitempty"` - Force bool `protobuf:"varint,3,opt,name=force,proto3" json:"force,omitempty"` + AfterStart []string `protobuf:"bytes,1001,rep,name=after_start,json=afterStart,proto3" json:"after_start,omitempty"` + BeforeStop []string `protobuf:"bytes,1002,rep,name=before_stop,json=beforeStop,proto3" json:"before_stop,omitempty"` + Force bool `protobuf:"varint,1003,opt,name=force,proto3" json:"force,omitempty"` } func (x *HookOptions) Reset() { @@ -3244,10 +3243,10 @@ type HealthCheckOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - TcpPorts []string `protobuf:"bytes,1,rep,name=tcp_ports,json=tcpPorts,proto3" json:"tcp_ports,omitempty"` - HttpPort string `protobuf:"bytes,2,opt,name=http_port,json=httpPort,proto3" json:"http_port,omitempty"` - Url string `protobuf:"bytes,3,opt,name=url,proto3" json:"url,omitempty"` - Code int32 `protobuf:"varint,4,opt,name=code,proto3" json:"code,omitempty"` + TcpPorts []string `protobuf:"bytes,1001,rep,name=tcp_ports,json=tcpPorts,proto3" json:"tcp_ports,omitempty"` + HttpPort string `protobuf:"bytes,1002,opt,name=http_port,json=httpPort,proto3" json:"http_port,omitempty"` + Url string `protobuf:"bytes,1003,opt,name=url,proto3" json:"url,omitempty"` + Code int32 `protobuf:"varint,1004,opt,name=code,proto3" json:"code,omitempty"` } func (x *HealthCheckOptions) Reset() { @@ -3315,8 +3314,8 @@ type LogOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - Config map[string]string `protobuf:"bytes,2,rep,name=config,proto3" json:"config,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Type string `protobuf:"bytes,1001,opt,name=type,proto3" json:"type,omitempty"` + Config map[string]string `protobuf:"bytes,1002,rep,name=config,proto3" json:"config,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *LogOptions) Reset() { @@ -3370,21 +3369,21 @@ type EntrypointOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,1001,opt,name=name,proto3" json:"name,omitempty"` // `command` field is to be deprecated in favor of `commands` field - Command string `protobuf:"bytes,2,opt,name=command,proto3" json:"command,omitempty"` - Privileged bool `protobuf:"varint,3,opt,name=privileged,proto3" json:"privileged,omitempty"` - Dir string `protobuf:"bytes,4,opt,name=dir,proto3" json:"dir,omitempty"` - Log *LogOptions `protobuf:"bytes,5,opt,name=log,proto3" json:"log,omitempty"` - Publish []string `protobuf:"bytes,6,rep,name=publish,proto3" json:"publish,omitempty"` - Healthcheck *HealthCheckOptions `protobuf:"bytes,7,opt,name=healthcheck,proto3" json:"healthcheck,omitempty"` - Hook *HookOptions `protobuf:"bytes,8,opt,name=hook,proto3" json:"hook,omitempty"` - Restart string `protobuf:"bytes,9,opt,name=restart,proto3" json:"restart,omitempty"` - Sysctls map[string]string `protobuf:"bytes,10,rep,name=sysctls,proto3" json:"sysctls,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Command string `protobuf:"bytes,1002,opt,name=command,proto3" json:"command,omitempty"` + Privileged bool `protobuf:"varint,1003,opt,name=privileged,proto3" json:"privileged,omitempty"` + Dir string `protobuf:"bytes,1004,opt,name=dir,proto3" json:"dir,omitempty"` + Log *LogOptions `protobuf:"bytes,1005,opt,name=log,proto3" json:"log,omitempty"` + Publish []string `protobuf:"bytes,1006,rep,name=publish,proto3" json:"publish,omitempty"` + Healthcheck *HealthCheckOptions `protobuf:"bytes,1007,opt,name=healthcheck,proto3" json:"healthcheck,omitempty"` + Hook *HookOptions `protobuf:"bytes,1008,opt,name=hook,proto3" json:"hook,omitempty"` + Restart string `protobuf:"bytes,1009,opt,name=restart,proto3" json:"restart,omitempty"` + Sysctls map[string]string `protobuf:"bytes,1010,rep,name=sysctls,proto3" json:"sysctls,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // `commands` is the new-style and preferable fields to specify process to run // to specify shell-like command such as `true && echo a > /dev/null` // please state the shell explicitly: ["sh", "-c", "true && echo a > /dev/null"] - Commands []string `protobuf:"bytes,11,rep,name=commands,proto3" json:"commands,omitempty"` + Commands []string `protobuf:"bytes,1011,rep,name=commands,proto3" json:"commands,omitempty"` } func (x *EntrypointOptions) Reset() { @@ -3501,7 +3500,7 @@ type Volume struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Volume map[string]int64 `protobuf:"bytes,1,rep,name=volume,proto3" json:"volume,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + Volume map[string]int64 `protobuf:"bytes,1001,rep,name=volume,proto3" json:"volume,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` } func (x *Volume) Reset() { @@ -3548,34 +3547,32 @@ type DeployOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - Entrypoint *EntrypointOptions `protobuf:"bytes,2,opt,name=entrypoint,proto3" json:"entrypoint,omitempty"` - Podname string `protobuf:"bytes,3,opt,name=podname,proto3" json:"podname,omitempty"` - Nodenames []string `protobuf:"bytes,4,rep,name=nodenames,proto3" json:"nodenames,omitempty"` - Image string `protobuf:"bytes,5,opt,name=image,proto3" json:"image,omitempty"` - ExtraArgs string `protobuf:"bytes,6,opt,name=extra_args,json=extraArgs,proto3" json:"extra_args,omitempty"` - Count int32 `protobuf:"varint,7,opt,name=count,proto3" json:"count,omitempty"` - Env []string `protobuf:"bytes,8,rep,name=env,proto3" json:"env,omitempty"` - Dns []string `protobuf:"bytes,9,rep,name=dns,proto3" json:"dns,omitempty"` - ExtraHosts []string `protobuf:"bytes,10,rep,name=extra_hosts,json=extraHosts,proto3" json:"extra_hosts,omitempty"` - Networks map[string]string `protobuf:"bytes,11,rep,name=networks,proto3" json:"networks,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - User string `protobuf:"bytes,13,opt,name=user,proto3" json:"user,omitempty"` - Debug bool `protobuf:"varint,14,opt,name=debug,proto3" json:"debug,omitempty"` - OpenStdin bool `protobuf:"varint,15,opt,name=open_stdin,json=openStdin,proto3" json:"open_stdin,omitempty"` - Labels map[string]string `protobuf:"bytes,16,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Nodelabels map[string]string `protobuf:"bytes,17,rep,name=nodelabels,proto3" json:"nodelabels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - DeployStrategy DeployOptions_Strategy `protobuf:"varint,18,opt,name=deploy_strategy,json=deployStrategy,proto3,enum=pb.DeployOptions_Strategy" json:"deploy_strategy,omitempty"` - Data map[string][]byte `protobuf:"bytes,19,rep,name=data,proto3" json:"data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - NodesLimit int32 `protobuf:"varint,20,opt,name=nodes_limit,json=nodesLimit,proto3" json:"nodes_limit,omitempty"` - IgnoreHook bool `protobuf:"varint,21,opt,name=ignore_hook,json=ignoreHook,proto3" json:"ignore_hook,omitempty"` - AfterCreate []string `protobuf:"bytes,22,rep,name=after_create,json=afterCreate,proto3" json:"after_create,omitempty"` - RawArgs []byte `protobuf:"bytes,23,opt,name=raw_args,json=rawArgs,proto3" json:"raw_args,omitempty"` - // ResourceOptions old_resource_opts = 24; - NodeFilter *NodeFilter `protobuf:"bytes,25,opt,name=node_filter,json=nodeFilter,proto3" json:"node_filter,omitempty"` - // should be part of field no.19 - Modes map[string]*FileMode `protobuf:"bytes,26,rep,name=modes,proto3" json:"modes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Owners map[string]*FileOwner `protobuf:"bytes,27,rep,name=owners,proto3" json:"owners,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - ResourceOpts map[string]*RawParam `protobuf:"bytes,28,rep,name=resource_opts,json=resourceOpts,proto3" json:"resource_opts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Name string `protobuf:"bytes,1001,opt,name=name,proto3" json:"name,omitempty"` + Entrypoint *EntrypointOptions `protobuf:"bytes,1002,opt,name=entrypoint,proto3" json:"entrypoint,omitempty"` + Podname string `protobuf:"bytes,1003,opt,name=podname,proto3" json:"podname,omitempty"` + Nodenames []string `protobuf:"bytes,1004,rep,name=nodenames,proto3" json:"nodenames,omitempty"` + Image string `protobuf:"bytes,1005,opt,name=image,proto3" json:"image,omitempty"` + ExtraArgs string `protobuf:"bytes,1006,opt,name=extra_args,json=extraArgs,proto3" json:"extra_args,omitempty"` + Count int32 `protobuf:"varint,1007,opt,name=count,proto3" json:"count,omitempty"` + Env []string `protobuf:"bytes,1008,rep,name=env,proto3" json:"env,omitempty"` + Dns []string `protobuf:"bytes,1009,rep,name=dns,proto3" json:"dns,omitempty"` + ExtraHosts []string `protobuf:"bytes,1010,rep,name=extra_hosts,json=extraHosts,proto3" json:"extra_hosts,omitempty"` + Networks map[string]string `protobuf:"bytes,1011,rep,name=networks,proto3" json:"networks,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + User string `protobuf:"bytes,1013,opt,name=user,proto3" json:"user,omitempty"` + Debug bool `protobuf:"varint,1014,opt,name=debug,proto3" json:"debug,omitempty"` + OpenStdin bool `protobuf:"varint,1015,opt,name=open_stdin,json=openStdin,proto3" json:"open_stdin,omitempty"` + Labels map[string]string `protobuf:"bytes,1016,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Nodelabels map[string]string `protobuf:"bytes,1017,rep,name=nodelabels,proto3" json:"nodelabels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + DeployStrategy DeployOptions_Strategy `protobuf:"varint,1018,opt,name=deploy_strategy,json=deployStrategy,proto3,enum=pb.DeployOptions_Strategy" json:"deploy_strategy,omitempty"` + Data map[string][]byte `protobuf:"bytes,1019,rep,name=data,proto3" json:"data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + NodesLimit int32 `protobuf:"varint,1020,opt,name=nodes_limit,json=nodesLimit,proto3" json:"nodes_limit,omitempty"` + IgnoreHook bool `protobuf:"varint,1021,opt,name=ignore_hook,json=ignoreHook,proto3" json:"ignore_hook,omitempty"` + AfterCreate []string `protobuf:"bytes,1022,rep,name=after_create,json=afterCreate,proto3" json:"after_create,omitempty"` + RawArgs []byte `protobuf:"bytes,1023,opt,name=raw_args,json=rawArgs,proto3" json:"raw_args,omitempty"` + NodeFilter *NodeFilter `protobuf:"bytes,1024,opt,name=node_filter,json=nodeFilter,proto3" json:"node_filter,omitempty"` + Modes map[string]*FileMode `protobuf:"bytes,1025,rep,name=modes,proto3" json:"modes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Owners map[string]*FileOwner `protobuf:"bytes,1026,rep,name=owners,proto3" json:"owners,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ResourceOpts map[string]*RawParam `protobuf:"bytes,1027,rep,name=resource_opts,json=resourceOpts,proto3" json:"resource_opts,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *DeployOptions) Reset() { @@ -3797,11 +3794,11 @@ type ReplaceOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeployOpt *DeployOptions `protobuf:"bytes,1,opt,name=deployOpt,proto3" json:"deployOpt,omitempty"` - Networkinherit bool `protobuf:"varint,2,opt,name=networkinherit,proto3" json:"networkinherit,omitempty"` - FilterLabels map[string]string `protobuf:"bytes,3,rep,name=filter_labels,json=filterLabels,proto3" json:"filter_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Copy map[string]string `protobuf:"bytes,4,rep,name=copy,proto3" json:"copy,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Ids []string `protobuf:"bytes,5,rep,name=ids,proto3" json:"ids,omitempty"` + DeployOpt *DeployOptions `protobuf:"bytes,1001,opt,name=deployOpt,proto3" json:"deployOpt,omitempty"` + Networkinherit bool `protobuf:"varint,1002,opt,name=networkinherit,proto3" json:"networkinherit,omitempty"` + FilterLabels map[string]string `protobuf:"bytes,1003,rep,name=filter_labels,json=filterLabels,proto3" json:"filter_labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Copy map[string]string `protobuf:"bytes,1004,rep,name=copy,proto3" json:"copy,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Ids []string `protobuf:"bytes,5100,rep,name=ids,proto3" json:"ids,omitempty"` } func (x *ReplaceOptions) Reset() { @@ -3876,10 +3873,9 @@ type CacheImageOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Podname string `protobuf:"bytes,1,opt,name=podname,proto3" json:"podname,omitempty"` - Nodenames []string `protobuf:"bytes,2,rep,name=nodenames,proto3" json:"nodenames,omitempty"` - Images []string `protobuf:"bytes,3,rep,name=images,proto3" json:"images,omitempty"` - Step int32 `protobuf:"varint,4,opt,name=step,proto3" json:"step,omitempty"` + Podname string `protobuf:"bytes,1001,opt,name=podname,proto3" json:"podname,omitempty"` + Nodenames []string `protobuf:"bytes,1002,rep,name=nodenames,proto3" json:"nodenames,omitempty"` + Images []string `protobuf:"bytes,1003,rep,name=images,proto3" json:"images,omitempty"` } func (x *CacheImageOptions) Reset() { @@ -3935,23 +3931,15 @@ func (x *CacheImageOptions) GetImages() []string { return nil } -func (x *CacheImageOptions) GetStep() int32 { - if x != nil { - return x.Step - } - return 0 -} - type RemoveImageOptions struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Podname string `protobuf:"bytes,1,opt,name=podname,proto3" json:"podname,omitempty"` - Nodenames []string `protobuf:"bytes,2,rep,name=nodenames,proto3" json:"nodenames,omitempty"` - Images []string `protobuf:"bytes,3,rep,name=images,proto3" json:"images,omitempty"` - Step int32 `protobuf:"varint,4,opt,name=step,proto3" json:"step,omitempty"` - Prune bool `protobuf:"varint,5,opt,name=prune,proto3" json:"prune,omitempty"` + Podname string `protobuf:"bytes,1001,opt,name=podname,proto3" json:"podname,omitempty"` + Nodenames []string `protobuf:"bytes,1002,rep,name=nodenames,proto3" json:"nodenames,omitempty"` + Images []string `protobuf:"bytes,1003,rep,name=images,proto3" json:"images,omitempty"` + Prune bool `protobuf:"varint,1005,opt,name=prune,proto3" json:"prune,omitempty"` } func (x *RemoveImageOptions) Reset() { @@ -4007,13 +3995,6 @@ func (x *RemoveImageOptions) GetImages() []string { return nil } -func (x *RemoveImageOptions) GetStep() int32 { - if x != nil { - return x.Step - } - return 0 -} - func (x *RemoveImageOptions) GetPrune() bool { if x != nil { return x.Prune @@ -4026,9 +4007,9 @@ type ListImageOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Podname string `protobuf:"bytes,1,opt,name=podname,proto3" json:"podname,omitempty"` - Nodenames []string `protobuf:"bytes,2,rep,name=nodenames,proto3" json:"nodenames,omitempty"` - Filter string `protobuf:"bytes,3,opt,name=filter,proto3" json:"filter,omitempty"` + Podname string `protobuf:"bytes,1001,opt,name=podname,proto3" json:"podname,omitempty"` + Nodenames []string `protobuf:"bytes,1002,rep,name=nodenames,proto3" json:"nodenames,omitempty"` + Filter string `protobuf:"bytes,1003,opt,name=filter,proto3" json:"filter,omitempty"` } func (x *ListImageOptions) Reset() { @@ -4089,7 +4070,7 @@ type CopyPaths struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Paths []string `protobuf:"bytes,1,rep,name=paths,proto3" json:"paths,omitempty"` + Paths []string `protobuf:"bytes,1001,rep,name=paths,proto3" json:"paths,omitempty"` } func (x *CopyPaths) Reset() { @@ -4136,7 +4117,7 @@ type CopyOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Targets map[string]*CopyPaths `protobuf:"bytes,1,rep,name=targets,proto3" json:"targets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Targets map[string]*CopyPaths `protobuf:"bytes,1001,rep,name=targets,proto3" json:"targets,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *CopyOptions) Reset() { @@ -4183,8 +4164,8 @@ type FileOwner struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Uid int32 `protobuf:"varint,1,opt,name=uid,proto3" json:"uid,omitempty"` - Gid int32 `protobuf:"varint,2,opt,name=gid,proto3" json:"gid,omitempty"` + Uid int32 `protobuf:"varint,1001,opt,name=uid,proto3" json:"uid,omitempty"` + Gid int32 `protobuf:"varint,1002,opt,name=gid,proto3" json:"gid,omitempty"` } func (x *FileOwner) Reset() { @@ -4238,7 +4219,7 @@ type FileMode struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Mode int64 `protobuf:"varint,1,opt,name=mode,proto3" json:"mode,omitempty"` + Mode int64 `protobuf:"varint,1001,opt,name=mode,proto3" json:"mode,omitempty"` } func (x *FileMode) Reset() { @@ -4285,10 +4266,10 @@ type SendOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` - Data map[string][]byte `protobuf:"bytes,2,rep,name=data,proto3" json:"data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Modes map[string]*FileMode `protobuf:"bytes,3,rep,name=modes,proto3" json:"modes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Owners map[string]*FileOwner `protobuf:"bytes,4,rep,name=owners,proto3" json:"owners,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Ids []string `protobuf:"bytes,1001,rep,name=ids,proto3" json:"ids,omitempty"` + Data map[string][]byte `protobuf:"bytes,1002,rep,name=data,proto3" json:"data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Modes map[string]*FileMode `protobuf:"bytes,1003,rep,name=modes,proto3" json:"modes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Owners map[string]*FileOwner `protobuf:"bytes,1004,rep,name=owners,proto3" json:"owners,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *SendOptions) Reset() { @@ -4356,8 +4337,8 @@ type ErrorDetail struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Code int64 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"` - Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` + Code int64 `protobuf:"varint,1001,opt,name=code,proto3" json:"code,omitempty"` + Message string `protobuf:"bytes,1002,opt,name=message,proto3" json:"message,omitempty"` } func (x *ErrorDetail) Reset() { @@ -4411,12 +4392,12 @@ type BuildImageMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` - Progress string `protobuf:"bytes,3,opt,name=progress,proto3" json:"progress,omitempty"` - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - Stream string `protobuf:"bytes,5,opt,name=stream,proto3" json:"stream,omitempty"` - ErrorDetail *ErrorDetail `protobuf:"bytes,6,opt,name=error_detail,json=errorDetail,proto3" json:"error_detail,omitempty"` + Id string `protobuf:"bytes,1001,opt,name=id,proto3" json:"id,omitempty"` + Status string `protobuf:"bytes,1002,opt,name=status,proto3" json:"status,omitempty"` + Progress string `protobuf:"bytes,1003,opt,name=progress,proto3" json:"progress,omitempty"` + Error string `protobuf:"bytes,1004,opt,name=error,proto3" json:"error,omitempty"` + Stream string `protobuf:"bytes,1005,opt,name=stream,proto3" json:"stream,omitempty"` + ErrorDetail *ErrorDetail `protobuf:"bytes,1006,opt,name=error_detail,json=errorDetail,proto3" json:"error_detail,omitempty"` } func (x *BuildImageMessage) Reset() { @@ -4498,16 +4479,15 @@ type CreateWorkloadMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Podname string `protobuf:"bytes,1,opt,name=podname,proto3" json:"podname,omitempty"` - Nodename string `protobuf:"bytes,2,opt,name=nodename,proto3" json:"nodename,omitempty"` - Id string `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"` - Error string `protobuf:"bytes,5,opt,name=error,proto3" json:"error,omitempty"` - Success bool `protobuf:"varint,6,opt,name=success,proto3" json:"success,omitempty"` - Publish map[string]string `protobuf:"bytes,7,rep,name=publish,proto3" json:"publish,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Hook []byte `protobuf:"bytes,8,opt,name=hook,proto3" json:"hook,omitempty"` - // Resource resource = 9; - ResourceArgs string `protobuf:"bytes,10,opt,name=resource_args,json=resourceArgs,proto3" json:"resource_args,omitempty"` + Podname string `protobuf:"bytes,1001,opt,name=podname,proto3" json:"podname,omitempty"` + Nodename string `protobuf:"bytes,1002,opt,name=nodename,proto3" json:"nodename,omitempty"` + Id string `protobuf:"bytes,1003,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,1004,opt,name=name,proto3" json:"name,omitempty"` + Error string `protobuf:"bytes,1005,opt,name=error,proto3" json:"error,omitempty"` + Success bool `protobuf:"varint,1006,opt,name=success,proto3" json:"success,omitempty"` + Publish map[string]string `protobuf:"bytes,1007,rep,name=publish,proto3" json:"publish,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Hook []byte `protobuf:"bytes,1008,opt,name=hook,proto3" json:"hook,omitempty"` + ResourceArgs string `protobuf:"bytes,1009,opt,name=resource_args,json=resourceArgs,proto3" json:"resource_args,omitempty"` } func (x *CreateWorkloadMessage) Reset() { @@ -4610,9 +4590,9 @@ type ReplaceWorkloadMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Create *CreateWorkloadMessage `protobuf:"bytes,1,opt,name=create,proto3" json:"create,omitempty"` - Remove *RemoveWorkloadMessage `protobuf:"bytes,2,opt,name=remove,proto3" json:"remove,omitempty"` - Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + Create *CreateWorkloadMessage `protobuf:"bytes,1001,opt,name=create,proto3" json:"create,omitempty"` + Remove *RemoveWorkloadMessage `protobuf:"bytes,1002,opt,name=remove,proto3" json:"remove,omitempty"` + Error string `protobuf:"bytes,1003,opt,name=error,proto3" json:"error,omitempty"` } func (x *ReplaceWorkloadMessage) Reset() { @@ -4673,10 +4653,10 @@ type CacheImageMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Image string `protobuf:"bytes,1,opt,name=image,proto3" json:"image,omitempty"` - Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"` - Nodename string `protobuf:"bytes,3,opt,name=nodename,proto3" json:"nodename,omitempty"` - Message string `protobuf:"bytes,4,opt,name=message,proto3" json:"message,omitempty"` + Image string `protobuf:"bytes,1001,opt,name=image,proto3" json:"image,omitempty"` + Success bool `protobuf:"varint,1002,opt,name=success,proto3" json:"success,omitempty"` + Nodename string `protobuf:"bytes,1003,opt,name=nodename,proto3" json:"nodename,omitempty"` + Message string `protobuf:"bytes,1004,opt,name=message,proto3" json:"message,omitempty"` } func (x *CacheImageMessage) Reset() { @@ -4744,9 +4724,9 @@ type RemoveImageMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Image string `protobuf:"bytes,1,opt,name=image,proto3" json:"image,omitempty"` - Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"` - Messages []string `protobuf:"bytes,3,rep,name=messages,proto3" json:"messages,omitempty"` + Image string `protobuf:"bytes,1001,opt,name=image,proto3" json:"image,omitempty"` + Success bool `protobuf:"varint,1002,opt,name=success,proto3" json:"success,omitempty"` + Messages []string `protobuf:"bytes,1003,rep,name=messages,proto3" json:"messages,omitempty"` } func (x *RemoveImageMessage) Reset() { @@ -4807,8 +4787,8 @@ type ImageItem struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Tags []string `protobuf:"bytes,2,rep,name=tags,proto3" json:"tags,omitempty"` + Id string `protobuf:"bytes,1001,opt,name=id,proto3" json:"id,omitempty"` + Tags []string `protobuf:"bytes,1002,rep,name=tags,proto3" json:"tags,omitempty"` } func (x *ImageItem) Reset() { @@ -4862,9 +4842,9 @@ type ListImageMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Images []*ImageItem `protobuf:"bytes,1,rep,name=images,proto3" json:"images,omitempty"` - Nodename string `protobuf:"bytes,2,opt,name=nodename,proto3" json:"nodename,omitempty"` - Err string `protobuf:"bytes,3,opt,name=err,proto3" json:"err,omitempty"` + Images []*ImageItem `protobuf:"bytes,1001,rep,name=images,proto3" json:"images,omitempty"` + Nodename string `protobuf:"bytes,1002,opt,name=nodename,proto3" json:"nodename,omitempty"` + Err string `protobuf:"bytes,1003,opt,name=err,proto3" json:"err,omitempty"` } func (x *ListImageMessage) Reset() { @@ -4925,9 +4905,9 @@ type RemoveWorkloadMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Success bool `protobuf:"varint,2,opt,name=success,proto3" json:"success,omitempty"` - Hook string `protobuf:"bytes,3,opt,name=hook,proto3" json:"hook,omitempty"` + Id string `protobuf:"bytes,1001,opt,name=id,proto3" json:"id,omitempty"` + Success bool `protobuf:"varint,1002,opt,name=success,proto3" json:"success,omitempty"` + Hook string `protobuf:"bytes,1003,opt,name=hook,proto3" json:"hook,omitempty"` } func (x *RemoveWorkloadMessage) Reset() { @@ -4988,8 +4968,8 @@ type DissociateWorkloadMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` + Id string `protobuf:"bytes,1001,opt,name=id,proto3" json:"id,omitempty"` + Error string `protobuf:"bytes,1002,opt,name=error,proto3" json:"error,omitempty"` } func (x *DissociateWorkloadMessage) Reset() { @@ -5043,7 +5023,7 @@ type ReallocResourceMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Error string `protobuf:"bytes,1,opt,name=error,proto3" json:"error,omitempty"` + Error string `protobuf:"bytes,1001,opt,name=error,proto3" json:"error,omitempty"` } func (x *ReallocResourceMessage) Reset() { @@ -5090,11 +5070,11 @@ type CopyMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - Path string `protobuf:"bytes,3,opt,name=path,proto3" json:"path,omitempty"` - Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` - Data []byte `protobuf:"bytes,5,opt,name=data,proto3" json:"data,omitempty"` + Id string `protobuf:"bytes,1001,opt,name=id,proto3" json:"id,omitempty"` + Name string `protobuf:"bytes,1002,opt,name=name,proto3" json:"name,omitempty"` + Path string `protobuf:"bytes,1003,opt,name=path,proto3" json:"path,omitempty"` + Error string `protobuf:"bytes,1004,opt,name=error,proto3" json:"error,omitempty"` + Data []byte `protobuf:"bytes,1005,opt,name=data,proto3" json:"data,omitempty"` } func (x *CopyMessage) Reset() { @@ -5169,9 +5149,9 @@ type SendMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Path string `protobuf:"bytes,2,opt,name=path,proto3" json:"path,omitempty"` - Error string `protobuf:"bytes,3,opt,name=error,proto3" json:"error,omitempty"` + Id string `protobuf:"bytes,1001,opt,name=id,proto3" json:"id,omitempty"` + Path string `protobuf:"bytes,1002,opt,name=path,proto3" json:"path,omitempty"` + Error string `protobuf:"bytes,1003,opt,name=error,proto3" json:"error,omitempty"` } func (x *SendMessage) Reset() { @@ -5232,9 +5212,9 @@ type AttachWorkloadMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WorkloadId string `protobuf:"bytes,1,opt,name=workload_id,json=workloadId,proto3" json:"workload_id,omitempty"` - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` - StdStreamType StdStreamType `protobuf:"varint,3,opt,name=std_stream_type,json=stdStreamType,proto3,enum=pb.StdStreamType" json:"std_stream_type,omitempty"` + WorkloadId string `protobuf:"bytes,1001,opt,name=workload_id,json=workloadId,proto3" json:"workload_id,omitempty"` + Data []byte `protobuf:"bytes,1002,opt,name=data,proto3" json:"data,omitempty"` + StdStreamType StdStreamType `protobuf:"varint,1003,opt,name=std_stream_type,json=stdStreamType,proto3,enum=pb.StdStreamType" json:"std_stream_type,omitempty"` } func (x *AttachWorkloadMessage) Reset() { @@ -5295,10 +5275,10 @@ type RunAndWaitOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - DeployOptions *DeployOptions `protobuf:"bytes,1,opt,name=deploy_options,json=deployOptions,proto3" json:"deploy_options,omitempty"` - Cmd []byte `protobuf:"bytes,2,opt,name=cmd,proto3" json:"cmd,omitempty"` - Async bool `protobuf:"varint,3,opt,name=async,proto3" json:"async,omitempty"` - AsyncTimeout int32 `protobuf:"varint,4,opt,name=async_timeout,json=asyncTimeout,proto3" json:"async_timeout,omitempty"` + DeployOptions *DeployOptions `protobuf:"bytes,1001,opt,name=deploy_options,json=deployOptions,proto3" json:"deploy_options,omitempty"` + Cmd []byte `protobuf:"bytes,1002,opt,name=cmd,proto3" json:"cmd,omitempty"` + Async bool `protobuf:"varint,1003,opt,name=async,proto3" json:"async,omitempty"` + AsyncTimeout int32 `protobuf:"varint,1004,opt,name=async_timeout,json=asyncTimeout,proto3" json:"async_timeout,omitempty"` } func (x *RunAndWaitOptions) Reset() { @@ -5366,9 +5346,9 @@ type ControlWorkloadOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` - Type string `protobuf:"bytes,2,opt,name=type,proto3" json:"type,omitempty"` - Force bool `protobuf:"varint,3,opt,name=force,proto3" json:"force,omitempty"` + Ids []string `protobuf:"bytes,1001,rep,name=ids,proto3" json:"ids,omitempty"` + Type string `protobuf:"bytes,1002,opt,name=type,proto3" json:"type,omitempty"` + Force bool `protobuf:"varint,1003,opt,name=force,proto3" json:"force,omitempty"` } func (x *ControlWorkloadOptions) Reset() { @@ -5429,9 +5409,9 @@ type ControlWorkloadMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` - Hook []byte `protobuf:"bytes,3,opt,name=hook,proto3" json:"hook,omitempty"` + Id string `protobuf:"bytes,1001,opt,name=id,proto3" json:"id,omitempty"` + Error string `protobuf:"bytes,1002,opt,name=error,proto3" json:"error,omitempty"` + Hook []byte `protobuf:"bytes,1003,opt,name=hook,proto3" json:"hook,omitempty"` } func (x *ControlWorkloadMessage) Reset() { @@ -5492,11 +5472,11 @@ type LogStreamOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Tail string `protobuf:"bytes,2,opt,name=tail,proto3" json:"tail,omitempty"` - Since string `protobuf:"bytes,3,opt,name=since,proto3" json:"since,omitempty"` - Until string `protobuf:"bytes,4,opt,name=until,proto3" json:"until,omitempty"` - Follow bool `protobuf:"varint,5,opt,name=follow,proto3" json:"follow,omitempty"` + Id string `protobuf:"bytes,1001,opt,name=id,proto3" json:"id,omitempty"` + Tail string `protobuf:"bytes,1002,opt,name=tail,proto3" json:"tail,omitempty"` + Since string `protobuf:"bytes,1003,opt,name=since,proto3" json:"since,omitempty"` + Until string `protobuf:"bytes,1004,opt,name=until,proto3" json:"until,omitempty"` + Follow bool `protobuf:"varint,1005,opt,name=follow,proto3" json:"follow,omitempty"` } func (x *LogStreamOptions) Reset() { @@ -5571,10 +5551,10 @@ type LogStreamMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - Error string `protobuf:"bytes,2,opt,name=error,proto3" json:"error,omitempty"` - Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` - StdStreamType StdStreamType `protobuf:"varint,4,opt,name=std_stream_type,json=stdStreamType,proto3,enum=pb.StdStreamType" json:"std_stream_type,omitempty"` + Id string `protobuf:"bytes,1001,opt,name=id,proto3" json:"id,omitempty"` + Error string `protobuf:"bytes,1002,opt,name=error,proto3" json:"error,omitempty"` + Data []byte `protobuf:"bytes,1003,opt,name=data,proto3" json:"data,omitempty"` + StdStreamType StdStreamType `protobuf:"varint,1004,opt,name=std_stream_type,json=stdStreamType,proto3,enum=pb.StdStreamType" json:"std_stream_type,omitempty"` } func (x *LogStreamMessage) Reset() { @@ -5642,12 +5622,12 @@ type ExecuteWorkloadOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - WorkloadId string `protobuf:"bytes,1,opt,name=workload_id,json=workloadId,proto3" json:"workload_id,omitempty"` - Commands []string `protobuf:"bytes,2,rep,name=commands,proto3" json:"commands,omitempty"` - Envs []string `protobuf:"bytes,3,rep,name=envs,proto3" json:"envs,omitempty"` - Workdir string `protobuf:"bytes,4,opt,name=workdir,proto3" json:"workdir,omitempty"` - OpenStdin bool `protobuf:"varint,5,opt,name=open_stdin,json=openStdin,proto3" json:"open_stdin,omitempty"` - ReplCmd []byte `protobuf:"bytes,6,opt,name=repl_cmd,json=replCmd,proto3" json:"repl_cmd,omitempty"` + WorkloadId string `protobuf:"bytes,1001,opt,name=workload_id,json=workloadId,proto3" json:"workload_id,omitempty"` + Commands []string `protobuf:"bytes,1002,rep,name=commands,proto3" json:"commands,omitempty"` + Envs []string `protobuf:"bytes,1003,rep,name=envs,proto3" json:"envs,omitempty"` + Workdir string `protobuf:"bytes,1004,opt,name=workdir,proto3" json:"workdir,omitempty"` + OpenStdin bool `protobuf:"varint,1005,opt,name=open_stdin,json=openStdin,proto3" json:"open_stdin,omitempty"` + ReplCmd []byte `protobuf:"bytes,1006,opt,name=repl_cmd,json=replCmd,proto3" json:"repl_cmd,omitempty"` } func (x *ExecuteWorkloadOptions) Reset() { @@ -5729,8 +5709,8 @@ type CapacityMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` - NodeCapacities map[string]int64 `protobuf:"bytes,2,rep,name=node_capacities,json=nodeCapacities,proto3" json:"node_capacities,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` + Total int64 `protobuf:"varint,1001,opt,name=total,proto3" json:"total,omitempty"` + NodeCapacities map[string]int64 `protobuf:"bytes,1002,rep,name=node_capacities,json=nodeCapacities,proto3" json:"node_capacities,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` } func (x *CapacityMessage) Reset() { @@ -6021,774 +6001,784 @@ var file_rpc_gen_core_proto_rawDesc = []byte{ 0x61, 0x6c, 0x6c, 0x1a, 0x39, 0x0a, 0x0b, 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, 0xfc, - 0x03, 0x0a, 0x08, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, - 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, - 0x67, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x69, - 0x6c, 0x65, 0x67, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x33, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, - 0x76, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x72, - 0x67, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 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, 0x1a, 0x3a, 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, 0x74, 0x72, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x88, + 0x04, 0x0a, 0x08, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x0f, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x07, + 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xec, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0a, 0x70, 0x72, 0x69, + 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x64, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, + 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x64, 0x12, 0x31, 0x0a, 0x06, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x73, 0x18, 0xee, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x34, 0x0a, + 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x18, 0xef, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x2e, 0x50, 0x75, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x73, 0x68, 0x12, 0x15, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0xf0, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0xf1, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0xf2, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x11, 0x0a, 0x03, 0x65, 0x6e, 0x76, + 0x18, 0xf3, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x24, 0x0a, 0x0d, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0xf4, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x72, + 0x67, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 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, 0xd5, 0x02, - 0x0a, 0x0e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x65, - 0x61, 0x6c, 0x74, 0x68, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x79, 0x12, 0x3c, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, + 0x0c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 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, 0xde, 0x02, 0x0a, 0x0e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, + 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x19, 0x0a, 0x07, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x79, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x79, 0x12, 0x3d, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, + 0xec, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x10, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x74, - 0x74, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x70, 0x70, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, - 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x1a, 0x3b, 0x0a, 0x0d, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 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, 0x3d, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, + 0x6b, 0x73, 0x12, 0x1d, 0x0a, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0xed, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x65, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x11, 0x0a, 0x03, 0x74, 0x74, 0x6c, 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x03, 0x74, 0x74, 0x6c, 0x12, 0x19, 0x0a, 0x07, 0x61, 0x70, 0x70, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0xef, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1b, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xf0, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1f, 0x0a, 0x0a, + 0x65, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0xf1, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x1a, 0x3b, 0x0a, + 0x0d, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 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, 0x3e, 0x0a, 0x0f, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2b, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x48, 0x0a, 0x19, 0x53, 0x65, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x22, 0x47, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x2a, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xf3, 0x01, - 0x0a, 0x1b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x0a, - 0x07, 0x61, 0x70, 0x70, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x61, 0x70, 0x70, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, - 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x74, - 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x61, 0x74, 0x75, 0x73, 0x22, 0xf7, 0x01, 0x0a, 0x1b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 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, 0xb1, 0x01, 0x0a, 0x1b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x28, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2a, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x16, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x37, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x22, 0x1c, 0x0a, 0x0a, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1f, - 0x0a, 0x0b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x73, 0x12, 0x10, 0x0a, - 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, - 0x3f, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x22, 0x2d, 0x0a, 0x19, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, - 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, - 0xbc, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x4a, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, - 0x6f, 0x70, 0x74, 0x73, 0x18, 0xea, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x73, 0x1a, - 0x4d, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x77, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xdc, - 0x05, 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 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, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x1c, 0x0a, 0x09, - 0x73, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x73, 0x75, 0x62, 0x6d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x27, 0x0a, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, - 0x45, 0x6e, 0x76, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x12, - 0x27, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x41, 0x72, 0x67, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x2e, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x19, 0x0a, 0x07, 0x61, 0x70, 0x70, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1f, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0xea, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x12, 0x1b, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xeb, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x44, 0x0a, + 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0xec, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 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, 0xb6, + 0x01, 0x0a, 0x1b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0f, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x29, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0xea, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x70, 0x62, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x17, + 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x22, 0x38, 0x0a, 0x09, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x12, 0x2b, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x73, 0x22, 0x1d, 0x0a, 0x0a, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x12, + 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x22, 0x20, 0x0a, 0x0b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x73, 0x12, + 0x11, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, + 0x64, 0x73, 0x22, 0x41, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x11, 0x0a, 0x03, 0x69, + 0x64, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x15, + 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x2e, 0x0a, 0x19, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x11, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x03, 0x69, 0x64, 0x73, 0x22, 0xbc, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, + 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0xe9, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x4a, 0x0a, 0x0d, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x18, 0xea, 0x07, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4f, 0x70, 0x74, 0x73, 0x1a, 0x4d, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4f, 0x70, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, + 0x2e, 0x52, 0x61, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xe9, 0x05, 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x13, + 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, + 0x61, 0x73, 0x65, 0x12, 0x13, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0xea, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x19, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x11, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x1d, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x6d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x75, 0x62, 0x6d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x18, 0xee, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x12, 0x28, 0x0a, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x18, 0xef, 0x07, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x45, 0x6e, 0x76, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x12, 0x28, 0x0a, 0x04, + 0x61, 0x72, 0x67, 0x73, 0x18, 0xf0, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x62, + 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x41, 0x72, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x2e, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0xf1, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, + 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x37, 0x0a, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, + 0x63, 0x74, 0x73, 0x18, 0xf2, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x12, - 0x2a, 0x0a, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, - 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, - 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x1a, 0x37, 0x0a, 0x09, 0x45, 0x6e, 0x76, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 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, 0x1a, 0x3c, 0x0a, 0x0e, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x38, 0x0a, 0x0a, 0x43, 0x61, 0x63, 0x68, 0x65, 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, 0x96, 0x01, - 0x0a, 0x06, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x67, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x67, 0x65, 0x73, - 0x12, 0x2e, 0x0a, 0x06, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x2e, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, - 0x1a, 0x44, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 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, 0x1f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa4, 0x02, 0x0a, 0x11, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x22, 0x0a, 0x06, 0x62, 0x75, - 0x69, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x2e, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x06, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x74, 0x61, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x74, 0x61, 0x72, - 0x12, 0x44, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, - 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x78, 0x69, 0x73, 0x74, 0x5f, - 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x69, 0x73, 0x74, 0x49, - 0x64, 0x22, 0x2a, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x12, 0x07, 0x0a, 0x03, 0x53, 0x43, 0x4d, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x41, 0x57, - 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x58, 0x49, 0x53, 0x54, 0x10, 0x02, 0x22, 0x65, 0x0a, - 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, - 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x0a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x14, - 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x22, 0x74, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x63, - 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x74, - 0x63, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x68, 0x74, 0x74, 0x70, 0x5f, - 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x74, 0x74, 0x70, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x0a, 0x4c, - 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x32, 0x0a, - 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xbe, 0x03, 0x0a, - 0x11, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x64, - 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, - 0x69, 0x72, 0x12, 0x20, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x03, 0x6c, 0x6f, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x18, - 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x38, - 0x0a, 0x0b, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x68, 0x65, 0x61, - 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x23, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x18, 0x0a, - 0x07, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x3c, 0x0a, 0x07, 0x73, 0x79, 0x73, 0x63, 0x74, - 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, - 0x53, 0x79, 0x73, 0x63, 0x74, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x73, 0x79, - 0x73, 0x63, 0x74, 0x6c, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x79, 0x73, 0x63, 0x74, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x2b, 0x0a, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x18, 0xf3, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x63, 0x61, 0x63, 0x68, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x18, 0xf4, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x70, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x6c, 0x12, 0x1b, + 0x0a, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x18, 0xf5, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x73, 0x65, 0x63, 0x75, 0x72, 0x69, 0x74, 0x79, 0x1a, 0x37, 0x0a, 0x09, 0x45, + 0x6e, 0x76, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x37, 0x0a, 0x09, 0x41, 0x72, 0x67, 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, 0x73, 0x0a, - 0x06, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x56, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x1a, 0x39, 0x0a, 0x0b, 0x56, 0x6f, 0x6c, 0x75, 0x6d, - 0x65, 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, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x90, 0x0c, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x0a, 0x65, 0x6e, 0x74, 0x72, - 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, - 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x64, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, - 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x1d, 0x0a, - 0x0a, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x72, 0x61, 0x41, 0x72, 0x67, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x08, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x03, 0x65, 0x6e, 0x76, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x03, 0x64, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, - 0x68, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, - 0x72, 0x61, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x62, 0x75, - 0x67, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x12, 0x1d, - 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x12, 0x35, 0x0a, - 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x12, 0x41, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6e, 0x6f, 0x64, - 0x65, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x43, 0x0a, 0x0f, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, 0x0e, 0x64, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2f, 0x0a, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x18, 0x13, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x62, 0x2e, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x61, - 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1f, 0x0a, - 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x14, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1f, - 0x0a, 0x0b, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x15, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x12, - 0x21, 0x0a, 0x0c, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, - 0x16, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x66, 0x74, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x61, 0x77, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x17, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x72, 0x61, 0x77, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2f, 0x0a, - 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x19, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x32, - 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6d, 0x6f, 0x64, - 0x65, 0x73, 0x12, 0x35, 0x0a, 0x06, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x1b, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x06, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x48, 0x0a, 0x0d, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, - 0x70, 0x74, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x45, + 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, + 0x0b, 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, 0x1a, 0x3c, 0x0a, 0x0e, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x38, 0x0a, 0x0a, 0x43, 0x61, 0x63, 0x68, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x22, 0x98, 0x01, 0x0a, 0x06, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x17, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x67, 0x65, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x67, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x18, 0xea, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x73, 0x1a, 0x44, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 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, 0x1f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xac, 0x02, 0x0a, 0x11, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0xea, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x11, 0x0a, 0x03, 0x75, + 0x69, 0x64, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x13, + 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0xec, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x12, 0x23, 0x0a, 0x06, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x18, 0xed, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, + 0x52, 0x06, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x11, 0x0a, 0x03, 0x74, 0x61, 0x72, 0x18, + 0xee, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x74, 0x61, 0x72, 0x12, 0x45, 0x0a, 0x0c, 0x62, + 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0xef, 0x07, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x21, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x69, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0xf0, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x69, 0x73, 0x74, 0x49, 0x64, 0x22, 0x2a, + 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x07, 0x0a, + 0x03, 0x53, 0x43, 0x4d, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x41, 0x57, 0x10, 0x01, 0x12, + 0x09, 0x0a, 0x05, 0x45, 0x58, 0x49, 0x53, 0x54, 0x10, 0x02, 0x22, 0x68, 0x0a, 0x0b, 0x48, 0x6f, + 0x6f, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x61, 0x66, 0x74, + 0x65, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0a, 0x61, 0x66, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x62, + 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0xea, 0x07, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0a, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x15, 0x0a, + 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, + 0x6f, 0x72, 0x63, 0x65, 0x22, 0x78, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x63, + 0x70, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, + 0x74, 0x63, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x68, 0x74, 0x74, 0x70, + 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x74, + 0x74, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x11, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0xeb, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x13, 0x0a, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x22, 0x91, + 0x01, 0x0a, 0x0a, 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x13, 0x0a, + 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0xea, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x39, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xc9, 0x03, 0x0a, 0x11, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, + 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, + 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1f, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x76, + 0x69, 0x6c, 0x65, 0x67, 0x65, 0x64, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x70, + 0x72, 0x69, 0x76, 0x69, 0x6c, 0x65, 0x67, 0x65, 0x64, 0x12, 0x11, 0x0a, 0x03, 0x64, 0x69, 0x72, + 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x72, 0x12, 0x21, 0x0a, 0x03, + 0x6c, 0x6f, 0x67, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x03, 0x6c, 0x6f, 0x67, 0x12, + 0x19, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x18, 0xee, 0x07, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x39, 0x0a, 0x0b, 0x68, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0xef, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0b, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0xf0, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x6f, 0x6b, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x19, 0x0a, 0x07, 0x72, + 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0xf1, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, + 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x3d, 0x0a, 0x07, 0x73, 0x79, 0x73, 0x63, 0x74, 0x6c, + 0x73, 0x18, 0xf2, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x53, 0x79, 0x73, 0x63, 0x74, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x73, 0x79, + 0x73, 0x63, 0x74, 0x6c, 0x73, 0x12, 0x1b, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x18, 0xf3, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x53, 0x79, 0x73, 0x63, 0x74, 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, 0x74, + 0x0a, 0x06, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, + 0x6d, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x1a, 0x39, 0x0a, 0x0b, 0x56, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 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, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaa, 0x0c, 0x0a, 0x0d, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xe9, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x36, 0x0a, 0x0a, 0x65, + 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0a, 0x65, 0x6e, 0x74, 0x72, 0x79, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xeb, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, + 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0xec, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x15, 0x0a, + 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x61, 0x72, + 0x67, 0x73, 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x65, 0x78, 0x74, 0x72, 0x61, + 0x41, 0x72, 0x67, 0x73, 0x12, 0x15, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0xef, 0x07, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x11, 0x0a, 0x03, 0x65, + 0x6e, 0x76, 0x18, 0xf0, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x12, 0x11, + 0x0a, 0x03, 0x64, 0x6e, 0x73, 0x18, 0xf1, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x64, 0x6e, + 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x78, 0x74, 0x72, 0x61, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x73, + 0x18, 0xf2, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x78, 0x74, 0x72, 0x61, 0x48, 0x6f, + 0x73, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x18, + 0xf3, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x12, 0x13, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0xf5, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x15, 0x0a, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x18, + 0xf6, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x64, 0x65, 0x62, 0x75, 0x67, 0x12, 0x1e, 0x0a, + 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x18, 0xf7, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x12, 0x36, 0x0a, + 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0xf8, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x42, 0x0a, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0xf9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x70, 0x62, 0x2e, + 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6e, + 0x6f, 0x64, 0x65, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x44, 0x0a, 0x0f, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0xfa, 0x07, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x52, + 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, + 0x30, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0xfb, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x18, 0xfc, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x5f, 0x68, 0x6f, + 0x6f, 0x6b, 0x18, 0xfd, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x69, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x48, 0x6f, 0x6f, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x63, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0xfe, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x61, 0x77, + 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0xff, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x72, 0x61, + 0x77, 0x41, 0x72, 0x67, 0x73, 0x12, 0x30, 0x0a, 0x0b, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x18, 0x80, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x70, 0x62, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x0a, 0x6e, 0x6f, 0x64, + 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x33, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x73, + 0x18, 0x81, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x06, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x82, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6f, 0x77, + 0x6e, 0x65, 0x72, 0x73, 0x12, 0x49, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x5f, 0x6f, 0x70, 0x74, 0x73, 0x18, 0x83, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x70, + 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x73, 0x1a, + 0x3b, 0x0a, 0x0d, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, + 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, 0x1a, 0x3d, 0x0a, 0x0f, 0x4e, 0x6f, 0x64, 0x65, 0x6c, + 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, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, + 0x46, 0x0a, 0x0a, 0x4d, 0x6f, 0x64, 0x65, 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, + 0x22, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x48, 0x0a, 0x0b, 0x4f, 0x77, 0x6e, 0x65, 0x72, + 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, 0x23, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, + 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0x4d, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x61, 0x77, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x3f, 0x0a, 0x08, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x08, 0x0a, 0x04, + 0x41, 0x55, 0x54, 0x4f, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x49, 0x4c, 0x4c, 0x10, 0x01, + 0x12, 0x08, 0x0a, 0x04, 0x45, 0x41, 0x43, 0x48, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x4c, + 0x4f, 0x42, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x55, 0x4d, 0x4d, 0x59, 0x10, + 0x63, 0x22, 0xf7, 0x02, 0x0a, 0x0e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x09, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, + 0x74, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x09, 0x64, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x12, 0x27, 0x0a, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x12, + 0x4a, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, + 0x18, 0xeb, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x31, 0x0a, 0x04, 0x63, + 0x6f, 0x70, 0x79, 0x18, 0xec, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, + 0x6f, 0x70, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x63, 0x6f, 0x70, 0x79, 0x12, 0x11, + 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0xec, 0x27, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, + 0x73, 0x1a, 0x3f, 0x0a, 0x11, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x1a, 0x37, 0x0a, 0x09, 0x43, 0x6f, 0x70, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x4e, - 0x6f, 0x64, 0x65, 0x6c, 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, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, - 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x46, 0x0a, 0x0a, 0x4d, 0x6f, 0x64, 0x65, 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, 0x22, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x48, 0x0a, 0x0b, 0x4f, - 0x77, 0x6e, 0x65, 0x72, 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, 0x23, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x4d, 0x0a, 0x11, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4f, 0x70, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, - 0x2e, 0x52, 0x61, 0x77, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3f, 0x0a, 0x08, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, - 0x12, 0x08, 0x0a, 0x04, 0x41, 0x55, 0x54, 0x4f, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x49, - 0x4c, 0x4c, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x41, 0x43, 0x48, 0x10, 0x02, 0x12, 0x0a, - 0x0a, 0x06, 0x47, 0x4c, 0x4f, 0x42, 0x41, 0x4c, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x55, - 0x4d, 0x4d, 0x59, 0x10, 0x63, 0x22, 0xf2, 0x02, 0x0a, 0x0e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x09, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x62, - 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x09, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x69, 0x6e, 0x68, 0x65, 0x72, 0x69, - 0x74, 0x12, 0x49, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x5f, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x30, 0x0a, 0x04, - 0x63, 0x6f, 0x70, 0x79, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, - 0x6f, 0x70, 0x79, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x63, 0x6f, 0x70, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, - 0x1a, 0x3f, 0x0a, 0x11, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 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, 0x1a, 0x37, 0x0a, 0x09, 0x43, 0x6f, 0x70, 0x79, 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, 0x77, 0x0a, 0x11, 0x43, 0x61, - 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x64, - 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, - 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, - 0x12, 0x0a, 0x04, 0x73, 0x74, 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, - 0x74, 0x65, 0x70, 0x22, 0x8e, 0x01, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, - 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x74, - 0x65, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x74, 0x65, 0x70, 0x12, 0x14, - 0x0a, 0x05, 0x70, 0x72, 0x75, 0x6e, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x70, - 0x72, 0x75, 0x6e, 0x65, 0x22, 0x62, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x21, 0x0a, 0x09, 0x43, 0x6f, 0x70, 0x79, - 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, 0x90, 0x01, 0x0a, 0x0b, - 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x0a, 0x07, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x70, - 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x73, 0x1a, 0x49, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x50, 0x61, - 0x74, 0x68, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x2f, - 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, - 0x03, 0x67, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x67, 0x69, 0x64, 0x22, - 0x1e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, - 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, - 0x80, 0x03, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, - 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x30, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6d, 0x6f, 0x64, - 0x65, 0x73, 0x12, 0x33, 0x0a, 0x06, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x06, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 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, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x1a, 0x46, 0x0a, 0x0a, 0x4d, 0x6f, 0x64, 0x65, 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, 0x22, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x48, 0x0a, 0x0b, 0x4f, 0x77, 0x6e, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x66, 0x0a, 0x11, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x19, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x6e, + 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0xea, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x06, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x73, 0x18, 0xeb, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x73, 0x22, 0x7e, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x19, 0x0a, 0x07, 0x70, 0x6f, 0x64, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0xea, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0xeb, 0x07, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x15, 0x0a, 0x05, + 0x70, 0x72, 0x75, 0x6e, 0x65, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x70, 0x72, + 0x75, 0x6e, 0x65, 0x22, 0x65, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x19, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, + 0xea, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x12, 0x17, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0xeb, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x22, 0x0a, 0x09, 0x43, 0x6f, + 0x70, 0x79, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x15, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, + 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x22, 0x91, + 0x01, 0x0a, 0x0b, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, + 0x0a, 0x07, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x2e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x1a, 0x49, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x3b, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0xb9, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x32, 0x0a, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, - 0x70, 0x62, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x0b, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0xd8, 0x02, 0x0a, 0x15, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, + 0x70, 0x79, 0x50, 0x61, 0x74, 0x68, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x31, 0x0a, 0x09, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, + 0x11, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x75, + 0x69, 0x64, 0x12, 0x11, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x67, 0x69, 0x64, 0x22, 0x1f, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, + 0x65, 0x12, 0x13, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x84, 0x03, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x11, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0xe9, 0x07, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0xea, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, + 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x31, 0x0a, 0x05, 0x6d, 0x6f, 0x64, + 0x65, 0x73, 0x18, 0xeb, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x53, + 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x06, + 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x73, 0x18, 0xec, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4f, + 0x77, 0x6e, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x6f, 0x77, 0x6e, 0x65, + 0x72, 0x73, 0x1a, 0x37, 0x0a, 0x09, 0x44, 0x61, 0x74, 0x61, 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, 0x0c, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x46, 0x0a, 0x0a, 0x4d, + 0x6f, 0x64, 0x65, 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, 0x22, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, + 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x48, 0x0a, 0x0b, 0x4f, 0x77, 0x6e, 0x65, 0x72, 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, 0x23, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x77, 0x6e, + 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3d, 0x0a, + 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x13, 0x0a, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x12, 0x19, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0xea, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xbf, 0x01, 0x0a, + 0x11, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0xea, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x08, + 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x17, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x33, 0x0a, 0x0c, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x52, 0x0b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0xe1, + 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1b, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0xea, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0xed, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x19, 0x0a, + 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x41, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x73, 0x68, 0x18, 0xef, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, - 0x40, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x73, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x73, 0x68, 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, 0x94, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x31, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x79, 0x0a, - 0x11, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x60, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x67, 0x0a, 0x10, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x25, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x65, 0x72, 0x72, 0x22, 0x55, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x41, 0x0a, 0x19, 0x44, - 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2e, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x13, 0x0a, 0x04, 0x68, + 0x6f, 0x6f, 0x6b, 0x18, 0xf0, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, + 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x61, 0x72, 0x67, + 0x73, 0x18, 0xf1, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, + 0x68, 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, 0x97, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x32, 0x0a, + 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x12, 0x32, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0xea, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x72, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xeb, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x7d, 0x0a, 0x11, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x15, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0xeb, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x19, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0xec, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x63, 0x0a, 0x12, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x15, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x19, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x12, 0x1b, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, + 0xeb, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, + 0x22, 0x31, 0x0a, 0x09, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x0f, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x13, + 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0xea, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x61, 0x67, 0x73, 0x22, 0x6a, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, + 0x1b, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xea, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x11, 0x0a, 0x03, + 0x65, 0x72, 0x72, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x72, 0x72, 0x22, + 0x58, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0xe9, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x07, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x12, 0x13, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0xeb, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x43, 0x0a, 0x19, 0x44, 0x69, 0x73, + 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2f, 0x0a, 0x16, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6f, - 0x0a, 0x0b, 0x43, 0x6f, 0x70, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, - 0x47, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x87, 0x01, 0x0a, 0x15, 0x41, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, - 0x70, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, - 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x6d, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x63, 0x6d, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x73, - 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, + 0x74, 0x0a, 0x0b, 0x43, 0x6f, 0x70, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0f, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x13, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0xeb, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72, + 0x6f, 0x72, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x13, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x4a, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x13, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0xea, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x8a, 0x01, 0x0a, 0x15, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x13, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x3a, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0d, 0x73, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x22, 0x9e, + 0x01, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x6f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x11, 0x0a, 0x03, 0x63, 0x6d, 0x64, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x63, + 0x6d, 0x64, 0x12, 0x15, 0x0a, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x18, 0xeb, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x73, 0x79, + 0x6e, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, - 0x54, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x52, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x7a, 0x0a, 0x10, 0x4c, 0x6f, 0x67, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x69, - 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x12, 0x16, 0x0a, - 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, - 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x22, 0x87, 0x01, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x0d, 0x73, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x22, - 0xbd, 0x01, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x77, - 0x6f, 0x72, 0x6b, 0x64, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x6f, - 0x72, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x73, 0x74, - 0x64, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x6e, 0x53, - 0x74, 0x64, 0x69, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x5f, 0x63, 0x6d, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x43, 0x6d, 0x64, 0x22, - 0xbc, 0x01, 0x0a, 0x0f, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x50, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x6f, 0x64, - 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x4e, + 0x57, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x11, 0x0a, 0x03, 0x69, 0x64, 0x73, + 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x13, 0x0a, 0x04, + 0x74, 0x79, 0x70, 0x65, 0x18, 0xea, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x15, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x55, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0xea, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x13, 0x0a, 0x04, 0x68, 0x6f, + 0x6f, 0x6b, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, + 0x7f, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x13, 0x0a, 0x04, 0x74, 0x61, 0x69, 0x6c, 0x18, 0xea, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x15, 0x0a, 0x05, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x12, 0x15, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x12, 0x17, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, + 0x77, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, + 0x22, 0x8b, 0x01, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x15, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, + 0xea, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x13, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0xeb, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x3a, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0d, 0x73, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x22, 0xc3, + 0x01, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x77, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x08, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0xea, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x13, 0x0a, 0x04, 0x65, 0x6e, 0x76, 0x73, + 0x18, 0xeb, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x12, 0x19, 0x0a, + 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x64, 0x69, 0x72, 0x18, 0xec, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x6e, + 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x18, 0xed, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, + 0x70, 0x65, 0x6e, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, + 0x5f, 0x63, 0x6d, 0x64, 0x18, 0xee, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x72, 0x65, 0x70, + 0x6c, 0x43, 0x6d, 0x64, 0x22, 0xbe, 0x01, 0x0a, 0x0f, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x15, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x18, 0xe9, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, + 0x51, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x18, 0xea, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x62, 0x2e, 0x43, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 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, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x27, - 0x0a, 0x06, 0x54, 0x72, 0x69, 0x4f, 0x70, 0x74, 0x12, 0x08, 0x0a, 0x04, 0x4b, 0x45, 0x45, 0x50, - 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x52, 0x55, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, - 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10, 0x02, 0x2a, 0x52, 0x0a, 0x0d, 0x53, 0x74, 0x64, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x4f, - 0x55, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x10, 0x01, - 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x59, 0x50, 0x45, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, - 0x49, 0x44, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x08, 0x45, 0x52, 0x55, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x32, 0x88, 0x14, 0x0a, 0x07, - 0x43, 0x6f, 0x72, 0x65, 0x52, 0x50, 0x43, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, - 0x43, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x12, 0x57, 0x61, - 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x36, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0e, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x2e, 0x70, - 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x1c, 0x2e, 0x70, 0x62, - 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x26, 0x0a, 0x06, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x64, - 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x07, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x22, 0x00, 0x12, 0x2e, - 0x0a, 0x09, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x12, 0x14, 0x2e, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x26, - 0x0a, 0x06, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, - 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x07, 0x2e, 0x70, 0x62, - 0x2e, 0x50, 0x6f, 0x64, 0x22, 0x00, 0x12, 0x21, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, - 0x64, 0x73, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x08, 0x2e, - 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x73, 0x22, 0x00, 0x12, 0x39, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x11, 0x2e, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x10, - 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x41, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x12, 0x29, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x32, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x4e, - 0x6f, 0x64, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, - 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x29, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x67, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0a, 0x2e, 0x70, - 0x62, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x12, 0x29, 0x0a, 0x07, 0x53, 0x65, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, - 0x0d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, - 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x09, 0x2e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3b, 0x0a, 0x11, 0x43, 0x61, 0x6c, 0x63, 0x75, - 0x6c, 0x61, 0x74, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x11, 0x2e, 0x70, - 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x49, 0x44, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x49, 0x44, 0x73, 0x1a, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x38, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0d, 0x2e, 0x70, 0x62, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x12, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x49, 0x44, 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x12, 0x53, 0x65, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1f, - 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x0f, 0x2e, 0x70, - 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, - 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, - 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x3e, 0x0a, 0x0a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x15, - 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x3e, 0x0a, 0x0a, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x15, - 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x41, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, - 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x3b, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x42, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x45, 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1a, 0x2e, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4a, 0x0a, 0x0e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x19, 0x2e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x12, 0x44, 0x69, 0x73, 0x73, 0x6f, - 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1d, 0x2e, - 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1d, 0x2e, 0x70, - 0x62, 0x2e, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x4d, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1a, - 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4e, - 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, - 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x43, - 0x0a, 0x0f, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x6c, - 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x44, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, 0x12, 0x15, - 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, - 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x28, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x72, 0x75, 0x32, - 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x65, 0x6e, 0x3b, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x69, 0x65, 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, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x27, 0x0a, 0x06, 0x54, 0x72, 0x69, 0x4f, 0x70, 0x74, 0x12, + 0x08, 0x0a, 0x04, 0x4b, 0x45, 0x45, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x52, 0x55, + 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10, 0x02, 0x2a, 0x52, + 0x0a, 0x0d, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, + 0x54, 0x44, 0x45, 0x52, 0x52, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x59, 0x50, 0x45, 0x57, + 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x49, 0x44, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x08, 0x45, + 0x52, 0x55, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x01, 0x32, 0x88, 0x14, 0x0a, 0x07, 0x43, 0x6f, 0x72, 0x65, 0x52, 0x50, 0x43, 0x12, 0x21, + 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, + 0x00, 0x12, 0x36, 0x0a, 0x12, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x30, 0x01, 0x12, 0x36, 0x0a, 0x0c, 0x4c, 0x69, 0x73, + 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x22, + 0x00, 0x12, 0x3a, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0b, + 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x00, 0x12, 0x3e, 0x0a, + 0x11, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x12, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x26, 0x0a, + 0x06, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, + 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x07, 0x2e, 0x70, 0x62, 0x2e, + 0x50, 0x6f, 0x64, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x09, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, + 0x6f, 0x64, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6f, + 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x26, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x12, + 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x1a, 0x07, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x22, 0x00, 0x12, 0x21, 0x0a, + 0x08, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x73, 0x22, 0x00, + 0x12, 0x39, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, + 0x63, 0x65, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x41, 0x0a, 0x0f, 0x47, + 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, + 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x12, 0x29, + 0x0a, 0x07, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x41, + 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, + 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0a, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, + 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x32, 0x0a, 0x0c, 0x4c, + 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x70, 0x62, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x29, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, + 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x35, 0x0a, 0x11, 0x47, 0x65, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x1a, 0x0a, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x67, 0x69, 0x6e, 0x65, 0x22, + 0x00, 0x12, 0x29, 0x0a, 0x07, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x3e, + 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, + 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3c, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x49, 0x44, 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x12, + 0x53, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x12, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3b, 0x0a, 0x11, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, + 0x61, 0x74, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x11, 0x2e, 0x70, 0x62, + 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x13, + 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x49, 0x44, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x49, 0x44, 0x73, 0x1a, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x38, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0d, 0x2e, 0x70, 0x62, 0x2e, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x00, 0x12, 0x2c, 0x0a, 0x04, 0x43, + 0x6f, 0x70, 0x79, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x53, 0x65, 0x6e, + 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x15, 0x2e, 0x70, + 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x15, 0x2e, 0x70, + 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x41, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x16, + 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3b, 0x0a, 0x09, 0x4c, 0x69, + 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x14, 0x2e, + 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x45, 0x0a, 0x0f, 0x52, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x12, + 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x4a, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, + 0x0a, 0x12, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, + 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x1a, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4d, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, + 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x43, 0x0a, 0x0f, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1a, 0x2e, 0x70, + 0x62, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x4c, 0x6f, + 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x14, 0x2e, + 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x41, 0x6e, + 0x64, 0x57, 0x61, 0x69, 0x74, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x6e, + 0x64, 0x57, 0x61, 0x69, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, + 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x28, 0x5a, + 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x65, 0x72, 0x75, 0x32, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x72, 0x70, 0x63, + 0x2f, 0x67, 0x65, 0x6e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -7022,17 +7012,17 @@ var file_rpc_gen_core_proto_depIdxs = []int32{ 25, // 89: pb.CoreRPC.GetNode:input_type -> pb.GetNodeOptions 25, // 90: pb.CoreRPC.GetNodeEngineInfo:input_type -> pb.GetNodeOptions 28, // 91: pb.CoreRPC.SetNode:input_type -> pb.SetNodeOptions - 29, // 92: pb.CoreRPC.SetNodeStatus:input_type -> pb.SetNodeStatusOptions - 30, // 93: pb.CoreRPC.GetNodeStatus:input_type -> pb.GetNodeStatusOptions + 30, // 92: pb.CoreRPC.GetNodeStatus:input_type -> pb.GetNodeStatusOptions + 29, // 93: pb.CoreRPC.SetNodeStatus:input_type -> pb.SetNodeStatusOptions 4, // 94: pb.CoreRPC.NodeStatusStream:input_type -> pb.Empty - 53, // 95: pb.CoreRPC.CalculateCapacity:input_type -> pb.DeployOptions - 40, // 96: pb.CoreRPC.GetWorkload:input_type -> pb.WorkloadID - 41, // 97: pb.CoreRPC.GetWorkloads:input_type -> pb.WorkloadIDs - 8, // 98: pb.CoreRPC.ListWorkloads:input_type -> pb.ListWorkloadsOptions - 25, // 99: pb.CoreRPC.ListNodeWorkloads:input_type -> pb.GetNodeOptions - 41, // 100: pb.CoreRPC.GetWorkloadsStatus:input_type -> pb.WorkloadIDs - 36, // 101: pb.CoreRPC.SetWorkloadsStatus:input_type -> pb.SetWorkloadsStatusOptions - 37, // 102: pb.CoreRPC.WorkloadStatusStream:input_type -> pb.WorkloadStatusStreamOptions + 41, // 95: pb.CoreRPC.GetWorkloadsStatus:input_type -> pb.WorkloadIDs + 36, // 96: pb.CoreRPC.SetWorkloadsStatus:input_type -> pb.SetWorkloadsStatusOptions + 37, // 97: pb.CoreRPC.WorkloadStatusStream:input_type -> pb.WorkloadStatusStreamOptions + 53, // 98: pb.CoreRPC.CalculateCapacity:input_type -> pb.DeployOptions + 40, // 99: pb.CoreRPC.GetWorkload:input_type -> pb.WorkloadID + 41, // 100: pb.CoreRPC.GetWorkloads:input_type -> pb.WorkloadIDs + 8, // 101: pb.CoreRPC.ListWorkloads:input_type -> pb.ListWorkloadsOptions + 25, // 102: pb.CoreRPC.ListNodeWorkloads:input_type -> pb.GetNodeOptions 59, // 103: pb.CoreRPC.Copy:input_type -> pb.CopyOptions 62, // 104: pb.CoreRPC.Send:input_type -> pb.SendOptions 47, // 105: pb.CoreRPC.BuildImage:input_type -> pb.BuildImageOptions @@ -7065,17 +7055,17 @@ var file_rpc_gen_core_proto_depIdxs = []int32{ 19, // 132: pb.CoreRPC.GetNode:output_type -> pb.Node 7, // 133: pb.CoreRPC.GetNodeEngineInfo:output_type -> pb.Engine 19, // 134: pb.CoreRPC.SetNode:output_type -> pb.Node - 4, // 135: pb.CoreRPC.SetNodeStatus:output_type -> pb.Empty - 31, // 136: pb.CoreRPC.GetNodeStatus:output_type -> pb.NodeStatusStreamMessage + 31, // 135: pb.CoreRPC.GetNodeStatus:output_type -> pb.NodeStatusStreamMessage + 4, // 136: pb.CoreRPC.SetNodeStatus:output_type -> pb.Empty 31, // 137: pb.CoreRPC.NodeStatusStream:output_type -> pb.NodeStatusStreamMessage - 83, // 138: pb.CoreRPC.CalculateCapacity:output_type -> pb.CapacityMessage - 33, // 139: pb.CoreRPC.GetWorkload:output_type -> pb.Workload - 39, // 140: pb.CoreRPC.GetWorkloads:output_type -> pb.Workloads - 33, // 141: pb.CoreRPC.ListWorkloads:output_type -> pb.Workload - 39, // 142: pb.CoreRPC.ListNodeWorkloads:output_type -> pb.Workloads - 35, // 143: pb.CoreRPC.GetWorkloadsStatus:output_type -> pb.WorkloadsStatus - 35, // 144: pb.CoreRPC.SetWorkloadsStatus:output_type -> pb.WorkloadsStatus - 38, // 145: pb.CoreRPC.WorkloadStatusStream:output_type -> pb.WorkloadStatusStreamMessage + 35, // 138: pb.CoreRPC.GetWorkloadsStatus:output_type -> pb.WorkloadsStatus + 35, // 139: pb.CoreRPC.SetWorkloadsStatus:output_type -> pb.WorkloadsStatus + 38, // 140: pb.CoreRPC.WorkloadStatusStream:output_type -> pb.WorkloadStatusStreamMessage + 83, // 141: pb.CoreRPC.CalculateCapacity:output_type -> pb.CapacityMessage + 33, // 142: pb.CoreRPC.GetWorkload:output_type -> pb.Workload + 39, // 143: pb.CoreRPC.GetWorkloads:output_type -> pb.Workloads + 33, // 144: pb.CoreRPC.ListWorkloads:output_type -> pb.Workload + 39, // 145: pb.CoreRPC.ListNodeWorkloads:output_type -> pb.Workloads 74, // 146: pb.CoreRPC.Copy:output_type -> pb.CopyMessage 75, // 147: pb.CoreRPC.Send:output_type -> pb.SendMessage 64, // 148: pb.CoreRPC.BuildImage:output_type -> pb.BuildImageMessage diff --git a/rpc/gen/core.proto b/rpc/gen/core.proto index 40234533b..1223bfd3d 100644 --- a/rpc/gen/core.proto +++ b/rpc/gen/core.proto @@ -26,9 +26,13 @@ service CoreRPC { rpc GetNode(GetNodeOptions) returns (Node) {}; rpc GetNodeEngineInfo(GetNodeOptions) returns (Engine) {}; rpc SetNode(SetNodeOptions) returns (Node) {}; - rpc SetNodeStatus(SetNodeStatusOptions) returns (Empty) {}; + rpc GetNodeStatus(GetNodeStatusOptions) returns (NodeStatusStreamMessage) {}; + rpc SetNodeStatus(SetNodeStatusOptions) returns (Empty) {}; rpc NodeStatusStream(Empty) returns (stream NodeStatusStreamMessage) {}; + rpc GetWorkloadsStatus(WorkloadIDs) returns (WorkloadsStatus) {}; + rpc SetWorkloadsStatus(SetWorkloadsStatusOptions) returns (WorkloadsStatus) {}; + rpc WorkloadStatusStream(WorkloadStatusStreamOptions) returns (stream WorkloadStatusStreamMessage) {}; rpc CalculateCapacity(DeployOptions) returns (CapacityMessage); @@ -36,9 +40,6 @@ service CoreRPC { rpc GetWorkloads(WorkloadIDs) returns (Workloads) {}; rpc ListWorkloads(ListWorkloadsOptions) returns (stream Workload) {}; rpc ListNodeWorkloads(GetNodeOptions) returns (Workloads) {}; - rpc GetWorkloadsStatus(WorkloadIDs) returns (WorkloadsStatus) {}; - rpc SetWorkloadsStatus(SetWorkloadsStatusOptions) returns (WorkloadsStatus) {}; - rpc WorkloadStatusStream(WorkloadStatusStreamOptions) returns (stream WorkloadStatusStreamMessage) {}; rpc Copy(CopyOptions) returns (stream CopyMessage) {}; rpc Send(SendOptions) returns (stream SendMessage) {}; @@ -237,76 +238,75 @@ message NodeFilter { } message Workload { - string id = 1; - string podname = 2; - string nodename = 3; - string name = 4; - bool privileged = 5; - map labels = 6; - map publish = 7; - string image = 8; - WorkloadStatus status = 9; -// Resource resource = 10; - int64 create_time = 11; - repeated string env = 12; - string resource_args = 13; + string id = 1001; + string podname = 1002; + string nodename = 1003; + string name = 1004; + bool privileged = 1005; + map labels = 1006; + map publish = 1007; + string image = 1008; + WorkloadStatus status = 1009; + int64 create_time = 1010; + repeated string env = 1011; + string resource_args = 1012; } message WorkloadStatus { - string id = 1; - bool running = 2; - bool healthy = 3; - map networks = 4; - bytes extension = 5; - int64 ttl = 6; + string id = 1001; + bool running = 1002; + bool healthy = 1003; + map networks = 1004; + bytes extension = 1005; + int64 ttl = 1006; // extra fields used to set workload status - string appname = 7; - string nodename = 8; - string entrypoint = 9; + string appname = 1007; + string nodename = 1008; + string entrypoint = 1009; } message WorkloadsStatus { - repeated WorkloadStatus status = 1; + repeated WorkloadStatus status = 1001; } message SetWorkloadsStatusOptions { - repeated WorkloadStatus status = 1; + repeated WorkloadStatus status = 1001; } message WorkloadStatusStreamOptions { - string appname = 1; - string entrypoint = 2; - string nodename = 3; - map labels = 4; + string appname = 1001; + string entrypoint = 1002; + string nodename = 1003; + map labels = 1004; } message WorkloadStatusStreamMessage { - string id = 1; - Workload workload = 2; - WorkloadStatus status = 3; - string error = 4; - bool delete = 5; + string id = 1001; + Workload workload = 1002; + WorkloadStatus status = 1003; + string error = 1004; + bool delete = 1005; } message Workloads { - repeated Workload workloads = 1; + repeated Workload workloads = 1001; } message WorkloadID { - string id = 1; + string id = 1001; } message WorkloadIDs { - repeated string ids = 1; + repeated string ids = 1001; } message RemoveWorkloadOptions { - repeated string ids = 1; - bool force = 2; + repeated string ids = 1001; + bool force = 1002; } message DissociateWorkloadOptions { - repeated string ids = 1; + repeated string ids = 1001; } enum TriOpt { @@ -321,80 +321,80 @@ message ReallocOptions { } message Build { - string base = 1; - string repo = 2; - string version = 3; - string dir = 4; - bool submodule = 5; - repeated string commands = 6; - map envs = 7; - map args = 8; - map labels = 9; - map artifacts = 10; - map cache = 11; - string stop_signal = 12; - bool security = 13; + string base = 1001; + string repo = 1002; + string version = 1003; + string dir = 1004; + bool submodule = 1005; + repeated string commands = 1006; + map envs = 1007; + map args = 1008; + map labels = 1009; + map artifacts = 1010; + map cache = 1011; + string stop_signal = 1012; + bool security = 1013; } message Builds { - repeated string stages = 1; - map builds = 2; + repeated string stages = 1001; + map builds = 1002; } message BuildImageOptions { - string name = 1; - string user = 2; - int32 uid = 3; - repeated string tags = 4; - Builds builds = 5; - bytes tar = 6; + string name = 1001; + string user = 1002; + int32 uid = 1003; + repeated string tags = 1004; + Builds builds = 1005; + bytes tar = 1006; enum BuildMethod { SCM = 0; RAW = 1; EXIST = 2; } - BuildMethod build_method = 7; - string exist_id = 8; + BuildMethod build_method = 1007; + string exist_id = 1008; } message HookOptions { - repeated string after_start = 1; - repeated string before_stop = 2; - bool force = 3; + repeated string after_start = 1001; + repeated string before_stop = 1002; + bool force = 1003; } message HealthCheckOptions { - repeated string tcp_ports = 1; - string http_port = 2; - string url = 3; - int32 code = 4; + repeated string tcp_ports = 1001; + string http_port = 1002; + string url = 1003; + int32 code = 1004; } message LogOptions { - string type = 1; - map config = 2; + string type = 1001; + map config = 1002; } message EntrypointOptions { - string name = 1; + string name = 1001; // `command` field is to be deprecated in favor of `commands` field - string command = 2; - bool privileged = 3; - string dir = 4; - LogOptions log = 5; - repeated string publish = 6; - HealthCheckOptions healthcheck = 7; - HookOptions hook = 8; - string restart = 9; - map sysctls = 10; + string command = 1002; + bool privileged = 1003; + string dir = 1004; + LogOptions log = 1005; + repeated string publish = 1006; + HealthCheckOptions healthcheck = 1007; + HookOptions hook = 1008; + string restart = 1009; + map sysctls = 1010; // `commands` is the new-style and preferable fields to specify process to run // to specify shell-like command such as `true && echo a > /dev/null` // please state the shell explicitly: ["sh", "-c", "true && echo a > /dev/null"] - repeated string commands = 11; + repeated string commands = 1011; } message Volume { - map volume = 1; + map volume = 1001; } message DeployOptions { @@ -405,173 +405,168 @@ message DeployOptions { GLOBAL = 3; DUMMY = 99; } - string name = 1; - EntrypointOptions entrypoint = 2; - string podname = 3; - repeated string nodenames = 4; - string image = 5; - string extra_args = 6; - int32 count = 7; - repeated string env = 8; - repeated string dns = 9; - repeated string extra_hosts = 10; - map networks = 11; - string user = 13; - bool debug = 14; - bool open_stdin = 15; - map labels = 16; - map nodelabels = 17; - Strategy deploy_strategy = 18; - map data = 19; - int32 nodes_limit = 20; - bool ignore_hook = 21; - repeated string after_create = 22; - bytes raw_args = 23; -// ResourceOptions old_resource_opts = 24; - NodeFilter node_filter = 25; - // should be part of field no.19 - map modes = 26; - map owners = 27; - map resource_opts = 28; + string name = 1001; + EntrypointOptions entrypoint = 1002; + string podname = 1003; + repeated string nodenames = 1004; + string image = 1005; + string extra_args = 1006; + int32 count = 1007; + repeated string env = 1008; + repeated string dns = 1009; + repeated string extra_hosts = 1010; + map networks = 1011; + string user = 1013; + bool debug = 1014; + bool open_stdin = 1015; + map labels = 1016; + map nodelabels = 1017; + Strategy deploy_strategy = 1018; + map data = 1019; + int32 nodes_limit = 1020; + bool ignore_hook = 1021; + repeated string after_create = 1022; + bytes raw_args = 1023; + NodeFilter node_filter = 1024; + map modes = 1025; + map owners = 1026; + map resource_opts = 1027; } message ReplaceOptions { - DeployOptions deployOpt = 1; - bool networkinherit = 2; - map filter_labels = 3; - map copy = 4; - repeated string ids = 5; + DeployOptions deployOpt = 1001; + bool networkinherit = 1002; + map filter_labels = 1003; + map copy = 1004; + repeated string ids = 5100; } message CacheImageOptions { - string podname = 1; - repeated string nodenames = 2; - repeated string images = 3; - int32 step = 4; + string podname = 1001; + repeated string nodenames = 1002; + repeated string images = 1003; } message RemoveImageOptions { - string podname = 1; - repeated string nodenames = 2; - repeated string images = 3; - int32 step = 4; - bool prune = 5; + string podname = 1001; + repeated string nodenames = 1002; + repeated string images = 1003; + bool prune = 1005; } message ListImageOptions { - string podname = 1; - repeated string nodenames = 2; - string filter = 3; + string podname = 1001; + repeated string nodenames = 1002; + string filter = 1003; } message CopyPaths { - repeated string paths = 1; + repeated string paths = 1001; } message CopyOptions { - map targets = 1; + map targets = 1001; } message FileOwner { - int32 uid = 1; - int32 gid = 2; + int32 uid = 1001; + int32 gid = 1002; } message FileMode { - int64 mode = 1; + int64 mode = 1001; } message SendOptions { - repeated string ids = 1; - map data = 2; - map modes = 3; - map owners = 4; + repeated string ids = 1001; + map data = 1002; + map modes = 1003; + map owners = 1004; } message ErrorDetail { - int64 code = 1; - string message = 2; + int64 code = 1001; + string message = 1002; } message BuildImageMessage { - string id = 1; - string status = 2; - string progress = 3; - string error = 4; - string stream = 5; - ErrorDetail error_detail = 6; + string id = 1001; + string status = 1002; + string progress = 1003; + string error = 1004; + string stream = 1005; + ErrorDetail error_detail = 1006; } message CreateWorkloadMessage { - string podname = 1; - string nodename = 2; - string id = 3; - string name = 4; - string error = 5; - bool success = 6; - map publish = 7; - bytes hook = 8; -// Resource resource = 9; - string resource_args = 10; + string podname = 1001; + string nodename = 1002; + string id = 1003; + string name = 1004; + string error = 1005; + bool success = 1006; + map publish = 1007; + bytes hook = 1008; + string resource_args = 1009; } message ReplaceWorkloadMessage { - CreateWorkloadMessage create = 1; - RemoveWorkloadMessage remove = 2; - string error = 3; + CreateWorkloadMessage create = 1001; + RemoveWorkloadMessage remove = 1002; + string error = 1003; } message CacheImageMessage { - string image = 1; - bool success = 2; - string nodename = 3; - string message = 4; + string image = 1001; + bool success = 1002; + string nodename = 1003; + string message = 1004; } message RemoveImageMessage { - string image = 1; - bool success = 2; - repeated string messages = 3; + string image = 1001; + bool success = 1002; + repeated string messages = 1003; } message ImageItem{ - string id = 1; - repeated string tags = 2; + string id = 1001; + repeated string tags = 1002; } message ListImageMessage{ - repeated ImageItem images = 1; - string nodename = 2; - string err = 3; + repeated ImageItem images = 1001; + string nodename = 1002; + string err = 1003; } message RemoveWorkloadMessage { - string id = 1; - bool success = 2; - string hook = 3; + string id = 1001; + bool success = 1002; + string hook = 1003; } message DissociateWorkloadMessage { - string id = 1; - string error = 2; + string id = 1001; + string error = 1002; } message ReallocResourceMessage { - string error = 1; + string error = 1001; } message CopyMessage { - string id = 1; - string name = 2; - string path = 3; - string error = 4; - bytes data = 5; + string id = 1001; + string name = 1002; + string path = 1003; + string error = 1004; + bytes data = 1005; } message SendMessage { - string id = 1; - string path = 2; - string error = 3; + string id = 1001; + string path = 1002; + string error = 1003; } enum StdStreamType { @@ -582,55 +577,55 @@ enum StdStreamType { } message AttachWorkloadMessage { - string workload_id = 1; - bytes data = 2; - StdStreamType std_stream_type = 3; + string workload_id = 1001; + bytes data = 1002; + StdStreamType std_stream_type = 1003; } message RunAndWaitOptions{ - DeployOptions deploy_options = 1; - bytes cmd = 2; - bool async = 3; - int32 async_timeout = 4; + DeployOptions deploy_options = 1001; + bytes cmd = 1002; + bool async = 1003; + int32 async_timeout = 1004; } message ControlWorkloadOptions { - repeated string ids = 1; - string type = 2; - bool force = 3; + repeated string ids = 1001; + string type = 1002; + bool force = 1003; } message ControlWorkloadMessage { - string id = 1; - string error = 2; - bytes hook = 3; + string id = 1001; + string error = 1002; + bytes hook = 1003; } message LogStreamOptions { - string id = 1; - string tail = 2; - string since = 3; - string until = 4; - bool follow = 5; + string id = 1001; + string tail = 1002; + string since = 1003; + string until = 1004; + bool follow = 1005; } message LogStreamMessage { - string id = 1; - string error = 2; - bytes data = 3; - StdStreamType std_stream_type = 4; + string id = 1001; + string error = 1002; + bytes data = 1003; + StdStreamType std_stream_type = 1004; } message ExecuteWorkloadOptions { - string workload_id = 1; - repeated string commands = 2; - repeated string envs = 3; - string workdir = 4; - bool open_stdin = 5; - bytes repl_cmd = 6; + string workload_id = 1001; + repeated string commands = 1002; + repeated string envs = 1003; + string workdir = 1004; + bool open_stdin = 1005; + bytes repl_cmd = 1006; } message CapacityMessage { - int64 total = 1; - map node_capacities = 2; + int64 total = 1001; + map node_capacities = 1002; } diff --git a/rpc/gen/core_grpc.pb.go b/rpc/gen/core_grpc.pb.go index 02e087b6b..801da5273 100644 --- a/rpc/gen/core_grpc.pb.go +++ b/rpc/gen/core_grpc.pb.go @@ -39,17 +39,17 @@ type CoreRPCClient interface { GetNode(ctx context.Context, in *GetNodeOptions, opts ...grpc.CallOption) (*Node, error) GetNodeEngineInfo(ctx context.Context, in *GetNodeOptions, opts ...grpc.CallOption) (*Engine, error) SetNode(ctx context.Context, in *SetNodeOptions, opts ...grpc.CallOption) (*Node, error) - SetNodeStatus(ctx context.Context, in *SetNodeStatusOptions, opts ...grpc.CallOption) (*Empty, error) GetNodeStatus(ctx context.Context, in *GetNodeStatusOptions, opts ...grpc.CallOption) (*NodeStatusStreamMessage, error) + SetNodeStatus(ctx context.Context, in *SetNodeStatusOptions, opts ...grpc.CallOption) (*Empty, error) NodeStatusStream(ctx context.Context, in *Empty, opts ...grpc.CallOption) (CoreRPC_NodeStatusStreamClient, error) + GetWorkloadsStatus(ctx context.Context, in *WorkloadIDs, opts ...grpc.CallOption) (*WorkloadsStatus, error) + SetWorkloadsStatus(ctx context.Context, in *SetWorkloadsStatusOptions, opts ...grpc.CallOption) (*WorkloadsStatus, error) + WorkloadStatusStream(ctx context.Context, in *WorkloadStatusStreamOptions, opts ...grpc.CallOption) (CoreRPC_WorkloadStatusStreamClient, error) CalculateCapacity(ctx context.Context, in *DeployOptions, opts ...grpc.CallOption) (*CapacityMessage, error) GetWorkload(ctx context.Context, in *WorkloadID, opts ...grpc.CallOption) (*Workload, error) GetWorkloads(ctx context.Context, in *WorkloadIDs, opts ...grpc.CallOption) (*Workloads, error) ListWorkloads(ctx context.Context, in *ListWorkloadsOptions, opts ...grpc.CallOption) (CoreRPC_ListWorkloadsClient, error) ListNodeWorkloads(ctx context.Context, in *GetNodeOptions, opts ...grpc.CallOption) (*Workloads, error) - GetWorkloadsStatus(ctx context.Context, in *WorkloadIDs, opts ...grpc.CallOption) (*WorkloadsStatus, error) - SetWorkloadsStatus(ctx context.Context, in *SetWorkloadsStatusOptions, opts ...grpc.CallOption) (*WorkloadsStatus, error) - WorkloadStatusStream(ctx context.Context, in *WorkloadStatusStreamOptions, opts ...grpc.CallOption) (CoreRPC_WorkloadStatusStreamClient, error) Copy(ctx context.Context, in *CopyOptions, opts ...grpc.CallOption) (CoreRPC_CopyClient, error) Send(ctx context.Context, in *SendOptions, opts ...grpc.CallOption) (CoreRPC_SendClient, error) BuildImage(ctx context.Context, in *BuildImageOptions, opts ...grpc.CallOption) (CoreRPC_BuildImageClient, error) @@ -297,18 +297,18 @@ func (c *coreRPCClient) SetNode(ctx context.Context, in *SetNodeOptions, opts .. return out, nil } -func (c *coreRPCClient) SetNodeStatus(ctx context.Context, in *SetNodeStatusOptions, opts ...grpc.CallOption) (*Empty, error) { - out := new(Empty) - err := c.cc.Invoke(ctx, "/pb.CoreRPC/SetNodeStatus", in, out, opts...) +func (c *coreRPCClient) GetNodeStatus(ctx context.Context, in *GetNodeStatusOptions, opts ...grpc.CallOption) (*NodeStatusStreamMessage, error) { + out := new(NodeStatusStreamMessage) + err := c.cc.Invoke(ctx, "/pb.CoreRPC/GetNodeStatus", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *coreRPCClient) GetNodeStatus(ctx context.Context, in *GetNodeStatusOptions, opts ...grpc.CallOption) (*NodeStatusStreamMessage, error) { - out := new(NodeStatusStreamMessage) - err := c.cc.Invoke(ctx, "/pb.CoreRPC/GetNodeStatus", in, out, opts...) +func (c *coreRPCClient) SetNodeStatus(ctx context.Context, in *SetNodeStatusOptions, opts ...grpc.CallOption) (*Empty, error) { + out := new(Empty) + err := c.cc.Invoke(ctx, "/pb.CoreRPC/SetNodeStatus", in, out, opts...) if err != nil { return nil, err } @@ -347,39 +347,30 @@ func (x *coreRPCNodeStatusStreamClient) Recv() (*NodeStatusStreamMessage, error) return m, nil } -func (c *coreRPCClient) CalculateCapacity(ctx context.Context, in *DeployOptions, opts ...grpc.CallOption) (*CapacityMessage, error) { - out := new(CapacityMessage) - err := c.cc.Invoke(ctx, "/pb.CoreRPC/CalculateCapacity", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *coreRPCClient) GetWorkload(ctx context.Context, in *WorkloadID, opts ...grpc.CallOption) (*Workload, error) { - out := new(Workload) - err := c.cc.Invoke(ctx, "/pb.CoreRPC/GetWorkload", in, out, opts...) +func (c *coreRPCClient) GetWorkloadsStatus(ctx context.Context, in *WorkloadIDs, opts ...grpc.CallOption) (*WorkloadsStatus, error) { + out := new(WorkloadsStatus) + err := c.cc.Invoke(ctx, "/pb.CoreRPC/GetWorkloadsStatus", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *coreRPCClient) GetWorkloads(ctx context.Context, in *WorkloadIDs, opts ...grpc.CallOption) (*Workloads, error) { - out := new(Workloads) - err := c.cc.Invoke(ctx, "/pb.CoreRPC/GetWorkloads", in, out, opts...) +func (c *coreRPCClient) SetWorkloadsStatus(ctx context.Context, in *SetWorkloadsStatusOptions, opts ...grpc.CallOption) (*WorkloadsStatus, error) { + out := new(WorkloadsStatus) + err := c.cc.Invoke(ctx, "/pb.CoreRPC/SetWorkloadsStatus", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *coreRPCClient) ListWorkloads(ctx context.Context, in *ListWorkloadsOptions, opts ...grpc.CallOption) (CoreRPC_ListWorkloadsClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[4], "/pb.CoreRPC/ListWorkloads", opts...) +func (c *coreRPCClient) WorkloadStatusStream(ctx context.Context, in *WorkloadStatusStreamOptions, opts ...grpc.CallOption) (CoreRPC_WorkloadStatusStreamClient, error) { + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[4], "/pb.CoreRPC/WorkloadStatusStream", opts...) if err != nil { return nil, err } - x := &coreRPCListWorkloadsClient{stream} + x := &coreRPCWorkloadStatusStreamClient{stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -389,56 +380,56 @@ func (c *coreRPCClient) ListWorkloads(ctx context.Context, in *ListWorkloadsOpti return x, nil } -type CoreRPC_ListWorkloadsClient interface { - Recv() (*Workload, error) +type CoreRPC_WorkloadStatusStreamClient interface { + Recv() (*WorkloadStatusStreamMessage, error) grpc.ClientStream } -type coreRPCListWorkloadsClient struct { +type coreRPCWorkloadStatusStreamClient struct { grpc.ClientStream } -func (x *coreRPCListWorkloadsClient) Recv() (*Workload, error) { - m := new(Workload) +func (x *coreRPCWorkloadStatusStreamClient) Recv() (*WorkloadStatusStreamMessage, error) { + m := new(WorkloadStatusStreamMessage) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } -func (c *coreRPCClient) ListNodeWorkloads(ctx context.Context, in *GetNodeOptions, opts ...grpc.CallOption) (*Workloads, error) { - out := new(Workloads) - err := c.cc.Invoke(ctx, "/pb.CoreRPC/ListNodeWorkloads", in, out, opts...) +func (c *coreRPCClient) CalculateCapacity(ctx context.Context, in *DeployOptions, opts ...grpc.CallOption) (*CapacityMessage, error) { + out := new(CapacityMessage) + err := c.cc.Invoke(ctx, "/pb.CoreRPC/CalculateCapacity", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *coreRPCClient) GetWorkloadsStatus(ctx context.Context, in *WorkloadIDs, opts ...grpc.CallOption) (*WorkloadsStatus, error) { - out := new(WorkloadsStatus) - err := c.cc.Invoke(ctx, "/pb.CoreRPC/GetWorkloadsStatus", in, out, opts...) +func (c *coreRPCClient) GetWorkload(ctx context.Context, in *WorkloadID, opts ...grpc.CallOption) (*Workload, error) { + out := new(Workload) + err := c.cc.Invoke(ctx, "/pb.CoreRPC/GetWorkload", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *coreRPCClient) SetWorkloadsStatus(ctx context.Context, in *SetWorkloadsStatusOptions, opts ...grpc.CallOption) (*WorkloadsStatus, error) { - out := new(WorkloadsStatus) - err := c.cc.Invoke(ctx, "/pb.CoreRPC/SetWorkloadsStatus", in, out, opts...) +func (c *coreRPCClient) GetWorkloads(ctx context.Context, in *WorkloadIDs, opts ...grpc.CallOption) (*Workloads, error) { + out := new(Workloads) + err := c.cc.Invoke(ctx, "/pb.CoreRPC/GetWorkloads", in, out, opts...) if err != nil { return nil, err } return out, nil } -func (c *coreRPCClient) WorkloadStatusStream(ctx context.Context, in *WorkloadStatusStreamOptions, opts ...grpc.CallOption) (CoreRPC_WorkloadStatusStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[5], "/pb.CoreRPC/WorkloadStatusStream", opts...) +func (c *coreRPCClient) ListWorkloads(ctx context.Context, in *ListWorkloadsOptions, opts ...grpc.CallOption) (CoreRPC_ListWorkloadsClient, error) { + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[5], "/pb.CoreRPC/ListWorkloads", opts...) if err != nil { return nil, err } - x := &coreRPCWorkloadStatusStreamClient{stream} + x := &coreRPCListWorkloadsClient{stream} if err := x.ClientStream.SendMsg(in); err != nil { return nil, err } @@ -448,23 +439,32 @@ func (c *coreRPCClient) WorkloadStatusStream(ctx context.Context, in *WorkloadSt return x, nil } -type CoreRPC_WorkloadStatusStreamClient interface { - Recv() (*WorkloadStatusStreamMessage, error) +type CoreRPC_ListWorkloadsClient interface { + Recv() (*Workload, error) grpc.ClientStream } -type coreRPCWorkloadStatusStreamClient struct { +type coreRPCListWorkloadsClient struct { grpc.ClientStream } -func (x *coreRPCWorkloadStatusStreamClient) Recv() (*WorkloadStatusStreamMessage, error) { - m := new(WorkloadStatusStreamMessage) +func (x *coreRPCListWorkloadsClient) Recv() (*Workload, error) { + m := new(Workload) if err := x.ClientStream.RecvMsg(m); err != nil { return nil, err } return m, nil } +func (c *coreRPCClient) ListNodeWorkloads(ctx context.Context, in *GetNodeOptions, opts ...grpc.CallOption) (*Workloads, error) { + out := new(Workloads) + err := c.cc.Invoke(ctx, "/pb.CoreRPC/ListNodeWorkloads", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *coreRPCClient) Copy(ctx context.Context, in *CopyOptions, opts ...grpc.CallOption) (CoreRPC_CopyClient, error) { stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[6], "/pb.CoreRPC/Copy", opts...) if err != nil { @@ -941,17 +941,17 @@ type CoreRPCServer interface { GetNode(context.Context, *GetNodeOptions) (*Node, error) GetNodeEngineInfo(context.Context, *GetNodeOptions) (*Engine, error) SetNode(context.Context, *SetNodeOptions) (*Node, error) - SetNodeStatus(context.Context, *SetNodeStatusOptions) (*Empty, error) GetNodeStatus(context.Context, *GetNodeStatusOptions) (*NodeStatusStreamMessage, error) + SetNodeStatus(context.Context, *SetNodeStatusOptions) (*Empty, error) NodeStatusStream(*Empty, CoreRPC_NodeStatusStreamServer) error + GetWorkloadsStatus(context.Context, *WorkloadIDs) (*WorkloadsStatus, error) + SetWorkloadsStatus(context.Context, *SetWorkloadsStatusOptions) (*WorkloadsStatus, error) + WorkloadStatusStream(*WorkloadStatusStreamOptions, CoreRPC_WorkloadStatusStreamServer) error CalculateCapacity(context.Context, *DeployOptions) (*CapacityMessage, error) GetWorkload(context.Context, *WorkloadID) (*Workload, error) GetWorkloads(context.Context, *WorkloadIDs) (*Workloads, error) ListWorkloads(*ListWorkloadsOptions, CoreRPC_ListWorkloadsServer) error ListNodeWorkloads(context.Context, *GetNodeOptions) (*Workloads, error) - GetWorkloadsStatus(context.Context, *WorkloadIDs) (*WorkloadsStatus, error) - SetWorkloadsStatus(context.Context, *SetWorkloadsStatusOptions) (*WorkloadsStatus, error) - WorkloadStatusStream(*WorkloadStatusStreamOptions, CoreRPC_WorkloadStatusStreamServer) error Copy(*CopyOptions, CoreRPC_CopyServer) error Send(*SendOptions, CoreRPC_SendServer) error BuildImage(*BuildImageOptions, CoreRPC_BuildImageServer) error @@ -1024,15 +1024,24 @@ func (UnimplementedCoreRPCServer) GetNodeEngineInfo(context.Context, *GetNodeOpt func (UnimplementedCoreRPCServer) SetNode(context.Context, *SetNodeOptions) (*Node, error) { return nil, status.Errorf(codes.Unimplemented, "method SetNode not implemented") } -func (UnimplementedCoreRPCServer) SetNodeStatus(context.Context, *SetNodeStatusOptions) (*Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetNodeStatus not implemented") -} func (UnimplementedCoreRPCServer) GetNodeStatus(context.Context, *GetNodeStatusOptions) (*NodeStatusStreamMessage, error) { return nil, status.Errorf(codes.Unimplemented, "method GetNodeStatus not implemented") } +func (UnimplementedCoreRPCServer) SetNodeStatus(context.Context, *SetNodeStatusOptions) (*Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetNodeStatus not implemented") +} func (UnimplementedCoreRPCServer) NodeStatusStream(*Empty, CoreRPC_NodeStatusStreamServer) error { return status.Errorf(codes.Unimplemented, "method NodeStatusStream not implemented") } +func (UnimplementedCoreRPCServer) GetWorkloadsStatus(context.Context, *WorkloadIDs) (*WorkloadsStatus, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetWorkloadsStatus not implemented") +} +func (UnimplementedCoreRPCServer) SetWorkloadsStatus(context.Context, *SetWorkloadsStatusOptions) (*WorkloadsStatus, error) { + return nil, status.Errorf(codes.Unimplemented, "method SetWorkloadsStatus not implemented") +} +func (UnimplementedCoreRPCServer) WorkloadStatusStream(*WorkloadStatusStreamOptions, CoreRPC_WorkloadStatusStreamServer) error { + return status.Errorf(codes.Unimplemented, "method WorkloadStatusStream not implemented") +} func (UnimplementedCoreRPCServer) CalculateCapacity(context.Context, *DeployOptions) (*CapacityMessage, error) { return nil, status.Errorf(codes.Unimplemented, "method CalculateCapacity not implemented") } @@ -1048,15 +1057,6 @@ func (UnimplementedCoreRPCServer) ListWorkloads(*ListWorkloadsOptions, CoreRPC_L func (UnimplementedCoreRPCServer) ListNodeWorkloads(context.Context, *GetNodeOptions) (*Workloads, error) { return nil, status.Errorf(codes.Unimplemented, "method ListNodeWorkloads not implemented") } -func (UnimplementedCoreRPCServer) GetWorkloadsStatus(context.Context, *WorkloadIDs) (*WorkloadsStatus, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetWorkloadsStatus not implemented") -} -func (UnimplementedCoreRPCServer) SetWorkloadsStatus(context.Context, *SetWorkloadsStatusOptions) (*WorkloadsStatus, error) { - return nil, status.Errorf(codes.Unimplemented, "method SetWorkloadsStatus not implemented") -} -func (UnimplementedCoreRPCServer) WorkloadStatusStream(*WorkloadStatusStreamOptions, CoreRPC_WorkloadStatusStreamServer) error { - return status.Errorf(codes.Unimplemented, "method WorkloadStatusStream not implemented") -} func (UnimplementedCoreRPCServer) Copy(*CopyOptions, CoreRPC_CopyServer) error { return status.Errorf(codes.Unimplemented, "method Copy not implemented") } @@ -1429,38 +1429,38 @@ func _CoreRPC_SetNode_Handler(srv interface{}, ctx context.Context, dec func(int return interceptor(ctx, in, info, handler) } -func _CoreRPC_SetNodeStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetNodeStatusOptions) +func _CoreRPC_GetNodeStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetNodeStatusOptions) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(CoreRPCServer).SetNodeStatus(ctx, in) + return srv.(CoreRPCServer).GetNodeStatus(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/pb.CoreRPC/SetNodeStatus", + FullMethod: "/pb.CoreRPC/GetNodeStatus", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CoreRPCServer).SetNodeStatus(ctx, req.(*SetNodeStatusOptions)) + return srv.(CoreRPCServer).GetNodeStatus(ctx, req.(*GetNodeStatusOptions)) } return interceptor(ctx, in, info, handler) } -func _CoreRPC_GetNodeStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetNodeStatusOptions) +func _CoreRPC_SetNodeStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetNodeStatusOptions) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(CoreRPCServer).GetNodeStatus(ctx, in) + return srv.(CoreRPCServer).SetNodeStatus(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/pb.CoreRPC/GetNodeStatus", + FullMethod: "/pb.CoreRPC/SetNodeStatus", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CoreRPCServer).GetNodeStatus(ctx, req.(*GetNodeStatusOptions)) + return srv.(CoreRPCServer).SetNodeStatus(ctx, req.(*SetNodeStatusOptions)) } return interceptor(ctx, in, info, handler) } @@ -1486,156 +1486,156 @@ func (x *coreRPCNodeStatusStreamServer) Send(m *NodeStatusStreamMessage) error { return x.ServerStream.SendMsg(m) } -func _CoreRPC_CalculateCapacity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(DeployOptions) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(CoreRPCServer).CalculateCapacity(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/pb.CoreRPC/CalculateCapacity", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CoreRPCServer).CalculateCapacity(ctx, req.(*DeployOptions)) - } - return interceptor(ctx, in, info, handler) -} - -func _CoreRPC_GetWorkload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(WorkloadID) +func _CoreRPC_GetWorkloadsStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WorkloadIDs) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(CoreRPCServer).GetWorkload(ctx, in) + return srv.(CoreRPCServer).GetWorkloadsStatus(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/pb.CoreRPC/GetWorkload", + FullMethod: "/pb.CoreRPC/GetWorkloadsStatus", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CoreRPCServer).GetWorkload(ctx, req.(*WorkloadID)) + return srv.(CoreRPCServer).GetWorkloadsStatus(ctx, req.(*WorkloadIDs)) } return interceptor(ctx, in, info, handler) } -func _CoreRPC_GetWorkloads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(WorkloadIDs) +func _CoreRPC_SetWorkloadsStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(SetWorkloadsStatusOptions) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(CoreRPCServer).GetWorkloads(ctx, in) + return srv.(CoreRPCServer).SetWorkloadsStatus(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/pb.CoreRPC/GetWorkloads", + FullMethod: "/pb.CoreRPC/SetWorkloadsStatus", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CoreRPCServer).GetWorkloads(ctx, req.(*WorkloadIDs)) + return srv.(CoreRPCServer).SetWorkloadsStatus(ctx, req.(*SetWorkloadsStatusOptions)) } return interceptor(ctx, in, info, handler) } -func _CoreRPC_ListWorkloads_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(ListWorkloadsOptions) +func _CoreRPC_WorkloadStatusStream_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(WorkloadStatusStreamOptions) if err := stream.RecvMsg(m); err != nil { return err } - return srv.(CoreRPCServer).ListWorkloads(m, &coreRPCListWorkloadsServer{stream}) + return srv.(CoreRPCServer).WorkloadStatusStream(m, &coreRPCWorkloadStatusStreamServer{stream}) } -type CoreRPC_ListWorkloadsServer interface { - Send(*Workload) error +type CoreRPC_WorkloadStatusStreamServer interface { + Send(*WorkloadStatusStreamMessage) error grpc.ServerStream } -type coreRPCListWorkloadsServer struct { +type coreRPCWorkloadStatusStreamServer struct { grpc.ServerStream } -func (x *coreRPCListWorkloadsServer) Send(m *Workload) error { +func (x *coreRPCWorkloadStatusStreamServer) Send(m *WorkloadStatusStreamMessage) error { return x.ServerStream.SendMsg(m) } -func _CoreRPC_ListNodeWorkloads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(GetNodeOptions) +func _CoreRPC_CalculateCapacity_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeployOptions) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(CoreRPCServer).ListNodeWorkloads(ctx, in) + return srv.(CoreRPCServer).CalculateCapacity(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/pb.CoreRPC/ListNodeWorkloads", + FullMethod: "/pb.CoreRPC/CalculateCapacity", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CoreRPCServer).ListNodeWorkloads(ctx, req.(*GetNodeOptions)) + return srv.(CoreRPCServer).CalculateCapacity(ctx, req.(*DeployOptions)) } return interceptor(ctx, in, info, handler) } -func _CoreRPC_GetWorkloadsStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(WorkloadIDs) +func _CoreRPC_GetWorkload_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WorkloadID) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(CoreRPCServer).GetWorkloadsStatus(ctx, in) + return srv.(CoreRPCServer).GetWorkload(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/pb.CoreRPC/GetWorkloadsStatus", + FullMethod: "/pb.CoreRPC/GetWorkload", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CoreRPCServer).GetWorkloadsStatus(ctx, req.(*WorkloadIDs)) + return srv.(CoreRPCServer).GetWorkload(ctx, req.(*WorkloadID)) } return interceptor(ctx, in, info, handler) } -func _CoreRPC_SetWorkloadsStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SetWorkloadsStatusOptions) +func _CoreRPC_GetWorkloads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(WorkloadIDs) if err := dec(in); err != nil { return nil, err } if interceptor == nil { - return srv.(CoreRPCServer).SetWorkloadsStatus(ctx, in) + return srv.(CoreRPCServer).GetWorkloads(ctx, in) } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/pb.CoreRPC/SetWorkloadsStatus", + FullMethod: "/pb.CoreRPC/GetWorkloads", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(CoreRPCServer).SetWorkloadsStatus(ctx, req.(*SetWorkloadsStatusOptions)) + return srv.(CoreRPCServer).GetWorkloads(ctx, req.(*WorkloadIDs)) } return interceptor(ctx, in, info, handler) } -func _CoreRPC_WorkloadStatusStream_Handler(srv interface{}, stream grpc.ServerStream) error { - m := new(WorkloadStatusStreamOptions) +func _CoreRPC_ListWorkloads_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(ListWorkloadsOptions) if err := stream.RecvMsg(m); err != nil { return err } - return srv.(CoreRPCServer).WorkloadStatusStream(m, &coreRPCWorkloadStatusStreamServer{stream}) + return srv.(CoreRPCServer).ListWorkloads(m, &coreRPCListWorkloadsServer{stream}) } -type CoreRPC_WorkloadStatusStreamServer interface { - Send(*WorkloadStatusStreamMessage) error +type CoreRPC_ListWorkloadsServer interface { + Send(*Workload) error grpc.ServerStream } -type coreRPCWorkloadStatusStreamServer struct { +type coreRPCListWorkloadsServer struct { grpc.ServerStream } -func (x *coreRPCWorkloadStatusStreamServer) Send(m *WorkloadStatusStreamMessage) error { +func (x *coreRPCListWorkloadsServer) Send(m *Workload) error { return x.ServerStream.SendMsg(m) } +func _CoreRPC_ListNodeWorkloads_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetNodeOptions) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(CoreRPCServer).ListNodeWorkloads(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/pb.CoreRPC/ListNodeWorkloads", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(CoreRPCServer).ListNodeWorkloads(ctx, req.(*GetNodeOptions)) + } + return interceptor(ctx, in, info, handler) +} + func _CoreRPC_Copy_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(CopyOptions) if err := stream.RecvMsg(m); err != nil { @@ -2021,13 +2021,21 @@ var CoreRPC_ServiceDesc = grpc.ServiceDesc{ MethodName: "SetNode", Handler: _CoreRPC_SetNode_Handler, }, + { + MethodName: "GetNodeStatus", + Handler: _CoreRPC_GetNodeStatus_Handler, + }, { MethodName: "SetNodeStatus", Handler: _CoreRPC_SetNodeStatus_Handler, }, { - MethodName: "GetNodeStatus", - Handler: _CoreRPC_GetNodeStatus_Handler, + MethodName: "GetWorkloadsStatus", + Handler: _CoreRPC_GetWorkloadsStatus_Handler, + }, + { + MethodName: "SetWorkloadsStatus", + Handler: _CoreRPC_SetWorkloadsStatus_Handler, }, { MethodName: "CalculateCapacity", @@ -2045,14 +2053,6 @@ var CoreRPC_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListNodeWorkloads", Handler: _CoreRPC_ListNodeWorkloads_Handler, }, - { - MethodName: "GetWorkloadsStatus", - Handler: _CoreRPC_GetWorkloadsStatus_Handler, - }, - { - MethodName: "SetWorkloadsStatus", - Handler: _CoreRPC_SetWorkloadsStatus_Handler, - }, { MethodName: "ReallocResource", Handler: _CoreRPC_ReallocResource_Handler, @@ -2080,13 +2080,13 @@ var CoreRPC_ServiceDesc = grpc.ServiceDesc{ ServerStreams: true, }, { - StreamName: "ListWorkloads", - Handler: _CoreRPC_ListWorkloads_Handler, + StreamName: "WorkloadStatusStream", + Handler: _CoreRPC_WorkloadStatusStream_Handler, ServerStreams: true, }, { - StreamName: "WorkloadStatusStream", - Handler: _CoreRPC_WorkloadStatusStream_Handler, + StreamName: "ListWorkloads", + Handler: _CoreRPC_ListWorkloads_Handler, ServerStreams: true, }, { diff --git a/rpc/rpc.go b/rpc/rpc.go index f99a92518..c3b4b7ea3 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -274,16 +274,6 @@ func (v *Vibranium) SetNode(ctx context.Context, opts *pb.SetNodeOptions) (*pb.N return toRPCNode(n), nil } -// SetNodeStatus set status of a node for reporting -func (v *Vibranium) SetNodeStatus(ctx context.Context, opts *pb.SetNodeStatusOptions) (*pb.Empty, error) { - task := v.newTask(ctx, "SetNodeStatus", false) - defer task.done() - if err := v.cluster.SetNodeStatus(task.context, opts.Nodename, opts.Ttl); err != nil { - return nil, grpcstatus.Error(SetNodeStatus, err.Error()) - } - return &pb.Empty{}, nil -} - // GetNodeStatus set status of a node for reporting func (v *Vibranium) GetNodeStatus(ctx context.Context, opts *pb.GetNodeStatusOptions) (*pb.NodeStatusStreamMessage, error) { task := v.newTask(ctx, "GetNodeStatus", false) @@ -299,6 +289,16 @@ func (v *Vibranium) GetNodeStatus(ctx context.Context, opts *pb.GetNodeStatusOpt }, nil } +// SetNodeStatus set status of a node for reporting +func (v *Vibranium) SetNodeStatus(ctx context.Context, opts *pb.SetNodeStatusOptions) (*pb.Empty, error) { + task := v.newTask(ctx, "SetNodeStatus", false) + defer task.done() + if err := v.cluster.SetNodeStatus(task.context, opts.Nodename, opts.Ttl); err != nil { + return nil, grpcstatus.Error(SetNodeStatus, err.Error()) + } + return &pb.Empty{}, nil +} + // NodeStatusStream watch and show deployed status func (v *Vibranium) NodeStatusStream(_ *pb.Empty, stream pb.CoreRPC_NodeStatusStreamServer) error { task := v.newTask(stream.Context(), "NodeStatusStream", true) @@ -328,83 +328,6 @@ func (v *Vibranium) NodeStatusStream(_ *pb.Empty, stream pb.CoreRPC_NodeStatusSt } } -// CalculateCapacity calculates capacity for each node -func (v *Vibranium) CalculateCapacity(ctx context.Context, opts *pb.DeployOptions) (*pb.CapacityMessage, error) { - task := v.newTask(ctx, "CalculateCapacity", true) - defer task.done() - deployOpts, err := toCoreDeployOptions(opts) - if err != nil { - return nil, grpcstatus.Error(CalculateCapacity, err.Error()) - } - m, err := v.cluster.CalculateCapacity(task.context, deployOpts) - if err != nil { - return nil, grpcstatus.Error(CalculateCapacity, err.Error()) - } - return toRPCCapacityMessage(m), nil -} - -// GetWorkload get a workload -// More information will be shown -func (v *Vibranium) GetWorkload(ctx context.Context, id *pb.WorkloadID) (*pb.Workload, error) { - task := v.newTask(ctx, "GetWorkload", false) - defer task.done() - workload, err := v.cluster.GetWorkload(task.context, id.Id) - if err != nil { - return nil, grpcstatus.Error(GetWorkload, err.Error()) - } - - return toRPCWorkload(task.context, workload) -} - -// GetWorkloads get lots workloads -// like GetWorkload, information should be returned -func (v *Vibranium) GetWorkloads(ctx context.Context, cids *pb.WorkloadIDs) (*pb.Workloads, error) { - task := v.newTask(ctx, "GetWorkloads", false) - defer task.done() - workloads, err := v.cluster.GetWorkloads(task.context, cids.GetIds()) - if err != nil { - return nil, grpcstatus.Error(GetWorkloads, err.Error()) - } - - return toRPCWorkloads(task.context, workloads, nil), nil -} - -// ListWorkloads by appname with optional entrypoint and nodename -func (v *Vibranium) ListWorkloads(opts *pb.ListWorkloadsOptions, stream pb.CoreRPC_ListWorkloadsServer) error { - task := v.newTask(stream.Context(), "ListWorkloads", true) - defer task.done() - lsopts := &types.ListWorkloadsOptions{ - Appname: opts.Appname, - Entrypoint: opts.Entrypoint, - Nodename: opts.Nodename, - Limit: opts.Limit, - Labels: opts.Labels, - } - workloads, err := v.cluster.ListWorkloads(task.context, lsopts) - if err != nil { - return grpcstatus.Error(ListWorkloads, err.Error()) - } - - for _, c := range toRPCWorkloads(task.context, workloads, opts.Labels).Workloads { - if err = stream.Send(c); err != nil { - v.logUnsentMessages(task.context, "ListWorkloads", err, c) - return grpcstatus.Error(ListWorkloads, err.Error()) - } - } - return nil -} - -// ListNodeWorkloads list node workloads -func (v *Vibranium) ListNodeWorkloads(ctx context.Context, opts *pb.GetNodeOptions) (*pb.Workloads, error) { - task := v.newTask(ctx, "ListNodeWorkloads", false) - defer task.done() - workloads, err := v.cluster.ListNodeWorkloads(task.context, opts.Nodename, opts.Labels) - if err != nil { - return nil, grpcstatus.Error(ListNodeWorkloads, err.Error()) - } - return toRPCWorkloads(task.context, workloads, nil), nil -} - // GetWorkloadsStatus get workloads status func (v *Vibranium) GetWorkloadsStatus(ctx context.Context, opts *pb.WorkloadIDs) (*pb.WorkloadsStatus, error) { task := v.newTask(ctx, "GetWorkloadsStatus", false) @@ -486,6 +409,83 @@ func (v *Vibranium) WorkloadStatusStream(opts *pb.WorkloadStatusStreamOptions, s } } +// CalculateCapacity calculates capacity for each node +func (v *Vibranium) CalculateCapacity(ctx context.Context, opts *pb.DeployOptions) (*pb.CapacityMessage, error) { + task := v.newTask(ctx, "CalculateCapacity", true) + defer task.done() + deployOpts, err := toCoreDeployOptions(opts) + if err != nil { + return nil, grpcstatus.Error(CalculateCapacity, err.Error()) + } + m, err := v.cluster.CalculateCapacity(task.context, deployOpts) + if err != nil { + return nil, grpcstatus.Error(CalculateCapacity, err.Error()) + } + return toRPCCapacityMessage(m), nil +} + +// GetWorkload get a workload +// More information will be shown +func (v *Vibranium) GetWorkload(ctx context.Context, id *pb.WorkloadID) (*pb.Workload, error) { + task := v.newTask(ctx, "GetWorkload", false) + defer task.done() + workload, err := v.cluster.GetWorkload(task.context, id.Id) + if err != nil { + return nil, grpcstatus.Error(GetWorkload, err.Error()) + } + + return toRPCWorkload(task.context, workload) +} + +// GetWorkloads get lots workloads +// like GetWorkload, information should be returned +func (v *Vibranium) GetWorkloads(ctx context.Context, cids *pb.WorkloadIDs) (*pb.Workloads, error) { + task := v.newTask(ctx, "GetWorkloads", false) + defer task.done() + workloads, err := v.cluster.GetWorkloads(task.context, cids.GetIds()) + if err != nil { + return nil, grpcstatus.Error(GetWorkloads, err.Error()) + } + + return toRPCWorkloads(task.context, workloads, nil), nil +} + +// ListWorkloads by appname with optional entrypoint and nodename +func (v *Vibranium) ListWorkloads(opts *pb.ListWorkloadsOptions, stream pb.CoreRPC_ListWorkloadsServer) error { + task := v.newTask(stream.Context(), "ListWorkloads", true) + defer task.done() + lsopts := &types.ListWorkloadsOptions{ + Appname: opts.Appname, + Entrypoint: opts.Entrypoint, + Nodename: opts.Nodename, + Limit: opts.Limit, + Labels: opts.Labels, + } + workloads, err := v.cluster.ListWorkloads(task.context, lsopts) + if err != nil { + return grpcstatus.Error(ListWorkloads, err.Error()) + } + + for _, c := range toRPCWorkloads(task.context, workloads, opts.Labels).Workloads { + if err = stream.Send(c); err != nil { + v.logUnsentMessages(task.context, "ListWorkloads", err, c) + return grpcstatus.Error(ListWorkloads, err.Error()) + } + } + return nil +} + +// ListNodeWorkloads list node workloads +func (v *Vibranium) ListNodeWorkloads(ctx context.Context, opts *pb.GetNodeOptions) (*pb.Workloads, error) { + task := v.newTask(ctx, "ListNodeWorkloads", false) + defer task.done() + workloads, err := v.cluster.ListNodeWorkloads(task.context, opts.Nodename, opts.Labels) + if err != nil { + return nil, grpcstatus.Error(ListNodeWorkloads, err.Error()) + } + return toRPCWorkloads(task.context, workloads, nil), nil +} + // Copy copy files from multiple workloads func (v *Vibranium) Copy(opts *pb.CopyOptions, stream pb.CoreRPC_CopyServer) error { task := v.newTask(stream.Context(), "Copy", true) diff --git a/rpc/transform.go b/rpc/transform.go index 17763a62a..b7eb1b84f 100644 --- a/rpc/transform.go +++ b/rpc/transform.go @@ -34,10 +34,10 @@ func toRPCNode(n *types.Node) *pb.Node { resourceCapacity := map[string]types.RawParams{} resourceUsage := map[string]types.RawParams{} - for plugin, args := range n.ResourceCapacity { + for plugin, args := range n.Resource.Capacity { resourceCapacity[plugin] = types.RawParams(args) } - for plugin, args := range n.ResourceUsage { + for plugin, args := range n.Resource.Usage { resourceUsage[plugin] = types.RawParams(args) } @@ -70,10 +70,10 @@ func toRPCNodeResource(nr *types.NodeResource) *pb.NodeResource { resourceCapacity := map[string]types.RawParams{} resourceUsage := map[string]types.RawParams{} - for plugin, args := range nr.ResourceCapacity { + for plugin, args := range nr.Capacity { resourceCapacity[plugin] = types.RawParams(args) } - for plugin, args := range nr.ResourceUsage { + for plugin, args := range nr.Usage { resourceUsage[plugin] = types.RawParams(args) } @@ -549,7 +549,6 @@ func toCoreCacheImageOptions(opts *pb.CacheImageOptions) *types.ImageOptions { Podname: opts.Podname, Nodenames: opts.Nodenames, Images: opts.Images, - Step: int(opts.Step), } } @@ -558,7 +557,6 @@ func toCoreRemoveImageOptions(opts *pb.RemoveImageOptions) *types.ImageOptions { Podname: opts.Podname, Nodenames: opts.Nodenames, Images: opts.Images, - Step: int(opts.Step), Prune: opts.Prune, } } diff --git a/store/etcdv3/mercury_test.go b/store/etcdv3/mercury_test.go index 7d59d48f8..13fcce794 100644 --- a/store/etcdv3/mercury_test.go +++ b/store/etcdv3/mercury_test.go @@ -20,7 +20,7 @@ func NewMercury(t *testing.T) *Mercury { Prefix: "/eru-test", LockPrefix: "/eru-test-lock", } - config.MaxConcurrency = 20 + config.MaxConcurrency = 100000 // config.Docker.CertPath = "/tmp" ctx, cancel := context.WithCancel(context.Background()) diff --git a/store/etcdv3/node.go b/store/etcdv3/node.go index 8f747b2b5..bd3241c78 100644 --- a/store/etcdv3/node.go +++ b/store/etcdv3/node.go @@ -312,7 +312,6 @@ func (m *Mercury) doGetNodes(ctx context.Context, kvs []*mvccpb.KeyValue, labels wg := &sync.WaitGroup{} wg.Add(len(allNodes)) nodesCh := make(chan *types.Node, len(allNodes)) - defer close(nodesCh) for _, node := range allNodes { node := node @@ -338,6 +337,7 @@ func (m *Mercury) doGetNodes(ctx context.Context, kvs []*mvccpb.KeyValue, labels }) } wg.Wait() + close(nodesCh) for node := range nodesCh { nodes = append(nodes, node) diff --git a/store/redis/rediaron_test.go b/store/redis/rediaron_test.go index ce97e8aa9..2a72279cb 100644 --- a/store/redis/rediaron_test.go +++ b/store/redis/rediaron_test.go @@ -84,7 +84,7 @@ func TestRediaron(t *testing.T) { config := types.Config{} config.LockTimeout = 10 * time.Second config.GlobalTimeout = 30 * time.Second - config.MaxConcurrency = 20 + config.MaxConcurrency = 100000 ctx, cancel := context.WithCancel(context.Background()) defer cancel() diff --git a/strategy/strategy_test.go b/strategy/strategy_test.go index 8e04dde98..1ac18d79d 100644 --- a/strategy/strategy_test.go +++ b/strategy/strategy_test.go @@ -4,8 +4,6 @@ import ( "context" "testing" - "github.com/projecteru2/core/types" - "github.com/stretchr/testify/assert" ) @@ -35,16 +33,19 @@ func deployedNodes() []Info { } func TestDeploy(t *testing.T) { - opts := &types.DeployOptions{ - DeployStrategy: "invalid", - Count: 1, - NodesLimit: 3, - } - _, err := Deploy(context.TODO(), opts.DeployStrategy, opts.Count, opts.NodesLimit, nil, 2) - opts.DeployStrategy = "AUTO" + ctx := context.TODO() + + // invaild strategy + _, err := Deploy(ctx, "invalid", -1, 3, nil, 2) + assert.Error(t, err) + + // count < 0 + _, err = Deploy(ctx, "AUTO", -1, 3, nil, 2) + assert.Error(t, err) + Plans["test"] = func(_ context.Context, _ []Info, _, _, _ int) (map[string]int, error) { return nil, nil } - _, err = Deploy(context.TODO(), opts.DeployStrategy, opts.Count, opts.NodesLimit, nil, 2) - assert.Error(t, err) + _, err = Deploy(ctx, "test", 1, 3, nil, 2) + assert.NoError(t, err) } diff --git a/types/action.go b/types/action.go deleted file mode 100644 index 6ecf54689..000000000 --- a/types/action.go +++ /dev/null @@ -1,8 +0,0 @@ -package types - -const ( - // ActionIncr for incr resource - ActionIncr = "+" - // ActionDecr for decr resource - ActionDecr = "-" -) diff --git a/types/node.go b/types/node.go index f2bed284d..64b4a1bbb 100644 --- a/types/node.go +++ b/types/node.go @@ -9,27 +9,6 @@ import ( engine "github.com/projecteru2/core/engine" ) -const ( - // IncrUsage add cpuusage - IncrUsage = "+" - // DecrUsage cpuusage - DecrUsage = "-" -) - -// NUMA define NUMA cpuID->nodeID -type NUMA map[string]string - -// NUMAMemory fine NUMA memory NODE -type NUMAMemory map[string]int64 - -// NodeMetrics used for metrics collecting -type NodeMetrics struct { - Name string - Podname string - ResourceCapacity map[string]NodeResourceArgs - ResourceUsage map[string]NodeResourceArgs -} - // NodeMeta . type NodeMeta struct { Name string `json:"name"` @@ -51,14 +30,20 @@ func (n NodeMeta) DeepCopy() (nn NodeMeta, err error) { return nn, errors.WithStack(json.Unmarshal(b, &nn)) } +// NodeResource for resource +type NodeResource struct { + Name string `json:"-"` + Capacity map[string]NodeResourceArgs `json:"capacity,omitempty"` + Usage map[string]NodeResourceArgs `json:"usage,omitempty"` + Diffs []string `json:"diffs,omitempty"` + Workloads []*Workload `json:"-"` +} + // Node store node info type Node struct { NodeMeta - NodeInfo string `json:"-"` - - ResourceCapacity map[string]NodeResourceArgs `json:"resource_capacity,omitempty"` - ResourceUsage map[string]NodeResourceArgs `json:"resource_usage,omitempty"` - Diffs []string `json:"diffs,omitempty"` + Resource NodeResource `jason:"resource,omitempty"` + NodeInfo string `json:"-"` // Bypass if bypass is true, it will not participate in future scheduling Bypass bool `json:"bypass,omitempty"` @@ -90,24 +75,6 @@ func (n *Node) IsDown() bool { return n.Bypass || !n.Available } -// Metrics reports metrics value -func (n *Node) Metrics() *NodeMetrics { - return &NodeMetrics{ - Name: n.Name, - Podname: n.Podname, - // TODO: resource args - } -} - -// NodeResource for node check -type NodeResource struct { - Name string - ResourceCapacity map[string]NodeResourceArgs - ResourceUsage map[string]NodeResourceArgs - Diffs []string - Workloads []*Workload -} - // NodeStatus wraps node status // only used for node status stream type NodeStatus struct { diff --git a/types/node_test.go b/types/node_test.go index c24e6682d..f23e6358d 100644 --- a/types/node_test.go +++ b/types/node_test.go @@ -38,8 +38,3 @@ func TestNodeInfo(t *testing.T) { node.Bypass = true assert.True(t, node.IsDown()) } - -func TestNodeMetrics(t *testing.T) { - nm := Node{} - assert.NotNil(t, nm.Metrics()) -} diff --git a/types/options.go b/types/options.go index 78161ca03..6b31c6032 100644 --- a/types/options.go +++ b/types/options.go @@ -237,7 +237,6 @@ type ImageOptions struct { Podname string Nodenames []string Images []string - Step int Prune bool Filter string } @@ -250,13 +249,6 @@ func (o *ImageOptions) Validate() error { return nil } -// Normalize checks steps and set it properly -func (o *ImageOptions) Normalize() { - if o.Step < 1 { - o.Step = 1 - } -} - // ExecuteWorkloadOptions for executing commands in running workload type ExecuteWorkloadOptions struct { WorkloadID string diff --git a/types/options_test.go b/types/options_test.go index cf094fced..6ce55df1e 100644 --- a/types/options_test.go +++ b/types/options_test.go @@ -142,19 +142,11 @@ func TestValidatingAddNodeOptions(t *testing.T) { func TestImageOptions(t *testing.T) { assert := assert.New(t) - o := &ImageOptions{Step: -1} + o := &ImageOptions{} assert.Equal(ErrEmptyPodName, errors.Unwrap(o.Validate())) o.Podname = "podname" assert.NoError(o.Validate()) - - assert.Equal(o.Step, -1) - o.Normalize() - assert.Equal(o.Step, 1) - - o.Step = 3 - o.Normalize() - assert.Equal(o.Step, 3) } func TestRawArges(t *testing.T) { diff --git a/types/pod.go b/types/pod.go index 1b297e729..a1f4aef9c 100644 --- a/types/pod.go +++ b/types/pod.go @@ -5,9 +5,3 @@ type Pod struct { Name string `json:"name"` Desc string `json:"desc"` } - -// PodResource define pod resource -type PodResource struct { - Name string - NodesResource []*NodeResource -}