From 436c3db898c1537ed384aa100a62ffc9f65baf13 Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Thu, 5 Oct 2023 13:56:00 +0200 Subject: [PATCH 01/19] feat: inspect container --- golang/internal/grpc/grpc.go | 31 + golang/pkg/dagent/dagent.go | 1 + golang/pkg/dagent/utils/docker.go | 31 + protobuf/go/agent/agent.pb.go | 1099 +++++++++-------- protobuf/go/agent/agent_grpc.pb.go | 36 + protobuf/go/common/common.pb.go | 514 ++++---- protobuf/proto/agent.proto | 10 + protobuf/proto/common.proto | 4 + web/crux-ui/locales/en/nodes.json | 1 + .../components/nodes/node-containers-list.tsx | 8 +- .../[teamSlug]/nodes/[nodeId]/inspect.tsx | 119 ++ web/crux-ui/src/routes.ts | 6 + web/crux/proto/agent.proto | 12 +- web/crux/proto/common.proto | 4 + .../src/app/agent/agent.grpc.controller.ts | 6 + web/crux/src/app/agent/agent.service.ts | 19 + .../node.prefix-container.http.controller.ts | 50 +- web/crux/src/app/node/node.service.ts | 65 +- web/crux/src/grpc/protobuf/proto/agent.ts | 48 +- web/crux/src/grpc/protobuf/proto/common.ts | 20 + 20 files changed, 1314 insertions(+), 770 deletions(-) create mode 100644 web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx diff --git a/golang/internal/grpc/grpc.go b/golang/internal/grpc/grpc.go index be8e3a9eb..a17a16077 100644 --- a/golang/internal/grpc/grpc.go +++ b/golang/internal/grpc/grpc.go @@ -91,6 +91,7 @@ type ( ContainerCommandFunc func(context.Context, *common.ContainerCommandRequest) error DeleteContainersFunc func(context.Context, *common.DeleteContainersRequest) error ContainerLogFunc func(context.Context, *agent.ContainerLogRequest) (*ContainerLogContext, error) + ContainerInspectFunc func(context.Context, *agent.ContainerInspectRequest) (string, error) ReplaceTokenFunc func(context.Context, *agent.ReplaceTokenRequest) error ) @@ -105,6 +106,7 @@ type WorkerFunctions struct { ContainerCommand ContainerCommandFunc DeleteContainers DeleteContainersFunc ContainerLog ContainerLogFunc + ContainerInspect ContainerInspectFunc } type contextKey int @@ -271,6 +273,8 @@ func (cl *ClientLoop) grpcProcessCommand(command *agent.AgentCommand) { go executeDeleteMultipleContainers(cl.Ctx, command.GetDeleteContainers(), cl.WorkerFuncs.DeleteContainers) case command.GetContainerLog() != nil: go executeContainerLog(cl.Ctx, command.GetContainerLog(), cl.WorkerFuncs.ContainerLog) + case command.GetContainerInspect() != nil: + go executeContainerInspect(cl.Ctx, command.GetContainerInspect(), cl.WorkerFuncs.ContainerInspect) case command.GetReplaceToken() != nil: // NOTE(@m8vago): should be sync? err := cl.executeReplaceToken(command.GetReplaceToken()) @@ -837,6 +841,33 @@ func executeContainerLog(ctx context.Context, command *agent.ContainerLogRequest log.Trace().Str("prefix", prefix).Str("name", name).Msg("Container log exited") } +func executeContainerInspect(ctx context.Context, command *agent.ContainerInspectRequest, inspectFunc ContainerInspectFunc) { + if inspectFunc == nil { + log.Error().Msg("Container inspect function not implemented") + return + } + + prefix := command.Container.Prefix + name := command.Container.Name + + log.Info().Str("prefix", prefix).Str("name", name).Msg("Getting container inspection") + + inspection, err := inspectFunc(ctx, command) + if err != nil { + log.Error().Stack().Err(err).Msg("Failed to inspect container") + } + + resp := &common.ContainerInspectMessage{ + Inspection: inspection, + } + + _, err = grpcConn.Client.ContainerInspect(ctx, resp) + if err != nil { + log.Error().Stack().Err(err).Msg("Container inspection response error") + return + } +} + func (cl *ClientLoop) executeReplaceToken(command *agent.ReplaceTokenRequest) error { log.Debug().Msg("Replace token requested") diff --git a/golang/pkg/dagent/dagent.go b/golang/pkg/dagent/dagent.go index a71e16419..5e8c56cd8 100644 --- a/golang/pkg/dagent/dagent.go +++ b/golang/pkg/dagent/dagent.go @@ -46,6 +46,7 @@ func Serve(cfg *config.Configuration) { ContainerCommand: utils.ContainerCommand, DeleteContainers: utils.DeleteContainers, ContainerLog: utils.ContainerLog, + ContainerInspect: utils.ContainerInspect, }, cfg) } diff --git a/golang/pkg/dagent/utils/docker.go b/golang/pkg/dagent/utils/docker.go index 842670c3e..bd1e5893a 100644 --- a/golang/pkg/dagent/utils/docker.go +++ b/golang/pkg/dagent/utils/docker.go @@ -6,6 +6,7 @@ import ( "bytes" "context" "encoding/binary" + "encoding/json" "errors" "fmt" "io" @@ -785,3 +786,33 @@ func ContainerLog(ctx context.Context, request *agent.ContainerLogRequest) (*grp return logContext, nil } + +func ContainerInspect(ctx context.Context, request *agent.ContainerInspectRequest) (string, error) { + cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + if err != nil { + return "", err + } + + prefix := request.Container.Prefix + name := request.Container.Name + + container, err := GetContainerByPrefixAndName(ctx, cli, prefix, name) + if err != nil { + return "", err + } + + containerInfo, err := cli.ContainerInspect(ctx, container.ID) + if err != nil { + return "", err + } + + inspectionJSON, err := json.Marshal(containerInfo) + if err != nil { + return "", err + } + inspection := string(inspectionJSON) + // TODO(@amorfevo): maybe this works too + // inspection := fmt.Sprintf("%+v", containerInfo) + + return inspection, nil +} diff --git a/protobuf/go/agent/agent.pb.go b/protobuf/go/agent/agent.pb.go index 60936229b..2e97232f7 100644 --- a/protobuf/go/agent/agent.pb.go +++ b/protobuf/go/agent/agent.pb.go @@ -171,6 +171,7 @@ type AgentCommand struct { // *AgentCommand_ContainerCommand // *AgentCommand_DeleteContainers // *AgentCommand_ContainerLog + // *AgentCommand_ContainerInspect // *AgentCommand_ReplaceToken Command isAgentCommand_Command `protobuf_oneof:"command"` } @@ -284,6 +285,13 @@ func (x *AgentCommand) GetContainerLog() *ContainerLogRequest { return nil } +func (x *AgentCommand) GetContainerInspect() *ContainerInspectRequest { + if x, ok := x.GetCommand().(*AgentCommand_ContainerInspect); ok { + return x.ContainerInspect + } + return nil +} + func (x *AgentCommand) GetReplaceToken() *ReplaceTokenRequest { if x, ok := x.GetCommand().(*AgentCommand_ReplaceToken); ok { return x.ReplaceToken @@ -335,8 +343,12 @@ type AgentCommand_ContainerLog struct { ContainerLog *ContainerLogRequest `protobuf:"bytes,10,opt,name=containerLog,proto3,oneof"` } +type AgentCommand_ContainerInspect struct { + ContainerInspect *ContainerInspectRequest `protobuf:"bytes,11,opt,name=containerInspect,proto3,oneof"` +} + type AgentCommand_ReplaceToken struct { - ReplaceToken *ReplaceTokenRequest `protobuf:"bytes,11,opt,name=replaceToken,proto3,oneof"` + ReplaceToken *ReplaceTokenRequest `protobuf:"bytes,12,opt,name=replaceToken,proto3,oneof"` } func (*AgentCommand_Deploy) isAgentCommand_Command() {} @@ -359,6 +371,8 @@ func (*AgentCommand_DeleteContainers) isAgentCommand_Command() {} func (*AgentCommand_ContainerLog) isAgentCommand_Command() {} +func (*AgentCommand_ContainerInspect) isAgentCommand_Command() {} + func (*AgentCommand_ReplaceToken) isAgentCommand_Command() {} // This is more of a placeholder, we could include more, or return this @@ -2187,6 +2201,54 @@ func (x *ContainerLogRequest) GetTail() uint32 { return 0 } +// Container inspect +type ContainerInspectRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Container *common.ContainerIdentifier `protobuf:"bytes,1,opt,name=container,proto3" json:"container,omitempty"` +} + +func (x *ContainerInspectRequest) Reset() { + *x = ContainerInspectRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_protobuf_proto_agent_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContainerInspectRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContainerInspectRequest) ProtoMessage() {} + +func (x *ContainerInspectRequest) ProtoReflect() protoreflect.Message { + mi := &file_protobuf_proto_agent_proto_msgTypes[28] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ContainerInspectRequest.ProtoReflect.Descriptor instead. +func (*ContainerInspectRequest) Descriptor() ([]byte, []int) { + return file_protobuf_proto_agent_proto_rawDescGZIP(), []int{28} +} + +func (x *ContainerInspectRequest) GetContainer() *common.ContainerIdentifier { + if x != nil { + return x.Container + } + return nil +} + type CloseConnectionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2198,7 +2260,7 @@ type CloseConnectionRequest struct { func (x *CloseConnectionRequest) Reset() { *x = CloseConnectionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protobuf_proto_agent_proto_msgTypes[28] + mi := &file_protobuf_proto_agent_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2211,7 +2273,7 @@ func (x *CloseConnectionRequest) String() string { func (*CloseConnectionRequest) ProtoMessage() {} func (x *CloseConnectionRequest) ProtoReflect() protoreflect.Message { - mi := &file_protobuf_proto_agent_proto_msgTypes[28] + mi := &file_protobuf_proto_agent_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2224,7 +2286,7 @@ func (x *CloseConnectionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseConnectionRequest.ProtoReflect.Descriptor instead. func (*CloseConnectionRequest) Descriptor() ([]byte, []int) { - return file_protobuf_proto_agent_proto_rawDescGZIP(), []int{28} + return file_protobuf_proto_agent_proto_rawDescGZIP(), []int{29} } func (x *CloseConnectionRequest) GetReason() CloseReason { @@ -2250,7 +2312,7 @@ var file_protobuf_proto_agent_proto_rawDesc = []byte{ 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0xf2, 0x05, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, + 0x61, 0x6d, 0x65, 0x22, 0xc0, 0x06, 0x0a, 0x0c, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x35, 0x0a, 0x06, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, @@ -2292,411 +2354,425 @@ var file_protobuf_proto_agent_proto_rawDesc = []byte{ 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x12, 0x40, 0x0a, 0x0c, 0x72, - 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, - 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x09, 0x0a, - 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x2a, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, - 0x0b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x6f, - 0x74, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, - 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x40, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, - 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, - 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, - 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x12, 0x21, 0x0a, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, - 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x67, 0x65, - 0x6e, 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x2f, 0x0a, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x72, 0x65, 0x70, - 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x88, 0x01, 0x01, - 0x1a, 0x3e, 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 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, - 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x42, 0x13, - 0x0a, 0x11, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x22, 0x64, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, - 0x75, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x50, 0x0a, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x64, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x1f, 0x0a, - 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x05, 0x48, - 0x00, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x0b, - 0x0a, 0x09, 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x2f, 0x0a, 0x09, 0x50, - 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, - 0x18, 0x64, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, - 0x74, 0x6f, 0x18, 0x65, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x6e, 0x0a, 0x10, - 0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x12, 0x2c, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x64, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, - 0x61, 0x6e, 0x67, 0x65, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x2c, - 0x0a, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x12, 0x4c, 0x0a, 0x10, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x40, 0x0a, 0x0c, 0x72, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x72, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x2a, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x65, 0x64, 0x22, 0x9e, 0x01, 0x0a, 0x14, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x6f, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x6f, 0x74, 0x65, + 0x73, 0x12, 0x30, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x73, 0x22, 0x40, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xa9, 0x02, 0x0a, 0x0e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, + 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, + 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, + 0x12, 0x21, 0x0a, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, + 0x88, 0x01, 0x01, 0x12, 0x48, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, + 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2f, 0x0a, + 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x72, 0x65, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x88, 0x01, 0x01, 0x1a, 0x3e, + 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 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, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x74, 0x68, 0x42, 0x13, 0x0a, 0x11, + 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x22, 0x64, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, + 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x50, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x64, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x1f, 0x0a, 0x08, 0x65, + 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, + 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x88, 0x01, 0x01, 0x42, 0x0b, 0x0a, 0x09, + 0x5f, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0x2f, 0x0a, 0x09, 0x50, 0x6f, 0x72, + 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x64, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x66, 0x72, 0x6f, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x74, 0x6f, + 0x18, 0x65, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x74, 0x6f, 0x22, 0x6e, 0x0a, 0x10, 0x50, 0x6f, + 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x2c, + 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0xad, 0x01, 0x0a, - 0x06, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, - 0x17, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x04, 0x73, 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x67, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x48, 0x01, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x68, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x88, 0x01, 0x01, - 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x34, 0x0a, 0x0a, - 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x22, 0xe4, 0x02, 0x0a, 0x0d, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x64, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2d, - 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x66, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x50, 0x61, - 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, - 0x07, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0xe8, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, - 0x6e, 0x6b, 0x52, 0x07, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x07, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x13, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0xea, - 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x48, 0x0a, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0xeb, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, - 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, - 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x3e, 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, - 0x6d, 0x65, 0x6e, 0x74, 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, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x75, 0x73, 0x65, 0x50, 0x61, 0x72, - 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xcf, 0x01, 0x0a, 0x0f, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x16, 0x0a, - 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, - 0x4a, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0xe8, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x45, 0x6e, - 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, - 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x3e, 0x0a, 0x10, 0x45, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 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, 0xad, 0x01, 0x0a, 0x09, - 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2a, 0x0a, 0x06, 0x64, 0x72, 0x69, - 0x76, 0x65, 0x72, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x64, - 0x72, 0x69, 0x76, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0xe8, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x3a, 0x0a, 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 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, 0xed, 0x02, 0x0a, 0x06, - 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x18, 0xe8, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x35, 0x0a, - 0x07, 0x69, 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0xea, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2e, 0x49, - 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x69, 0x6e, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x67, 0x65, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x08, + 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, + 0x52, 0x08, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x22, 0xad, 0x01, 0x0a, 0x06, 0x56, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x64, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x17, 0x0a, + 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x67, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x48, 0x01, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x19, 0x0a, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x68, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x02, 0x52, 0x05, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x07, + 0x0a, 0x05, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x22, 0x34, 0x0a, 0x0a, 0x56, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x22, 0xe4, 0x02, 0x0a, 0x0d, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, + 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x0f, + 0x75, 0x73, 0x65, 0x50, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x66, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x50, 0x61, 0x72, 0x65, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x07, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0xe8, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x4c, 0x69, 0x6e, 0x6b, + 0x52, 0x07, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x07, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x13, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0xea, 0x07, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x48, 0x0a, 0x0b, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0xeb, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x25, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, + 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, + 0x65, 0x6e, 0x74, 0x1a, 0x3e, 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 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, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 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, - 0x3a, 0x0a, 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 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, 0x95, 0x03, 0x0a, 0x15, - 0x44, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x4c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, - 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0d, 0x72, 0x65, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x65, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x15, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x0b, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x02, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x18, 0xe8, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, - 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x44, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 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, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, - 0x69, 0x63, 0x79, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, - 0x6f, 0x64, 0x65, 0x22, 0x31, 0x0a, 0x07, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, - 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x22, 0xc3, 0x06, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x6e, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x4f, 0x0a, 0x12, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x00, 0x52, 0x12, 0x64, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, - 0x12, 0x4c, 0x0a, 0x11, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, 0x11, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x43, - 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x66, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x02, - 0x52, 0x0e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x18, 0x67, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x0c, 0x70, 0x72, 0x6f, - 0x78, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x0f, - 0x75, 0x73, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x18, - 0x68, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x4c, 0x6f, 0x61, 0x64, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x0b, 0x61, - 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x48, - 0x05, 0x52, 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, - 0x01, 0x12, 0x2a, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x6a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, - 0x48, 0x06, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, - 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x07, - 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0d, - 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0xe8, 0x07, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x12, 0x64, 0x0a, 0x12, 0x65, 0x78, 0x74, 0x72, 0x61, 0x4c, 0x42, 0x41, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x33, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x61, 0x6e, 0x65, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x78, - 0x74, 0x72, 0x61, 0x4c, 0x42, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x65, 0x78, 0x74, 0x72, 0x61, 0x4c, 0x42, 0x41, 0x6e, - 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x45, 0x0a, 0x17, 0x45, 0x78, 0x74, - 0x72, 0x61, 0x4c, 0x42, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, - 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x68, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x11, 0x0a, - 0x0f, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x73, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x75, 0x73, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x72, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, - 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xac, 0x07, 0x0a, - 0x15, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x65, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x65, 0x78, - 0x70, 0x6f, 0x73, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, - 0x67, 0x79, 0x48, 0x00, 0x52, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x2e, 0x0a, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x48, 0x01, 0x52, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, - 0x46, 0x0a, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x48, 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x0f, 0x69, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x48, 0x03, 0x52, 0x0f, 0x69, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x17, - 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x04, - 0x75, 0x73, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x54, 0x54, 0x59, 0x18, 0x6b, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x05, 0x52, 0x03, 0x54, 0x54, 0x59, 0x88, 0x01, 0x01, 0x12, 0x22, - 0x0a, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0xe8, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, - 0x74, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x50, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, - 0x52, 0x0a, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x07, - 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0xea, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x07, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x18, 0xeb, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x12, 0x13, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0xec, 0x07, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x50, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, - 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0xed, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, - 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x6e, 0x76, - 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x65, - 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x73, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x73, 0x18, 0xee, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, + 0x02, 0x38, 0x01, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x75, 0x73, 0x65, 0x50, 0x61, 0x72, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xcf, 0x01, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x76, + 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x65, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x4a, 0x0a, + 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0xe8, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x2e, 0x45, 0x6e, 0x76, 0x69, + 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x65, 0x6e, + 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x3e, 0x0a, 0x10, 0x45, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 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, 0xad, 0x01, 0x0a, 0x09, 0x4c, 0x6f, + 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2a, 0x0a, 0x06, 0x64, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x2e, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x06, 0x64, 0x72, 0x69, + 0x76, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe8, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x6f, + 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3a, 0x0a, + 0x0c, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 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, 0xed, 0x02, 0x0a, 0x06, 0x4d, 0x61, + 0x72, 0x6b, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0xe8, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x35, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, + 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, + 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x35, 0x0a, 0x07, 0x69, + 0x6e, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0xea, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x69, 0x6e, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 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, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 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, 0x3a, 0x0a, + 0x0c, 0x49, 0x6e, 0x67, 0x72, 0x65, 0x73, 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, 0x95, 0x03, 0x0a, 0x15, 0x44, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x33, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4c, + 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x15, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x48, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x0b, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x13, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x02, 0x52, 0x0b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, + 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x18, 0xe8, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x12, 0x41, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0xe9, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 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, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6c, 0x6f, 0x67, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, + 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x6f, 0x64, + 0x65, 0x22, 0x31, 0x0a, 0x07, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x70, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x22, 0xc3, 0x06, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x6e, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4f, 0x0a, + 0x12, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, + 0x65, 0x67, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x48, 0x00, 0x52, 0x12, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x88, 0x01, 0x01, 0x12, 0x4c, + 0x0a, 0x11, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, 0x11, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a, 0x0e, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x66, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x02, 0x52, 0x0e, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, + 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x67, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x78, 0x79, + 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x0f, 0x75, 0x73, + 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x18, 0x68, 0x20, + 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0f, 0x75, 0x73, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x0b, 0x61, 0x6e, 0x6e, + 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x48, 0x05, 0x52, + 0x0b, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, + 0x2a, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x61, 0x72, 0x6b, 0x65, 0x72, 0x48, 0x06, + 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2d, 0x0a, 0x07, 0x6d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x48, 0x07, 0x52, 0x07, + 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0d, 0x63, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0xe8, 0x07, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x64, 0x0a, 0x12, 0x65, 0x78, 0x74, 0x72, 0x61, 0x4c, 0x42, 0x41, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0xe9, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, 0x61, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x78, 0x74, 0x72, + 0x61, 0x4c, 0x42, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x12, 0x65, 0x78, 0x74, 0x72, 0x61, 0x4c, 0x42, 0x41, 0x6e, 0x6e, 0x6f, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x45, 0x0a, 0x17, 0x45, 0x78, 0x74, 0x72, 0x61, + 0x4c, 0x42, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 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, 0x42, 0x15, + 0x0a, 0x13, 0x5f, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x11, 0x0a, 0x0f, 0x5f, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0f, + 0x0a, 0x0d, 0x5f, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x42, + 0x12, 0x0a, 0x10, 0x5f, 0x75, 0x73, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x72, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x42, 0x0a, + 0x0a, 0x08, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xac, 0x07, 0x0a, 0x15, 0x43, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x65, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x33, 0x0a, 0x06, 0x65, 0x78, 0x70, 0x6f, + 0x73, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, + 0x48, 0x00, 0x52, 0x06, 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, + 0x07, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x48, + 0x01, 0x52, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x12, 0x46, 0x0a, + 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x18, 0x68, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x48, + 0x02, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x45, 0x0a, 0x0f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x48, 0x03, 0x52, 0x0f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, + 0x75, 0x73, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x03, 0x48, 0x04, 0x52, 0x04, 0x75, 0x73, + 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x54, 0x54, 0x59, 0x18, 0x6b, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x05, 0x52, 0x03, 0x54, 0x54, 0x59, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x05, + 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0xe8, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x70, 0x6f, 0x72, 0x74, 0x73, + 0x12, 0x38, 0x0a, 0x0a, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0xe9, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x50, 0x6f, + 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, + 0x70, 0x6f, 0x72, 0x74, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x07, 0x76, 0x6f, + 0x6c, 0x75, 0x6d, 0x65, 0x73, 0x18, 0xea, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x52, 0x07, 0x76, 0x6f, 0x6c, + 0x75, 0x6d, 0x65, 0x73, 0x12, 0x1b, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x18, 0xeb, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x12, 0x13, 0x0a, 0x04, 0x61, 0x72, 0x67, 0x73, 0x18, 0xec, 0x07, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x04, 0x61, 0x72, 0x67, 0x73, 0x12, 0x50, 0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, + 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0xed, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, - 0x12, 0x3d, 0x0a, 0x0e, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x73, 0x18, 0xef, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x67, 0x65, 0x6e, - 0x74, 0x2e, 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x0e, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x1a, - 0x3e, 0x0a, 0x10, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 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, 0x53, 0x65, 0x63, 0x72, 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, 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, 0x42, 0x09, 0x0a, 0x07, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x75, - 0x73, 0x65, 0x72, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x54, 0x54, 0x59, 0x22, 0xbc, 0x04, 0x0a, 0x0d, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x24, 0x0a, - 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x3d, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x39, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x48, 0x00, 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, - 0x06, 0x64, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, 0x06, 0x64, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x05, 0x63, 0x72, 0x61, 0x6e, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, - 0x43, 0x72, 0x61, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x48, 0x02, 0x52, 0x05, 0x63, 0x72, 0x61, 0x6e, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x29, 0x0a, 0x0d, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, - 0x08, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x09, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, - 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x3c, 0x0a, 0x0c, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x48, 0x05, 0x52, 0x0c, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x64, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x63, 0x72, 0x61, 0x6e, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0b, 0x0a, 0x09, - 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x22, 0x6a, 0x0a, 0x15, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x88, 0x01, 0x01, - 0x12, 0x1d, 0x0a, 0x07, 0x6f, 0x6e, 0x65, 0x53, 0x68, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x48, 0x01, 0x52, 0x07, 0x6f, 0x6e, 0x65, 0x53, 0x68, 0x6f, 0x74, 0x88, 0x01, 0x01, 0x42, - 0x09, 0x0a, 0x07, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6f, - 0x6e, 0x65, 0x53, 0x68, 0x6f, 0x74, 0x22, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x13, - 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x65, 0x67, - 0x61, 0x63, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x22, 0x64, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, - 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x26, 0x0a, - 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2b, 0x0a, 0x13, 0x52, - 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x28, 0x0a, 0x10, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x82, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x09, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, - 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x44, 0x0a, 0x16, 0x43, 0x6c, 0x6f, 0x73, 0x65, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x12, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x52, - 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2a, 0x69, 0x0a, - 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x18, - 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, - 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4c, - 0x4f, 0x53, 0x45, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x45, 0x4c, 0x46, 0x5f, 0x44, 0x45, - 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x48, 0x55, 0x54, - 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x56, 0x4f, 0x4b, 0x45, - 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x04, 0x32, 0xe9, 0x03, 0x0a, 0x05, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, 0x10, 0x2e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x66, 0x6f, 0x1a, - 0x13, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x10, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x44, 0x0a, 0x0e, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x21, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, + 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x65, 0x6e, 0x76, + 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x44, 0x0a, 0x07, 0x73, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x73, 0x18, 0xee, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x67, 0x65, + 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x73, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x12, 0x3d, + 0x0a, 0x0e, 0x69, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, + 0x18, 0xef, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x49, 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x0e, 0x69, + 0x6e, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x1a, 0x3e, 0x0a, + 0x10, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 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, 0x53, 0x65, 0x63, 0x72, 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, + 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, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x65, 0x78, + 0x70, 0x6f, 0x73, 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, + 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x42, 0x12, 0x0a, 0x10, 0x5f, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x75, 0x73, 0x65, + 0x72, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x54, 0x54, 0x59, 0x22, 0xbc, 0x04, 0x0a, 0x0d, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x3d, 0x0a, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x2e, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x0e, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x39, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x00, + 0x52, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x39, 0x0a, 0x06, 0x64, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x2e, 0x44, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x48, 0x01, 0x52, 0x06, 0x64, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x88, 0x01, 0x01, 0x12, 0x36, 0x0a, 0x05, 0x63, 0x72, 0x61, 0x6e, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x72, + 0x61, 0x6e, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x48, 0x02, 0x52, 0x05, 0x63, 0x72, 0x61, 0x6e, 0x65, 0x88, 0x01, 0x01, 0x12, 0x29, + 0x0a, 0x0d, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0d, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x88, 0x01, 0x01, 0x12, 0x1f, 0x0a, 0x08, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x3c, 0x0a, 0x0c, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x41, 0x75, 0x74, 0x68, 0x48, 0x05, 0x52, 0x0c, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x41, 0x75, 0x74, 0x68, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x64, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x42, 0x08, + 0x0a, 0x06, 0x5f, 0x63, 0x72, 0x61, 0x6e, 0x65, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x72, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x41, 0x75, 0x74, 0x68, 0x22, 0x6a, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x00, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x88, 0x01, 0x01, 0x12, 0x1d, + 0x0a, 0x07, 0x6f, 0x6e, 0x65, 0x53, 0x68, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x01, 0x52, 0x07, 0x6f, 0x6e, 0x65, 0x53, 0x68, 0x6f, 0x74, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, + 0x07, 0x5f, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x6f, 0x6e, 0x65, + 0x53, 0x68, 0x6f, 0x74, 0x22, 0x44, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x47, 0x0a, 0x13, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x65, 0x67, 0x61, 0x63, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6a, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6a, + 0x73, 0x6f, 0x6e, 0x22, 0x64, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x74, 0x61, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12, 0x26, 0x0a, 0x0e, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0e, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x2b, 0x0a, 0x13, 0x52, 0x65, 0x70, + 0x6c, 0x61, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x28, 0x0a, 0x10, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, + 0x62, 0x6f, 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x22, 0x82, 0x01, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x69, 0x6e, + 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x74, 0x61, 0x69, 0x6c, 0x22, 0x54, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x39, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x44, 0x0a, 0x16, 0x43, + 0x6c, 0x6f, 0x73, 0x65, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x2a, 0x69, 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, + 0x12, 0x1c, 0x0a, 0x18, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x45, 0x4c, + 0x46, 0x5f, 0x44, 0x45, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, + 0x53, 0x48, 0x55, 0x54, 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, + 0x56, 0x4f, 0x4b, 0x45, 0x5f, 0x54, 0x4f, 0x4b, 0x45, 0x4e, 0x10, 0x04, 0x32, 0xad, 0x04, 0x0a, + 0x05, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x12, 0x10, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x49, + 0x6e, 0x66, 0x6f, 0x1a, 0x13, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x10, 0x44, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, + 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, + 0x12, 0x44, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x21, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x38, 0x0a, 0x0a, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x28, 0x01, 0x12, 0x38, 0x0a, 0x0a, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, - 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x0d, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x0b, - 0x41, 0x62, 0x6f, 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x61, 0x67, - 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x1a, 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x12, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x2d, 0x0a, 0x0d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x12, 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x42, 0x35, 0x5a, 0x33, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x64, 0x79, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x64, - 0x79, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x67, 0x6f, 0x2f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x12, 0x35, 0x0a, 0x0b, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x17, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x62, 0x6f, + 0x72, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x10, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0d, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x0c, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x12, 0x1b, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, + 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x42, 0x0a, 0x10, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x1f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x1a, 0x0d, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2d, 0x0a, + 0x0d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x12, 0x0d, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0d, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x35, 0x5a, 0x33, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x79, 0x72, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x64, 0x79, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, + 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x67, 0x6f, 0x2f, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2712,7 +2788,7 @@ func file_protobuf_proto_agent_proto_rawDescGZIP() []byte { } var file_protobuf_proto_agent_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_protobuf_proto_agent_proto_msgTypes = make([]protoimpl.MessageInfo, 40) +var file_protobuf_proto_agent_proto_msgTypes = make([]protoimpl.MessageInfo, 41) var file_protobuf_proto_agent_proto_goTypes = []interface{}{ (CloseReason)(0), // 0: agent.CloseReason (*AgentInfo)(nil), // 1: agent.AgentInfo @@ -2743,36 +2819,38 @@ var file_protobuf_proto_agent_proto_goTypes = []interface{}{ (*ReplaceTokenRequest)(nil), // 26: agent.ReplaceTokenRequest (*AgentAbortUpdate)(nil), // 27: agent.AgentAbortUpdate (*ContainerLogRequest)(nil), // 28: agent.ContainerLogRequest - (*CloseConnectionRequest)(nil), // 29: agent.CloseConnectionRequest - nil, // 30: agent.InstanceConfig.EnvironmentEntry - nil, // 31: agent.InitContainer.EnvironmentEntry - nil, // 32: agent.ImportContainer.EnvironmentEntry - nil, // 33: agent.LogConfig.OptionsEntry - nil, // 34: agent.Marker.DeploymentEntry - nil, // 35: agent.Marker.ServiceEntry - nil, // 36: agent.Marker.IngressEntry - nil, // 37: agent.DagentContainerConfig.LabelsEntry - nil, // 38: agent.CraneContainerConfig.ExtraLBAnnotationsEntry - nil, // 39: agent.CommonContainerConfig.EnvironmentEntry - nil, // 40: agent.CommonContainerConfig.SecretsEntry - (*common.ContainerCommandRequest)(nil), // 41: common.ContainerCommandRequest - (*common.DeleteContainersRequest)(nil), // 42: common.DeleteContainersRequest - (common.VolumeType)(0), // 43: common.VolumeType - (common.DriverType)(0), // 44: common.DriverType - (common.RestartPolicy)(0), // 45: common.RestartPolicy - (common.NetworkMode)(0), // 46: common.NetworkMode - (common.DeploymentStrategy)(0), // 47: common.DeploymentStrategy - (*common.HealthCheckConfig)(nil), // 48: common.HealthCheckConfig - (*common.ResourceConfig)(nil), // 49: common.ResourceConfig - (common.ExposeStrategy)(0), // 50: common.ExposeStrategy - (*common.Routing)(nil), // 51: common.Routing - (*common.ConfigContainer)(nil), // 52: common.ConfigContainer - (*common.ContainerIdentifier)(nil), // 53: common.ContainerIdentifier - (*common.DeploymentStatusMessage)(nil), // 54: common.DeploymentStatusMessage - (*common.ContainerStateListMessage)(nil), // 55: common.ContainerStateListMessage - (*common.ListSecretsResponse)(nil), // 56: common.ListSecretsResponse - (*common.ContainerLogMessage)(nil), // 57: common.ContainerLogMessage - (*common.Empty)(nil), // 58: common.Empty + (*ContainerInspectRequest)(nil), // 29: agent.ContainerInspectRequest + (*CloseConnectionRequest)(nil), // 30: agent.CloseConnectionRequest + nil, // 31: agent.InstanceConfig.EnvironmentEntry + nil, // 32: agent.InitContainer.EnvironmentEntry + nil, // 33: agent.ImportContainer.EnvironmentEntry + nil, // 34: agent.LogConfig.OptionsEntry + nil, // 35: agent.Marker.DeploymentEntry + nil, // 36: agent.Marker.ServiceEntry + nil, // 37: agent.Marker.IngressEntry + nil, // 38: agent.DagentContainerConfig.LabelsEntry + nil, // 39: agent.CraneContainerConfig.ExtraLBAnnotationsEntry + nil, // 40: agent.CommonContainerConfig.EnvironmentEntry + nil, // 41: agent.CommonContainerConfig.SecretsEntry + (*common.ContainerCommandRequest)(nil), // 42: common.ContainerCommandRequest + (*common.DeleteContainersRequest)(nil), // 43: common.DeleteContainersRequest + (common.VolumeType)(0), // 44: common.VolumeType + (common.DriverType)(0), // 45: common.DriverType + (common.RestartPolicy)(0), // 46: common.RestartPolicy + (common.NetworkMode)(0), // 47: common.NetworkMode + (common.DeploymentStrategy)(0), // 48: common.DeploymentStrategy + (*common.HealthCheckConfig)(nil), // 49: common.HealthCheckConfig + (*common.ResourceConfig)(nil), // 50: common.ResourceConfig + (common.ExposeStrategy)(0), // 51: common.ExposeStrategy + (*common.Routing)(nil), // 52: common.Routing + (*common.ConfigContainer)(nil), // 53: common.ConfigContainer + (*common.ContainerIdentifier)(nil), // 54: common.ContainerIdentifier + (*common.DeploymentStatusMessage)(nil), // 55: common.DeploymentStatusMessage + (*common.ContainerStateListMessage)(nil), // 56: common.ContainerStateListMessage + (*common.ListSecretsResponse)(nil), // 57: common.ListSecretsResponse + (*common.ContainerLogMessage)(nil), // 58: common.ContainerLogMessage + (*common.ContainerInspectMessage)(nil), // 59: common.ContainerInspectMessage + (*common.Empty)(nil), // 60: common.Empty } var file_protobuf_proto_agent_proto_depIdxs = []int32{ 4, // 0: agent.AgentCommand.deploy:type_name -> agent.VersionDeployRequest @@ -2781,73 +2859,77 @@ var file_protobuf_proto_agent_proto_depIdxs = []int32{ 24, // 3: agent.AgentCommand.deployLegacy:type_name -> agent.DeployRequestLegacy 5, // 4: agent.AgentCommand.listSecrets:type_name -> agent.ListSecretsRequest 25, // 5: agent.AgentCommand.update:type_name -> agent.AgentUpdateRequest - 29, // 6: agent.AgentCommand.close:type_name -> agent.CloseConnectionRequest - 41, // 7: agent.AgentCommand.containerCommand:type_name -> common.ContainerCommandRequest - 42, // 8: agent.AgentCommand.deleteContainers:type_name -> common.DeleteContainersRequest + 30, // 6: agent.AgentCommand.close:type_name -> agent.CloseConnectionRequest + 42, // 7: agent.AgentCommand.containerCommand:type_name -> common.ContainerCommandRequest + 43, // 8: agent.AgentCommand.deleteContainers:type_name -> common.DeleteContainersRequest 28, // 9: agent.AgentCommand.containerLog:type_name -> agent.ContainerLogRequest - 26, // 10: agent.AgentCommand.replaceToken:type_name -> agent.ReplaceTokenRequest - 21, // 11: agent.VersionDeployRequest.requests:type_name -> agent.DeployRequest - 30, // 12: agent.InstanceConfig.environment:type_name -> agent.InstanceConfig.EnvironmentEntry - 9, // 13: agent.PortRangeBinding.internal:type_name -> agent.PortRange - 9, // 14: agent.PortRangeBinding.external:type_name -> agent.PortRange - 43, // 15: agent.Volume.type:type_name -> common.VolumeType - 12, // 16: agent.InitContainer.volumes:type_name -> agent.VolumeLink - 31, // 17: agent.InitContainer.environment:type_name -> agent.InitContainer.EnvironmentEntry - 32, // 18: agent.ImportContainer.environment:type_name -> agent.ImportContainer.EnvironmentEntry - 44, // 19: agent.LogConfig.driver:type_name -> common.DriverType - 33, // 20: agent.LogConfig.options:type_name -> agent.LogConfig.OptionsEntry - 34, // 21: agent.Marker.deployment:type_name -> agent.Marker.DeploymentEntry - 35, // 22: agent.Marker.service:type_name -> agent.Marker.ServiceEntry - 36, // 23: agent.Marker.ingress:type_name -> agent.Marker.IngressEntry - 15, // 24: agent.DagentContainerConfig.logConfig:type_name -> agent.LogConfig - 45, // 25: agent.DagentContainerConfig.restartPolicy:type_name -> common.RestartPolicy - 46, // 26: agent.DagentContainerConfig.networkMode:type_name -> common.NetworkMode - 37, // 27: agent.DagentContainerConfig.labels:type_name -> agent.DagentContainerConfig.LabelsEntry - 47, // 28: agent.CraneContainerConfig.deploymentStrategy:type_name -> common.DeploymentStrategy - 48, // 29: agent.CraneContainerConfig.healthCheckConfig:type_name -> common.HealthCheckConfig - 49, // 30: agent.CraneContainerConfig.resourceConfig:type_name -> common.ResourceConfig - 16, // 31: agent.CraneContainerConfig.annotations:type_name -> agent.Marker - 16, // 32: agent.CraneContainerConfig.labels:type_name -> agent.Marker - 18, // 33: agent.CraneContainerConfig.metrics:type_name -> agent.Metrics - 38, // 34: agent.CraneContainerConfig.extraLBAnnotations:type_name -> agent.CraneContainerConfig.ExtraLBAnnotationsEntry - 50, // 35: agent.CommonContainerConfig.expose:type_name -> common.ExposeStrategy - 51, // 36: agent.CommonContainerConfig.routing:type_name -> common.Routing - 52, // 37: agent.CommonContainerConfig.configContainer:type_name -> common.ConfigContainer - 14, // 38: agent.CommonContainerConfig.importContainer:type_name -> agent.ImportContainer - 8, // 39: agent.CommonContainerConfig.ports:type_name -> agent.Port - 10, // 40: agent.CommonContainerConfig.portRanges:type_name -> agent.PortRangeBinding - 11, // 41: agent.CommonContainerConfig.volumes:type_name -> agent.Volume - 39, // 42: agent.CommonContainerConfig.environment:type_name -> agent.CommonContainerConfig.EnvironmentEntry - 40, // 43: agent.CommonContainerConfig.secrets:type_name -> agent.CommonContainerConfig.SecretsEntry - 13, // 44: agent.CommonContainerConfig.initContainers:type_name -> agent.InitContainer - 6, // 45: agent.DeployRequest.instanceConfig:type_name -> agent.InstanceConfig - 20, // 46: agent.DeployRequest.common:type_name -> agent.CommonContainerConfig - 17, // 47: agent.DeployRequest.dagent:type_name -> agent.DagentContainerConfig - 19, // 48: agent.DeployRequest.crane:type_name -> agent.CraneContainerConfig - 7, // 49: agent.DeployRequest.registryAuth:type_name -> agent.RegistryAuth - 53, // 50: agent.ContainerLogRequest.container:type_name -> common.ContainerIdentifier - 0, // 51: agent.CloseConnectionRequest.reason:type_name -> agent.CloseReason - 1, // 52: agent.Agent.Connect:input_type -> agent.AgentInfo - 54, // 53: agent.Agent.DeploymentStatus:input_type -> common.DeploymentStatusMessage - 55, // 54: agent.Agent.ContainerState:input_type -> common.ContainerStateListMessage - 56, // 55: agent.Agent.SecretList:input_type -> common.ListSecretsResponse - 27, // 56: agent.Agent.AbortUpdate:input_type -> agent.AgentAbortUpdate - 42, // 57: agent.Agent.DeleteContainers:input_type -> common.DeleteContainersRequest - 57, // 58: agent.Agent.ContainerLog:input_type -> common.ContainerLogMessage - 58, // 59: agent.Agent.TokenReplaced:input_type -> common.Empty - 2, // 60: agent.Agent.Connect:output_type -> agent.AgentCommand - 58, // 61: agent.Agent.DeploymentStatus:output_type -> common.Empty - 58, // 62: agent.Agent.ContainerState:output_type -> common.Empty - 58, // 63: agent.Agent.SecretList:output_type -> common.Empty - 58, // 64: agent.Agent.AbortUpdate:output_type -> common.Empty - 58, // 65: agent.Agent.DeleteContainers:output_type -> common.Empty - 58, // 66: agent.Agent.ContainerLog:output_type -> common.Empty - 58, // 67: agent.Agent.TokenReplaced:output_type -> common.Empty - 60, // [60:68] is the sub-list for method output_type - 52, // [52:60] is the sub-list for method input_type - 52, // [52:52] is the sub-list for extension type_name - 52, // [52:52] is the sub-list for extension extendee - 0, // [0:52] is the sub-list for field type_name + 29, // 10: agent.AgentCommand.containerInspect:type_name -> agent.ContainerInspectRequest + 26, // 11: agent.AgentCommand.replaceToken:type_name -> agent.ReplaceTokenRequest + 21, // 12: agent.VersionDeployRequest.requests:type_name -> agent.DeployRequest + 31, // 13: agent.InstanceConfig.environment:type_name -> agent.InstanceConfig.EnvironmentEntry + 9, // 14: agent.PortRangeBinding.internal:type_name -> agent.PortRange + 9, // 15: agent.PortRangeBinding.external:type_name -> agent.PortRange + 44, // 16: agent.Volume.type:type_name -> common.VolumeType + 12, // 17: agent.InitContainer.volumes:type_name -> agent.VolumeLink + 32, // 18: agent.InitContainer.environment:type_name -> agent.InitContainer.EnvironmentEntry + 33, // 19: agent.ImportContainer.environment:type_name -> agent.ImportContainer.EnvironmentEntry + 45, // 20: agent.LogConfig.driver:type_name -> common.DriverType + 34, // 21: agent.LogConfig.options:type_name -> agent.LogConfig.OptionsEntry + 35, // 22: agent.Marker.deployment:type_name -> agent.Marker.DeploymentEntry + 36, // 23: agent.Marker.service:type_name -> agent.Marker.ServiceEntry + 37, // 24: agent.Marker.ingress:type_name -> agent.Marker.IngressEntry + 15, // 25: agent.DagentContainerConfig.logConfig:type_name -> agent.LogConfig + 46, // 26: agent.DagentContainerConfig.restartPolicy:type_name -> common.RestartPolicy + 47, // 27: agent.DagentContainerConfig.networkMode:type_name -> common.NetworkMode + 38, // 28: agent.DagentContainerConfig.labels:type_name -> agent.DagentContainerConfig.LabelsEntry + 48, // 29: agent.CraneContainerConfig.deploymentStrategy:type_name -> common.DeploymentStrategy + 49, // 30: agent.CraneContainerConfig.healthCheckConfig:type_name -> common.HealthCheckConfig + 50, // 31: agent.CraneContainerConfig.resourceConfig:type_name -> common.ResourceConfig + 16, // 32: agent.CraneContainerConfig.annotations:type_name -> agent.Marker + 16, // 33: agent.CraneContainerConfig.labels:type_name -> agent.Marker + 18, // 34: agent.CraneContainerConfig.metrics:type_name -> agent.Metrics + 39, // 35: agent.CraneContainerConfig.extraLBAnnotations:type_name -> agent.CraneContainerConfig.ExtraLBAnnotationsEntry + 51, // 36: agent.CommonContainerConfig.expose:type_name -> common.ExposeStrategy + 52, // 37: agent.CommonContainerConfig.routing:type_name -> common.Routing + 53, // 38: agent.CommonContainerConfig.configContainer:type_name -> common.ConfigContainer + 14, // 39: agent.CommonContainerConfig.importContainer:type_name -> agent.ImportContainer + 8, // 40: agent.CommonContainerConfig.ports:type_name -> agent.Port + 10, // 41: agent.CommonContainerConfig.portRanges:type_name -> agent.PortRangeBinding + 11, // 42: agent.CommonContainerConfig.volumes:type_name -> agent.Volume + 40, // 43: agent.CommonContainerConfig.environment:type_name -> agent.CommonContainerConfig.EnvironmentEntry + 41, // 44: agent.CommonContainerConfig.secrets:type_name -> agent.CommonContainerConfig.SecretsEntry + 13, // 45: agent.CommonContainerConfig.initContainers:type_name -> agent.InitContainer + 6, // 46: agent.DeployRequest.instanceConfig:type_name -> agent.InstanceConfig + 20, // 47: agent.DeployRequest.common:type_name -> agent.CommonContainerConfig + 17, // 48: agent.DeployRequest.dagent:type_name -> agent.DagentContainerConfig + 19, // 49: agent.DeployRequest.crane:type_name -> agent.CraneContainerConfig + 7, // 50: agent.DeployRequest.registryAuth:type_name -> agent.RegistryAuth + 54, // 51: agent.ContainerLogRequest.container:type_name -> common.ContainerIdentifier + 54, // 52: agent.ContainerInspectRequest.container:type_name -> common.ContainerIdentifier + 0, // 53: agent.CloseConnectionRequest.reason:type_name -> agent.CloseReason + 1, // 54: agent.Agent.Connect:input_type -> agent.AgentInfo + 55, // 55: agent.Agent.DeploymentStatus:input_type -> common.DeploymentStatusMessage + 56, // 56: agent.Agent.ContainerState:input_type -> common.ContainerStateListMessage + 57, // 57: agent.Agent.SecretList:input_type -> common.ListSecretsResponse + 27, // 58: agent.Agent.AbortUpdate:input_type -> agent.AgentAbortUpdate + 43, // 59: agent.Agent.DeleteContainers:input_type -> common.DeleteContainersRequest + 58, // 60: agent.Agent.ContainerLog:input_type -> common.ContainerLogMessage + 59, // 61: agent.Agent.ContainerInspect:input_type -> common.ContainerInspectMessage + 60, // 62: agent.Agent.TokenReplaced:input_type -> common.Empty + 2, // 63: agent.Agent.Connect:output_type -> agent.AgentCommand + 60, // 64: agent.Agent.DeploymentStatus:output_type -> common.Empty + 60, // 65: agent.Agent.ContainerState:output_type -> common.Empty + 60, // 66: agent.Agent.SecretList:output_type -> common.Empty + 60, // 67: agent.Agent.AbortUpdate:output_type -> common.Empty + 60, // 68: agent.Agent.DeleteContainers:output_type -> common.Empty + 60, // 69: agent.Agent.ContainerLog:output_type -> common.Empty + 60, // 70: agent.Agent.ContainerInspect:output_type -> common.Empty + 60, // 71: agent.Agent.TokenReplaced:output_type -> common.Empty + 63, // [63:72] is the sub-list for method output_type + 54, // [54:63] is the sub-list for method input_type + 54, // [54:54] is the sub-list for extension type_name + 54, // [54:54] is the sub-list for extension extendee + 0, // [0:54] is the sub-list for field type_name } func init() { file_protobuf_proto_agent_proto_init() } @@ -3193,6 +3275,18 @@ func file_protobuf_proto_agent_proto_init() { } } file_protobuf_proto_agent_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerInspectRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protobuf_proto_agent_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CloseConnectionRequest); i { case 0: return &v.state @@ -3217,6 +3311,7 @@ func file_protobuf_proto_agent_proto_init() { (*AgentCommand_ContainerCommand)(nil), (*AgentCommand_DeleteContainers)(nil), (*AgentCommand_ContainerLog)(nil), + (*AgentCommand_ContainerInspect)(nil), (*AgentCommand_ReplaceToken)(nil), } file_protobuf_proto_agent_proto_msgTypes[5].OneofWrappers = []interface{}{} @@ -3234,7 +3329,7 @@ func file_protobuf_proto_agent_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protobuf_proto_agent_proto_rawDesc, NumEnums: 1, - NumMessages: 40, + NumMessages: 41, NumExtensions: 0, NumServices: 1, }, diff --git a/protobuf/go/agent/agent_grpc.pb.go b/protobuf/go/agent/agent_grpc.pb.go index b9e120d69..1f8c5069b 100644 --- a/protobuf/go/agent/agent_grpc.pb.go +++ b/protobuf/go/agent/agent_grpc.pb.go @@ -36,6 +36,7 @@ type AgentClient interface { AbortUpdate(ctx context.Context, in *AgentAbortUpdate, opts ...grpc.CallOption) (*common.Empty, error) DeleteContainers(ctx context.Context, in *common.DeleteContainersRequest, opts ...grpc.CallOption) (*common.Empty, error) ContainerLog(ctx context.Context, opts ...grpc.CallOption) (Agent_ContainerLogClient, error) + ContainerInspect(ctx context.Context, in *common.ContainerInspectMessage, opts ...grpc.CallOption) (*common.Empty, error) TokenReplaced(ctx context.Context, in *common.Empty, opts ...grpc.CallOption) (*common.Empty, error) } @@ -208,6 +209,15 @@ func (x *agentContainerLogClient) CloseAndRecv() (*common.Empty, error) { return m, nil } +func (c *agentClient) ContainerInspect(ctx context.Context, in *common.ContainerInspectMessage, opts ...grpc.CallOption) (*common.Empty, error) { + out := new(common.Empty) + err := c.cc.Invoke(ctx, "/agent.Agent/ContainerInspect", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *agentClient) TokenReplaced(ctx context.Context, in *common.Empty, opts ...grpc.CallOption) (*common.Empty, error) { out := new(common.Empty) err := c.cc.Invoke(ctx, "/agent.Agent/TokenReplaced", in, out, opts...) @@ -234,6 +244,7 @@ type AgentServer interface { AbortUpdate(context.Context, *AgentAbortUpdate) (*common.Empty, error) DeleteContainers(context.Context, *common.DeleteContainersRequest) (*common.Empty, error) ContainerLog(Agent_ContainerLogServer) error + ContainerInspect(context.Context, *common.ContainerInspectMessage) (*common.Empty, error) TokenReplaced(context.Context, *common.Empty) (*common.Empty, error) mustEmbedUnimplementedAgentServer() } @@ -263,6 +274,9 @@ func (UnimplementedAgentServer) DeleteContainers(context.Context, *common.Delete func (UnimplementedAgentServer) ContainerLog(Agent_ContainerLogServer) error { return status.Errorf(codes.Unimplemented, "method ContainerLog not implemented") } +func (UnimplementedAgentServer) ContainerInspect(context.Context, *common.ContainerInspectMessage) (*common.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method ContainerInspect not implemented") +} func (UnimplementedAgentServer) TokenReplaced(context.Context, *common.Empty) (*common.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method TokenReplaced not implemented") } @@ -432,6 +446,24 @@ func (x *agentContainerLogServer) Recv() (*common.ContainerLogMessage, error) { return m, nil } +func _Agent_ContainerInspect_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(common.ContainerInspectMessage) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AgentServer).ContainerInspect(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/agent.Agent/ContainerInspect", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AgentServer).ContainerInspect(ctx, req.(*common.ContainerInspectMessage)) + } + return interceptor(ctx, in, info, handler) +} + func _Agent_TokenReplaced_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(common.Empty) if err := dec(in); err != nil { @@ -469,6 +501,10 @@ var Agent_ServiceDesc = grpc.ServiceDesc{ MethodName: "DeleteContainers", Handler: _Agent_DeleteContainers_Handler, }, + { + MethodName: "ContainerInspect", + Handler: _Agent_ContainerInspect_Handler, + }, { MethodName: "TokenReplaced", Handler: _Agent_TokenReplaced_Handler, diff --git a/protobuf/go/common/common.pb.go b/protobuf/go/common/common.pb.go index 8896dbc44..e79d67965 100644 --- a/protobuf/go/common/common.pb.go +++ b/protobuf/go/common/common.pb.go @@ -1012,6 +1012,53 @@ func (x *ContainerLogMessage) GetLog() string { return "" } +type ContainerInspectMessage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inspection string `protobuf:"bytes,100,opt,name=inspection,proto3" json:"inspection,omitempty"` +} + +func (x *ContainerInspectMessage) Reset() { + *x = ContainerInspectMessage{} + if protoimpl.UnsafeEnabled { + mi := &file_protobuf_proto_common_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ContainerInspectMessage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ContainerInspectMessage) ProtoMessage() {} + +func (x *ContainerInspectMessage) ProtoReflect() protoreflect.Message { + mi := &file_protobuf_proto_common_proto_msgTypes[7] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ContainerInspectMessage.ProtoReflect.Descriptor instead. +func (*ContainerInspectMessage) Descriptor() ([]byte, []int) { + return file_protobuf_proto_common_proto_rawDescGZIP(), []int{7} +} + +func (x *ContainerInspectMessage) GetInspection() string { + if x != nil { + return x.Inspection + } + return "" +} + type Routing struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1027,7 +1074,7 @@ type Routing struct { func (x *Routing) Reset() { *x = Routing{} if protoimpl.UnsafeEnabled { - mi := &file_protobuf_proto_common_proto_msgTypes[7] + mi := &file_protobuf_proto_common_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1040,7 +1087,7 @@ func (x *Routing) String() string { func (*Routing) ProtoMessage() {} func (x *Routing) ProtoReflect() protoreflect.Message { - mi := &file_protobuf_proto_common_proto_msgTypes[7] + mi := &file_protobuf_proto_common_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1053,7 +1100,7 @@ func (x *Routing) ProtoReflect() protoreflect.Message { // Deprecated: Use Routing.ProtoReflect.Descriptor instead. func (*Routing) Descriptor() ([]byte, []int) { - return file_protobuf_proto_common_proto_rawDescGZIP(), []int{7} + return file_protobuf_proto_common_proto_rawDescGZIP(), []int{8} } func (x *Routing) GetDomain() string { @@ -1105,7 +1152,7 @@ type ConfigContainer struct { func (x *ConfigContainer) Reset() { *x = ConfigContainer{} if protoimpl.UnsafeEnabled { - mi := &file_protobuf_proto_common_proto_msgTypes[8] + mi := &file_protobuf_proto_common_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1118,7 +1165,7 @@ func (x *ConfigContainer) String() string { func (*ConfigContainer) ProtoMessage() {} func (x *ConfigContainer) ProtoReflect() protoreflect.Message { - mi := &file_protobuf_proto_common_proto_msgTypes[8] + mi := &file_protobuf_proto_common_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1131,7 +1178,7 @@ func (x *ConfigContainer) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigContainer.ProtoReflect.Descriptor instead. func (*ConfigContainer) Descriptor() ([]byte, []int) { - return file_protobuf_proto_common_proto_rawDescGZIP(), []int{8} + return file_protobuf_proto_common_proto_rawDescGZIP(), []int{9} } func (x *ConfigContainer) GetImage() string { @@ -1176,7 +1223,7 @@ type HealthCheckConfig struct { func (x *HealthCheckConfig) Reset() { *x = HealthCheckConfig{} if protoimpl.UnsafeEnabled { - mi := &file_protobuf_proto_common_proto_msgTypes[9] + mi := &file_protobuf_proto_common_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1189,7 +1236,7 @@ func (x *HealthCheckConfig) String() string { func (*HealthCheckConfig) ProtoMessage() {} func (x *HealthCheckConfig) ProtoReflect() protoreflect.Message { - mi := &file_protobuf_proto_common_proto_msgTypes[9] + mi := &file_protobuf_proto_common_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1202,7 +1249,7 @@ func (x *HealthCheckConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use HealthCheckConfig.ProtoReflect.Descriptor instead. func (*HealthCheckConfig) Descriptor() ([]byte, []int) { - return file_protobuf_proto_common_proto_rawDescGZIP(), []int{9} + return file_protobuf_proto_common_proto_rawDescGZIP(), []int{10} } func (x *HealthCheckConfig) GetPort() int32 { @@ -1245,7 +1292,7 @@ type Resource struct { func (x *Resource) Reset() { *x = Resource{} if protoimpl.UnsafeEnabled { - mi := &file_protobuf_proto_common_proto_msgTypes[10] + mi := &file_protobuf_proto_common_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1258,7 +1305,7 @@ func (x *Resource) String() string { func (*Resource) ProtoMessage() {} func (x *Resource) ProtoReflect() protoreflect.Message { - mi := &file_protobuf_proto_common_proto_msgTypes[10] + mi := &file_protobuf_proto_common_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1271,7 +1318,7 @@ func (x *Resource) ProtoReflect() protoreflect.Message { // Deprecated: Use Resource.ProtoReflect.Descriptor instead. func (*Resource) Descriptor() ([]byte, []int) { - return file_protobuf_proto_common_proto_rawDescGZIP(), []int{10} + return file_protobuf_proto_common_proto_rawDescGZIP(), []int{11} } func (x *Resource) GetCpu() string { @@ -1300,7 +1347,7 @@ type ResourceConfig struct { func (x *ResourceConfig) Reset() { *x = ResourceConfig{} if protoimpl.UnsafeEnabled { - mi := &file_protobuf_proto_common_proto_msgTypes[11] + mi := &file_protobuf_proto_common_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1313,7 +1360,7 @@ func (x *ResourceConfig) String() string { func (*ResourceConfig) ProtoMessage() {} func (x *ResourceConfig) ProtoReflect() protoreflect.Message { - mi := &file_protobuf_proto_common_proto_msgTypes[11] + mi := &file_protobuf_proto_common_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1326,7 +1373,7 @@ func (x *ResourceConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceConfig.ProtoReflect.Descriptor instead. func (*ResourceConfig) Descriptor() ([]byte, []int) { - return file_protobuf_proto_common_proto_rawDescGZIP(), []int{11} + return file_protobuf_proto_common_proto_rawDescGZIP(), []int{12} } func (x *ResourceConfig) GetLimits() *Resource { @@ -1355,7 +1402,7 @@ type KeyValue struct { func (x *KeyValue) Reset() { *x = KeyValue{} if protoimpl.UnsafeEnabled { - mi := &file_protobuf_proto_common_proto_msgTypes[12] + mi := &file_protobuf_proto_common_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1368,7 +1415,7 @@ func (x *KeyValue) String() string { func (*KeyValue) ProtoMessage() {} func (x *KeyValue) ProtoReflect() protoreflect.Message { - mi := &file_protobuf_proto_common_proto_msgTypes[12] + mi := &file_protobuf_proto_common_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1381,7 +1428,7 @@ func (x *KeyValue) ProtoReflect() protoreflect.Message { // Deprecated: Use KeyValue.ProtoReflect.Descriptor instead. func (*KeyValue) Descriptor() ([]byte, []int) { - return file_protobuf_proto_common_proto_rawDescGZIP(), []int{12} + return file_protobuf_proto_common_proto_rawDescGZIP(), []int{13} } func (x *KeyValue) GetKey() string { @@ -1413,7 +1460,7 @@ type ListSecretsResponse struct { func (x *ListSecretsResponse) Reset() { *x = ListSecretsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_protobuf_proto_common_proto_msgTypes[13] + mi := &file_protobuf_proto_common_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1426,7 +1473,7 @@ func (x *ListSecretsResponse) String() string { func (*ListSecretsResponse) ProtoMessage() {} func (x *ListSecretsResponse) ProtoReflect() protoreflect.Message { - mi := &file_protobuf_proto_common_proto_msgTypes[13] + mi := &file_protobuf_proto_common_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1439,7 +1486,7 @@ func (x *ListSecretsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSecretsResponse.ProtoReflect.Descriptor instead. func (*ListSecretsResponse) Descriptor() ([]byte, []int) { - return file_protobuf_proto_common_proto_rawDescGZIP(), []int{13} + return file_protobuf_proto_common_proto_rawDescGZIP(), []int{14} } func (x *ListSecretsResponse) GetPrefix() string { @@ -1489,7 +1536,7 @@ type UniqueKey struct { func (x *UniqueKey) Reset() { *x = UniqueKey{} if protoimpl.UnsafeEnabled { - mi := &file_protobuf_proto_common_proto_msgTypes[14] + mi := &file_protobuf_proto_common_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1502,7 +1549,7 @@ func (x *UniqueKey) String() string { func (*UniqueKey) ProtoMessage() {} func (x *UniqueKey) ProtoReflect() protoreflect.Message { - mi := &file_protobuf_proto_common_proto_msgTypes[14] + mi := &file_protobuf_proto_common_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1515,7 +1562,7 @@ func (x *UniqueKey) ProtoReflect() protoreflect.Message { // Deprecated: Use UniqueKey.ProtoReflect.Descriptor instead. func (*UniqueKey) Descriptor() ([]byte, []int) { - return file_protobuf_proto_common_proto_rawDescGZIP(), []int{14} + return file_protobuf_proto_common_proto_rawDescGZIP(), []int{15} } func (x *UniqueKey) GetId() string { @@ -1544,7 +1591,7 @@ type ContainerIdentifier struct { func (x *ContainerIdentifier) Reset() { *x = ContainerIdentifier{} if protoimpl.UnsafeEnabled { - mi := &file_protobuf_proto_common_proto_msgTypes[15] + mi := &file_protobuf_proto_common_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1557,7 +1604,7 @@ func (x *ContainerIdentifier) String() string { func (*ContainerIdentifier) ProtoMessage() {} func (x *ContainerIdentifier) ProtoReflect() protoreflect.Message { - mi := &file_protobuf_proto_common_proto_msgTypes[15] + mi := &file_protobuf_proto_common_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1570,7 +1617,7 @@ func (x *ContainerIdentifier) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerIdentifier.ProtoReflect.Descriptor instead. func (*ContainerIdentifier) Descriptor() ([]byte, []int) { - return file_protobuf_proto_common_proto_rawDescGZIP(), []int{15} + return file_protobuf_proto_common_proto_rawDescGZIP(), []int{16} } func (x *ContainerIdentifier) GetPrefix() string { @@ -1599,7 +1646,7 @@ type ContainerCommandRequest struct { func (x *ContainerCommandRequest) Reset() { *x = ContainerCommandRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protobuf_proto_common_proto_msgTypes[16] + mi := &file_protobuf_proto_common_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1612,7 +1659,7 @@ func (x *ContainerCommandRequest) String() string { func (*ContainerCommandRequest) ProtoMessage() {} func (x *ContainerCommandRequest) ProtoReflect() protoreflect.Message { - mi := &file_protobuf_proto_common_proto_msgTypes[16] + mi := &file_protobuf_proto_common_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1625,7 +1672,7 @@ func (x *ContainerCommandRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ContainerCommandRequest.ProtoReflect.Descriptor instead. func (*ContainerCommandRequest) Descriptor() ([]byte, []int) { - return file_protobuf_proto_common_proto_rawDescGZIP(), []int{16} + return file_protobuf_proto_common_proto_rawDescGZIP(), []int{17} } func (x *ContainerCommandRequest) GetContainer() *ContainerIdentifier { @@ -1657,7 +1704,7 @@ type DeleteContainersRequest struct { func (x *DeleteContainersRequest) Reset() { *x = DeleteContainersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_protobuf_proto_common_proto_msgTypes[17] + mi := &file_protobuf_proto_common_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1670,7 +1717,7 @@ func (x *DeleteContainersRequest) String() string { func (*DeleteContainersRequest) ProtoMessage() {} func (x *DeleteContainersRequest) ProtoReflect() protoreflect.Message { - mi := &file_protobuf_proto_common_proto_msgTypes[17] + mi := &file_protobuf_proto_common_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1683,7 +1730,7 @@ func (x *DeleteContainersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteContainersRequest.ProtoReflect.Descriptor instead. func (*DeleteContainersRequest) Descriptor() ([]byte, []int) { - return file_protobuf_proto_common_proto_rawDescGZIP(), []int{17} + return file_protobuf_proto_common_proto_rawDescGZIP(), []int{18} } func (m *DeleteContainersRequest) GetTarget() isDeleteContainersRequest_Target { @@ -1796,163 +1843,167 @@ var file_protobuf_proto_common_proto_rawDesc = []byte{ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x27, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6c, - 0x6f, 0x67, 0x22, 0xdd, 0x01, 0x0a, 0x07, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1b, - 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x70, - 0x61, 0x74, 0x68, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x69, 0x70, 0x50, 0x61, 0x74, - 0x68, 0x18, 0x66, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x70, - 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, - 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x17, - 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x04, 0x52, 0x04, - 0x70, 0x6f, 0x72, 0x74, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x64, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, - 0x73, 0x74, 0x72, 0x69, 0x70, 0x50, 0x61, 0x74, 0x68, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x75, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x6f, - 0x72, 0x74, 0x22, 0x71, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x64, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x6f, 0x6c, - 0x75, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x66, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x18, 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xec, 0x01, 0x0a, 0x11, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, 0x0a, 0x04, 0x70, - 0x6f, 0x72, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x72, - 0x74, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0d, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, - 0x50, 0x72, 0x6f, 0x62, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0d, 0x6c, - 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x2b, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, - 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x69, - 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x18, 0x67, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x03, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x72, 0x6f, - 0x62, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x10, - 0x0a, 0x0e, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, - 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, - 0x6f, 0x62, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, - 0x72, 0x6f, 0x62, 0x65, 0x22, 0x51, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x15, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x03, 0x63, 0x70, 0x75, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x63, 0x70, 0x75, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x8a, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x0a, 0x06, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x73, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x06, - 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x08, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x01, 0x52, - 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x73, 0x22, 0x32, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x61, - 0x73, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, - 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x2d, 0x0a, 0x09, 0x55, 0x6e, 0x69, 0x71, - 0x75, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x64, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x65, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x41, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x16, - 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x8e, 0x01, 0x0a, 0x17, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x65, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x17, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x18, 0xc9, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0xca, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x42, - 0x08, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x2a, 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x43, - 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x49, - 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x58, 0x49, 0x54, 0x45, 0x44, - 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x04, 0x2a, - 0x8f, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x1d, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, - 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, 0x41, - 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, - 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x55, 0x43, 0x43, 0x45, - 0x53, 0x53, 0x46, 0x55, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, - 0x44, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x42, 0x53, 0x4f, 0x4c, 0x45, 0x54, 0x45, 0x10, - 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x41, 0x44, 0x45, 0x44, 0x10, - 0x06, 0x2a, 0x4b, 0x0a, 0x0b, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x4d, 0x4f, 0x44, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x42, 0x52, 0x49, 0x44, 0x47, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x4f, - 0x53, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x06, 0x2a, 0x6e, - 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x16, 0x0a, 0x12, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, 0x46, - 0x49, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x4f, 0x10, 0x02, 0x12, 0x0e, - 0x0a, 0x0a, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0a, - 0x0a, 0x06, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, - 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x05, 0x2a, 0x5b, - 0x0a, 0x12, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x61, - 0x74, 0x65, 0x67, 0x79, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, - 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x43, - 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x4f, 0x4c, 0x4c, 0x49, - 0x4e, 0x47, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0a, 0x56, - 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x56, 0x4f, 0x4c, - 0x55, 0x4d, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, - 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, 0x02, 0x52, 0x4f, 0x10, 0x01, 0x12, 0x07, - 0x0a, 0x03, 0x52, 0x57, 0x4f, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x57, 0x58, 0x10, 0x03, - 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x45, 0x4d, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4d, 0x50, - 0x10, 0x05, 0x2a, 0xdf, 0x01, 0x0a, 0x0a, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x52, 0x49, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, - 0x0a, 0x0c, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, - 0x12, 0x14, 0x0a, 0x10, 0x44, 0x52, 0x49, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, - 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x47, 0x43, 0x50, 0x4c, 0x4f, 0x47, - 0x53, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x0d, - 0x0a, 0x09, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x05, 0x12, 0x0a, 0x0a, - 0x06, 0x53, 0x59, 0x53, 0x4c, 0x4f, 0x47, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4a, 0x4f, 0x55, - 0x52, 0x4e, 0x41, 0x4c, 0x44, 0x10, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x47, 0x45, 0x4c, 0x46, 0x10, - 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x4c, 0x55, 0x45, 0x4e, 0x54, 0x44, 0x10, 0x09, 0x12, 0x0b, - 0x0a, 0x07, 0x41, 0x57, 0x53, 0x4c, 0x4f, 0x47, 0x53, 0x10, 0x0a, 0x12, 0x0a, 0x0a, 0x06, 0x53, - 0x50, 0x4c, 0x55, 0x4e, 0x4b, 0x10, 0x0b, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x54, 0x57, 0x4c, 0x4f, - 0x47, 0x53, 0x10, 0x0c, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, 0x4f, 0x47, 0x45, 0x4e, 0x54, 0x52, 0x49, - 0x45, 0x53, 0x10, 0x0d, 0x2a, 0x5f, 0x0a, 0x0e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x53, 0x74, - 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x1f, 0x0a, 0x1b, 0x45, 0x58, 0x50, 0x4f, 0x53, 0x45, - 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x4e, 0x45, 0x5f, - 0x45, 0x53, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x58, 0x50, 0x4f, 0x53, 0x45, 0x10, 0x02, - 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x58, 0x50, 0x4f, 0x53, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, - 0x54, 0x4c, 0x53, 0x10, 0x03, 0x2a, 0x79, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x1f, 0x43, - 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, - 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, - 0x4e, 0x45, 0x52, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x43, 0x4f, - 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x53, - 0x54, 0x41, 0x52, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x03, - 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, - 0x79, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x64, 0x79, 0x72, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x69, 0x6f, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x67, - 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x67, 0x22, 0x39, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x64, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xdd, 0x01, + 0x0a, 0x07, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1b, 0x0a, 0x06, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x64, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x65, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, + 0x21, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x69, 0x70, 0x50, 0x61, 0x74, 0x68, 0x18, 0x66, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x02, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x70, 0x50, 0x61, 0x74, 0x68, 0x88, + 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x04, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x88, + 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x42, 0x07, 0x0a, + 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x70, + 0x50, 0x61, 0x74, 0x68, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x71, 0x0a, + 0x0f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x22, 0xec, 0x01, 0x0a, 0x11, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x64, + 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, + 0x29, 0x0a, 0x0d, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, + 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0d, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, + 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0e, 0x72, 0x65, + 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x18, 0x66, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x02, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x50, + 0x72, 0x6f, 0x62, 0x65, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x75, 0x70, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, + 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x88, 0x01, 0x01, + 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6c, 0x69, + 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, + 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x42, 0x0f, + 0x0a, 0x0d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x22, + 0x51, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x15, 0x0a, 0x03, 0x63, + 0x70, 0x75, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x63, 0x70, 0x75, 0x88, + 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x65, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x88, 0x01, 0x01, 0x42, + 0x06, 0x0a, 0x04, 0x5f, 0x63, 0x70, 0x75, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x22, 0x8a, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, + 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, + 0x32, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, + 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x61, 0x73, 0x4b, 0x65, 0x79, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, + 0x65, 0x79, 0x73, 0x22, 0x2d, 0x0a, 0x09, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4b, 0x65, 0x79, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x22, 0x41, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, + 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x8e, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x39, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x64, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, + 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x09, + 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x3c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0xc9, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, + 0x19, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0xca, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x42, 0x08, 0x0a, 0x06, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x2a, 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, + 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, + 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x10, + 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x58, 0x49, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0b, 0x0a, + 0x07, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x8f, 0x01, 0x0a, 0x10, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x21, 0x0a, 0x1d, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, + 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, + 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x46, 0x55, 0x4c, + 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0c, + 0x0a, 0x08, 0x4f, 0x42, 0x53, 0x4f, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, + 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x41, 0x44, 0x45, 0x44, 0x10, 0x06, 0x2a, 0x4b, 0x0a, 0x0b, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x4e, + 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x52, 0x49, + 0x44, 0x47, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x02, 0x12, + 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x06, 0x2a, 0x6e, 0x0a, 0x0d, 0x52, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x4f, + 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, + 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x4f, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x4e, 0x5f, + 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4c, 0x57, + 0x41, 0x59, 0x53, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4c, 0x45, 0x53, 0x53, 0x5f, + 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x05, 0x2a, 0x5b, 0x0a, 0x12, 0x44, 0x65, 0x70, + 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, + 0x23, 0x0a, 0x1f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, + 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, + 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x4f, 0x4c, 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x50, + 0x44, 0x41, 0x54, 0x45, 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x06, 0x0a, 0x02, 0x52, 0x4f, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x57, 0x4f, + 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x57, 0x58, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, + 0x45, 0x4d, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4d, 0x50, 0x10, 0x05, 0x2a, 0xdf, 0x01, + 0x0a, 0x0a, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, + 0x44, 0x52, 0x49, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, + 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x44, + 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x44, + 0x52, 0x49, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, + 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x47, 0x43, 0x50, 0x4c, 0x4f, 0x47, 0x53, 0x10, 0x03, 0x12, 0x09, + 0x0a, 0x05, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x4f, + 0x4e, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x59, 0x53, 0x4c, + 0x4f, 0x47, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x41, 0x4c, 0x44, + 0x10, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x47, 0x45, 0x4c, 0x46, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, + 0x46, 0x4c, 0x55, 0x45, 0x4e, 0x54, 0x44, 0x10, 0x09, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x57, 0x53, + 0x4c, 0x4f, 0x47, 0x53, 0x10, 0x0a, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x50, 0x4c, 0x55, 0x4e, 0x4b, + 0x10, 0x0b, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x54, 0x57, 0x4c, 0x4f, 0x47, 0x53, 0x10, 0x0c, 0x12, + 0x0e, 0x0a, 0x0a, 0x4c, 0x4f, 0x47, 0x45, 0x4e, 0x54, 0x52, 0x49, 0x45, 0x53, 0x10, 0x0d, 0x2a, + 0x5f, 0x0a, 0x0e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x12, 0x1f, 0x0a, 0x1b, 0x45, 0x58, 0x50, 0x4f, 0x53, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x41, + 0x54, 0x45, 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x4e, 0x45, 0x5f, 0x45, 0x53, 0x10, 0x01, 0x12, + 0x0a, 0x0a, 0x06, 0x45, 0x58, 0x50, 0x4f, 0x53, 0x45, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x45, + 0x58, 0x50, 0x4f, 0x53, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x54, 0x4c, 0x53, 0x10, 0x03, + 0x2a, 0x79, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, + 0x4e, 0x45, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x53, + 0x54, 0x41, 0x52, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x01, + 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, + 0x45, 0x52, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, + 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x03, 0x42, 0x36, 0x5a, 0x34, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x79, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x64, 0x79, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x6f, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1968,7 +2019,7 @@ func file_protobuf_proto_common_proto_rawDescGZIP() []byte { } var file_protobuf_proto_common_proto_enumTypes = make([]protoimpl.EnumInfo, 9) -var file_protobuf_proto_common_proto_msgTypes = make([]protoimpl.MessageInfo, 19) +var file_protobuf_proto_common_proto_msgTypes = make([]protoimpl.MessageInfo, 20) var file_protobuf_proto_common_proto_goTypes = []interface{}{ (ContainerState)(0), // 0: common.ContainerState (DeploymentStatus)(0), // 1: common.DeploymentStatus @@ -1986,35 +2037,36 @@ var file_protobuf_proto_common_proto_goTypes = []interface{}{ (*ContainerStateListMessage)(nil), // 13: common.ContainerStateListMessage (*ContainerStateItem)(nil), // 14: common.ContainerStateItem (*ContainerLogMessage)(nil), // 15: common.ContainerLogMessage - (*Routing)(nil), // 16: common.Routing - (*ConfigContainer)(nil), // 17: common.ConfigContainer - (*HealthCheckConfig)(nil), // 18: common.HealthCheckConfig - (*Resource)(nil), // 19: common.Resource - (*ResourceConfig)(nil), // 20: common.ResourceConfig - (*KeyValue)(nil), // 21: common.KeyValue - (*ListSecretsResponse)(nil), // 22: common.ListSecretsResponse - (*UniqueKey)(nil), // 23: common.UniqueKey - (*ContainerIdentifier)(nil), // 24: common.ContainerIdentifier - (*ContainerCommandRequest)(nil), // 25: common.ContainerCommandRequest - (*DeleteContainersRequest)(nil), // 26: common.DeleteContainersRequest - nil, // 27: common.ContainerStateItem.LabelsEntry - (*timestamppb.Timestamp)(nil), // 28: google.protobuf.Timestamp + (*ContainerInspectMessage)(nil), // 16: common.ContainerInspectMessage + (*Routing)(nil), // 17: common.Routing + (*ConfigContainer)(nil), // 18: common.ConfigContainer + (*HealthCheckConfig)(nil), // 19: common.HealthCheckConfig + (*Resource)(nil), // 20: common.Resource + (*ResourceConfig)(nil), // 21: common.ResourceConfig + (*KeyValue)(nil), // 22: common.KeyValue + (*ListSecretsResponse)(nil), // 23: common.ListSecretsResponse + (*UniqueKey)(nil), // 24: common.UniqueKey + (*ContainerIdentifier)(nil), // 25: common.ContainerIdentifier + (*ContainerCommandRequest)(nil), // 26: common.ContainerCommandRequest + (*DeleteContainersRequest)(nil), // 27: common.DeleteContainersRequest + nil, // 28: common.ContainerStateItem.LabelsEntry + (*timestamppb.Timestamp)(nil), // 29: google.protobuf.Timestamp } var file_protobuf_proto_common_proto_depIdxs = []int32{ 0, // 0: common.InstanceDeploymentItem.state:type_name -> common.ContainerState 10, // 1: common.DeploymentStatusMessage.instance:type_name -> common.InstanceDeploymentItem 1, // 2: common.DeploymentStatusMessage.deploymentStatus:type_name -> common.DeploymentStatus 14, // 3: common.ContainerStateListMessage.data:type_name -> common.ContainerStateItem - 24, // 4: common.ContainerStateItem.id:type_name -> common.ContainerIdentifier - 28, // 5: common.ContainerStateItem.createdAt:type_name -> google.protobuf.Timestamp + 25, // 4: common.ContainerStateItem.id:type_name -> common.ContainerIdentifier + 29, // 5: common.ContainerStateItem.createdAt:type_name -> google.protobuf.Timestamp 0, // 6: common.ContainerStateItem.state:type_name -> common.ContainerState 12, // 7: common.ContainerStateItem.ports:type_name -> common.ContainerStateItemPort - 27, // 8: common.ContainerStateItem.labels:type_name -> common.ContainerStateItem.LabelsEntry - 19, // 9: common.ResourceConfig.limits:type_name -> common.Resource - 19, // 10: common.ResourceConfig.requests:type_name -> common.Resource - 24, // 11: common.ContainerCommandRequest.container:type_name -> common.ContainerIdentifier + 28, // 8: common.ContainerStateItem.labels:type_name -> common.ContainerStateItem.LabelsEntry + 20, // 9: common.ResourceConfig.limits:type_name -> common.Resource + 20, // 10: common.ResourceConfig.requests:type_name -> common.Resource + 25, // 11: common.ContainerCommandRequest.container:type_name -> common.ContainerIdentifier 8, // 12: common.ContainerCommandRequest.operation:type_name -> common.ContainerOperation - 24, // 13: common.DeleteContainersRequest.container:type_name -> common.ContainerIdentifier + 25, // 13: common.DeleteContainersRequest.container:type_name -> common.ContainerIdentifier 14, // [14:14] is the sub-list for method output_type 14, // [14:14] is the sub-list for method input_type 14, // [14:14] is the sub-list for extension type_name @@ -2113,7 +2165,7 @@ func file_protobuf_proto_common_proto_init() { } } file_protobuf_proto_common_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Routing); i { + switch v := v.(*ContainerInspectMessage); i { case 0: return &v.state case 1: @@ -2125,7 +2177,7 @@ func file_protobuf_proto_common_proto_init() { } } file_protobuf_proto_common_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConfigContainer); i { + switch v := v.(*Routing); i { case 0: return &v.state case 1: @@ -2137,7 +2189,7 @@ func file_protobuf_proto_common_proto_init() { } } file_protobuf_proto_common_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HealthCheckConfig); i { + switch v := v.(*ConfigContainer); i { case 0: return &v.state case 1: @@ -2149,7 +2201,7 @@ func file_protobuf_proto_common_proto_init() { } } file_protobuf_proto_common_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Resource); i { + switch v := v.(*HealthCheckConfig); i { case 0: return &v.state case 1: @@ -2161,7 +2213,7 @@ func file_protobuf_proto_common_proto_init() { } } file_protobuf_proto_common_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResourceConfig); i { + switch v := v.(*Resource); i { case 0: return &v.state case 1: @@ -2173,7 +2225,7 @@ func file_protobuf_proto_common_proto_init() { } } file_protobuf_proto_common_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KeyValue); i { + switch v := v.(*ResourceConfig); i { case 0: return &v.state case 1: @@ -2185,7 +2237,7 @@ func file_protobuf_proto_common_proto_init() { } } file_protobuf_proto_common_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListSecretsResponse); i { + switch v := v.(*KeyValue); i { case 0: return &v.state case 1: @@ -2197,7 +2249,7 @@ func file_protobuf_proto_common_proto_init() { } } file_protobuf_proto_common_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UniqueKey); i { + switch v := v.(*ListSecretsResponse); i { case 0: return &v.state case 1: @@ -2209,7 +2261,7 @@ func file_protobuf_proto_common_proto_init() { } } file_protobuf_proto_common_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerIdentifier); i { + switch v := v.(*UniqueKey); i { case 0: return &v.state case 1: @@ -2221,7 +2273,7 @@ func file_protobuf_proto_common_proto_init() { } } file_protobuf_proto_common_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContainerCommandRequest); i { + switch v := v.(*ContainerIdentifier); i { case 0: return &v.state case 1: @@ -2233,6 +2285,18 @@ func file_protobuf_proto_common_proto_init() { } } file_protobuf_proto_common_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ContainerCommandRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_protobuf_proto_common_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteContainersRequest); i { case 0: return &v.state @@ -2250,11 +2314,11 @@ func file_protobuf_proto_common_proto_init() { (*DeploymentStatusMessage_DeploymentStatus)(nil), } file_protobuf_proto_common_proto_msgTypes[4].OneofWrappers = []interface{}{} - file_protobuf_proto_common_proto_msgTypes[7].OneofWrappers = []interface{}{} - file_protobuf_proto_common_proto_msgTypes[9].OneofWrappers = []interface{}{} + file_protobuf_proto_common_proto_msgTypes[8].OneofWrappers = []interface{}{} file_protobuf_proto_common_proto_msgTypes[10].OneofWrappers = []interface{}{} file_protobuf_proto_common_proto_msgTypes[11].OneofWrappers = []interface{}{} - file_protobuf_proto_common_proto_msgTypes[17].OneofWrappers = []interface{}{ + file_protobuf_proto_common_proto_msgTypes[12].OneofWrappers = []interface{}{} + file_protobuf_proto_common_proto_msgTypes[18].OneofWrappers = []interface{}{ (*DeleteContainersRequest_Container)(nil), (*DeleteContainersRequest_Prefix)(nil), } @@ -2264,7 +2328,7 @@ func file_protobuf_proto_common_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_protobuf_proto_common_proto_rawDesc, NumEnums: 9, - NumMessages: 19, + NumMessages: 20, NumExtensions: 0, NumServices: 0, }, diff --git a/protobuf/proto/agent.proto b/protobuf/proto/agent.proto index 4be39cace..2e4c16c98 100644 --- a/protobuf/proto/agent.proto +++ b/protobuf/proto/agent.proto @@ -30,6 +30,7 @@ service Agent { rpc AbortUpdate(AgentAbortUpdate) returns (common.Empty); rpc DeleteContainers(common.DeleteContainersRequest) returns (common.Empty); rpc ContainerLog(stream common.ContainerLogMessage) returns (common.Empty); + rpc ContainerInspect(common.ContainerInspectMessage) returns (common.Empty); rpc TokenReplaced(common.Empty) returns (common.Empty); } @@ -57,6 +58,7 @@ message AgentCommand { common.DeleteContainersRequest deleteContainers = 9; ContainerLogRequest containerLog = 10; ReplaceTokenRequest replaceToken = 11; + ContainerInspectRequest containerInspect = 12; } } @@ -272,6 +274,14 @@ message ContainerLogRequest { uint32 tail = 3; } +/* + * Container inspect + * + */ +message ContainerInspectRequest { + common.ContainerIdentifier container = 1; +} + /* * Connection close * diff --git a/protobuf/proto/common.proto b/protobuf/proto/common.proto index 70345e76a..8713a9d53 100644 --- a/protobuf/proto/common.proto +++ b/protobuf/proto/common.proto @@ -77,6 +77,10 @@ message ContainerLogMessage { string log = 100; } +message ContainerInspectMessage { + string inspection = 100; +} + enum NetworkMode { NETWORK_MODE_UNSPECIFIED = 0; BRIDGE = 1; diff --git a/web/crux-ui/locales/en/nodes.json b/web/crux-ui/locales/en/nodes.json index cf30dbf60..104cec688 100644 --- a/web/crux-ui/locales/en/nodes.json +++ b/web/crux-ui/locales/en/nodes.json @@ -3,6 +3,7 @@ "containers": "Containers", "logs": "Logs", + "inspect": "Inspect", "add": "Add node", "new": "New node", diff --git a/web/crux-ui/src/components/nodes/node-containers-list.tsx b/web/crux-ui/src/components/nodes/node-containers-list.tsx index 6af4ee934..8b5dc59f6 100644 --- a/web/crux-ui/src/components/nodes/node-containers-list.tsx +++ b/web/crux-ui/src/components/nodes/node-containers-list.tsx @@ -80,7 +80,7 @@ const NodeContainersList = (props: NodeContainersListProps) => { !container.ports ? null : ( {containerPortsToString(container.ports)} ), -
+
{targetState ? ( ) : ( @@ -116,6 +116,12 @@ const NodeContainersList = (props: NodeContainersListProps) => { )} + {container.state && ( + + + + )} + { +// // TODO(@amorfevo): path to api +// const response = await fetch(`/path-to-api/${nodeId}/${prefix}/${name}/inspect`) +// if (!response.ok) { +// throw new Error('Failed to fetch container inspection') +// } +// return await response.text() +// } + +const NodeContainerInspectPage = (props: ContainerInspectPageProps) => { + const { node, prefix, name } = props + + const { t } = useTranslation('common') + const routes = useTeamRoutes() + + const [inspection, setInspection] = useState([]) + // const [inspection, setInspection] = useState(null) + + // TODO(@amorfevo): use real data instead of dummy + const fetchInspection = async () => { + const dummyInspection: ContainerInspection = { + inspectionData: 'Container ID: 12 Image: my-container-image:latest Status: Running // ... other details ...', + } + + setInspection([dummyInspection]) + + // try { + // const inspectionData = await fetchContainerInspection(node.id, prefix, name) + // setInspection([{ inspectionData }]) + // } catch (error) { + // console.error('Failed to fetch inspection data:', error) + // } + } + + useEffect(() => { + fetchInspection() + }, []) + + const pageLink: BreadcrumbLink = { + name: t('nodes'), + url: routes.node.list(), + } + + const sublinks: BreadcrumbLink[] = [ + { + name: node.name, + url: `${routes.node.details(node.id)}`, + }, + { + name: t('inspect'), + url: `${routes.node.containerInspect(node.id, { prefix, name })}`, + }, + ] + + return ( + + + + +
+ + {t('inspect')} + +
+ + {/* TODO(@amorfevo): DyoCards or json-editor component or own inspection component */} + [it.inspectionData]} /> +
+
+ ) +} + +export default NodeContainerInspectPage + +const getPageServerSideProps = async (context: NextPageContext) => { + const routes = TeamRoutes.fromContext(context) + + const nodeId = context.query.nodeId as string + const prefix = context.query.prefix as string + const name = context.query.name as string + + const node = await getCruxFromContext(context, routes.node.api.details(nodeId)) + + return { + props: { + node, + prefix: prefix ?? null, + name: name ?? null, + }, + } +} + +export const getServerSideProps = withContextAuthorization(getPageServerSideProps) diff --git a/web/crux-ui/src/routes.ts b/web/crux-ui/src/routes.ts index b6a9a5684..934725038 100644 --- a/web/crux-ui/src/routes.ts +++ b/web/crux-ui/src/routes.ts @@ -253,6 +253,12 @@ class NodeRoutes { ...params, anchor: null, }) + + containerInspect = (id: string, params: ContainerLogParams) => + appendUrlParams(`${this.details(id)}/inspect`, { + ...params, + anchor: null, + }) } class RegistryApi { diff --git a/web/crux/proto/agent.proto b/web/crux/proto/agent.proto index 4be39cace..df9d9aae4 100644 --- a/web/crux/proto/agent.proto +++ b/web/crux/proto/agent.proto @@ -30,6 +30,7 @@ service Agent { rpc AbortUpdate(AgentAbortUpdate) returns (common.Empty); rpc DeleteContainers(common.DeleteContainersRequest) returns (common.Empty); rpc ContainerLog(stream common.ContainerLogMessage) returns (common.Empty); + rpc ContainerInspect(common.ContainerInspectMessage) returns (common.Empty); rpc TokenReplaced(common.Empty) returns (common.Empty); } @@ -56,7 +57,8 @@ message AgentCommand { common.ContainerCommandRequest containerCommand = 8; common.DeleteContainersRequest deleteContainers = 9; ContainerLogRequest containerLog = 10; - ReplaceTokenRequest replaceToken = 11; + ContainerInspectRequest containerInspect = 11; + ReplaceTokenRequest replaceToken = 12; } } @@ -272,6 +274,14 @@ message ContainerLogRequest { uint32 tail = 3; } +/* + * Container inspect + * + */ +message ContainerInspectRequest { + common.ContainerIdentifier container = 1; +} + /* * Connection close * diff --git a/web/crux/proto/common.proto b/web/crux/proto/common.proto index 70345e76a..8713a9d53 100644 --- a/web/crux/proto/common.proto +++ b/web/crux/proto/common.proto @@ -77,6 +77,10 @@ message ContainerLogMessage { string log = 100; } +message ContainerInspectMessage { + string inspection = 100; +} + enum NetworkMode { NETWORK_MODE_UNSPECIFIED = 0; BRIDGE = 1; diff --git a/web/crux/src/app/agent/agent.grpc.controller.ts b/web/crux/src/app/agent/agent.grpc.controller.ts index 323f43981..c7ecd2ffb 100644 --- a/web/crux/src/app/agent/agent.grpc.controller.ts +++ b/web/crux/src/app/agent/agent.grpc.controller.ts @@ -10,6 +10,7 @@ import { AgentController as GrpcAgentController, } from 'src/grpc/protobuf/proto/agent' import { + ContainerInspectMessage, ContainerLogMessage, ContainerStateListMessage, DeleteContainersRequest, @@ -58,6 +59,11 @@ export default class AgentController implements GrpcAgentController { return this.service.handleContainerLog(call.connection, request) } + // TODO(@amorfevo): Empty or Promise or Observable + containerInspect(request: ContainerInspectMessage, _: Metadata, call: NodeGrpcCall): Observable { + return this.service.handleContainerInspect(call.connection, request) + } + async tokenReplaced(_: Empty, __: Metadata, call: NodeGrpcCall): Promise { return await this.service.tokenReplaced(call.connection) } diff --git a/web/crux/src/app/agent/agent.service.ts b/web/crux/src/app/agent/agent.service.ts index da92d95fe..45912f4be 100644 --- a/web/crux/src/app/agent/agent.service.ts +++ b/web/crux/src/app/agent/agent.service.ts @@ -28,6 +28,7 @@ import { CruxNotFoundException } from 'src/exception/crux-exception' import { AgentAbortUpdate, AgentCommand, AgentInfo, CloseReason } from 'src/grpc/protobuf/proto/agent' import { ContainerIdentifier, + ContainerInspectMessage, ContainerLogMessage, ContainerStateListMessage, DeleteContainersRequest, @@ -353,6 +354,24 @@ export default class AgentService { ) } + // handleSecretList(connection: GrpcNodeConnection, request: ListSecretsResponse): Observable { + // const agent = this.getByIdOrThrow(connection.nodeId) + + // agent.onContainerSecrets(request) + + // return of(Empty) + // } + + handleContainerInspect(connection: GrpcNodeConnection, request: ContainerInspectMessage): Observable { + const agent = this.getByIdOrThrow(connection.nodeId) + + // const inspection = await this.agentService.inspectContainer(container) + const inspection = agent.inspectContainer(container) + agent.onContainerSecrets(request) + + return Empty + } + async tokenReplaced(connection: GrpcNodeConnection): Promise { const agent = this.getByIdOrThrow(connection.nodeId) diff --git a/web/crux/src/app/node/node.prefix-container.http.controller.ts b/web/crux/src/app/node/node.prefix-container.http.controller.ts index b438050fc..7d326c93a 100644 --- a/web/crux/src/app/node/node.prefix-container.http.controller.ts +++ b/web/crux/src/app/node/node.prefix-container.http.controller.ts @@ -1,26 +1,26 @@ -import { Controller, Delete, HttpCode, HttpStatus, Post, UseGuards } from '@nestjs/common' +import { Controller,Delete,Get,HttpCode,HttpStatus,Post,UseGuards } from '@nestjs/common' import { - ApiBadRequestResponse, - ApiForbiddenResponse, - ApiNoContentResponse, - ApiNotFoundResponse, - ApiOperation, - ApiTags, +ApiBadRequestResponse, +ApiForbiddenResponse, +ApiNoContentResponse, +ApiNotFoundResponse, +ApiOperation, +ApiTags, } from '@nestjs/swagger' -import { Observable, from, mergeAll } from 'rxjs' +import { Observable,from,mergeAll } from 'rxjs' import UuidParams from 'src/decorators/api-params.decorator' import NodeTeamAccessGuard from './guards/node.team-access.http.guard' import { - Name, - NodeId, - PARAM_NODE_ID, - Prefix, - ROUTE_CONTAINERS, - ROUTE_NAME, - ROUTE_NODES, - ROUTE_NODE_ID, - ROUTE_PREFIX, - ROUTE_TEAM_SLUG, +Name, +NodeId, +PARAM_NODE_ID, +Prefix, +ROUTE_CONTAINERS, +ROUTE_NAME, +ROUTE_NODES, +ROUTE_NODE_ID, +ROUTE_PREFIX, +ROUTE_TEAM_SLUG, } from './node.const' import NodeService from './node.service' @@ -99,4 +99,18 @@ export default class NodePrefixContainerHttpController { deleteContainer(@NodeId() nodeId: string, @Prefix() prefix: string, @Name() name: string): Observable { return from(this.service.deleteContainer(nodeId, prefix, name)).pipe(mergeAll()) } + + @Get(`${ROUTE_NAME}/inspect`) + @HttpCode(HttpStatus.NO_CONTENT) + @ApiOperation({ + description: 'Request must include `nodeId`, `prefix`, and `name`.', + summary: 'Inspect a container deployed with dyrector.io on a node.', + }) + @ApiNoContentResponse({ description: 'Container started.' }) + @ApiBadRequestResponse({ description: 'Bad request for container starting.' }) + @ApiForbiddenResponse({ description: 'Unauthorized request for container starting.' }) + @UuidParams(PARAM_NODE_ID) + async inspectContainer(@NodeId() nodeId: string, @Prefix() prefix: string, @Name() name: string): Promise { + await this.service.inspectContainer(nodeId, prefix, name) + } } diff --git a/web/crux/src/app/node/node.service.ts b/web/crux/src/app/node/node.service.ts index a16276a60..28de0e0e3 100644 --- a/web/crux/src/app/node/node.service.ts +++ b/web/crux/src/app/node/node.service.ts @@ -1,38 +1,38 @@ -import { Injectable, Logger } from '@nestjs/common' +import { Injectable,Logger } from '@nestjs/common' import { Identity } from '@ory/kratos-client' import { Prisma } from '@prisma/client' -import { EmptyError, Observable, filter, firstValueFrom, map, mergeAll, mergeWith, of, timeout } from 'rxjs' -import { Agent, AgentConnectionMessage } from 'src/domain/agent' +import { EmptyError,Observable,filter,firstValueFrom,map,mergeAll,mergeWith,of,timeout } from 'rxjs' +import { Agent,AgentConnectionMessage } from 'src/domain/agent' import { BaseMessage } from 'src/domain/notification-templates' import { - ContainerCommandRequest, - ContainerIdentifier, - ContainerOperation, - ContainerStateListMessage, - DeleteContainersRequest, - containerOperationToJSON, +ContainerCommandRequest, +ContainerIdentifier, +ContainerOperation, +ContainerStateListMessage, +DeleteContainersRequest, +containerOperationToJSON, } from 'src/grpc/protobuf/proto/common' import DomainNotificationService from 'src/services/domain.notification.service' import PrismaService from 'src/services/prisma.service' import AgentService from '../agent/agent.service' import TeamRepository from '../team/team.repository' import { - ContainerDto, - CreateNodeDto, - NodeAuditLogListDto, - NodeAuditLogQueryDto, - NodeDetailsDto, - NodeDto, - NodeGenerateScriptDto, - NodeInstallDto, - UpdateNodeDto, +ContainerDto, +CreateNodeDto, +NodeAuditLogListDto, +NodeAuditLogQueryDto, +NodeDetailsDto, +NodeDto, +NodeGenerateScriptDto, +NodeInstallDto, +UpdateNodeDto, } from './node.dto' import NodeMapper from './node.mapper' import { - ContainerLogMessage, - ContainersStateListMessage, - WatchContainerLogMessage, - WatchContainersStateMessage, +ContainerLogMessage, +ContainersStateListMessage, +WatchContainerLogMessage, +WatchContainersStateMessage, } from './node.message' @Injectable() @@ -408,6 +408,27 @@ export default class NodeService { } } + // watchContainerLog(nodeId: string, message: WatchContainerLogMessage): Observable { + // const { container } = message + + // this.logger.debug( + // `Opening container log stream for container: ${nodeId} - ${Agent.containerPrefixNameOf(container)}}`, + // ) + + // const agent = this.agentService.getByIdOrThrow(nodeId) + + // const stream = agent.upsertContainerLogStream(container) + + // return stream.watch() + // } + + // async updateAgent(id: string, identity: Identity): Promise { + // await this.agentService.updateAgent(id, identity) + // } + async inspectContainer(container: ContainerIdentifier): Promise { + return await this.agentService.inspectContainer(container) + } + private static snakeCaseToCamelCase(snake: string): string { return snake.toLocaleLowerCase().replace(/([-_][a-z])/g, it => it.replace('_', '').toLocaleUpperCase()) } diff --git a/web/crux/src/grpc/protobuf/proto/agent.ts b/web/crux/src/grpc/protobuf/proto/agent.ts index 044a6216c..bb71981ee 100644 --- a/web/crux/src/grpc/protobuf/proto/agent.ts +++ b/web/crux/src/grpc/protobuf/proto/agent.ts @@ -6,6 +6,7 @@ import { ConfigContainer, ContainerCommandRequest, ContainerIdentifier, + ContainerInspectMessage, ContainerLogMessage, ContainerStateListMessage, DeleteContainersRequest, @@ -113,6 +114,7 @@ export interface AgentCommand { containerCommand?: ContainerCommandRequest | undefined deleteContainers?: DeleteContainersRequest | undefined containerLog?: ContainerLogRequest | undefined + containerInspect?: ContainerInspectRequest | undefined replaceToken?: ReplaceTokenRequest | undefined } @@ -368,6 +370,11 @@ export interface ContainerLogRequest { tail: number } +/** Container inspect */ +export interface ContainerInspectRequest { + container: ContainerIdentifier | undefined +} + export interface CloseConnectionRequest { reason: CloseReason } @@ -421,6 +428,9 @@ export const AgentCommand = { ? DeleteContainersRequest.fromJSON(object.deleteContainers) : undefined, containerLog: isSet(object.containerLog) ? ContainerLogRequest.fromJSON(object.containerLog) : undefined, + containerInspect: isSet(object.containerInspect) + ? ContainerInspectRequest.fromJSON(object.containerInspect) + : undefined, replaceToken: isSet(object.replaceToken) ? ReplaceTokenRequest.fromJSON(object.replaceToken) : undefined, } }, @@ -453,6 +463,10 @@ export const AgentCommand = { : undefined) message.containerLog !== undefined && (obj.containerLog = message.containerLog ? ContainerLogRequest.toJSON(message.containerLog) : undefined) + message.containerInspect !== undefined && + (obj.containerInspect = message.containerInspect + ? ContainerInspectRequest.toJSON(message.containerInspect) + : undefined) message.replaceToken !== undefined && (obj.replaceToken = message.replaceToken ? ReplaceTokenRequest.toJSON(message.replaceToken) : undefined) return obj @@ -1441,6 +1455,23 @@ export const ContainerLogRequest = { }, } +function createBaseContainerInspectRequest(): ContainerInspectRequest { + return { container: undefined } +} + +export const ContainerInspectRequest = { + fromJSON(object: any): ContainerInspectRequest { + return { container: isSet(object.container) ? ContainerIdentifier.fromJSON(object.container) : undefined } + }, + + toJSON(message: ContainerInspectRequest): unknown { + const obj: any = {} + message.container !== undefined && + (obj.container = message.container ? ContainerIdentifier.toJSON(message.container) : undefined) + return obj + }, +} + function createBaseCloseConnectionRequest(): CloseConnectionRequest { return { reason: 0 } } @@ -1482,6 +1513,8 @@ export interface AgentClient { containerLog(request: Observable, metadata: Metadata, ...rest: any): Observable + containerInspect(request: ContainerInspectMessage, metadata: Metadata, ...rest: any): Observable + tokenReplaced(request: Empty, metadata: Metadata, ...rest: any): Observable } @@ -1526,12 +1559,25 @@ export interface AgentController { ...rest: any ): Promise | Observable | Empty + containerInspect( + request: ContainerInspectMessage, + metadata: Metadata, + ...rest: any + ): Promise | Observable | Empty + tokenReplaced(request: Empty, metadata: Metadata, ...rest: any): Promise | Observable | Empty } export function AgentControllerMethods() { return function (constructor: Function) { - const grpcMethods: string[] = ['connect', 'secretList', 'abortUpdate', 'deleteContainers', 'tokenReplaced'] + const grpcMethods: string[] = [ + 'connect', + 'secretList', + 'abortUpdate', + 'deleteContainers', + 'containerInspect', + 'tokenReplaced', + ] for (const method of grpcMethods) { const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method) GrpcMethod('Agent', method)(constructor.prototype[method], method, descriptor) diff --git a/web/crux/src/grpc/protobuf/proto/common.ts b/web/crux/src/grpc/protobuf/proto/common.ts index fdf3eedc3..05e5dd3fc 100644 --- a/web/crux/src/grpc/protobuf/proto/common.ts +++ b/web/crux/src/grpc/protobuf/proto/common.ts @@ -564,6 +564,10 @@ export interface ContainerLogMessage { log: string } +export interface ContainerInspectMessage { + inspection: string +} + export interface Routing { domain?: string | undefined path?: string | undefined @@ -835,6 +839,22 @@ export const ContainerLogMessage = { }, } +function createBaseContainerInspectMessage(): ContainerInspectMessage { + return { inspection: '' } +} + +export const ContainerInspectMessage = { + fromJSON(object: any): ContainerInspectMessage { + return { inspection: isSet(object.inspection) ? String(object.inspection) : '' } + }, + + toJSON(message: ContainerInspectMessage): unknown { + const obj: any = {} + message.inspection !== undefined && (obj.inspection = message.inspection) + return obj + }, +} + function createBaseRouting(): Routing { return {} } From 8088533227be0c93729eefe9ba089c7d1073a34d Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Thu, 5 Oct 2023 14:47:04 +0200 Subject: [PATCH 02/19] feat: use prefix and name in container inspect message --- golang/internal/grpc/grpc.go | 2 + protobuf/go/agent/agent.pb.go | 52 ++-- protobuf/go/common/common.pb.go | 343 +++++++++++---------- protobuf/proto/common.proto | 4 +- web/crux/proto/agent.proto | 4 +- web/crux/proto/common.proto | 4 +- web/crux/src/grpc/protobuf/proto/agent.ts | 8 +- web/crux/src/grpc/protobuf/proto/common.ts | 12 +- 8 files changed, 231 insertions(+), 198 deletions(-) diff --git a/golang/internal/grpc/grpc.go b/golang/internal/grpc/grpc.go index a17a16077..8b34e67aa 100644 --- a/golang/internal/grpc/grpc.go +++ b/golang/internal/grpc/grpc.go @@ -858,6 +858,8 @@ func executeContainerInspect(ctx context.Context, command *agent.ContainerInspec } resp := &common.ContainerInspectMessage{ + Prefix: prefix, + Name: name, Inspection: inspection, } diff --git a/protobuf/go/agent/agent.pb.go b/protobuf/go/agent/agent.pb.go index 2e97232f7..eea7ce043 100644 --- a/protobuf/go/agent/agent.pb.go +++ b/protobuf/go/agent/agent.pb.go @@ -171,8 +171,8 @@ type AgentCommand struct { // *AgentCommand_ContainerCommand // *AgentCommand_DeleteContainers // *AgentCommand_ContainerLog - // *AgentCommand_ContainerInspect // *AgentCommand_ReplaceToken + // *AgentCommand_ContainerInspect Command isAgentCommand_Command `protobuf_oneof:"command"` } @@ -285,16 +285,16 @@ func (x *AgentCommand) GetContainerLog() *ContainerLogRequest { return nil } -func (x *AgentCommand) GetContainerInspect() *ContainerInspectRequest { - if x, ok := x.GetCommand().(*AgentCommand_ContainerInspect); ok { - return x.ContainerInspect +func (x *AgentCommand) GetReplaceToken() *ReplaceTokenRequest { + if x, ok := x.GetCommand().(*AgentCommand_ReplaceToken); ok { + return x.ReplaceToken } return nil } -func (x *AgentCommand) GetReplaceToken() *ReplaceTokenRequest { - if x, ok := x.GetCommand().(*AgentCommand_ReplaceToken); ok { - return x.ReplaceToken +func (x *AgentCommand) GetContainerInspect() *ContainerInspectRequest { + if x, ok := x.GetCommand().(*AgentCommand_ContainerInspect); ok { + return x.ContainerInspect } return nil } @@ -343,12 +343,12 @@ type AgentCommand_ContainerLog struct { ContainerLog *ContainerLogRequest `protobuf:"bytes,10,opt,name=containerLog,proto3,oneof"` } -type AgentCommand_ContainerInspect struct { - ContainerInspect *ContainerInspectRequest `protobuf:"bytes,11,opt,name=containerInspect,proto3,oneof"` +type AgentCommand_ReplaceToken struct { + ReplaceToken *ReplaceTokenRequest `protobuf:"bytes,11,opt,name=replaceToken,proto3,oneof"` } -type AgentCommand_ReplaceToken struct { - ReplaceToken *ReplaceTokenRequest `protobuf:"bytes,12,opt,name=replaceToken,proto3,oneof"` +type AgentCommand_ContainerInspect struct { + ContainerInspect *ContainerInspectRequest `protobuf:"bytes,12,opt,name=containerInspect,proto3,oneof"` } func (*AgentCommand_Deploy) isAgentCommand_Command() {} @@ -371,10 +371,10 @@ func (*AgentCommand_DeleteContainers) isAgentCommand_Command() {} func (*AgentCommand_ContainerLog) isAgentCommand_Command() {} -func (*AgentCommand_ContainerInspect) isAgentCommand_Command() {} - func (*AgentCommand_ReplaceToken) isAgentCommand_Command() {} +func (*AgentCommand_ContainerInspect) isAgentCommand_Command() {} + // This is more of a placeholder, we could include more, or return this // instantly after validation success. type DeployResponse struct { @@ -2354,16 +2354,16 @@ var file_protobuf_proto_agent_proto_rawDesc = []byte{ 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x12, 0x4c, 0x0a, 0x10, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x40, 0x0a, 0x0c, 0x72, 0x65, 0x70, - 0x6c, 0x61, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x72, - 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x09, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x12, 0x40, 0x0a, 0x0c, 0x72, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, + 0x0c, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x4c, 0x0a, + 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x48, 0x00, 0x52, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x42, 0x09, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0x2a, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, 0x74, @@ -2863,8 +2863,8 @@ var file_protobuf_proto_agent_proto_depIdxs = []int32{ 42, // 7: agent.AgentCommand.containerCommand:type_name -> common.ContainerCommandRequest 43, // 8: agent.AgentCommand.deleteContainers:type_name -> common.DeleteContainersRequest 28, // 9: agent.AgentCommand.containerLog:type_name -> agent.ContainerLogRequest - 29, // 10: agent.AgentCommand.containerInspect:type_name -> agent.ContainerInspectRequest - 26, // 11: agent.AgentCommand.replaceToken:type_name -> agent.ReplaceTokenRequest + 26, // 10: agent.AgentCommand.replaceToken:type_name -> agent.ReplaceTokenRequest + 29, // 11: agent.AgentCommand.containerInspect:type_name -> agent.ContainerInspectRequest 21, // 12: agent.VersionDeployRequest.requests:type_name -> agent.DeployRequest 31, // 13: agent.InstanceConfig.environment:type_name -> agent.InstanceConfig.EnvironmentEntry 9, // 14: agent.PortRangeBinding.internal:type_name -> agent.PortRange @@ -3311,8 +3311,8 @@ func file_protobuf_proto_agent_proto_init() { (*AgentCommand_ContainerCommand)(nil), (*AgentCommand_DeleteContainers)(nil), (*AgentCommand_ContainerLog)(nil), - (*AgentCommand_ContainerInspect)(nil), (*AgentCommand_ReplaceToken)(nil), + (*AgentCommand_ContainerInspect)(nil), } file_protobuf_proto_agent_proto_msgTypes[5].OneofWrappers = []interface{}{} file_protobuf_proto_agent_proto_msgTypes[7].OneofWrappers = []interface{}{} diff --git a/protobuf/go/common/common.pb.go b/protobuf/go/common/common.pb.go index e79d67965..cbeb155c8 100644 --- a/protobuf/go/common/common.pb.go +++ b/protobuf/go/common/common.pb.go @@ -1017,7 +1017,9 @@ type ContainerInspectMessage struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Inspection string `protobuf:"bytes,100,opt,name=inspection,proto3" json:"inspection,omitempty"` + Prefix string `protobuf:"bytes,1,opt,name=prefix,proto3" json:"prefix,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + Inspection string `protobuf:"bytes,3,opt,name=inspection,proto3" json:"inspection,omitempty"` } func (x *ContainerInspectMessage) Reset() { @@ -1052,6 +1054,20 @@ func (*ContainerInspectMessage) Descriptor() ([]byte, []int) { return file_protobuf_proto_common_proto_rawDescGZIP(), []int{7} } +func (x *ContainerInspectMessage) GetPrefix() string { + if x != nil { + return x.Prefix + } + return "" +} + +func (x *ContainerInspectMessage) GetName() string { + if x != nil { + return x.Name + } + return "" +} + func (x *ContainerInspectMessage) GetInspection() string { if x != nil { return x.Inspection @@ -1843,167 +1859,170 @@ var file_protobuf_proto_common_proto_rawDesc = []byte{ 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x27, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x6f, 0x67, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6c, - 0x6f, 0x67, 0x22, 0x39, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, - 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1e, 0x0a, - 0x0a, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x64, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xdd, 0x01, - 0x0a, 0x07, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1b, 0x0a, 0x06, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x64, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x65, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, - 0x21, 0x0a, 0x09, 0x73, 0x74, 0x72, 0x69, 0x70, 0x50, 0x61, 0x74, 0x68, 0x18, 0x66, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x02, 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x70, 0x50, 0x61, 0x74, 0x68, 0x88, - 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x18, 0x67, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x6f, 0x72, - 0x74, 0x18, 0x68, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x04, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x88, - 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x42, 0x07, 0x0a, - 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x70, - 0x50, 0x61, 0x74, 0x68, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x71, 0x0a, - 0x0f, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x22, 0xec, 0x01, 0x0a, 0x11, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x64, - 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, - 0x29, 0x0a, 0x0d, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, - 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0d, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, - 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0e, 0x72, 0x65, - 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x18, 0x66, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x02, 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x50, - 0x72, 0x6f, 0x62, 0x65, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x75, 0x70, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, - 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x88, 0x01, 0x01, - 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6c, 0x69, - 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, - 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x42, 0x0f, - 0x0a, 0x0d, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x22, - 0x51, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x15, 0x0a, 0x03, 0x63, - 0x70, 0x75, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x63, 0x70, 0x75, 0x88, - 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x65, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x01, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x88, 0x01, 0x01, 0x42, - 0x06, 0x0a, 0x04, 0x5f, 0x63, 0x70, 0x75, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x22, 0x8a, 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, - 0x64, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x18, 0x65, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x73, 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x73, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, - 0x32, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x22, 0x8d, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, - 0x65, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x61, 0x73, 0x4b, 0x65, 0x79, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x12, - 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, - 0x65, 0x79, 0x73, 0x22, 0x2d, 0x0a, 0x09, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4b, 0x65, 0x79, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x22, 0x41, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, - 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, - 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x8e, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x39, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x64, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x09, - 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1a, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x3c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0xc9, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x48, 0x00, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, - 0x19, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0xca, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x42, 0x08, 0x0a, 0x06, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x2a, 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, - 0x4e, 0x45, 0x52, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, - 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x10, - 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x58, 0x49, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0b, 0x0a, - 0x07, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x8f, 0x01, 0x0a, 0x10, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x21, 0x0a, 0x1d, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, - 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, - 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x46, 0x55, 0x4c, - 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0c, - 0x0a, 0x08, 0x4f, 0x42, 0x53, 0x4f, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, - 0x44, 0x4f, 0x57, 0x4e, 0x47, 0x52, 0x41, 0x44, 0x45, 0x44, 0x10, 0x06, 0x2a, 0x4b, 0x0a, 0x0b, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x4e, - 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x52, 0x49, - 0x44, 0x47, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x02, 0x12, - 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x06, 0x2a, 0x6e, 0x0a, 0x0d, 0x52, 0x65, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x4f, - 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, - 0x01, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x4f, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x4e, 0x5f, - 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4c, 0x57, - 0x41, 0x59, 0x53, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4c, 0x45, 0x53, 0x53, 0x5f, - 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x05, 0x2a, 0x5b, 0x0a, 0x12, 0x44, 0x65, 0x70, - 0x6c, 0x6f, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, - 0x23, 0x0a, 0x1f, 0x44, 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, - 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, - 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x4f, 0x4c, 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x50, - 0x44, 0x41, 0x54, 0x45, 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x06, 0x0a, 0x02, 0x52, 0x4f, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x57, 0x4f, - 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x57, 0x58, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, - 0x45, 0x4d, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4d, 0x50, 0x10, 0x05, 0x2a, 0xdf, 0x01, - 0x0a, 0x0a, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, - 0x44, 0x52, 0x49, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x44, - 0x45, 0x5f, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x44, - 0x52, 0x49, 0x56, 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, - 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x47, 0x43, 0x50, 0x4c, 0x4f, 0x47, 0x53, 0x10, 0x03, 0x12, 0x09, - 0x0a, 0x05, 0x4c, 0x4f, 0x43, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x4f, - 0x4e, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x59, 0x53, 0x4c, - 0x4f, 0x47, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x41, 0x4c, 0x44, - 0x10, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x47, 0x45, 0x4c, 0x46, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, - 0x46, 0x4c, 0x55, 0x45, 0x4e, 0x54, 0x44, 0x10, 0x09, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x57, 0x53, - 0x4c, 0x4f, 0x47, 0x53, 0x10, 0x0a, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x50, 0x4c, 0x55, 0x4e, 0x4b, - 0x10, 0x0b, 0x12, 0x0b, 0x0a, 0x07, 0x45, 0x54, 0x57, 0x4c, 0x4f, 0x47, 0x53, 0x10, 0x0c, 0x12, - 0x0e, 0x0a, 0x0a, 0x4c, 0x4f, 0x47, 0x45, 0x4e, 0x54, 0x52, 0x49, 0x45, 0x53, 0x10, 0x0d, 0x2a, - 0x5f, 0x0a, 0x0e, 0x45, 0x78, 0x70, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, - 0x79, 0x12, 0x1f, 0x0a, 0x1b, 0x45, 0x58, 0x50, 0x4f, 0x53, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x41, - 0x54, 0x45, 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x4e, 0x45, 0x5f, 0x45, 0x53, 0x10, 0x01, 0x12, - 0x0a, 0x0a, 0x06, 0x45, 0x58, 0x50, 0x4f, 0x53, 0x45, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x45, - 0x58, 0x50, 0x4f, 0x53, 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x54, 0x4c, 0x53, 0x10, 0x03, - 0x2a, 0x79, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, - 0x4e, 0x45, 0x52, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, - 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x53, - 0x54, 0x41, 0x52, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x01, - 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, - 0x45, 0x52, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, - 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x03, 0x42, 0x36, 0x5a, 0x34, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x79, 0x72, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x2d, 0x69, 0x6f, 0x2f, 0x64, 0x79, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x6f, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x67, 0x22, 0x65, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x16, 0x0a, + 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x73, + 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, + 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xdd, 0x01, 0x0a, 0x07, 0x52, 0x6f, + 0x75, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x1b, 0x0a, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, + 0x64, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x88, + 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x01, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x21, 0x0a, 0x09, 0x73, + 0x74, 0x72, 0x69, 0x70, 0x50, 0x61, 0x74, 0x68, 0x18, 0x66, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, + 0x52, 0x09, 0x73, 0x74, 0x72, 0x69, 0x70, 0x50, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x25, + 0x0a, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x67, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0b, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x68, 0x20, + 0x01, 0x28, 0x0d, 0x48, 0x04, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x88, 0x01, 0x01, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, + 0x74, 0x68, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x70, 0x50, 0x61, 0x74, 0x68, + 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x75, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x71, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x18, 0x65, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x76, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x1c, + 0x0a, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x67, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x6b, 0x65, 0x65, 0x70, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x22, 0xec, 0x01, 0x0a, + 0x11, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x00, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x88, 0x01, 0x01, 0x12, 0x29, 0x0a, 0x0d, 0x6c, + 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x18, 0x65, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x0d, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, + 0x6f, 0x62, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, + 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, + 0x52, 0x0e, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x72, + 0x6f, 0x62, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x0c, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, + 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6c, 0x69, 0x76, 0x65, 0x6e, 0x65, + 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x72, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x65, 0x73, 0x73, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x22, 0x51, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x15, 0x0a, 0x03, 0x63, 0x70, 0x75, 0x18, 0x64, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x63, 0x70, 0x75, 0x88, 0x01, 0x01, 0x12, 0x1b, + 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, + 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a, 0x04, 0x5f, + 0x63, 0x70, 0x75, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x22, 0x8a, + 0x01, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x2d, 0x0a, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x64, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x48, 0x00, 0x52, 0x06, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x31, 0x0a, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x65, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x48, 0x01, 0x52, 0x08, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x88, 0x01, 0x01, 0x42, 0x09, 0x0a, 0x07, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x42, 0x0b, + 0x0a, 0x09, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x22, 0x32, 0x0a, 0x08, 0x4b, + 0x65, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x64, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x8d, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, + 0x79, 0x12, 0x18, 0x0a, 0x07, 0x68, 0x61, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x68, 0x61, 0x73, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6b, + 0x65, 0x79, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x22, + 0x2d, 0x0a, 0x09, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x0e, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x65, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x41, + 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x8e, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x39, 0x0a, + 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x52, 0x09, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x65, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x7c, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, + 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0xc9, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x48, 0x00, + 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x06, 0x70, + 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0xca, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x06, + 0x70, 0x72, 0x65, 0x66, 0x69, 0x78, 0x42, 0x08, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x2a, 0x64, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x1b, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x49, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x12, 0x0a, 0x0a, + 0x06, 0x45, 0x58, 0x49, 0x54, 0x45, 0x44, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x4d, + 0x4f, 0x56, 0x45, 0x44, 0x10, 0x04, 0x2a, 0x8f, 0x01, 0x0a, 0x10, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x1d, 0x44, + 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x50, 0x52, 0x45, 0x50, 0x41, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0f, 0x0a, + 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x02, 0x12, 0x0e, + 0x0a, 0x0a, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x46, 0x55, 0x4c, 0x10, 0x03, 0x12, 0x0a, + 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x4f, 0x42, + 0x53, 0x4f, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x57, 0x4e, + 0x47, 0x52, 0x41, 0x44, 0x45, 0x44, 0x10, 0x06, 0x2a, 0x4b, 0x0a, 0x0b, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x45, 0x54, 0x57, 0x4f, + 0x52, 0x4b, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x52, 0x49, 0x44, 0x47, 0x45, 0x10, + 0x01, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x4f, 0x53, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x4e, + 0x4f, 0x4e, 0x45, 0x10, 0x06, 0x2a, 0x6e, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x16, 0x0a, 0x12, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x55, 0x4e, 0x44, 0x45, 0x46, 0x49, 0x4e, 0x45, 0x44, 0x10, 0x01, 0x12, 0x06, 0x0a, + 0x02, 0x4e, 0x4f, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, + 0x55, 0x52, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, + 0x04, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4c, 0x45, 0x53, 0x53, 0x5f, 0x53, 0x54, 0x4f, 0x50, + 0x50, 0x45, 0x44, 0x10, 0x05, 0x2a, 0x5b, 0x0a, 0x12, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x23, 0x0a, 0x1f, 0x44, + 0x45, 0x50, 0x4c, 0x4f, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, + 0x47, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x45, 0x43, 0x52, 0x45, 0x41, 0x54, 0x45, 0x10, 0x01, 0x12, 0x12, + 0x0a, 0x0e, 0x52, 0x4f, 0x4c, 0x4c, 0x49, 0x4e, 0x47, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, + 0x10, 0x02, 0x2a, 0x55, 0x0a, 0x0a, 0x56, 0x6f, 0x6c, 0x75, 0x6d, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x1b, 0x0a, 0x17, 0x56, 0x4f, 0x4c, 0x55, 0x4d, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x06, 0x0a, + 0x02, 0x52, 0x4f, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x52, 0x57, 0x4f, 0x10, 0x02, 0x12, 0x07, + 0x0a, 0x03, 0x52, 0x57, 0x58, 0x10, 0x03, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x45, 0x4d, 0x10, 0x04, + 0x12, 0x07, 0x0a, 0x03, 0x54, 0x4d, 0x50, 0x10, 0x05, 0x2a, 0xdf, 0x01, 0x0a, 0x0a, 0x44, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x44, 0x52, 0x49, 0x56, + 0x45, 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x44, 0x45, 0x5f, 0x44, 0x45, + 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x44, 0x52, 0x49, 0x56, 0x45, + 0x52, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, + 0x07, 0x47, 0x43, 0x50, 0x4c, 0x4f, 0x47, 0x53, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x4f, + 0x43, 0x41, 0x4c, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x4a, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x49, + 0x4c, 0x45, 0x10, 0x05, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x59, 0x53, 0x4c, 0x4f, 0x47, 0x10, 0x06, + 0x12, 0x0c, 0x0a, 0x08, 0x4a, 0x4f, 0x55, 0x52, 0x4e, 0x41, 0x4c, 0x44, 0x10, 0x07, 0x12, 0x08, + 0x0a, 0x04, 0x47, 0x45, 0x4c, 0x46, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x4c, 0x55, 0x45, + 0x4e, 0x54, 0x44, 0x10, 0x09, 0x12, 0x0b, 0x0a, 0x07, 0x41, 0x57, 0x53, 0x4c, 0x4f, 0x47, 0x53, + 0x10, 0x0a, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x50, 0x4c, 0x55, 0x4e, 0x4b, 0x10, 0x0b, 0x12, 0x0b, + 0x0a, 0x07, 0x45, 0x54, 0x57, 0x4c, 0x4f, 0x47, 0x53, 0x10, 0x0c, 0x12, 0x0e, 0x0a, 0x0a, 0x4c, + 0x4f, 0x47, 0x45, 0x4e, 0x54, 0x52, 0x49, 0x45, 0x53, 0x10, 0x0d, 0x2a, 0x5f, 0x0a, 0x0e, 0x45, + 0x78, 0x70, 0x6f, 0x73, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x1f, 0x0a, + 0x1b, 0x45, 0x58, 0x50, 0x4f, 0x53, 0x45, 0x5f, 0x53, 0x54, 0x52, 0x41, 0x54, 0x45, 0x47, 0x59, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, + 0x0a, 0x07, 0x4e, 0x4f, 0x4e, 0x45, 0x5f, 0x45, 0x53, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x45, + 0x58, 0x50, 0x4f, 0x53, 0x45, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x45, 0x58, 0x50, 0x4f, 0x53, + 0x45, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x5f, 0x54, 0x4c, 0x53, 0x10, 0x03, 0x2a, 0x79, 0x0a, 0x12, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x1f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x5f, + 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, + 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x54, 0x41, 0x52, 0x54, + 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, + 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x43, 0x4f, 0x4e, 0x54, 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x02, + 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x43, 0x4f, 0x4e, 0x54, + 0x41, 0x49, 0x4e, 0x45, 0x52, 0x10, 0x03, 0x42, 0x36, 0x5a, 0x34, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x79, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2d, 0x69, + 0x6f, 0x2f, 0x64, 0x79, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x69, 0x6f, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protobuf/proto/common.proto b/protobuf/proto/common.proto index 8713a9d53..9fc5b1e2b 100644 --- a/protobuf/proto/common.proto +++ b/protobuf/proto/common.proto @@ -78,7 +78,9 @@ message ContainerLogMessage { } message ContainerInspectMessage { - string inspection = 100; + string prefix = 1; + string name = 2; + string inspection = 3; } enum NetworkMode { diff --git a/web/crux/proto/agent.proto b/web/crux/proto/agent.proto index df9d9aae4..2e4c16c98 100644 --- a/web/crux/proto/agent.proto +++ b/web/crux/proto/agent.proto @@ -57,8 +57,8 @@ message AgentCommand { common.ContainerCommandRequest containerCommand = 8; common.DeleteContainersRequest deleteContainers = 9; ContainerLogRequest containerLog = 10; - ContainerInspectRequest containerInspect = 11; - ReplaceTokenRequest replaceToken = 12; + ReplaceTokenRequest replaceToken = 11; + ContainerInspectRequest containerInspect = 12; } } diff --git a/web/crux/proto/common.proto b/web/crux/proto/common.proto index 8713a9d53..9fc5b1e2b 100644 --- a/web/crux/proto/common.proto +++ b/web/crux/proto/common.proto @@ -78,7 +78,9 @@ message ContainerLogMessage { } message ContainerInspectMessage { - string inspection = 100; + string prefix = 1; + string name = 2; + string inspection = 3; } enum NetworkMode { diff --git a/web/crux/src/grpc/protobuf/proto/agent.ts b/web/crux/src/grpc/protobuf/proto/agent.ts index bb71981ee..05f0c2885 100644 --- a/web/crux/src/grpc/protobuf/proto/agent.ts +++ b/web/crux/src/grpc/protobuf/proto/agent.ts @@ -114,8 +114,8 @@ export interface AgentCommand { containerCommand?: ContainerCommandRequest | undefined deleteContainers?: DeleteContainersRequest | undefined containerLog?: ContainerLogRequest | undefined - containerInspect?: ContainerInspectRequest | undefined replaceToken?: ReplaceTokenRequest | undefined + containerInspect?: ContainerInspectRequest | undefined } /** @@ -428,10 +428,10 @@ export const AgentCommand = { ? DeleteContainersRequest.fromJSON(object.deleteContainers) : undefined, containerLog: isSet(object.containerLog) ? ContainerLogRequest.fromJSON(object.containerLog) : undefined, + replaceToken: isSet(object.replaceToken) ? ReplaceTokenRequest.fromJSON(object.replaceToken) : undefined, containerInspect: isSet(object.containerInspect) ? ContainerInspectRequest.fromJSON(object.containerInspect) : undefined, - replaceToken: isSet(object.replaceToken) ? ReplaceTokenRequest.fromJSON(object.replaceToken) : undefined, } }, @@ -463,12 +463,12 @@ export const AgentCommand = { : undefined) message.containerLog !== undefined && (obj.containerLog = message.containerLog ? ContainerLogRequest.toJSON(message.containerLog) : undefined) + message.replaceToken !== undefined && + (obj.replaceToken = message.replaceToken ? ReplaceTokenRequest.toJSON(message.replaceToken) : undefined) message.containerInspect !== undefined && (obj.containerInspect = message.containerInspect ? ContainerInspectRequest.toJSON(message.containerInspect) : undefined) - message.replaceToken !== undefined && - (obj.replaceToken = message.replaceToken ? ReplaceTokenRequest.toJSON(message.replaceToken) : undefined) return obj }, } diff --git a/web/crux/src/grpc/protobuf/proto/common.ts b/web/crux/src/grpc/protobuf/proto/common.ts index 05e5dd3fc..7bf7f2efc 100644 --- a/web/crux/src/grpc/protobuf/proto/common.ts +++ b/web/crux/src/grpc/protobuf/proto/common.ts @@ -565,6 +565,8 @@ export interface ContainerLogMessage { } export interface ContainerInspectMessage { + prefix: string + name: string inspection: string } @@ -840,16 +842,22 @@ export const ContainerLogMessage = { } function createBaseContainerInspectMessage(): ContainerInspectMessage { - return { inspection: '' } + return { prefix: '', name: '', inspection: '' } } export const ContainerInspectMessage = { fromJSON(object: any): ContainerInspectMessage { - return { inspection: isSet(object.inspection) ? String(object.inspection) : '' } + return { + prefix: isSet(object.prefix) ? String(object.prefix) : '', + name: isSet(object.name) ? String(object.name) : '', + inspection: isSet(object.inspection) ? String(object.inspection) : '', + } }, toJSON(message: ContainerInspectMessage): unknown { const obj: any = {} + message.prefix !== undefined && (obj.prefix = message.prefix) + message.name !== undefined && (obj.name = message.name) message.inspection !== undefined && (obj.inspection = message.inspection) return obj }, From 642fa163301b817792fce2a37c6374cee19a90be Mon Sep 17 00:00:00 2001 From: amorfevo Date: Thu, 5 Oct 2023 19:59:54 +0200 Subject: [PATCH 03/19] feat: agent and api call (wip) --- .../src/app/agent/agent.grpc.controller.ts | 1 - web/crux/src/app/agent/agent.service.ts | 16 +---- web/crux/src/app/node/node.dto.ts | 13 ++++ .../node.prefix-container.http.controller.ts | 14 +++-- web/crux/src/domain/agent.ts | 61 +++++++++++++++++++ 5 files changed, 85 insertions(+), 20 deletions(-) mode change 100644 => 100755 web/crux/src/app/agent/agent.grpc.controller.ts mode change 100644 => 100755 web/crux/src/app/agent/agent.service.ts mode change 100644 => 100755 web/crux/src/app/node/node.dto.ts mode change 100644 => 100755 web/crux/src/app/node/node.prefix-container.http.controller.ts mode change 100644 => 100755 web/crux/src/domain/agent.ts diff --git a/web/crux/src/app/agent/agent.grpc.controller.ts b/web/crux/src/app/agent/agent.grpc.controller.ts old mode 100644 new mode 100755 index c7ecd2ffb..51b94ea41 --- a/web/crux/src/app/agent/agent.grpc.controller.ts +++ b/web/crux/src/app/agent/agent.grpc.controller.ts @@ -59,7 +59,6 @@ export default class AgentController implements GrpcAgentController { return this.service.handleContainerLog(call.connection, request) } - // TODO(@amorfevo): Empty or Promise or Observable containerInspect(request: ContainerInspectMessage, _: Metadata, call: NodeGrpcCall): Observable { return this.service.handleContainerInspect(call.connection, request) } diff --git a/web/crux/src/app/agent/agent.service.ts b/web/crux/src/app/agent/agent.service.ts old mode 100644 new mode 100755 index 45912f4be..b56198189 --- a/web/crux/src/app/agent/agent.service.ts +++ b/web/crux/src/app/agent/agent.service.ts @@ -354,22 +354,12 @@ export default class AgentService { ) } - // handleSecretList(connection: GrpcNodeConnection, request: ListSecretsResponse): Observable { - // const agent = this.getByIdOrThrow(connection.nodeId) - - // agent.onContainerSecrets(request) - - // return of(Empty) - // } - handleContainerInspect(connection: GrpcNodeConnection, request: ContainerInspectMessage): Observable { const agent = this.getByIdOrThrow(connection.nodeId) + + agent.onContainerInspect(request) - // const inspection = await this.agentService.inspectContainer(container) - const inspection = agent.inspectContainer(container) - agent.onContainerSecrets(request) - - return Empty + return of(Empty) } async tokenReplaced(connection: GrpcNodeConnection): Promise { diff --git a/web/crux/src/app/node/node.dto.ts b/web/crux/src/app/node/node.dto.ts old mode 100644 new mode 100755 index 9b0ccfd85..649c65707 --- a/web/crux/src/app/node/node.dto.ts +++ b/web/crux/src/app/node/node.dto.ts @@ -238,3 +238,16 @@ export class NodeAuditLogListDto extends PaginatedList { total: number } + +// TODO(@amorfevo): implement it +export class ContainerInspectionDto { + // @ValidateNested() + // container: ContainerIdentifierDto + + // @IsString() + // publicKey: string + + // @IsOptional() + // @IsString({ each: true }) + // keys?: string[] | null +} diff --git a/web/crux/src/app/node/node.prefix-container.http.controller.ts b/web/crux/src/app/node/node.prefix-container.http.controller.ts old mode 100644 new mode 100755 index 7d326c93a..81795fc03 --- a/web/crux/src/app/node/node.prefix-container.http.controller.ts +++ b/web/crux/src/app/node/node.prefix-container.http.controller.ts @@ -4,6 +4,7 @@ ApiBadRequestResponse, ApiForbiddenResponse, ApiNoContentResponse, ApiNotFoundResponse, +ApiOkResponse, ApiOperation, ApiTags, } from '@nestjs/swagger' @@ -23,6 +24,7 @@ ROUTE_PREFIX, ROUTE_TEAM_SLUG, } from './node.const' import NodeService from './node.service' +import { ContainerInspectionDto } from './node.dto' @Controller(`${ROUTE_TEAM_SLUG}/${ROUTE_NODES}/${ROUTE_NODE_ID}/${ROUTE_PREFIX}/${ROUTE_CONTAINERS}`) @ApiTags(ROUTE_NODES) @@ -101,16 +103,16 @@ export default class NodePrefixContainerHttpController { } @Get(`${ROUTE_NAME}/inspect`) - @HttpCode(HttpStatus.NO_CONTENT) + @HttpCode(HttpStatus.OK) @ApiOperation({ description: 'Request must include `nodeId`, `prefix`, and `name`.', - summary: 'Inspect a container deployed with dyrector.io on a node.', + summary: 'Inspect a container.', }) - @ApiNoContentResponse({ description: 'Container started.' }) - @ApiBadRequestResponse({ description: 'Bad request for container starting.' }) - @ApiForbiddenResponse({ description: 'Unauthorized request for container starting.' }) + @ApiOkResponse({ type: ContainerInspectionDto, description: 'Container inspection.' }) + @ApiBadRequestResponse({ description: 'Bad request for container inspection.' }) + @ApiForbiddenResponse({ description: 'Unauthorized request for container inspection.' }) @UuidParams(PARAM_NODE_ID) - async inspectContainer(@NodeId() nodeId: string, @Prefix() prefix: string, @Name() name: string): Promise { + async inspectContainer(@NodeId() nodeId: string, @Prefix() prefix: string, @Name() name: string): Promise { await this.service.inspectContainer(nodeId, prefix, name) } } diff --git a/web/crux/src/domain/agent.ts b/web/crux/src/domain/agent.ts old mode 100644 new mode 100755 index a911d57bd..a56623353 --- a/web/crux/src/domain/agent.ts +++ b/web/crux/src/domain/agent.ts @@ -11,6 +11,7 @@ import { AgentCommand, AgentInfo, CloseReason } from 'src/grpc/protobuf/proto/ag import { ContainerCommandRequest, ContainerIdentifier, + ContainerInspectMessage, DeleteContainersRequest, DeploymentStatusMessage, Empty, @@ -49,6 +50,8 @@ export class Agent { private secretsWatchers: Map> = new Map() + private inspectionWatchers: Map> = new Map() + private deleteContainersRequests: Map> = new Map() private logStreams: Map = new Map() @@ -253,6 +256,7 @@ export class Agent { this.deployments.forEach(it => it.onDisconnected()) this.statusWatchers.forEach(it => it.stop()) this.secretsWatchers.forEach(it => it.complete()) + this.inspectionWatchers.forEach(it => it.complete()) this.logStreams.forEach(it => it.stop()) this.commandChannel.complete() @@ -366,6 +370,63 @@ export class Agent { this.secretsWatchers.delete(key) } + getContainerInspection(prefix: string, name: string): Observable { + this.throwIfCommandsAreDisabled() + + const key = Agent.containerPrefixNameOf({ + prefix, + name, + }) + + let watcher = this.inspectionWatchers.get(key) + if (!watcher) { + watcher = new Subject() + this.inspectionWatchers.set(key, watcher) + + this.commandChannel.next({ + containerInspect: { + container: { + prefix, + name + } + }, + } as AgentCommand) + } + + return watcher.pipe( + finalize(() => { + this.inspectionWatchers.delete(key) + }), + timeout({ + each: Agent.SECRET_TIMEOUT, + with: () => { + this.inspectionWatchers.delete(key) + + return throwError( + () => + new CruxInternalServerErrorException({ + message: 'Agent container inspection timed out.', + }), + ) + }, + }), + ) + } + + onContainerInspect(res: ContainerInspectMessage) { + const key = Agent.containerPrefixNameOf(res) + + const watcher = this.inspectionWatchers.get(key) + if (!watcher) { + return + } + + watcher.next(res) + watcher.complete() + + this.inspectionWatchers.delete(key) + } + startUpdate(tag: string, options: AgentUpdateOptions) { if (this.deployments.size > 0) { throw new CruxPreconditionFailedException({ From 07398133d193033a7fe3bbbef512630147a34520 Mon Sep 17 00:00:00 2001 From: amorfevo Date: Fri, 6 Oct 2023 01:17:20 +0200 Subject: [PATCH 04/19] feat: agent and api call --- web/crux/src/app/node/node.dto.ts | 13 +-- web/crux/src/app/node/node.mapper.ts | 12 +++ .../node.prefix-container.http.controller.ts | 2 +- web/crux/src/app/node/node.service.ts | 79 +++++++++---------- 4 files changed, 56 insertions(+), 50 deletions(-) diff --git a/web/crux/src/app/node/node.dto.ts b/web/crux/src/app/node/node.dto.ts index 649c65707..1ed96a44a 100755 --- a/web/crux/src/app/node/node.dto.ts +++ b/web/crux/src/app/node/node.dto.ts @@ -239,15 +239,10 @@ export class NodeAuditLogListDto extends PaginatedList { total: number } -// TODO(@amorfevo): implement it export class ContainerInspectionDto { - // @ValidateNested() - // container: ContainerIdentifierDto - - // @IsString() - // publicKey: string + @ValidateNested() + container: ContainerIdentifierDto - // @IsOptional() - // @IsString({ each: true }) - // keys?: string[] | null + @IsString() + inspection: string } diff --git a/web/crux/src/app/node/node.mapper.ts b/web/crux/src/app/node/node.mapper.ts index cddd14ba7..15c8c2153 100644 --- a/web/crux/src/app/node/node.mapper.ts +++ b/web/crux/src/app/node/node.mapper.ts @@ -6,6 +6,7 @@ import { ContainerState } from 'src/domain/container' import { NodeWithToken } from 'src/domain/node' import { fromTimestamp } from 'src/domain/utils' import { + ContainerInspectMessage, ContainerOperation, ContainerStateItem, ContainerStateListMessage, @@ -18,6 +19,7 @@ import { BasicNodeDto, BasicNodeWithStatus, ContainerDto, + ContainerInspectionDto, ContainerOperationDto, NodeConnectionStatus, NodeDetailsDto, @@ -138,6 +140,16 @@ export default class NodeMapper { return ContainerOperation.UNRECOGNIZED } } + + containerInspectionMessageToDto(it: ContainerInspectMessage): ContainerInspectionDto { + return { + container: { + prefix: it.prefix, + name: it.name, + }, + inspection: it.inspection, + } + } } type NodeDetails = NodeWithToken & { diff --git a/web/crux/src/app/node/node.prefix-container.http.controller.ts b/web/crux/src/app/node/node.prefix-container.http.controller.ts index 81795fc03..25c7ce24c 100755 --- a/web/crux/src/app/node/node.prefix-container.http.controller.ts +++ b/web/crux/src/app/node/node.prefix-container.http.controller.ts @@ -113,6 +113,6 @@ export default class NodePrefixContainerHttpController { @ApiForbiddenResponse({ description: 'Unauthorized request for container inspection.' }) @UuidParams(PARAM_NODE_ID) async inspectContainer(@NodeId() nodeId: string, @Prefix() prefix: string, @Name() name: string): Promise { - await this.service.inspectContainer(nodeId, prefix, name) + return await this.service.inspectContainer(nodeId, prefix, name) } } diff --git a/web/crux/src/app/node/node.service.ts b/web/crux/src/app/node/node.service.ts index 28de0e0e3..ffb772bb7 100644 --- a/web/crux/src/app/node/node.service.ts +++ b/web/crux/src/app/node/node.service.ts @@ -1,38 +1,50 @@ -import { Injectable,Logger } from '@nestjs/common' +import { Injectable, Logger } from '@nestjs/common' import { Identity } from '@ory/kratos-client' import { Prisma } from '@prisma/client' -import { EmptyError,Observable,filter,firstValueFrom,map,mergeAll,mergeWith,of,timeout } from 'rxjs' -import { Agent,AgentConnectionMessage } from 'src/domain/agent' +import { + EmptyError, + Observable, + filter, + firstValueFrom, + lastValueFrom, + map, + mergeAll, + mergeWith, + of, + timeout, +} from 'rxjs' +import { Agent, AgentConnectionMessage } from 'src/domain/agent' import { BaseMessage } from 'src/domain/notification-templates' import { -ContainerCommandRequest, -ContainerIdentifier, -ContainerOperation, -ContainerStateListMessage, -DeleteContainersRequest, -containerOperationToJSON, + ContainerCommandRequest, + ContainerIdentifier, + ContainerOperation, + ContainerStateListMessage, + DeleteContainersRequest, + containerOperationToJSON, } from 'src/grpc/protobuf/proto/common' import DomainNotificationService from 'src/services/domain.notification.service' import PrismaService from 'src/services/prisma.service' import AgentService from '../agent/agent.service' import TeamRepository from '../team/team.repository' import { -ContainerDto, -CreateNodeDto, -NodeAuditLogListDto, -NodeAuditLogQueryDto, -NodeDetailsDto, -NodeDto, -NodeGenerateScriptDto, -NodeInstallDto, -UpdateNodeDto, + ContainerDto, + ContainerInspectionDto, + CreateNodeDto, + NodeAuditLogListDto, + NodeAuditLogQueryDto, + NodeDetailsDto, + NodeDto, + NodeGenerateScriptDto, + NodeInstallDto, + UpdateNodeDto, } from './node.dto' import NodeMapper from './node.mapper' import { -ContainerLogMessage, -ContainersStateListMessage, -WatchContainerLogMessage, -WatchContainersStateMessage, + ContainerLogMessage, + ContainersStateListMessage, + WatchContainerLogMessage, + WatchContainersStateMessage, } from './node.message' @Injectable() @@ -408,25 +420,12 @@ export default class NodeService { } } - // watchContainerLog(nodeId: string, message: WatchContainerLogMessage): Observable { - // const { container } = message - - // this.logger.debug( - // `Opening container log stream for container: ${nodeId} - ${Agent.containerPrefixNameOf(container)}}`, - // ) - - // const agent = this.agentService.getByIdOrThrow(nodeId) - - // const stream = agent.upsertContainerLogStream(container) - - // return stream.watch() - // } + async inspectContainer(nodeId: string, prefix: string, name: string): Promise { + const agent = this.agentService.getByIdOrThrow(nodeId) + const watcher = agent.getContainerInspection(prefix, name) + const inspectionMessage = await lastValueFrom(watcher) - // async updateAgent(id: string, identity: Identity): Promise { - // await this.agentService.updateAgent(id, identity) - // } - async inspectContainer(container: ContainerIdentifier): Promise { - return await this.agentService.inspectContainer(container) + return this.mapper.containerInspectionMessageToDto(inspectionMessage) } private static snakeCaseToCamelCase(snake: string): string { From 07560fa8e11f1bdc3944ff6b43afa88ef26c6164 Mon Sep 17 00:00:00 2001 From: amorfevo Date: Fri, 6 Oct 2023 01:53:10 +0200 Subject: [PATCH 05/19] chore: linting --- golang/pkg/dagent/utils/docker.go | 4 +- web/crux/src/app/agent/agent.service.ts | 2 +- .../node.prefix-container.http.controller.ts | 46 ++++++++++--------- web/crux/src/domain/agent.ts | 4 +- 4 files changed, 30 insertions(+), 26 deletions(-) diff --git a/golang/pkg/dagent/utils/docker.go b/golang/pkg/dagent/utils/docker.go index bd1e5893a..8ed4de928 100644 --- a/golang/pkg/dagent/utils/docker.go +++ b/golang/pkg/dagent/utils/docker.go @@ -796,12 +796,12 @@ func ContainerInspect(ctx context.Context, request *agent.ContainerInspectReques prefix := request.Container.Prefix name := request.Container.Name - container, err := GetContainerByPrefixAndName(ctx, cli, prefix, name) + cont, err := GetContainerByPrefixAndName(ctx, cli, prefix, name) if err != nil { return "", err } - containerInfo, err := cli.ContainerInspect(ctx, container.ID) + containerInfo, err := cli.ContainerInspect(ctx, cont.ID) if err != nil { return "", err } diff --git a/web/crux/src/app/agent/agent.service.ts b/web/crux/src/app/agent/agent.service.ts index b56198189..2a5c5de19 100755 --- a/web/crux/src/app/agent/agent.service.ts +++ b/web/crux/src/app/agent/agent.service.ts @@ -356,7 +356,7 @@ export default class AgentService { handleContainerInspect(connection: GrpcNodeConnection, request: ContainerInspectMessage): Observable { const agent = this.getByIdOrThrow(connection.nodeId) - + agent.onContainerInspect(request) return of(Empty) diff --git a/web/crux/src/app/node/node.prefix-container.http.controller.ts b/web/crux/src/app/node/node.prefix-container.http.controller.ts index 25c7ce24c..052df70b1 100755 --- a/web/crux/src/app/node/node.prefix-container.http.controller.ts +++ b/web/crux/src/app/node/node.prefix-container.http.controller.ts @@ -1,30 +1,30 @@ -import { Controller,Delete,Get,HttpCode,HttpStatus,Post,UseGuards } from '@nestjs/common' +import { Controller, Delete, Get, HttpCode, HttpStatus, Post, UseGuards } from '@nestjs/common' import { -ApiBadRequestResponse, -ApiForbiddenResponse, -ApiNoContentResponse, -ApiNotFoundResponse, -ApiOkResponse, -ApiOperation, -ApiTags, + ApiBadRequestResponse, + ApiForbiddenResponse, + ApiNoContentResponse, + ApiNotFoundResponse, + ApiOkResponse, + ApiOperation, + ApiTags, } from '@nestjs/swagger' -import { Observable,from,mergeAll } from 'rxjs' +import { Observable, from, mergeAll } from 'rxjs' import UuidParams from 'src/decorators/api-params.decorator' import NodeTeamAccessGuard from './guards/node.team-access.http.guard' import { -Name, -NodeId, -PARAM_NODE_ID, -Prefix, -ROUTE_CONTAINERS, -ROUTE_NAME, -ROUTE_NODES, -ROUTE_NODE_ID, -ROUTE_PREFIX, -ROUTE_TEAM_SLUG, + Name, + NodeId, + PARAM_NODE_ID, + Prefix, + ROUTE_CONTAINERS, + ROUTE_NAME, + ROUTE_NODES, + ROUTE_NODE_ID, + ROUTE_PREFIX, + ROUTE_TEAM_SLUG, } from './node.const' -import NodeService from './node.service' import { ContainerInspectionDto } from './node.dto' +import NodeService from './node.service' @Controller(`${ROUTE_TEAM_SLUG}/${ROUTE_NODES}/${ROUTE_NODE_ID}/${ROUTE_PREFIX}/${ROUTE_CONTAINERS}`) @ApiTags(ROUTE_NODES) @@ -112,7 +112,11 @@ export default class NodePrefixContainerHttpController { @ApiBadRequestResponse({ description: 'Bad request for container inspection.' }) @ApiForbiddenResponse({ description: 'Unauthorized request for container inspection.' }) @UuidParams(PARAM_NODE_ID) - async inspectContainer(@NodeId() nodeId: string, @Prefix() prefix: string, @Name() name: string): Promise { + async inspectContainer( + @NodeId() nodeId: string, + @Prefix() prefix: string, + @Name() name: string, + ): Promise { return await this.service.inspectContainer(nodeId, prefix, name) } } diff --git a/web/crux/src/domain/agent.ts b/web/crux/src/domain/agent.ts index a56623353..fce10222c 100755 --- a/web/crux/src/domain/agent.ts +++ b/web/crux/src/domain/agent.ts @@ -387,8 +387,8 @@ export class Agent { containerInspect: { container: { prefix, - name - } + name, + }, }, } as AgentCommand) } From a5edcc20f0d5b1d25f366f2b41c14db8c2bbf97e Mon Sep 17 00:00:00 2001 From: amorfevo Date: Fri, 6 Oct 2023 03:15:04 +0200 Subject: [PATCH 06/19] feat: container inspection ui (wip) --- .../[teamSlug]/nodes/[nodeId]/inspect.tsx | 52 +++++++++---------- 1 file changed, 24 insertions(+), 28 deletions(-) diff --git a/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx b/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx index 0825d30d5..f9f984620 100644 --- a/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx +++ b/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx @@ -19,43 +19,39 @@ interface ContainerInspectPageProps { name: string } -// TODO(@amorfevo): move -type ContainerInspection = { - inspectionData: string -} - -// async function fetchContainerInspection(nodeId: string, prefix: string, name: string): Promise { -// // TODO(@amorfevo): path to api -// const response = await fetch(`/path-to-api/${nodeId}/${prefix}/${name}/inspect`) -// if (!response.ok) { -// throw new Error('Failed to fetch container inspection') -// } -// return await response.text() -// } - const NodeContainerInspectPage = (props: ContainerInspectPageProps) => { const { node, prefix, name } = props const { t } = useTranslation('common') const routes = useTeamRoutes() - const [inspection, setInspection] = useState([]) - // const [inspection, setInspection] = useState(null) + async function fetchContainerInspection(nodeId: string, prefix: string, name: string): Promise { + const teamSlug = routes?.teamSlug + const apiUrl = prefix + ? `/${teamSlug}/nodes/${nodeId}/${prefix}/containers/${name}/inspect` + : `/${teamSlug}/nodes/${nodeId}/containers/${name}/inspect` - // TODO(@amorfevo): use real data instead of dummy - const fetchInspection = async () => { - const dummyInspection: ContainerInspection = { - inspectionData: 'Container ID: 12 Image: my-container-image:latest Status: Running // ... other details ...', + const response = await fetch(apiUrl) + if (!response.ok) { + throw new Error('Failed to fetch container inspection') } + + const data = await response.json() + return data.inspection + } - setInspection([dummyInspection]) + const [inspection, setInspection] = useState([]) + // const [inspection, setInspection] = useState(null) - // try { - // const inspectionData = await fetchContainerInspection(node.id, prefix, name) - // setInspection([{ inspectionData }]) - // } catch (error) { - // console.error('Failed to fetch inspection data:', error) - // } + const fetchInspection = async () => { + try { + // TODO(@amorfevo): remove dummy inspectionData + // const inspectionData = 'Container ID: 12 Image: my-container-image:latest Status: Running // ... other details ...' + const inspectionData = await fetchContainerInspection(node.id, prefix, name) + setInspection([ inspectionData]) + } catch (error) { + console.error('Failed to fetch inspection data:', error) + } } useEffect(() => { @@ -90,7 +86,7 @@ const NodeContainerInspectPage = (props: ContainerInspectPageProps) => {
{/* TODO(@amorfevo): DyoCards or json-editor component or own inspection component */} - [it.inspectionData]} /> + [it]} /> ) From 76f840969c2bae4e41d0333e60be3b794803081a Mon Sep 17 00:00:00 2001 From: amorfevo Date: Fri, 6 Oct 2023 03:29:06 +0200 Subject: [PATCH 07/19] feat: container inspection ui (wip) --- .../[teamSlug]/nodes/[nodeId]/inspect.tsx | 39 +++++++++++-------- 1 file changed, 22 insertions(+), 17 deletions(-) diff --git a/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx b/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx index f9f984620..1062cbbdc 100644 --- a/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx +++ b/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx @@ -19,27 +19,31 @@ interface ContainerInspectPageProps { name: string } +async function fetchContainerInspection( + teamSlug: string, + nodeId: string, + prefix: string, + name: string, +): Promise { + const apiUrl = prefix + ? `/${teamSlug}/nodes/${nodeId}/${prefix}/containers/${name}/inspect` + : `/${teamSlug}/nodes/${nodeId}/containers/${name}/inspect` + + const response = await fetch(apiUrl) + if (!response.ok) { + throw new Error('Failed to fetch container inspection') + } + + const data = await response.json() + return data.inspection +} + const NodeContainerInspectPage = (props: ContainerInspectPageProps) => { const { node, prefix, name } = props const { t } = useTranslation('common') const routes = useTeamRoutes() - async function fetchContainerInspection(nodeId: string, prefix: string, name: string): Promise { - const teamSlug = routes?.teamSlug - const apiUrl = prefix - ? `/${teamSlug}/nodes/${nodeId}/${prefix}/containers/${name}/inspect` - : `/${teamSlug}/nodes/${nodeId}/containers/${name}/inspect` - - const response = await fetch(apiUrl) - if (!response.ok) { - throw new Error('Failed to fetch container inspection') - } - - const data = await response.json() - return data.inspection - } - const [inspection, setInspection] = useState([]) // const [inspection, setInspection] = useState(null) @@ -47,8 +51,9 @@ const NodeContainerInspectPage = (props: ContainerInspectPageProps) => { try { // TODO(@amorfevo): remove dummy inspectionData // const inspectionData = 'Container ID: 12 Image: my-container-image:latest Status: Running // ... other details ...' - const inspectionData = await fetchContainerInspection(node.id, prefix, name) - setInspection([ inspectionData]) + const teamSlug = routes?.teamSlug + const inspectionData = await fetchContainerInspection(teamSlug, node.id, prefix, name) + setInspection([inspectionData]) } catch (error) { console.error('Failed to fetch inspection data:', error) } From 147b0dd35282ed5e39f667af411bc717e91993f7 Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Mon, 9 Oct 2023 12:46:52 +0200 Subject: [PATCH 08/19] chore: remove unused container identifier from container inspection dto --- web/crux/src/app/node/node.dto.ts | 3 --- web/crux/src/app/node/node.mapper.ts | 4 ---- 2 files changed, 7 deletions(-) diff --git a/web/crux/src/app/node/node.dto.ts b/web/crux/src/app/node/node.dto.ts index 1ed96a44a..fac1eab7a 100755 --- a/web/crux/src/app/node/node.dto.ts +++ b/web/crux/src/app/node/node.dto.ts @@ -240,9 +240,6 @@ export class NodeAuditLogListDto extends PaginatedList { } export class ContainerInspectionDto { - @ValidateNested() - container: ContainerIdentifierDto - @IsString() inspection: string } diff --git a/web/crux/src/app/node/node.mapper.ts b/web/crux/src/app/node/node.mapper.ts index 15c8c2153..1bb9f7da0 100644 --- a/web/crux/src/app/node/node.mapper.ts +++ b/web/crux/src/app/node/node.mapper.ts @@ -143,10 +143,6 @@ export default class NodeMapper { containerInspectionMessageToDto(it: ContainerInspectMessage): ContainerInspectionDto { return { - container: { - prefix: it.prefix, - name: it.name, - }, inspection: it.inspection, } } From 606d839787ae50b56cefeb8f91d49e7f76842ae3 Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Mon, 9 Oct 2023 13:06:22 +0200 Subject: [PATCH 09/19] feat: add inspect container endpoint to node global container controller with global prefix --- .../node.global-container.http.controller.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/web/crux/src/app/node/node.global-container.http.controller.ts b/web/crux/src/app/node/node.global-container.http.controller.ts index c3f3f6994..e7502d1fc 100644 --- a/web/crux/src/app/node/node.global-container.http.controller.ts +++ b/web/crux/src/app/node/node.global-container.http.controller.ts @@ -22,7 +22,7 @@ import { ROUTE_NODE_ID, ROUTE_TEAM_SLUG, } from './node.const' -import { ContainerDto } from './node.dto' +import { ContainerDto, ContainerInspectionDto } from './node.dto' import NodeService from './node.service' @Controller(`${ROUTE_TEAM_SLUG}/${ROUTE_NODES}/${ROUTE_NODE_ID}/${ROUTE_CONTAINERS}`) @@ -99,4 +99,21 @@ export default class NodeGlobalContainerHttpController { deleteContainer(@NodeId() nodeId: string, @Name() name: string): Observable { return from(this.service.deleteContainer(nodeId, GLOBAL_PREFIX, name)).pipe(mergeAll()) } + + @Get(`${ROUTE_NAME}/inspect`) + @HttpCode(HttpStatus.OK) + @ApiOperation({ + description: 'Request must include `nodeId`, and the `name` of the container.', + summary: 'Inspect a specific container on a node.', + }) + @ApiOkResponse({ type: ContainerInspectionDto, description: 'Container inspection.' }) + @ApiBadRequestResponse({ description: 'Bad request for container inspection.' }) + @ApiForbiddenResponse({ description: 'Unauthorized request for container inspection.' }) + @UuidParams(PARAM_NODE_ID) + async inspectContainer( + @NodeId() nodeId: string, + @Name() name: string, + ): Promise { + return await this.service.inspectContainer(nodeId, GLOBAL_PREFIX, name) + } } From 55c030eb95a26360d8344e77eb2a64dc396c16bd Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Mon, 9 Oct 2023 13:18:15 +0200 Subject: [PATCH 10/19] doc: better descriptions and summaries on node prefix container controller endpoints --- .../node/node.prefix-container.http.controller.ts | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/web/crux/src/app/node/node.prefix-container.http.controller.ts b/web/crux/src/app/node/node.prefix-container.http.controller.ts index 052df70b1..8287545b9 100755 --- a/web/crux/src/app/node/node.prefix-container.http.controller.ts +++ b/web/crux/src/app/node/node.prefix-container.http.controller.ts @@ -35,7 +35,7 @@ export default class NodePrefixContainerHttpController { @Post(`${ROUTE_NAME}/start`) @HttpCode(HttpStatus.NO_CONTENT) @ApiOperation({ - description: 'Request must include `nodeId`, `prefix`, and `name`.', + description: 'Request must include `nodeId`, `prefix`, and the `name` of the container.', summary: 'Start a container deployed with dyrector.io on a node.', }) @ApiNoContentResponse({ description: 'Container started.' }) @@ -49,7 +49,7 @@ export default class NodePrefixContainerHttpController { @Post(`${ROUTE_NAME}/stop`) @HttpCode(HttpStatus.NO_CONTENT) @ApiOperation({ - description: 'Request must include `nodeId`, `prefix`, and `name`.', + description: 'Request must include `nodeId`, `prefix`, and the `name` of the container.', summary: 'Stop a container deployed with dyrector.io on a node.', }) @ApiNoContentResponse({ description: 'Container stopped.' }) @@ -63,7 +63,7 @@ export default class NodePrefixContainerHttpController { @Post(`${ROUTE_NAME}/restart`) @HttpCode(HttpStatus.NO_CONTENT) @ApiOperation({ - description: 'Request must include `nodeId`, `prefix`, and `name`.', + description: 'Request must include `nodeId`, `prefix`, and the `name` of the container.', summary: 'Restart a container deployed with dyrector.io on a node.', }) @ApiNoContentResponse({ description: 'Container restarted.' }) @@ -91,7 +91,7 @@ export default class NodePrefixContainerHttpController { @Delete(`${ROUTE_NAME}`) @HttpCode(HttpStatus.NO_CONTENT) @ApiOperation({ - description: 'Request must include `nodeId`, `prefix`, and `name`.', + description: 'Request must include `nodeId`, `prefix`, and the `name` of the container.', summary: 'Delete a container deployed with dyrector.io, with the specified prefix and name on a node.', }) @ApiNoContentResponse({ description: 'Container deleted.' }) @@ -105,8 +105,8 @@ export default class NodePrefixContainerHttpController { @Get(`${ROUTE_NAME}/inspect`) @HttpCode(HttpStatus.OK) @ApiOperation({ - description: 'Request must include `nodeId`, `prefix`, and `name`.', - summary: 'Inspect a container.', + description: 'Request must include `nodeId`, `prefix`, and the `name` of the container.', + summary: 'Inspect a container with the specified prefix and name on a node.', }) @ApiOkResponse({ type: ContainerInspectionDto, description: 'Container inspection.' }) @ApiBadRequestResponse({ description: 'Bad request for container inspection.' }) From f70f5a32785c54425a0c499716233ea30a18090d Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Mon, 9 Oct 2023 13:32:10 +0200 Subject: [PATCH 11/19] refactor: rename and move secret timeout to shared consts --- web/crux/src/domain/agent.ts | 8 +++----- web/crux/src/shared/const.ts | 1 + 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/web/crux/src/domain/agent.ts b/web/crux/src/domain/agent.ts index fce10222c..94581cfc6 100755 --- a/web/crux/src/domain/agent.ts +++ b/web/crux/src/domain/agent.ts @@ -17,7 +17,7 @@ import { Empty, ListSecretsResponse, } from 'src/grpc/protobuf/proto/common' -import { CONTAINER_DELETE_TIMEOUT, DEFAULT_CONTAINER_LOG_TAIL } from 'src/shared/const' +import { CONTAINER_DELETE_TIMEOUT, DEFAULT_CONTAINER_LOG_TAIL, GET_CONTAINER_SECRETS_TIMEOUT } from 'src/shared/const' import GrpcNodeConnection from 'src/shared/grpc-node-connection' import { AgentToken } from './agent-token' import AgentUpdate, { AgentUpdateOptions, AgentUpdateResult } from './agent-update' @@ -40,8 +40,6 @@ export type AgentTokenReplacement = { } export class Agent { - public static SECRET_TIMEOUT = 5000 - private readonly commandChannel = new BufferedSubject() private deployments: Map = new Map() @@ -341,7 +339,7 @@ export class Agent { this.secretsWatchers.delete(key) }), timeout({ - each: Agent.SECRET_TIMEOUT, + each: GET_CONTAINER_SECRETS_TIMEOUT, with: () => { this.secretsWatchers.delete(key) @@ -398,7 +396,7 @@ export class Agent { this.inspectionWatchers.delete(key) }), timeout({ - each: Agent.SECRET_TIMEOUT, + each: GET_CONTAINER_SECRETS_TIMEOUT, with: () => { this.inspectionWatchers.delete(key) diff --git a/web/crux/src/shared/const.ts b/web/crux/src/shared/const.ts index 4d59edb67..97d63b282 100644 --- a/web/crux/src/shared/const.ts +++ b/web/crux/src/shared/const.ts @@ -15,6 +15,7 @@ const DAY_IN_MILLIS = 24 * 60 * 60 * 1000 export const TEAM_INVITATION_EXPIRATION = 7 * DAY_IN_MILLIS export const JWT_EXPIRATION_MILLIS = 10 * 60 * 1000 // 10 minutes export const CONTAINER_DELETE_TIMEOUT = 1000 // millis +export const GET_CONTAINER_SECRETS_TIMEOUT = 5000 // millis export const DEFAULT_CONTAINER_LOG_TAIL = 40 From c97741e58e641919428d87ef3900d960dac5909d Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Mon, 9 Oct 2023 13:53:29 +0200 Subject: [PATCH 12/19] refactor: distinct timeout const for inspection too --- web/crux/src/domain/agent.ts | 8 ++++---- web/crux/src/shared/const.ts | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/web/crux/src/domain/agent.ts b/web/crux/src/domain/agent.ts index 94581cfc6..da3c8cad1 100755 --- a/web/crux/src/domain/agent.ts +++ b/web/crux/src/domain/agent.ts @@ -17,7 +17,7 @@ import { Empty, ListSecretsResponse, } from 'src/grpc/protobuf/proto/common' -import { CONTAINER_DELETE_TIMEOUT, DEFAULT_CONTAINER_LOG_TAIL, GET_CONTAINER_SECRETS_TIMEOUT } from 'src/shared/const' +import { CONTAINER_DELETE_TIMEOUT_MILLIS, DEFAULT_CONTAINER_LOG_TAIL, GET_CONTAINER_INSPECTION_TIMEOUT_MILLIS, GET_CONTAINER_SECRETS_TIMEOUT_MILLIS } from 'src/shared/const' import GrpcNodeConnection from 'src/shared/grpc-node-connection' import { AgentToken } from './agent-token' import AgentUpdate, { AgentUpdateOptions, AgentUpdateResult } from './agent-update' @@ -223,7 +223,7 @@ export class Agent { } as AgentCommand) return result.pipe( - timeout(CONTAINER_DELETE_TIMEOUT), + timeout(CONTAINER_DELETE_TIMEOUT_MILLIS), catchError(err => { if (err instanceof TimeoutError) { result.complete() @@ -339,7 +339,7 @@ export class Agent { this.secretsWatchers.delete(key) }), timeout({ - each: GET_CONTAINER_SECRETS_TIMEOUT, + each: GET_CONTAINER_SECRETS_TIMEOUT_MILLIS, with: () => { this.secretsWatchers.delete(key) @@ -396,7 +396,7 @@ export class Agent { this.inspectionWatchers.delete(key) }), timeout({ - each: GET_CONTAINER_SECRETS_TIMEOUT, + each: GET_CONTAINER_INSPECTION_TIMEOUT_MILLIS, with: () => { this.inspectionWatchers.delete(key) diff --git a/web/crux/src/shared/const.ts b/web/crux/src/shared/const.ts index 97d63b282..7ae819958 100644 --- a/web/crux/src/shared/const.ts +++ b/web/crux/src/shared/const.ts @@ -14,8 +14,9 @@ export const VERSIONLESS_PROJECT_VERSION_NAME = 'rolling' const DAY_IN_MILLIS = 24 * 60 * 60 * 1000 export const TEAM_INVITATION_EXPIRATION = 7 * DAY_IN_MILLIS export const JWT_EXPIRATION_MILLIS = 10 * 60 * 1000 // 10 minutes -export const CONTAINER_DELETE_TIMEOUT = 1000 // millis -export const GET_CONTAINER_SECRETS_TIMEOUT = 5000 // millis +export const CONTAINER_DELETE_TIMEOUT_MILLIS = 1000 +export const GET_CONTAINER_SECRETS_TIMEOUT_MILLIS = 5000 +export const GET_CONTAINER_INSPECTION_TIMEOUT_MILLIS = 5000 export const DEFAULT_CONTAINER_LOG_TAIL = 40 From 2e72e86e21914ff2aaf590b9183107dcd307fc55 Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Tue, 10 Oct 2023 12:48:14 +0200 Subject: [PATCH 13/19] feat: container inspection ui with json viewer --- web/crux-ui/locales/en/common.json | 3 +- .../components/nodes/node-containers-list.tsx | 17 +++--- web/crux-ui/src/models/node.ts | 4 ++ .../[teamSlug]/nodes/[nodeId]/inspect.tsx | 58 ++++--------------- .../pages/[teamSlug]/nodes/[nodeId]/log.tsx | 2 +- 5 files changed, 26 insertions(+), 58 deletions(-) diff --git a/web/crux-ui/locales/en/common.json b/web/crux-ui/locales/en/common.json index 6ed679326..04f0f75fa 100644 --- a/web/crux-ui/locales/en/common.json +++ b/web/crux-ui/locales/en/common.json @@ -211,7 +211,8 @@ "method": "Method", "event": "Event", "data": "Data", - "log": "Log", + "logOf": "Log of {{name}}", + "inspectOf": "Inspection of {{name}}", "storages": "Storages", "configBundles": "Config bundles", diff --git a/web/crux-ui/src/components/nodes/node-containers-list.tsx b/web/crux-ui/src/components/nodes/node-containers-list.tsx index 8b5dc59f6..ce330a0cb 100644 --- a/web/crux-ui/src/components/nodes/node-containers-list.tsx +++ b/web/crux-ui/src/components/nodes/node-containers-list.tsx @@ -111,15 +111,14 @@ const NodeContainersList = (props: NodeContainersListProps) => { /> {container.state && ( - - - - )} - - {container.state && ( - - - + <> + + + + + + + )} { - const apiUrl = prefix - ? `/${teamSlug}/nodes/${nodeId}/${prefix}/containers/${name}/inspect` - : `/${teamSlug}/nodes/${nodeId}/containers/${name}/inspect` - - const response = await fetch(apiUrl) - if (!response.ok) { - throw new Error('Failed to fetch container inspection') - } - - const data = await response.json() - return data.inspection -} - -const NodeContainerInspectPage = (props: ContainerInspectPageProps) => { - const { node, prefix, name } = props - +const NodeContainerInspectPage = ({ node, prefix, name, inspection }: ContainerInspectPageProps) => { const { t } = useTranslation('common') const routes = useTeamRoutes() - const [inspection, setInspection] = useState([]) - // const [inspection, setInspection] = useState(null) - - const fetchInspection = async () => { - try { - // TODO(@amorfevo): remove dummy inspectionData - // const inspectionData = 'Container ID: 12 Image: my-container-image:latest Status: Running // ... other details ...' - const teamSlug = routes?.teamSlug - const inspectionData = await fetchContainerInspection(teamSlug, node.id, prefix, name) - setInspection([inspectionData]) - } catch (error) { - console.error('Failed to fetch inspection data:', error) - } - } - - useEffect(() => { - fetchInspection() - }, []) - const pageLink: BreadcrumbLink = { name: t('nodes'), url: routes.node.list(), @@ -86,12 +46,12 @@ const NodeContainerInspectPage = (props: ContainerInspectPageProps) => {
- {t('inspect')} + {t('inspectOf', { name: prefix ? `${prefix}-${name}` : name })}
- {/* TODO(@amorfevo): DyoCards or json-editor component or own inspection component */} - [it]} /> + {/* TODO(@amorfevo): DyoCards or own inspection component instead of the json-editor */} +
) @@ -107,12 +67,16 @@ const getPageServerSideProps = async (context: NextPageContext) => { const name = context.query.name as string const node = await getCruxFromContext(context, routes.node.api.details(nodeId)) + const inspectApiUrl = `${routes.node.api.details(nodeId)}/${prefix ? `${prefix}/` : ''}containers/${name}/inspect` + const res = await getCruxFromContext(context, inspectApiUrl) + const inspection = JSON.parse(res.inspection) return { props: { node, prefix: prefix ?? null, name: name ?? null, + inspection, }, } } diff --git a/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/log.tsx b/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/log.tsx index 0b26f2895..2fdb5342a 100644 --- a/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/log.tsx +++ b/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/log.tsx @@ -74,7 +74,7 @@ const NodeContainerLogPage = (props: InstanceLogPageProps) => {
- {t('log')} + {t('logOf', { name: prefix ? `${prefix}-${name}` : name })}
From 2576cb3fa4f16d2bc6de9d0dab8c0a8115a31f17 Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Tue, 10 Oct 2023 13:03:12 +0200 Subject: [PATCH 14/19] fix: agent test and linting --- .../src/app/node/node.global-container.http.controller.ts | 5 +---- web/crux/src/domain/agent.spec.ts | 4 ++-- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/web/crux/src/app/node/node.global-container.http.controller.ts b/web/crux/src/app/node/node.global-container.http.controller.ts index e7502d1fc..8a4036197 100644 --- a/web/crux/src/app/node/node.global-container.http.controller.ts +++ b/web/crux/src/app/node/node.global-container.http.controller.ts @@ -110,10 +110,7 @@ export default class NodeGlobalContainerHttpController { @ApiBadRequestResponse({ description: 'Bad request for container inspection.' }) @ApiForbiddenResponse({ description: 'Unauthorized request for container inspection.' }) @UuidParams(PARAM_NODE_ID) - async inspectContainer( - @NodeId() nodeId: string, - @Name() name: string, - ): Promise { + async inspectContainer(@NodeId() nodeId: string, @Name() name: string): Promise { return await this.service.inspectContainer(nodeId, GLOBAL_PREFIX, name) } } diff --git a/web/crux/src/domain/agent.spec.ts b/web/crux/src/domain/agent.spec.ts index 693de9321..6b14db228 100644 --- a/web/crux/src/domain/agent.spec.ts +++ b/web/crux/src/domain/agent.spec.ts @@ -11,7 +11,7 @@ import { DeploymentStatusMessage, Empty, } from 'src/grpc/protobuf/proto/common' -import { DEFAULT_CONTAINER_LOG_TAIL } from 'src/shared/const' +import { DEFAULT_CONTAINER_LOG_TAIL, GET_CONTAINER_SECRETS_TIMEOUT_MILLIS } from 'src/shared/const' import { Agent, AgentConnectionMessage } from './agent' import { generateAgentToken } from './agent-token' import AgentUpdate from './agent-update' @@ -325,7 +325,7 @@ describe('agent', () => { await expect(secrets).rejects.toThrow() }, - Agent.SECRET_TIMEOUT * 2, + GET_CONTAINER_SECRETS_TIMEOUT_MILLIS * 2, ) // Default timeout is 5sec, but getContainerSecrets also uses a 5sec timeout // so we need to increase the default timeout to test the secret timeout From e57acaf487cd907b34c1944f9e535df048afb5e8 Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Tue, 10 Oct 2023 14:37:36 +0200 Subject: [PATCH 15/19] feat: container inspection ui table view (wip) --- web/crux-ui/locales/en/nodes.json | 37 +++ web/crux-ui/public/view_json.svg | 3 + .../components/nodes/inspect-table-view.tsx | 221 ++++++++++++++++++ .../nodes/inspect-view-mode-toggle.tsx | 41 ++++ .../[teamSlug]/nodes/[nodeId]/inspect.tsx | 20 +- web/crux/src/domain/agent.ts | 7 +- 6 files changed, 325 insertions(+), 4 deletions(-) create mode 100644 web/crux-ui/public/view_json.svg create mode 100644 web/crux-ui/src/components/nodes/inspect-table-view.tsx create mode 100644 web/crux-ui/src/components/nodes/inspect-view-mode-toggle.tsx diff --git a/web/crux-ui/locales/en/nodes.json b/web/crux-ui/locales/en/nodes.json index 104cec688..789ccb802 100644 --- a/web/crux-ui/locales/en/nodes.json +++ b/web/crux-ui/locales/en/nodes.json @@ -74,5 +74,42 @@ "installed": "Installed", "updateCompleted": "Update completed", "tokenReplaced": "Token replaced" + }, + + "json": "Json", + "table": "Table", + + "general": "General", + "environment": "Environment", + "labels": "Labels", + "networks": "Networks", + "mounts": "Mounts", + + "networkInfo": "IP: {{ip}}, Gateway: {{gateway}}", + + "inspectGeneral": { + "id": "Id", + "name": "Name", + "image": "Image", + "imageHash": "Image hash", + "exitCode": "Exit code", + "status": "Status", + "restartCount": "Restart count", + "hostName": "Host name", + "ip": "IP" + }, + + "mountsInfo": { + "type": "Type", + "source": "Source", + "dest": "Destination", + "mode": "Mode", + "rw": "RW", + "propagation": "Propagation" + }, + + "viewMode": { + "table": "Table", + "json": "JSON" } } diff --git a/web/crux-ui/public/view_json.svg b/web/crux-ui/public/view_json.svg new file mode 100644 index 000000000..ff209b564 --- /dev/null +++ b/web/crux-ui/public/view_json.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/web/crux-ui/src/components/nodes/inspect-table-view.tsx b/web/crux-ui/src/components/nodes/inspect-table-view.tsx new file mode 100644 index 000000000..ae9a75857 --- /dev/null +++ b/web/crux-ui/src/components/nodes/inspect-table-view.tsx @@ -0,0 +1,221 @@ +import clsx from 'clsx' +import useTranslation from 'next-translate/useTranslation' +import { DyoLabel } from 'src/elements/dyo-label' +import { DyoList } from 'src/elements/dyo-list' + +type KeyValue = { + key: string + value: string +} + +interface KeyValueTableProps { + data: KeyValue[] + translateKeys?: boolean +} + +const KeyValueTable = (props: KeyValueTableProps) => { + const { data, translateKeys } = props + + const { t } = useTranslation('nodes') + + const headers = ['common:key', 'common:value'] + + const defaultHeaderClass = 'uppercase text-lens-text-0 text-sm font-semibold bg-lens-surface-5 px-2 py-3 h-11' + const headerClasses = [clsx('rounded-tl-lg pl-4', defaultHeaderClass), clsx('rounded-tr-lg pr-4', defaultHeaderClass)] + + const columnWidths = ['w-1/2', 'w-1/2'] + const defaultItemClass = 'h-12 min-h-min text-lens-text-1 p-2 line-clamp-1 text-ellipsis' + const itemClasses = [clsx('pl-4', defaultItemClass), clsx('pr-4', defaultItemClass)] + + const itemBuilder = (item: KeyValue) => { + const { key, value } = item + + const keyTranslate = translateKeys ? t(key) : key + + return [{keyTranslate}, {value}] + } + + return ( + t(it))} + headerClassName={headerClasses} + columnWidths={columnWidths} + itemClassName={itemClasses} + data={data} + itemBuilder={itemBuilder} + /> + ) +} + +interface MountsTableProps { + data: any[] +} + +const MountsTable = (props: MountsTableProps) => { + const { data } = props + + const { t } = useTranslation('nodes') + + const headers = [ + 'mountsInfo.type', + 'mountsInfo.source', + 'mountsInfo.dest', + 'mountsInfo.mode', + 'mountsInfo.rw', + 'mountsInfo.propagation', + ] + + const defaultHeaderClass = 'uppercase text-lens-text-0 text-sm font-semibold bg-lens-surface-5 px-2 py-3 h-11' + const headerClasses = [ + clsx('rounded-tl-lg pl-4', defaultHeaderClass), + ...Array.from({ length: headers.length - 2 }).map(() => defaultHeaderClass), + clsx('rounded-tr-lg pr-4', defaultHeaderClass), + ] + + const columnWidths = ['w-3/12', 'w-3/12', 'w-3/12', 'w-1/12', 'w-1/12', 'w-1/12'] + const defaultItemClass = 'h-12 min-h-min text-lens-text-1 p-2 line-clamp-1 text-ellipsis' + const itemClasses = [ + clsx('pl-4', defaultItemClass), + ...Array.from({ length: headers.length - 2 }).map(() => defaultItemClass), + clsx('pr-4', defaultItemClass), + ] + + const itemBuilder = (item: any) => { + const { Type: type, Source: source, Destination: dest, Mode: mode, RW: rw, Propagation: propagation } = item + + return [ + {type}, + {source}, + {dest}, + {mode}, + {rw}, + {propagation}, + ] + } + + return ( + t(it))} + headerClassName={headerClasses} + columnWidths={columnWidths} + itemClassName={itemClasses} + data={data} + itemBuilder={itemBuilder} + /> + ) +} + +interface InspectTableViewProps { + inspect: any +} + +const InspectTableView = (props: InspectTableViewProps) => { + const { inspect } = props + const { + Id: id, + Config: config, + Image: imageHash, + Name: name, + RestartCount: restartCount, + NetworkSettings: networkSettings, + State: state, + Mounts: mounts, + } = inspect + const { Env: env, Labels: labels, Image: image, Hostname: hostname } = config ?? {} + const { Networks: networks, IPAddress: ipAddress } = networkSettings ?? {} + const { Status: status, ExitCode: exitCode } = state ?? {} + + const { t } = useTranslation('nodes') + + const envTableData = (env ?? []).map(it => { + const split = it.split('=') + return { + key: split[0], + value: split[1], + } + }) + + const labelsTableData = Object.entries(labels ?? {}).map(([key, value]) => ({ key, value: value as string })) + + const general: KeyValue[] = [ + { + key: 'inspectGeneral.id', + value: id, + }, + { + key: 'inspectGeneral.name', + value: name, + }, + { + key: 'inspectGeneral.status', + value: status, + }, + { + key: 'inspectGeneral.exitCode', + value: exitCode, + }, + { + key: 'inspectGeneral.image', + value: image, + }, + { + key: 'inspectGeneral.imageHash', + value: imageHash, + }, + { + key: 'inspectGeneral.restartCount', + value: restartCount, + }, + { + key: 'inspectGeneral.hostName', + value: hostname, + }, + { + key: 'inspectGeneral.ip', + value: ipAddress === '' ? '-' : ipAddress, + }, + ] + + const networkTableData = Object.entries(networks ?? {}).map(([networkName, network]) => { + const { IPAddress: ip, Gateway: gateway } = network as any + + return { + key: networkName, + value: t('networkInfo', { + ip: ip === '' ? '-' : ip, + gateway: gateway === '' ? '-' : gateway, + }), + } + }) + + return ( + <> +
+
+ {t('general')} + +
+
+ {t('environment')} + +
+
+ {t('labels')} + +
+
+ {t('networks')} + +
+
+
+ {t('mounts')} + +
+ + ) +} + +export default InspectTableView diff --git a/web/crux-ui/src/components/nodes/inspect-view-mode-toggle.tsx b/web/crux-ui/src/components/nodes/inspect-view-mode-toggle.tsx new file mode 100644 index 000000000..7c9bfcad9 --- /dev/null +++ b/web/crux-ui/src/components/nodes/inspect-view-mode-toggle.tsx @@ -0,0 +1,41 @@ +import clsx from 'clsx' +import DyoIcon from 'src/elements/dyo-icon' +import useTranslation from 'next-translate/useTranslation' + +export type InspectViewMode = 'table' | 'json' + +export interface InspectViewModeToggleProps { + className?: string + viewMode: InspectViewMode + onViewModeChanged: (mode: InspectViewMode) => void +} + +const InspectViewModeToggle = (props: InspectViewModeToggleProps) => { + const { className, viewMode, onViewModeChanged } = props + + const { t } = useTranslation('nodes') + + return ( +
+
onViewModeChanged('table')} + > + +
+
onViewModeChanged('json')} + > + +
+
+ ) +} + +export default InspectViewModeToggle diff --git a/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx b/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx index 88bd6344f..e4b79f3d8 100644 --- a/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx +++ b/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx @@ -1,9 +1,12 @@ import { Layout } from '@app/components/layout' +import InspectTableView from '@app/components/nodes/inspect-table-view' +import InspectViewModeToggle, { InspectViewMode } from '@app/components/nodes/inspect-view-mode-toggle' import { BreadcrumbLink } from '@app/components/shared/breadcrumb' import JsonEditor from '@app/components/shared/json-editor-dynamic-module' import PageHeading from '@app/components/shared/page-heading' import { DyoCard } from '@app/elements/dyo-card' import { DyoHeading } from '@app/elements/dyo-heading' +import LoadingIndicator from '@app/elements/loading-indicator' import useTeamRoutes from '@app/hooks/use-team-routes' import { NodeContainerInspection, NodeDetails } from '@app/models' import { TeamRoutes } from '@app/routes' @@ -11,6 +14,7 @@ import { withContextAuthorization } from '@app/utils' import { getCruxFromContext } from '@server/crux-api' import { NextPageContext } from 'next' import useTranslation from 'next-translate/useTranslation' +import { useState } from 'react' interface ContainerInspectPageProps { node: NodeDetails @@ -22,6 +26,7 @@ interface ContainerInspectPageProps { const NodeContainerInspectPage = ({ node, prefix, name, inspection }: ContainerInspectPageProps) => { const { t } = useTranslation('common') const routes = useTeamRoutes() + const [viewMode, setViewMode] = useState('table') const pageLink: BreadcrumbLink = { name: t('nodes'), @@ -41,7 +46,9 @@ const NodeContainerInspectPage = ({ node, prefix, name, inspection }: ContainerI return ( - + + {inspection && } +
@@ -50,8 +57,15 @@ const NodeContainerInspectPage = ({ node, prefix, name, inspection }: ContainerI
- {/* TODO(@amorfevo): DyoCards or own inspection component instead of the json-editor */} - + {inspection ? ( + viewMode === 'table' ? ( + + ) : ( + + ) + ) : ( + + )}
) diff --git a/web/crux/src/domain/agent.ts b/web/crux/src/domain/agent.ts index da3c8cad1..365588be6 100755 --- a/web/crux/src/domain/agent.ts +++ b/web/crux/src/domain/agent.ts @@ -17,7 +17,12 @@ import { Empty, ListSecretsResponse, } from 'src/grpc/protobuf/proto/common' -import { CONTAINER_DELETE_TIMEOUT_MILLIS, DEFAULT_CONTAINER_LOG_TAIL, GET_CONTAINER_INSPECTION_TIMEOUT_MILLIS, GET_CONTAINER_SECRETS_TIMEOUT_MILLIS } from 'src/shared/const' +import { + CONTAINER_DELETE_TIMEOUT_MILLIS, + DEFAULT_CONTAINER_LOG_TAIL, + GET_CONTAINER_INSPECTION_TIMEOUT_MILLIS, + GET_CONTAINER_SECRETS_TIMEOUT_MILLIS, +} from 'src/shared/const' import GrpcNodeConnection from 'src/shared/grpc-node-connection' import { AgentToken } from './agent-token' import AgentUpdate, { AgentUpdateOptions, AgentUpdateResult } from './agent-update' From 4e963ebf25b754be0f8bdd9576df9baa201cdd3d Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Tue, 10 Oct 2023 14:45:23 +0200 Subject: [PATCH 16/19] feat: add node connection status unreachable --- web/crux-ui/src/models/node.ts | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/web/crux-ui/src/models/node.ts b/web/crux-ui/src/models/node.ts index 341e3a9d7..d83428548 100644 --- a/web/crux-ui/src/models/node.ts +++ b/web/crux-ui/src/models/node.ts @@ -50,12 +50,17 @@ export type NodeDetails = DyoNode & { inUse: boolean } -export const nodeConnectionOf = (node: DyoNode): NodeConnection => ({ - address: node.address, - status: node.status, - connectedAt: node.connectedAt, - version: node.version, -}) +export const nodeConnectionOf = (node: DyoNode): NodeConnection => + node === null + ? ({ + status: 'unreachable', + } as NodeConnection) + : { + address: node.address, + status: node.status, + connectedAt: node.connectedAt, + version: node.version, + } export type CreateNode = { name: string From 3c2af03fade6d3e3e0e467924f45947e3724e281 Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Tue, 10 Oct 2023 14:48:14 +0200 Subject: [PATCH 17/19] feat: handle unknown container error --- golang/pkg/dagent/utils/docker.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/golang/pkg/dagent/utils/docker.go b/golang/pkg/dagent/utils/docker.go index 8ed4de928..8d5996d8d 100644 --- a/golang/pkg/dagent/utils/docker.go +++ b/golang/pkg/dagent/utils/docker.go @@ -797,6 +797,9 @@ func ContainerInspect(ctx context.Context, request *agent.ContainerInspectReques name := request.Container.Name cont, err := GetContainerByPrefixAndName(ctx, cli, prefix, name) + if cont == nil { + return "", &UnknownContainerError{} + } if err != nil { return "", err } @@ -811,8 +814,6 @@ func ContainerInspect(ctx context.Context, request *agent.ContainerInspectReques return "", err } inspection := string(inspectionJSON) - // TODO(@amorfevo): maybe this works too - // inspection := fmt.Sprintf("%+v", containerInfo) return inspection, nil } From 93b1ae01aa30453356648295c688b25a470114e4 Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Tue, 10 Oct 2023 16:38:38 +0200 Subject: [PATCH 18/19] feat: container inspection ui table view --- web/crux-ui/i18n.json | 1 + .../components/nodes/inspect-table-view.tsx | 24 ++++++++++--------- .../nodes/inspect-view-mode-toggle.tsx | 11 ++++----- .../[teamSlug]/nodes/[nodeId]/inspect.tsx | 4 +++- web/crux-ui/tailwind.config.js | 1 + 5 files changed, 22 insertions(+), 19 deletions(-) diff --git a/web/crux-ui/i18n.json b/web/crux-ui/i18n.json index 29938099f..c4da02402 100644 --- a/web/crux-ui/i18n.json +++ b/web/crux-ui/i18n.json @@ -24,6 +24,7 @@ "/[teamSlug]/nodes": ["nodes", "tokens"], "/[teamSlug]/nodes/[nodeId]": ["nodes", "images", "tokens", "deployments"], "/[teamSlug]/nodes/[nodeId]/log": [], + "/[teamSlug]/nodes/[nodeId]/inspect": ["nodes"], "/[teamSlug]/registries": ["registries"], "/[teamSlug]/registries/[registryId]": ["registries"], "/teams": ["teams"], diff --git a/web/crux-ui/src/components/nodes/inspect-table-view.tsx b/web/crux-ui/src/components/nodes/inspect-table-view.tsx index ae9a75857..8da18a0f3 100644 --- a/web/crux-ui/src/components/nodes/inspect-table-view.tsx +++ b/web/crux-ui/src/components/nodes/inspect-table-view.tsx @@ -13,6 +13,8 @@ interface KeyValueTableProps { translateKeys?: boolean } +const defaultHeaderClass = 'uppercase text-bright text-sm font-semibold bg-medium-eased px-2 py-3 h-11' + const KeyValueTable = (props: KeyValueTableProps) => { const { data, translateKeys } = props @@ -20,11 +22,10 @@ const KeyValueTable = (props: KeyValueTableProps) => { const headers = ['common:key', 'common:value'] - const defaultHeaderClass = 'uppercase text-lens-text-0 text-sm font-semibold bg-lens-surface-5 px-2 py-3 h-11' const headerClasses = [clsx('rounded-tl-lg pl-4', defaultHeaderClass), clsx('rounded-tr-lg pr-4', defaultHeaderClass)] const columnWidths = ['w-1/2', 'w-1/2'] - const defaultItemClass = 'h-12 min-h-min text-lens-text-1 p-2 line-clamp-1 text-ellipsis' + const defaultItemClass = 'h-12 min-h-min text-light-eased p-2 line-clamp-1 text-ellipsis' const itemClasses = [clsx('pl-4', defaultItemClass), clsx('pr-4', defaultItemClass)] const itemBuilder = (item: KeyValue) => { @@ -37,7 +38,7 @@ const KeyValueTable = (props: KeyValueTableProps) => { return ( t(it))} headerClassName={headerClasses} columnWidths={columnWidths} @@ -66,7 +67,6 @@ const MountsTable = (props: MountsTableProps) => { 'mountsInfo.propagation', ] - const defaultHeaderClass = 'uppercase text-lens-text-0 text-sm font-semibold bg-lens-surface-5 px-2 py-3 h-11' const headerClasses = [ clsx('rounded-tl-lg pl-4', defaultHeaderClass), ...Array.from({ length: headers.length - 2 }).map(() => defaultHeaderClass), @@ -74,7 +74,7 @@ const MountsTable = (props: MountsTableProps) => { ] const columnWidths = ['w-3/12', 'w-3/12', 'w-3/12', 'w-1/12', 'w-1/12', 'w-1/12'] - const defaultItemClass = 'h-12 min-h-min text-lens-text-1 p-2 line-clamp-1 text-ellipsis' + const defaultItemClass = 'h-12 min-h-min text-light-eased p-2 line-clamp-1 text-ellipsis' const itemClasses = [ clsx('pl-4', defaultItemClass), ...Array.from({ length: headers.length - 2 }).map(() => defaultItemClass), @@ -96,7 +96,7 @@ const MountsTable = (props: MountsTableProps) => { return ( t(it))} headerClassName={headerClasses} columnWidths={columnWidths} @@ -190,28 +190,30 @@ const InspectTableView = (props: InspectTableViewProps) => { } }) + const tableGroupHeaderClass = 'uppercase text-lg' + return ( <>
- {t('general')} + {t('general')}
- {t('environment')} + {t('environment')}
- {t('labels')} + {t('labels')}
- {t('networks')} + {t('networks')}
- {t('mounts')} + {t('mounts')}
diff --git a/web/crux-ui/src/components/nodes/inspect-view-mode-toggle.tsx b/web/crux-ui/src/components/nodes/inspect-view-mode-toggle.tsx index 7c9bfcad9..a02c361d9 100644 --- a/web/crux-ui/src/components/nodes/inspect-view-mode-toggle.tsx +++ b/web/crux-ui/src/components/nodes/inspect-view-mode-toggle.tsx @@ -1,5 +1,5 @@ +import DyoIcon from '@app/elements/dyo-icon' import clsx from 'clsx' -import DyoIcon from 'src/elements/dyo-icon' import useTranslation from 'next-translate/useTranslation' export type InspectViewMode = 'table' | 'json' @@ -17,19 +17,16 @@ const InspectViewModeToggle = (props: InspectViewModeToggleProps) => { return (
onViewModeChanged('table')} >
onViewModeChanged('json')} > diff --git a/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx b/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx index e4b79f3d8..07b005dbc 100644 --- a/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx +++ b/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx @@ -47,7 +47,9 @@ const NodeContainerInspectPage = ({ node, prefix, name, inspection }: ContainerI return ( - {inspection && } +
+ {inspection && } +
diff --git a/web/crux-ui/tailwind.config.js b/web/crux-ui/tailwind.config.js index 204bb6805..a1142e778 100644 --- a/web/crux-ui/tailwind.config.js +++ b/web/crux-ui/tailwind.config.js @@ -30,6 +30,7 @@ module.exports = { light: '#7783a3', 'medium-eased': '#343d55', medium: '#283046', + 'dark-eased': '#192034', dark: '#161d31', 'error-red': '#ea5455', 'warning-orange': '#ff9f43', From 176e9671da041e0fdf0f7cc533b3c3650d66c2e1 Mon Sep 17 00:00:00 2001 From: Imre Hajagos Date: Wed, 11 Oct 2023 12:25:51 +0200 Subject: [PATCH 19/19] refactor: just code cleaning --- golang/pkg/dagent/utils/docker.go | 4 +++- web/crux-ui/src/models/node.ts | 17 ++++++----------- .../pages/[teamSlug]/nodes/[nodeId]/inspect.tsx | 10 +++------- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/golang/pkg/dagent/utils/docker.go b/golang/pkg/dagent/utils/docker.go index 8d5996d8d..56bd3c4b9 100644 --- a/golang/pkg/dagent/utils/docker.go +++ b/golang/pkg/dagent/utils/docker.go @@ -51,6 +51,8 @@ type DockerVersion struct { ClientVersion string } +var ErrUnknownContainer = errors.New("unknown container") + func GetContainerLogs(name string, skip, take uint) []string { ctx := context.Background() @@ -798,7 +800,7 @@ func ContainerInspect(ctx context.Context, request *agent.ContainerInspectReques cont, err := GetContainerByPrefixAndName(ctx, cli, prefix, name) if cont == nil { - return "", &UnknownContainerError{} + return "", ErrUnknownContainer } if err != nil { return "", err diff --git a/web/crux-ui/src/models/node.ts b/web/crux-ui/src/models/node.ts index d83428548..341e3a9d7 100644 --- a/web/crux-ui/src/models/node.ts +++ b/web/crux-ui/src/models/node.ts @@ -50,17 +50,12 @@ export type NodeDetails = DyoNode & { inUse: boolean } -export const nodeConnectionOf = (node: DyoNode): NodeConnection => - node === null - ? ({ - status: 'unreachable', - } as NodeConnection) - : { - address: node.address, - status: node.status, - connectedAt: node.connectedAt, - version: node.version, - } +export const nodeConnectionOf = (node: DyoNode): NodeConnection => ({ + address: node.address, + status: node.status, + connectedAt: node.connectedAt, + version: node.version, +}) export type CreateNode = { name: string diff --git a/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx b/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx index 07b005dbc..24301a289 100644 --- a/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx +++ b/web/crux-ui/src/pages/[teamSlug]/nodes/[nodeId]/inspect.tsx @@ -6,7 +6,6 @@ import JsonEditor from '@app/components/shared/json-editor-dynamic-module' import PageHeading from '@app/components/shared/page-heading' import { DyoCard } from '@app/elements/dyo-card' import { DyoHeading } from '@app/elements/dyo-heading' -import LoadingIndicator from '@app/elements/loading-indicator' import useTeamRoutes from '@app/hooks/use-team-routes' import { NodeContainerInspection, NodeDetails } from '@app/models' import { TeamRoutes } from '@app/routes' @@ -59,15 +58,12 @@ const NodeContainerInspectPage = ({ node, prefix, name, inspection }: ContainerI
- {inspection ? ( - viewMode === 'table' ? ( + {inspection && + (viewMode === 'table' ? ( ) : ( - ) - ) : ( - - )} + ))} )