From 873e6b820909f07709cd44ab0f8dcdd2c4f5366a Mon Sep 17 00:00:00 2001 From: HJ Date: Fri, 7 Jan 2022 17:04:34 +0800 Subject: [PATCH 01/29] Add send large file --- rpc/errors.go | 2 + rpc/gen/core.pb.go | 1426 +++++++++++++++++++++++---------------- rpc/gen/core.proto | 15 + rpc/gen/core_grpc.pb.go | 96 ++- rpc/rpc.go | 57 ++ 5 files changed, 990 insertions(+), 606 deletions(-) diff --git a/rpc/errors.go b/rpc/errors.go index 23b1f38a3..ce39041bd 100644 --- a/rpc/errors.go +++ b/rpc/errors.go @@ -61,6 +61,8 @@ const ( Copy codes.Code = 1061 // Send . Send codes.Code = 1062 + // SendLargeFile . + SendLargeFile codes.Code = 1063 // BuildImage . BuildImage codes.Code = 1071 diff --git a/rpc/gen/core.pb.go b/rpc/gen/core.pb.go index e9160764e..4e1939e31 100644 --- a/rpc/gen/core.pb.go +++ b/rpc/gen/core.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.26.0 +// protoc-gen-go v1.27.1 // protoc v3.17.3 // source: rpc/gen/core.proto @@ -4786,6 +4786,61 @@ func (x *SendOptions) GetOwners() map[string]*FileOwner { return nil } +type FileOptions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Metadata *FileOptions_Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` + Chunk *FileOptions_Chunk `protobuf:"bytes,2,opt,name=chunk,proto3" json:"chunk,omitempty"` +} + +func (x *FileOptions) Reset() { + *x = FileOptions{} + if protoimpl.UnsafeEnabled { + mi := &file_rpc_gen_core_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FileOptions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FileOptions) ProtoMessage() {} + +func (x *FileOptions) ProtoReflect() protoreflect.Message { + mi := &file_rpc_gen_core_proto_msgTypes[61] + 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 FileOptions.ProtoReflect.Descriptor instead. +func (*FileOptions) Descriptor() ([]byte, []int) { + return file_rpc_gen_core_proto_rawDescGZIP(), []int{61} +} + +func (x *FileOptions) GetMetadata() *FileOptions_Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *FileOptions) GetChunk() *FileOptions_Chunk { + if x != nil { + return x.Chunk + } + return nil +} + type ErrorDetail struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -4798,7 +4853,7 @@ type ErrorDetail struct { func (x *ErrorDetail) Reset() { *x = ErrorDetail{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[61] + mi := &file_rpc_gen_core_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4811,7 +4866,7 @@ func (x *ErrorDetail) String() string { func (*ErrorDetail) ProtoMessage() {} func (x *ErrorDetail) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[61] + mi := &file_rpc_gen_core_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4824,7 +4879,7 @@ func (x *ErrorDetail) ProtoReflect() protoreflect.Message { // Deprecated: Use ErrorDetail.ProtoReflect.Descriptor instead. func (*ErrorDetail) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{61} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{62} } func (x *ErrorDetail) GetCode() int64 { @@ -4857,7 +4912,7 @@ type BuildImageMessage struct { func (x *BuildImageMessage) Reset() { *x = BuildImageMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[62] + mi := &file_rpc_gen_core_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4870,7 +4925,7 @@ func (x *BuildImageMessage) String() string { func (*BuildImageMessage) ProtoMessage() {} func (x *BuildImageMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[62] + mi := &file_rpc_gen_core_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4883,7 +4938,7 @@ func (x *BuildImageMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use BuildImageMessage.ProtoReflect.Descriptor instead. func (*BuildImageMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{62} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{63} } func (x *BuildImageMessage) GetId() string { @@ -4947,7 +5002,7 @@ type CreateWorkloadMessage struct { func (x *CreateWorkloadMessage) Reset() { *x = CreateWorkloadMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[63] + mi := &file_rpc_gen_core_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4960,7 +5015,7 @@ func (x *CreateWorkloadMessage) String() string { func (*CreateWorkloadMessage) ProtoMessage() {} func (x *CreateWorkloadMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[63] + mi := &file_rpc_gen_core_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4973,7 +5028,7 @@ func (x *CreateWorkloadMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateWorkloadMessage.ProtoReflect.Descriptor instead. func (*CreateWorkloadMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{63} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{64} } func (x *CreateWorkloadMessage) GetPodname() string { @@ -5052,7 +5107,7 @@ type ReplaceWorkloadMessage struct { func (x *ReplaceWorkloadMessage) Reset() { *x = ReplaceWorkloadMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[64] + mi := &file_rpc_gen_core_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5065,7 +5120,7 @@ func (x *ReplaceWorkloadMessage) String() string { func (*ReplaceWorkloadMessage) ProtoMessage() {} func (x *ReplaceWorkloadMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[64] + mi := &file_rpc_gen_core_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5078,7 +5133,7 @@ func (x *ReplaceWorkloadMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ReplaceWorkloadMessage.ProtoReflect.Descriptor instead. func (*ReplaceWorkloadMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{64} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{65} } func (x *ReplaceWorkloadMessage) GetCreate() *CreateWorkloadMessage { @@ -5116,7 +5171,7 @@ type CacheImageMessage struct { func (x *CacheImageMessage) Reset() { *x = CacheImageMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[65] + mi := &file_rpc_gen_core_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5129,7 +5184,7 @@ func (x *CacheImageMessage) String() string { func (*CacheImageMessage) ProtoMessage() {} func (x *CacheImageMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[65] + mi := &file_rpc_gen_core_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5142,7 +5197,7 @@ func (x *CacheImageMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use CacheImageMessage.ProtoReflect.Descriptor instead. func (*CacheImageMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{65} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{66} } func (x *CacheImageMessage) GetImage() string { @@ -5186,7 +5241,7 @@ type RemoveImageMessage struct { func (x *RemoveImageMessage) Reset() { *x = RemoveImageMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[66] + mi := &file_rpc_gen_core_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5199,7 +5254,7 @@ func (x *RemoveImageMessage) String() string { func (*RemoveImageMessage) ProtoMessage() {} func (x *RemoveImageMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[66] + mi := &file_rpc_gen_core_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5212,7 +5267,7 @@ func (x *RemoveImageMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveImageMessage.ProtoReflect.Descriptor instead. func (*RemoveImageMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{66} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{67} } func (x *RemoveImageMessage) GetImage() string { @@ -5248,7 +5303,7 @@ type ImageItem struct { func (x *ImageItem) Reset() { *x = ImageItem{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[67] + mi := &file_rpc_gen_core_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5261,7 +5316,7 @@ func (x *ImageItem) String() string { func (*ImageItem) ProtoMessage() {} func (x *ImageItem) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[67] + mi := &file_rpc_gen_core_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5274,7 +5329,7 @@ func (x *ImageItem) ProtoReflect() protoreflect.Message { // Deprecated: Use ImageItem.ProtoReflect.Descriptor instead. func (*ImageItem) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{67} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{68} } func (x *ImageItem) GetId() string { @@ -5304,7 +5359,7 @@ type ListImageMessage struct { func (x *ListImageMessage) Reset() { *x = ListImageMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[68] + mi := &file_rpc_gen_core_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5317,7 +5372,7 @@ func (x *ListImageMessage) String() string { func (*ListImageMessage) ProtoMessage() {} func (x *ListImageMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[68] + mi := &file_rpc_gen_core_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5330,7 +5385,7 @@ func (x *ListImageMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ListImageMessage.ProtoReflect.Descriptor instead. func (*ListImageMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{68} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{69} } func (x *ListImageMessage) GetImages() []*ImageItem { @@ -5367,7 +5422,7 @@ type RemoveWorkloadMessage struct { func (x *RemoveWorkloadMessage) Reset() { *x = RemoveWorkloadMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[69] + mi := &file_rpc_gen_core_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5380,7 +5435,7 @@ func (x *RemoveWorkloadMessage) String() string { func (*RemoveWorkloadMessage) ProtoMessage() {} func (x *RemoveWorkloadMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[69] + mi := &file_rpc_gen_core_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5393,7 +5448,7 @@ func (x *RemoveWorkloadMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveWorkloadMessage.ProtoReflect.Descriptor instead. func (*RemoveWorkloadMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{69} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{70} } func (x *RemoveWorkloadMessage) GetId() string { @@ -5429,7 +5484,7 @@ type DissociateWorkloadMessage struct { func (x *DissociateWorkloadMessage) Reset() { *x = DissociateWorkloadMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[70] + mi := &file_rpc_gen_core_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5442,7 +5497,7 @@ func (x *DissociateWorkloadMessage) String() string { func (*DissociateWorkloadMessage) ProtoMessage() {} func (x *DissociateWorkloadMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[70] + mi := &file_rpc_gen_core_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5455,7 +5510,7 @@ func (x *DissociateWorkloadMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use DissociateWorkloadMessage.ProtoReflect.Descriptor instead. func (*DissociateWorkloadMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{70} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{71} } func (x *DissociateWorkloadMessage) GetId() string { @@ -5483,7 +5538,7 @@ type ReallocResourceMessage struct { func (x *ReallocResourceMessage) Reset() { *x = ReallocResourceMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[71] + mi := &file_rpc_gen_core_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5496,7 +5551,7 @@ func (x *ReallocResourceMessage) String() string { func (*ReallocResourceMessage) ProtoMessage() {} func (x *ReallocResourceMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[71] + mi := &file_rpc_gen_core_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5509,7 +5564,7 @@ func (x *ReallocResourceMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ReallocResourceMessage.ProtoReflect.Descriptor instead. func (*ReallocResourceMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{71} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{72} } func (x *ReallocResourceMessage) GetError() string { @@ -5534,7 +5589,7 @@ type CopyMessage struct { func (x *CopyMessage) Reset() { *x = CopyMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[72] + mi := &file_rpc_gen_core_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5547,7 +5602,7 @@ func (x *CopyMessage) String() string { func (*CopyMessage) ProtoMessage() {} func (x *CopyMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[72] + mi := &file_rpc_gen_core_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5560,7 +5615,7 @@ func (x *CopyMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use CopyMessage.ProtoReflect.Descriptor instead. func (*CopyMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{72} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{73} } func (x *CopyMessage) GetId() string { @@ -5611,7 +5666,7 @@ type SendMessage struct { func (x *SendMessage) Reset() { *x = SendMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[73] + mi := &file_rpc_gen_core_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5624,7 +5679,7 @@ func (x *SendMessage) String() string { func (*SendMessage) ProtoMessage() {} func (x *SendMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[73] + mi := &file_rpc_gen_core_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5637,7 +5692,7 @@ func (x *SendMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use SendMessage.ProtoReflect.Descriptor instead. func (*SendMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{73} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{74} } func (x *SendMessage) GetId() string { @@ -5674,7 +5729,7 @@ type AttachWorkloadMessage struct { func (x *AttachWorkloadMessage) Reset() { *x = AttachWorkloadMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[74] + mi := &file_rpc_gen_core_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5687,7 +5742,7 @@ func (x *AttachWorkloadMessage) String() string { func (*AttachWorkloadMessage) ProtoMessage() {} func (x *AttachWorkloadMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[74] + mi := &file_rpc_gen_core_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5700,7 +5755,7 @@ func (x *AttachWorkloadMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use AttachWorkloadMessage.ProtoReflect.Descriptor instead. func (*AttachWorkloadMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{74} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{75} } func (x *AttachWorkloadMessage) GetWorkloadId() string { @@ -5738,7 +5793,7 @@ type RunAndWaitOptions struct { func (x *RunAndWaitOptions) Reset() { *x = RunAndWaitOptions{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[75] + mi := &file_rpc_gen_core_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5751,7 +5806,7 @@ func (x *RunAndWaitOptions) String() string { func (*RunAndWaitOptions) ProtoMessage() {} func (x *RunAndWaitOptions) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[75] + mi := &file_rpc_gen_core_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5764,7 +5819,7 @@ func (x *RunAndWaitOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use RunAndWaitOptions.ProtoReflect.Descriptor instead. func (*RunAndWaitOptions) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{75} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{76} } func (x *RunAndWaitOptions) GetDeployOptions() *DeployOptions { @@ -5808,7 +5863,7 @@ type ControlWorkloadOptions struct { func (x *ControlWorkloadOptions) Reset() { *x = ControlWorkloadOptions{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[76] + mi := &file_rpc_gen_core_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5821,7 +5876,7 @@ func (x *ControlWorkloadOptions) String() string { func (*ControlWorkloadOptions) ProtoMessage() {} func (x *ControlWorkloadOptions) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[76] + mi := &file_rpc_gen_core_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5834,7 +5889,7 @@ func (x *ControlWorkloadOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use ControlWorkloadOptions.ProtoReflect.Descriptor instead. func (*ControlWorkloadOptions) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{76} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{77} } func (x *ControlWorkloadOptions) GetIds() []string { @@ -5871,7 +5926,7 @@ type ControlWorkloadMessage struct { func (x *ControlWorkloadMessage) Reset() { *x = ControlWorkloadMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[77] + mi := &file_rpc_gen_core_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5884,7 +5939,7 @@ func (x *ControlWorkloadMessage) String() string { func (*ControlWorkloadMessage) ProtoMessage() {} func (x *ControlWorkloadMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[77] + mi := &file_rpc_gen_core_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5897,7 +5952,7 @@ func (x *ControlWorkloadMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use ControlWorkloadMessage.ProtoReflect.Descriptor instead. func (*ControlWorkloadMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{77} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{78} } func (x *ControlWorkloadMessage) GetId() string { @@ -5936,7 +5991,7 @@ type LogStreamOptions struct { func (x *LogStreamOptions) Reset() { *x = LogStreamOptions{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[78] + mi := &file_rpc_gen_core_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5949,7 +6004,7 @@ func (x *LogStreamOptions) String() string { func (*LogStreamOptions) ProtoMessage() {} func (x *LogStreamOptions) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[78] + mi := &file_rpc_gen_core_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5962,7 +6017,7 @@ func (x *LogStreamOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use LogStreamOptions.ProtoReflect.Descriptor instead. func (*LogStreamOptions) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{78} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{79} } func (x *LogStreamOptions) GetId() string { @@ -6014,7 +6069,7 @@ type LogStreamMessage struct { func (x *LogStreamMessage) Reset() { *x = LogStreamMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[79] + mi := &file_rpc_gen_core_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6027,7 +6082,7 @@ func (x *LogStreamMessage) String() string { func (*LogStreamMessage) ProtoMessage() {} func (x *LogStreamMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[79] + mi := &file_rpc_gen_core_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6040,7 +6095,7 @@ func (x *LogStreamMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use LogStreamMessage.ProtoReflect.Descriptor instead. func (*LogStreamMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{79} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{80} } func (x *LogStreamMessage) GetId() string { @@ -6087,7 +6142,7 @@ type ExecuteWorkloadOptions struct { func (x *ExecuteWorkloadOptions) Reset() { *x = ExecuteWorkloadOptions{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[80] + mi := &file_rpc_gen_core_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6100,7 +6155,7 @@ func (x *ExecuteWorkloadOptions) String() string { func (*ExecuteWorkloadOptions) ProtoMessage() {} func (x *ExecuteWorkloadOptions) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[80] + mi := &file_rpc_gen_core_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6113,7 +6168,7 @@ func (x *ExecuteWorkloadOptions) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecuteWorkloadOptions.ProtoReflect.Descriptor instead. func (*ExecuteWorkloadOptions) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{80} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{81} } func (x *ExecuteWorkloadOptions) GetWorkloadId() string { @@ -6170,7 +6225,7 @@ type CapacityMessage struct { func (x *CapacityMessage) Reset() { *x = CapacityMessage{} if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[81] + mi := &file_rpc_gen_core_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6183,7 +6238,7 @@ func (x *CapacityMessage) String() string { func (*CapacityMessage) ProtoMessage() {} func (x *CapacityMessage) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[81] + mi := &file_rpc_gen_core_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6196,7 +6251,7 @@ func (x *CapacityMessage) ProtoReflect() protoreflect.Message { // Deprecated: Use CapacityMessage.ProtoReflect.Descriptor instead. func (*CapacityMessage) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{81} + return file_rpc_gen_core_proto_rawDescGZIP(), []int{82} } func (x *CapacityMessage) GetTotal() int64 { @@ -6213,6 +6268,124 @@ func (x *CapacityMessage) GetNodeCapacities() map[string]int64 { return nil } +type FileOptions_Metadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` + Dst string `protobuf:"bytes,2,opt,name=dst,proto3" json:"dst,omitempty"` + Mode *FileMode `protobuf:"bytes,3,opt,name=mode,proto3" json:"mode,omitempty"` + Owner *FileOwner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` +} + +func (x *FileOptions_Metadata) Reset() { + *x = FileOptions_Metadata{} + if protoimpl.UnsafeEnabled { + mi := &file_rpc_gen_core_proto_msgTypes[132] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FileOptions_Metadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FileOptions_Metadata) ProtoMessage() {} + +func (x *FileOptions_Metadata) ProtoReflect() protoreflect.Message { + mi := &file_rpc_gen_core_proto_msgTypes[132] + 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 FileOptions_Metadata.ProtoReflect.Descriptor instead. +func (*FileOptions_Metadata) Descriptor() ([]byte, []int) { + return file_rpc_gen_core_proto_rawDescGZIP(), []int{61, 0} +} + +func (x *FileOptions_Metadata) GetIds() []string { + if x != nil { + return x.Ids + } + return nil +} + +func (x *FileOptions_Metadata) GetDst() string { + if x != nil { + return x.Dst + } + return "" +} + +func (x *FileOptions_Metadata) GetMode() *FileMode { + if x != nil { + return x.Mode + } + return nil +} + +func (x *FileOptions_Metadata) GetOwner() *FileOwner { + if x != nil { + return x.Owner + } + return nil +} + +type FileOptions_Chunk struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` +} + +func (x *FileOptions_Chunk) Reset() { + *x = FileOptions_Chunk{} + if protoimpl.UnsafeEnabled { + mi := &file_rpc_gen_core_proto_msgTypes[133] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FileOptions_Chunk) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FileOptions_Chunk) ProtoMessage() {} + +func (x *FileOptions_Chunk) ProtoReflect() protoreflect.Message { + mi := &file_rpc_gen_core_proto_msgTypes[133] + 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 FileOptions_Chunk.ProtoReflect.Descriptor instead. +func (*FileOptions_Chunk) Descriptor() ([]byte, []int) { + return file_rpc_gen_core_proto_rawDescGZIP(), []int{61, 1} +} + +func (x *FileOptions_Chunk) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + var File_rpc_gen_core_proto protoreflect.FileDescriptor var file_rpc_gen_core_proto_rawDesc = []byte{ @@ -7055,285 +7228,305 @@ var file_rpc_gen_core_proto_rawDesc = []byte{ 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x3b, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, - 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xb9, - 0x01, 0x0a, 0x11, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, - 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x32, 0x0a, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, - 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, - 0x62, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x0b, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0xdd, 0x02, 0x0a, 0x15, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x40, - 0x0a, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x73, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x28, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x3a, - 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x94, 0x01, 0x0a, 0x16, 0x52, - 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x22, 0x79, 0x0a, 0x11, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x60, 0x0a, 0x12, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x01, 0x22, 0x84, 0x02, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x34, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x05, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x75, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, + 0x64, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x64, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, + 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, + 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x1a, 0x1b, 0x0a, 0x05, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3b, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, + 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xb9, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x32, 0x0a, + 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x52, 0x0b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x22, 0xdd, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, + 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, + 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, + 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x28, 0x0a, 0x08, 0x72, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x3a, 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x94, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x06, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, + 0x31, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x79, 0x0a, 0x11, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x60, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x74, + 0x65, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x67, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x69, 0x6d, + 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, + 0x03, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x72, 0x72, 0x22, + 0x55, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x2f, - 0x0a, 0x09, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, - 0x67, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x74, - 0x65, 0x6d, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, - 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, - 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x72, 0x72, 0x22, 0x55, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, - 0x6f, 0x6f, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, - 0x41, 0x0a, 0x19, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x2e, 0x0a, 0x16, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x6f, 0x0a, 0x0b, 0x43, 0x6f, 0x70, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x22, 0x47, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x87, 0x01, 0x0a, - 0x15, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x0f, 0x73, - 0x74, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x41, 0x6e, - 0x64, 0x57, 0x61, 0x69, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0e, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x6d, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x03, 0x63, 0x6d, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x79, 0x6e, - 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x23, - 0x0a, 0x0d, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x22, 0x54, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, - 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x52, 0x0a, 0x16, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, + 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x41, 0x0a, 0x19, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, + 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, - 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x7a, 0x0a, - 0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x75, - 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, - 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x22, 0x87, 0x01, 0x0a, 0x10, 0x4c, 0x6f, - 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, - 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, - 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, - 0x79, 0x70, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, - 0x6e, 0x76, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x64, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x65, - 0x6e, 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, - 0x70, 0x65, 0x6e, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, - 0x5f, 0x63, 0x6d, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, - 0x43, 0x6d, 0x64, 0x22, 0xbc, 0x01, 0x0a, 0x0f, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x50, 0x0a, - 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, - 0x41, 0x0a, 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x2a, 0x27, 0x0a, 0x06, 0x54, 0x72, 0x69, 0x4f, 0x70, 0x74, 0x12, 0x08, 0x0a, 0x04, - 0x4b, 0x45, 0x45, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x52, 0x55, 0x45, 0x10, 0x01, - 0x12, 0x09, 0x0a, 0x05, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10, 0x02, 0x2a, 0x52, 0x0a, 0x0d, 0x53, - 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, - 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x45, - 0x52, 0x52, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x59, 0x50, 0x45, 0x57, 0x4f, 0x52, 0x4b, - 0x4c, 0x4f, 0x41, 0x44, 0x49, 0x44, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x08, 0x45, 0x52, 0x55, 0x45, - 0x52, 0x52, 0x4f, 0x52, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x32, - 0xc1, 0x14, 0x0a, 0x07, 0x43, 0x6f, 0x72, 0x65, 0x52, 0x50, 0x43, 0x12, 0x21, 0x0a, 0x04, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0c, - 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x36, - 0x0a, 0x12, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x22, 0x00, 0x30, 0x01, 0x12, 0x36, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0c, - 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x22, 0x00, 0x12, 0x3a, - 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0b, 0x2e, 0x70, 0x62, - 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x11, 0x44, 0x69, - 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, - 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x26, 0x0a, 0x06, 0x41, 0x64, - 0x64, 0x50, 0x6f, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x64, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x07, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, - 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x09, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x12, - 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x26, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x12, 0x11, 0x2e, 0x70, - 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x07, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x22, 0x00, 0x12, 0x21, 0x0a, 0x08, 0x4c, 0x69, - 0x73, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x73, 0x22, 0x00, 0x12, 0x36, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, - 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x11, 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x10, 0x2e, - 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x29, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, - 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x30, - 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x2e, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, - 0x12, 0x31, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, - 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, - 0x73, 0x22, 0x00, 0x12, 0x34, 0x0a, 0x0e, 0x50, 0x6f, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, - 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x29, 0x0a, 0x07, 0x47, 0x65, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, - 0x64, 0x65, 0x22, 0x00, 0x12, 0x29, 0x0a, 0x07, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, - 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x1a, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, - 0x00, 0x12, 0x3e, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x41, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x11, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, - 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, - 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x2e, 0x70, - 0x62, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x2d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, - 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x00, - 0x12, 0x30, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, - 0x73, 0x1a, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0c, 0x2e, - 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x38, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x73, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x12, 0x47, 0x65, 0x74, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x73, - 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x2e, - 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x2e, 0x70, - 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1f, 0x2e, 0x70, 0x62, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1f, 0x2e, 0x70, - 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x43, - 0x6f, 0x70, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, - 0x43, 0x6f, 0x70, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x2c, 0x0a, 0x04, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, - 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, - 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2e, 0x0a, 0x16, 0x52, 0x65, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6f, 0x0a, 0x0b, 0x43, 0x6f, 0x70, + 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x47, 0x0a, 0x0b, 0x53, 0x65, + 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x22, 0x87, 0x01, 0x0a, 0x15, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, + 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x39, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x70, 0x62, + 0x2e, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, + 0x73, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x22, 0x9a, 0x01, + 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x6f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x62, + 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, + 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x63, 0x6d, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x63, 0x6d, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x61, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x73, + 0x79, 0x6e, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x54, 0x0a, 0x16, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x22, 0x52, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x7a, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x69, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, + 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x69, 0x6e, + 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x6c, + 0x6f, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, + 0x22, 0x87, 0x01, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x39, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x74, + 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x64, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x16, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x64, 0x69, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x64, 0x69, 0x72, + 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x12, + 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x5f, 0x63, 0x6d, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x43, 0x6d, 0x64, 0x22, 0xbc, 0x01, 0x0a, 0x0f, 0x43, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, + 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x50, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x70, 0x62, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x27, 0x0a, 0x06, 0x54, 0x72, 0x69, + 0x4f, 0x70, 0x74, 0x12, 0x08, 0x0a, 0x04, 0x4b, 0x45, 0x45, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, + 0x04, 0x54, 0x52, 0x55, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x41, 0x4c, 0x53, 0x45, + 0x10, 0x02, 0x2a, 0x52, 0x0a, 0x0d, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x10, 0x00, 0x12, + 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x54, + 0x59, 0x50, 0x45, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x49, 0x44, 0x10, 0x06, 0x12, + 0x15, 0x0a, 0x08, 0x45, 0x52, 0x55, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x32, 0xfa, 0x14, 0x0a, 0x07, 0x43, 0x6f, 0x72, 0x65, 0x52, + 0x50, 0x43, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x12, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x09, 0x2e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x30, 0x01, 0x12, 0x36, 0x0a, + 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x16, 0x2e, + 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x1a, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, + 0x00, 0x12, 0x3e, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, + 0x00, 0x12, 0x26, 0x0a, 0x06, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, + 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x07, + 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x09, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x26, 0x0a, 0x06, 0x47, 0x65, 0x74, + 0x50, 0x6f, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x07, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x22, + 0x00, 0x12, 0x21, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x09, 0x2e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, + 0x64, 0x73, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, + 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x50, + 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x11, + 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x29, 0x0a, 0x07, 0x41, 0x64, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, + 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, + 0x6f, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, + 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x00, 0x12, 0x34, 0x0a, 0x0e, 0x50, 0x6f, + 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x2e, 0x70, + 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x29, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x29, 0x0a, 0x07, 0x53, + 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, + 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x48, + 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x09, 0x2e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x41, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x11, 0x43, + 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x73, 0x1a, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x0d, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x22, 0x00, 0x30, 0x01, 0x12, 0x38, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x12, 0x2e, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x00, + 0x12, 0x3c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x4a, + 0x0a, 0x12, 0x53, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x14, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x12, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x1a, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x43, 0x6f, 0x70, 0x79, + 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x0f, + 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x4c, 0x61, 0x72, 0x67, + 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, @@ -7410,7 +7603,7 @@ func file_rpc_gen_core_proto_rawDescGZIP() []byte { } var file_rpc_gen_core_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_rpc_gen_core_proto_msgTypes = make([]protoimpl.MessageInfo, 133) +var file_rpc_gen_core_proto_msgTypes = make([]protoimpl.MessageInfo, 136) var file_rpc_gen_core_proto_goTypes = []interface{}{ (TriOpt)(0), // 0: pb.TriOpt (StdStreamType)(0), // 1: pb.StdStreamType @@ -7477,265 +7670,274 @@ var file_rpc_gen_core_proto_goTypes = []interface{}{ (*FileOwner)(nil), // 62: pb.FileOwner (*FileMode)(nil), // 63: pb.FileMode (*SendOptions)(nil), // 64: pb.SendOptions - (*ErrorDetail)(nil), // 65: pb.ErrorDetail - (*BuildImageMessage)(nil), // 66: pb.BuildImageMessage - (*CreateWorkloadMessage)(nil), // 67: pb.CreateWorkloadMessage - (*ReplaceWorkloadMessage)(nil), // 68: pb.ReplaceWorkloadMessage - (*CacheImageMessage)(nil), // 69: pb.CacheImageMessage - (*RemoveImageMessage)(nil), // 70: pb.RemoveImageMessage - (*ImageItem)(nil), // 71: pb.ImageItem - (*ListImageMessage)(nil), // 72: pb.ListImageMessage - (*RemoveWorkloadMessage)(nil), // 73: pb.RemoveWorkloadMessage - (*DissociateWorkloadMessage)(nil), // 74: pb.DissociateWorkloadMessage - (*ReallocResourceMessage)(nil), // 75: pb.ReallocResourceMessage - (*CopyMessage)(nil), // 76: pb.CopyMessage - (*SendMessage)(nil), // 77: pb.SendMessage - (*AttachWorkloadMessage)(nil), // 78: pb.AttachWorkloadMessage - (*RunAndWaitOptions)(nil), // 79: pb.RunAndWaitOptions - (*ControlWorkloadOptions)(nil), // 80: pb.ControlWorkloadOptions - (*ControlWorkloadMessage)(nil), // 81: pb.ControlWorkloadMessage - (*LogStreamOptions)(nil), // 82: pb.LogStreamOptions - (*LogStreamMessage)(nil), // 83: pb.LogStreamMessage - (*ExecuteWorkloadOptions)(nil), // 84: pb.ExecuteWorkloadOptions - (*CapacityMessage)(nil), // 85: pb.CapacityMessage - nil, // 86: pb.ListWorkloadsOptions.LabelsEntry - nil, // 87: pb.Node.CpuEntry - nil, // 88: pb.Node.LabelsEntry - nil, // 89: pb.Node.InitCpuEntry - nil, // 90: pb.Node.NumaEntry - nil, // 91: pb.Node.NumaMemoryEntry - nil, // 92: pb.Node.InitVolumeEntry - nil, // 93: pb.Node.VolumeEntry - nil, // 94: pb.Node.InitNumaMemoryEntry - nil, // 95: pb.SetNodeOptions.DeltaCpuEntry - nil, // 96: pb.SetNodeOptions.DeltaNumaMemoryEntry - nil, // 97: pb.SetNodeOptions.NumaEntry - nil, // 98: pb.SetNodeOptions.LabelsEntry - nil, // 99: pb.SetNodeOptions.DeltaVolumeEntry - nil, // 100: pb.NodeFilter.LabelsEntry - nil, // 101: pb.Workload.LabelsEntry - nil, // 102: pb.Workload.PublishEntry - nil, // 103: pb.WorkloadStatus.NetworksEntry - nil, // 104: pb.WorkloadStatusStreamOptions.LabelsEntry - nil, // 105: pb.AddNodeOptions.LabelsEntry - nil, // 106: pb.AddNodeOptions.NumaEntry - nil, // 107: pb.AddNodeOptions.NumaMemoryEntry - nil, // 108: pb.AddNodeOptions.VolumeMapEntry - nil, // 109: pb.GetNodeOptions.LabelsEntry - nil, // 110: pb.ListNodesOptions.LabelsEntry - nil, // 111: pb.Build.EnvsEntry - nil, // 112: pb.Build.ArgsEntry - nil, // 113: pb.Build.LabelsEntry - nil, // 114: pb.Build.ArtifactsEntry - nil, // 115: pb.Build.CacheEntry - nil, // 116: pb.Builds.BuildsEntry - nil, // 117: pb.LogOptions.ConfigEntry - nil, // 118: pb.EntrypointOptions.SysctlsEntry - nil, // 119: pb.Resource.CpuEntry - nil, // 120: pb.Resource.VolumePlanLimitEntry - nil, // 121: pb.Resource.VolumePlanRequestEntry - nil, // 122: pb.Volume.VolumeEntry - nil, // 123: pb.DeployOptions.NetworksEntry - nil, // 124: pb.DeployOptions.LabelsEntry - nil, // 125: pb.DeployOptions.NodelabelsEntry - nil, // 126: pb.DeployOptions.DataEntry - nil, // 127: pb.DeployOptions.ModesEntry - nil, // 128: pb.DeployOptions.OwnersEntry - nil, // 129: pb.ReplaceOptions.FilterLabelsEntry - nil, // 130: pb.ReplaceOptions.CopyEntry - nil, // 131: pb.CopyOptions.TargetsEntry - nil, // 132: pb.SendOptions.DataEntry - nil, // 133: pb.SendOptions.ModesEntry - nil, // 134: pb.SendOptions.OwnersEntry - nil, // 135: pb.CreateWorkloadMessage.PublishEntry - nil, // 136: pb.CapacityMessage.NodeCapacitiesEntry + (*FileOptions)(nil), // 65: pb.FileOptions + (*ErrorDetail)(nil), // 66: pb.ErrorDetail + (*BuildImageMessage)(nil), // 67: pb.BuildImageMessage + (*CreateWorkloadMessage)(nil), // 68: pb.CreateWorkloadMessage + (*ReplaceWorkloadMessage)(nil), // 69: pb.ReplaceWorkloadMessage + (*CacheImageMessage)(nil), // 70: pb.CacheImageMessage + (*RemoveImageMessage)(nil), // 71: pb.RemoveImageMessage + (*ImageItem)(nil), // 72: pb.ImageItem + (*ListImageMessage)(nil), // 73: pb.ListImageMessage + (*RemoveWorkloadMessage)(nil), // 74: pb.RemoveWorkloadMessage + (*DissociateWorkloadMessage)(nil), // 75: pb.DissociateWorkloadMessage + (*ReallocResourceMessage)(nil), // 76: pb.ReallocResourceMessage + (*CopyMessage)(nil), // 77: pb.CopyMessage + (*SendMessage)(nil), // 78: pb.SendMessage + (*AttachWorkloadMessage)(nil), // 79: pb.AttachWorkloadMessage + (*RunAndWaitOptions)(nil), // 80: pb.RunAndWaitOptions + (*ControlWorkloadOptions)(nil), // 81: pb.ControlWorkloadOptions + (*ControlWorkloadMessage)(nil), // 82: pb.ControlWorkloadMessage + (*LogStreamOptions)(nil), // 83: pb.LogStreamOptions + (*LogStreamMessage)(nil), // 84: pb.LogStreamMessage + (*ExecuteWorkloadOptions)(nil), // 85: pb.ExecuteWorkloadOptions + (*CapacityMessage)(nil), // 86: pb.CapacityMessage + nil, // 87: pb.ListWorkloadsOptions.LabelsEntry + nil, // 88: pb.Node.CpuEntry + nil, // 89: pb.Node.LabelsEntry + nil, // 90: pb.Node.InitCpuEntry + nil, // 91: pb.Node.NumaEntry + nil, // 92: pb.Node.NumaMemoryEntry + nil, // 93: pb.Node.InitVolumeEntry + nil, // 94: pb.Node.VolumeEntry + nil, // 95: pb.Node.InitNumaMemoryEntry + nil, // 96: pb.SetNodeOptions.DeltaCpuEntry + nil, // 97: pb.SetNodeOptions.DeltaNumaMemoryEntry + nil, // 98: pb.SetNodeOptions.NumaEntry + nil, // 99: pb.SetNodeOptions.LabelsEntry + nil, // 100: pb.SetNodeOptions.DeltaVolumeEntry + nil, // 101: pb.NodeFilter.LabelsEntry + nil, // 102: pb.Workload.LabelsEntry + nil, // 103: pb.Workload.PublishEntry + nil, // 104: pb.WorkloadStatus.NetworksEntry + nil, // 105: pb.WorkloadStatusStreamOptions.LabelsEntry + nil, // 106: pb.AddNodeOptions.LabelsEntry + nil, // 107: pb.AddNodeOptions.NumaEntry + nil, // 108: pb.AddNodeOptions.NumaMemoryEntry + nil, // 109: pb.AddNodeOptions.VolumeMapEntry + nil, // 110: pb.GetNodeOptions.LabelsEntry + nil, // 111: pb.ListNodesOptions.LabelsEntry + nil, // 112: pb.Build.EnvsEntry + nil, // 113: pb.Build.ArgsEntry + nil, // 114: pb.Build.LabelsEntry + nil, // 115: pb.Build.ArtifactsEntry + nil, // 116: pb.Build.CacheEntry + nil, // 117: pb.Builds.BuildsEntry + nil, // 118: pb.LogOptions.ConfigEntry + nil, // 119: pb.EntrypointOptions.SysctlsEntry + nil, // 120: pb.Resource.CpuEntry + nil, // 121: pb.Resource.VolumePlanLimitEntry + nil, // 122: pb.Resource.VolumePlanRequestEntry + nil, // 123: pb.Volume.VolumeEntry + nil, // 124: pb.DeployOptions.NetworksEntry + nil, // 125: pb.DeployOptions.LabelsEntry + nil, // 126: pb.DeployOptions.NodelabelsEntry + nil, // 127: pb.DeployOptions.DataEntry + nil, // 128: pb.DeployOptions.ModesEntry + nil, // 129: pb.DeployOptions.OwnersEntry + nil, // 130: pb.ReplaceOptions.FilterLabelsEntry + nil, // 131: pb.ReplaceOptions.CopyEntry + nil, // 132: pb.CopyOptions.TargetsEntry + nil, // 133: pb.SendOptions.DataEntry + nil, // 134: pb.SendOptions.ModesEntry + nil, // 135: pb.SendOptions.OwnersEntry + (*FileOptions_Metadata)(nil), // 136: pb.FileOptions.Metadata + (*FileOptions_Chunk)(nil), // 137: pb.FileOptions.Chunk + nil, // 138: pb.CreateWorkloadMessage.PublishEntry + nil, // 139: pb.CapacityMessage.NodeCapacitiesEntry } var file_rpc_gen_core_proto_depIdxs = []int32{ - 86, // 0: pb.ListWorkloadsOptions.labels:type_name -> pb.ListWorkloadsOptions.LabelsEntry + 87, // 0: pb.ListWorkloadsOptions.labels:type_name -> pb.ListWorkloadsOptions.LabelsEntry 8, // 1: pb.Pods.pods:type_name -> pb.Pod 11, // 2: pb.PodResource.nodes_resource:type_name -> pb.NodeResource 15, // 3: pb.Networks.networks:type_name -> pb.Network - 87, // 4: pb.Node.cpu:type_name -> pb.Node.CpuEntry - 88, // 5: pb.Node.labels:type_name -> pb.Node.LabelsEntry - 89, // 6: pb.Node.init_cpu:type_name -> pb.Node.InitCpuEntry - 90, // 7: pb.Node.numa:type_name -> pb.Node.NumaEntry - 91, // 8: pb.Node.numa_memory:type_name -> pb.Node.NumaMemoryEntry - 92, // 9: pb.Node.init_volume:type_name -> pb.Node.InitVolumeEntry - 93, // 10: pb.Node.volume:type_name -> pb.Node.VolumeEntry - 94, // 11: pb.Node.init_numa_memory:type_name -> pb.Node.InitNumaMemoryEntry + 88, // 4: pb.Node.cpu:type_name -> pb.Node.CpuEntry + 89, // 5: pb.Node.labels:type_name -> pb.Node.LabelsEntry + 90, // 6: pb.Node.init_cpu:type_name -> pb.Node.InitCpuEntry + 91, // 7: pb.Node.numa:type_name -> pb.Node.NumaEntry + 92, // 8: pb.Node.numa_memory:type_name -> pb.Node.NumaMemoryEntry + 93, // 9: pb.Node.init_volume:type_name -> pb.Node.InitVolumeEntry + 94, // 10: pb.Node.volume:type_name -> pb.Node.VolumeEntry + 95, // 11: pb.Node.init_numa_memory:type_name -> pb.Node.InitNumaMemoryEntry 17, // 12: pb.Nodes.nodes:type_name -> pb.Node - 95, // 13: pb.SetNodeOptions.delta_cpu:type_name -> pb.SetNodeOptions.DeltaCpuEntry - 96, // 14: pb.SetNodeOptions.delta_numa_memory:type_name -> pb.SetNodeOptions.DeltaNumaMemoryEntry - 97, // 15: pb.SetNodeOptions.numa:type_name -> pb.SetNodeOptions.NumaEntry - 98, // 16: pb.SetNodeOptions.labels:type_name -> pb.SetNodeOptions.LabelsEntry - 99, // 17: pb.SetNodeOptions.delta_volume:type_name -> pb.SetNodeOptions.DeltaVolumeEntry + 96, // 13: pb.SetNodeOptions.delta_cpu:type_name -> pb.SetNodeOptions.DeltaCpuEntry + 97, // 14: pb.SetNodeOptions.delta_numa_memory:type_name -> pb.SetNodeOptions.DeltaNumaMemoryEntry + 98, // 15: pb.SetNodeOptions.numa:type_name -> pb.SetNodeOptions.NumaEntry + 99, // 16: pb.SetNodeOptions.labels:type_name -> pb.SetNodeOptions.LabelsEntry + 100, // 17: pb.SetNodeOptions.delta_volume:type_name -> pb.SetNodeOptions.DeltaVolumeEntry 0, // 18: pb.SetNodeOptions.bypass_opt:type_name -> pb.TriOpt - 100, // 19: pb.NodeFilter.labels:type_name -> pb.NodeFilter.LabelsEntry - 101, // 20: pb.Workload.labels:type_name -> pb.Workload.LabelsEntry - 102, // 21: pb.Workload.publish:type_name -> pb.Workload.PublishEntry + 101, // 19: pb.NodeFilter.labels:type_name -> pb.NodeFilter.LabelsEntry + 102, // 20: pb.Workload.labels:type_name -> pb.Workload.LabelsEntry + 103, // 21: pb.Workload.publish:type_name -> pb.Workload.PublishEntry 26, // 22: pb.Workload.status:type_name -> pb.WorkloadStatus 53, // 23: pb.Workload.resource:type_name -> pb.Resource - 103, // 24: pb.WorkloadStatus.networks:type_name -> pb.WorkloadStatus.NetworksEntry + 104, // 24: pb.WorkloadStatus.networks:type_name -> pb.WorkloadStatus.NetworksEntry 26, // 25: pb.WorkloadsStatus.status:type_name -> pb.WorkloadStatus 26, // 26: pb.SetWorkloadsStatusOptions.status:type_name -> pb.WorkloadStatus - 104, // 27: pb.WorkloadStatusStreamOptions.labels:type_name -> pb.WorkloadStatusStreamOptions.LabelsEntry + 105, // 27: pb.WorkloadStatusStreamOptions.labels:type_name -> pb.WorkloadStatusStreamOptions.LabelsEntry 25, // 28: pb.WorkloadStatusStreamMessage.workload:type_name -> pb.Workload 26, // 29: pb.WorkloadStatusStreamMessage.status:type_name -> pb.WorkloadStatus 25, // 30: pb.Workloads.workloads:type_name -> pb.Workload 0, // 31: pb.ReallocOptions.bind_cpu_opt:type_name -> pb.TriOpt 52, // 32: pb.ReallocOptions.resource_opts:type_name -> pb.ResourceOptions - 105, // 33: pb.AddNodeOptions.labels:type_name -> pb.AddNodeOptions.LabelsEntry - 106, // 34: pb.AddNodeOptions.numa:type_name -> pb.AddNodeOptions.NumaEntry - 107, // 35: pb.AddNodeOptions.numa_memory:type_name -> pb.AddNodeOptions.NumaMemoryEntry - 108, // 36: pb.AddNodeOptions.volume_map:type_name -> pb.AddNodeOptions.VolumeMapEntry - 109, // 37: pb.GetNodeOptions.labels:type_name -> pb.GetNodeOptions.LabelsEntry + 106, // 33: pb.AddNodeOptions.labels:type_name -> pb.AddNodeOptions.LabelsEntry + 107, // 34: pb.AddNodeOptions.numa:type_name -> pb.AddNodeOptions.NumaEntry + 108, // 35: pb.AddNodeOptions.numa_memory:type_name -> pb.AddNodeOptions.NumaMemoryEntry + 109, // 36: pb.AddNodeOptions.volume_map:type_name -> pb.AddNodeOptions.VolumeMapEntry + 110, // 37: pb.GetNodeOptions.labels:type_name -> pb.GetNodeOptions.LabelsEntry 42, // 38: pb.GetNodeResourceOptions.opts:type_name -> pb.GetNodeOptions - 110, // 39: pb.ListNodesOptions.labels:type_name -> pb.ListNodesOptions.LabelsEntry - 111, // 40: pb.Build.envs:type_name -> pb.Build.EnvsEntry - 112, // 41: pb.Build.args:type_name -> pb.Build.ArgsEntry - 113, // 42: pb.Build.labels:type_name -> pb.Build.LabelsEntry - 114, // 43: pb.Build.artifacts:type_name -> pb.Build.ArtifactsEntry - 115, // 44: pb.Build.cache:type_name -> pb.Build.CacheEntry - 116, // 45: pb.Builds.builds:type_name -> pb.Builds.BuildsEntry + 111, // 39: pb.ListNodesOptions.labels:type_name -> pb.ListNodesOptions.LabelsEntry + 112, // 40: pb.Build.envs:type_name -> pb.Build.EnvsEntry + 113, // 41: pb.Build.args:type_name -> pb.Build.ArgsEntry + 114, // 42: pb.Build.labels:type_name -> pb.Build.LabelsEntry + 115, // 43: pb.Build.artifacts:type_name -> pb.Build.ArtifactsEntry + 116, // 44: pb.Build.cache:type_name -> pb.Build.CacheEntry + 117, // 45: pb.Builds.builds:type_name -> pb.Builds.BuildsEntry 46, // 46: pb.BuildImageOptions.builds:type_name -> pb.Builds 2, // 47: pb.BuildImageOptions.build_method:type_name -> pb.BuildImageOptions.BuildMethod - 117, // 48: pb.LogOptions.config:type_name -> pb.LogOptions.ConfigEntry + 118, // 48: pb.LogOptions.config:type_name -> pb.LogOptions.ConfigEntry 50, // 49: pb.EntrypointOptions.log:type_name -> pb.LogOptions 49, // 50: pb.EntrypointOptions.healthcheck:type_name -> pb.HealthCheckOptions 48, // 51: pb.EntrypointOptions.hook:type_name -> pb.HookOptions - 118, // 52: pb.EntrypointOptions.sysctls:type_name -> pb.EntrypointOptions.SysctlsEntry - 119, // 53: pb.Resource.cpu:type_name -> pb.Resource.CpuEntry - 120, // 54: pb.Resource.volume_plan_limit:type_name -> pb.Resource.VolumePlanLimitEntry - 121, // 55: pb.Resource.volume_plan_request:type_name -> pb.Resource.VolumePlanRequestEntry - 122, // 56: pb.Volume.volume:type_name -> pb.Volume.VolumeEntry + 119, // 52: pb.EntrypointOptions.sysctls:type_name -> pb.EntrypointOptions.SysctlsEntry + 120, // 53: pb.Resource.cpu:type_name -> pb.Resource.CpuEntry + 121, // 54: pb.Resource.volume_plan_limit:type_name -> pb.Resource.VolumePlanLimitEntry + 122, // 55: pb.Resource.volume_plan_request:type_name -> pb.Resource.VolumePlanRequestEntry + 123, // 56: pb.Volume.volume:type_name -> pb.Volume.VolumeEntry 51, // 57: pb.DeployOptions.entrypoint:type_name -> pb.EntrypointOptions - 123, // 58: pb.DeployOptions.networks:type_name -> pb.DeployOptions.NetworksEntry - 124, // 59: pb.DeployOptions.labels:type_name -> pb.DeployOptions.LabelsEntry - 125, // 60: pb.DeployOptions.nodelabels:type_name -> pb.DeployOptions.NodelabelsEntry + 124, // 58: pb.DeployOptions.networks:type_name -> pb.DeployOptions.NetworksEntry + 125, // 59: pb.DeployOptions.labels:type_name -> pb.DeployOptions.LabelsEntry + 126, // 60: pb.DeployOptions.nodelabels:type_name -> pb.DeployOptions.NodelabelsEntry 3, // 61: pb.DeployOptions.deploy_strategy:type_name -> pb.DeployOptions.Strategy - 126, // 62: pb.DeployOptions.data:type_name -> pb.DeployOptions.DataEntry + 127, // 62: pb.DeployOptions.data:type_name -> pb.DeployOptions.DataEntry 52, // 63: pb.DeployOptions.resource_opts:type_name -> pb.ResourceOptions 24, // 64: pb.DeployOptions.node_filter:type_name -> pb.NodeFilter - 127, // 65: pb.DeployOptions.modes:type_name -> pb.DeployOptions.ModesEntry - 128, // 66: pb.DeployOptions.owners:type_name -> pb.DeployOptions.OwnersEntry + 128, // 65: pb.DeployOptions.modes:type_name -> pb.DeployOptions.ModesEntry + 129, // 66: pb.DeployOptions.owners:type_name -> pb.DeployOptions.OwnersEntry 55, // 67: pb.ReplaceOptions.deployOpt:type_name -> pb.DeployOptions - 129, // 68: pb.ReplaceOptions.filter_labels:type_name -> pb.ReplaceOptions.FilterLabelsEntry - 130, // 69: pb.ReplaceOptions.copy:type_name -> pb.ReplaceOptions.CopyEntry - 131, // 70: pb.CopyOptions.targets:type_name -> pb.CopyOptions.TargetsEntry - 132, // 71: pb.SendOptions.data:type_name -> pb.SendOptions.DataEntry - 133, // 72: pb.SendOptions.modes:type_name -> pb.SendOptions.ModesEntry - 134, // 73: pb.SendOptions.owners:type_name -> pb.SendOptions.OwnersEntry - 65, // 74: pb.BuildImageMessage.error_detail:type_name -> pb.ErrorDetail - 135, // 75: pb.CreateWorkloadMessage.publish:type_name -> pb.CreateWorkloadMessage.PublishEntry - 53, // 76: pb.CreateWorkloadMessage.resource:type_name -> pb.Resource - 67, // 77: pb.ReplaceWorkloadMessage.create:type_name -> pb.CreateWorkloadMessage - 73, // 78: pb.ReplaceWorkloadMessage.remove:type_name -> pb.RemoveWorkloadMessage - 71, // 79: pb.ListImageMessage.images:type_name -> pb.ImageItem - 1, // 80: pb.AttachWorkloadMessage.std_stream_type:type_name -> pb.StdStreamType - 55, // 81: pb.RunAndWaitOptions.deploy_options:type_name -> pb.DeployOptions - 1, // 82: pb.LogStreamMessage.std_stream_type:type_name -> pb.StdStreamType - 136, // 83: pb.CapacityMessage.node_capacities:type_name -> pb.CapacityMessage.NodeCapacitiesEntry - 45, // 84: pb.Builds.BuildsEntry.value:type_name -> pb.Build - 54, // 85: pb.Resource.VolumePlanLimitEntry.value:type_name -> pb.Volume - 54, // 86: pb.Resource.VolumePlanRequestEntry.value:type_name -> pb.Volume - 63, // 87: pb.DeployOptions.ModesEntry.value:type_name -> pb.FileMode - 62, // 88: pb.DeployOptions.OwnersEntry.value:type_name -> pb.FileOwner - 60, // 89: pb.CopyOptions.TargetsEntry.value:type_name -> pb.CopyPaths - 63, // 90: pb.SendOptions.ModesEntry.value:type_name -> pb.FileMode - 62, // 91: pb.SendOptions.OwnersEntry.value:type_name -> pb.FileOwner - 4, // 92: pb.CoreRPC.Info:input_type -> pb.Empty - 4, // 93: pb.CoreRPC.WatchServiceStatus:input_type -> pb.Empty - 12, // 94: pb.CoreRPC.ListNetworks:input_type -> pb.ListNetworkOptions - 13, // 95: pb.CoreRPC.ConnectNetwork:input_type -> pb.ConnectNetworkOptions - 14, // 96: pb.CoreRPC.DisconnectNetwork:input_type -> pb.DisconnectNetworkOptions - 37, // 97: pb.CoreRPC.AddPod:input_type -> pb.AddPodOptions - 38, // 98: pb.CoreRPC.RemovePod:input_type -> pb.RemovePodOptions - 39, // 99: pb.CoreRPC.GetPod:input_type -> pb.GetPodOptions - 4, // 100: pb.CoreRPC.ListPods:input_type -> pb.Empty - 39, // 101: pb.CoreRPC.GetPodResource:input_type -> pb.GetPodOptions - 39, // 102: pb.CoreRPC.PodResourceStream:input_type -> pb.GetPodOptions - 40, // 103: pb.CoreRPC.AddNode:input_type -> pb.AddNodeOptions - 41, // 104: pb.CoreRPC.RemoveNode:input_type -> pb.RemoveNodeOptions - 44, // 105: pb.CoreRPC.ListPodNodes:input_type -> pb.ListNodesOptions - 44, // 106: pb.CoreRPC.PodNodesStream:input_type -> pb.ListNodesOptions - 42, // 107: pb.CoreRPC.GetNode:input_type -> pb.GetNodeOptions - 20, // 108: pb.CoreRPC.SetNode:input_type -> pb.SetNodeOptions - 21, // 109: pb.CoreRPC.SetNodeStatus:input_type -> pb.SetNodeStatusOptions - 22, // 110: pb.CoreRPC.GetNodeStatus:input_type -> pb.GetNodeStatusOptions - 4, // 111: pb.CoreRPC.NodeStatusStream:input_type -> pb.Empty - 43, // 112: pb.CoreRPC.GetNodeResource:input_type -> pb.GetNodeResourceOptions - 55, // 113: pb.CoreRPC.CalculateCapacity:input_type -> pb.DeployOptions - 32, // 114: pb.CoreRPC.GetWorkload:input_type -> pb.WorkloadID - 33, // 115: pb.CoreRPC.GetWorkloads:input_type -> pb.WorkloadIDs - 7, // 116: pb.CoreRPC.ListWorkloads:input_type -> pb.ListWorkloadsOptions - 42, // 117: pb.CoreRPC.ListNodeWorkloads:input_type -> pb.GetNodeOptions - 33, // 118: pb.CoreRPC.GetWorkloadsStatus:input_type -> pb.WorkloadIDs - 28, // 119: pb.CoreRPC.SetWorkloadsStatus:input_type -> pb.SetWorkloadsStatusOptions - 29, // 120: pb.CoreRPC.WorkloadStatusStream:input_type -> pb.WorkloadStatusStreamOptions - 61, // 121: pb.CoreRPC.Copy:input_type -> pb.CopyOptions - 64, // 122: pb.CoreRPC.Send:input_type -> pb.SendOptions - 47, // 123: pb.CoreRPC.BuildImage:input_type -> pb.BuildImageOptions - 57, // 124: pb.CoreRPC.CacheImage:input_type -> pb.CacheImageOptions - 58, // 125: pb.CoreRPC.RemoveImage:input_type -> pb.RemoveImageOptions - 59, // 126: pb.CoreRPC.ListImage:input_type -> pb.ListImageOptions - 55, // 127: pb.CoreRPC.CreateWorkload:input_type -> pb.DeployOptions - 56, // 128: pb.CoreRPC.ReplaceWorkload:input_type -> pb.ReplaceOptions - 34, // 129: pb.CoreRPC.RemoveWorkload:input_type -> pb.RemoveWorkloadOptions - 35, // 130: pb.CoreRPC.DissociateWorkload:input_type -> pb.DissociateWorkloadOptions - 80, // 131: pb.CoreRPC.ControlWorkload:input_type -> pb.ControlWorkloadOptions - 84, // 132: pb.CoreRPC.ExecuteWorkload:input_type -> pb.ExecuteWorkloadOptions - 36, // 133: pb.CoreRPC.ReallocResource:input_type -> pb.ReallocOptions - 82, // 134: pb.CoreRPC.LogStream:input_type -> pb.LogStreamOptions - 79, // 135: pb.CoreRPC.RunAndWait:input_type -> pb.RunAndWaitOptions - 5, // 136: pb.CoreRPC.Info:output_type -> pb.CoreInfo - 6, // 137: pb.CoreRPC.WatchServiceStatus:output_type -> pb.ServiceStatus - 16, // 138: pb.CoreRPC.ListNetworks:output_type -> pb.Networks - 15, // 139: pb.CoreRPC.ConnectNetwork:output_type -> pb.Network - 4, // 140: pb.CoreRPC.DisconnectNetwork:output_type -> pb.Empty - 8, // 141: pb.CoreRPC.AddPod:output_type -> pb.Pod - 4, // 142: pb.CoreRPC.RemovePod:output_type -> pb.Empty - 8, // 143: pb.CoreRPC.GetPod:output_type -> pb.Pod - 9, // 144: pb.CoreRPC.ListPods:output_type -> pb.Pods - 10, // 145: pb.CoreRPC.GetPodResource:output_type -> pb.PodResource - 11, // 146: pb.CoreRPC.PodResourceStream:output_type -> pb.NodeResource - 17, // 147: pb.CoreRPC.AddNode:output_type -> pb.Node - 4, // 148: pb.CoreRPC.RemoveNode:output_type -> pb.Empty - 18, // 149: pb.CoreRPC.ListPodNodes:output_type -> pb.Nodes - 17, // 150: pb.CoreRPC.PodNodesStream:output_type -> pb.Node - 17, // 151: pb.CoreRPC.GetNode:output_type -> pb.Node - 17, // 152: pb.CoreRPC.SetNode:output_type -> pb.Node - 4, // 153: pb.CoreRPC.SetNodeStatus:output_type -> pb.Empty - 23, // 154: pb.CoreRPC.GetNodeStatus:output_type -> pb.NodeStatusStreamMessage - 23, // 155: pb.CoreRPC.NodeStatusStream:output_type -> pb.NodeStatusStreamMessage - 11, // 156: pb.CoreRPC.GetNodeResource:output_type -> pb.NodeResource - 85, // 157: pb.CoreRPC.CalculateCapacity:output_type -> pb.CapacityMessage - 25, // 158: pb.CoreRPC.GetWorkload:output_type -> pb.Workload - 31, // 159: pb.CoreRPC.GetWorkloads:output_type -> pb.Workloads - 25, // 160: pb.CoreRPC.ListWorkloads:output_type -> pb.Workload - 31, // 161: pb.CoreRPC.ListNodeWorkloads:output_type -> pb.Workloads - 27, // 162: pb.CoreRPC.GetWorkloadsStatus:output_type -> pb.WorkloadsStatus - 27, // 163: pb.CoreRPC.SetWorkloadsStatus:output_type -> pb.WorkloadsStatus - 30, // 164: pb.CoreRPC.WorkloadStatusStream:output_type -> pb.WorkloadStatusStreamMessage - 76, // 165: pb.CoreRPC.Copy:output_type -> pb.CopyMessage - 77, // 166: pb.CoreRPC.Send:output_type -> pb.SendMessage - 66, // 167: pb.CoreRPC.BuildImage:output_type -> pb.BuildImageMessage - 69, // 168: pb.CoreRPC.CacheImage:output_type -> pb.CacheImageMessage - 70, // 169: pb.CoreRPC.RemoveImage:output_type -> pb.RemoveImageMessage - 72, // 170: pb.CoreRPC.ListImage:output_type -> pb.ListImageMessage - 67, // 171: pb.CoreRPC.CreateWorkload:output_type -> pb.CreateWorkloadMessage - 68, // 172: pb.CoreRPC.ReplaceWorkload:output_type -> pb.ReplaceWorkloadMessage - 73, // 173: pb.CoreRPC.RemoveWorkload:output_type -> pb.RemoveWorkloadMessage - 74, // 174: pb.CoreRPC.DissociateWorkload:output_type -> pb.DissociateWorkloadMessage - 81, // 175: pb.CoreRPC.ControlWorkload:output_type -> pb.ControlWorkloadMessage - 78, // 176: pb.CoreRPC.ExecuteWorkload:output_type -> pb.AttachWorkloadMessage - 75, // 177: pb.CoreRPC.ReallocResource:output_type -> pb.ReallocResourceMessage - 83, // 178: pb.CoreRPC.LogStream:output_type -> pb.LogStreamMessage - 78, // 179: pb.CoreRPC.RunAndWait:output_type -> pb.AttachWorkloadMessage - 136, // [136:180] is the sub-list for method output_type - 92, // [92:136] is the sub-list for method input_type - 92, // [92:92] is the sub-list for extension type_name - 92, // [92:92] is the sub-list for extension extendee - 0, // [0:92] is the sub-list for field type_name + 130, // 68: pb.ReplaceOptions.filter_labels:type_name -> pb.ReplaceOptions.FilterLabelsEntry + 131, // 69: pb.ReplaceOptions.copy:type_name -> pb.ReplaceOptions.CopyEntry + 132, // 70: pb.CopyOptions.targets:type_name -> pb.CopyOptions.TargetsEntry + 133, // 71: pb.SendOptions.data:type_name -> pb.SendOptions.DataEntry + 134, // 72: pb.SendOptions.modes:type_name -> pb.SendOptions.ModesEntry + 135, // 73: pb.SendOptions.owners:type_name -> pb.SendOptions.OwnersEntry + 136, // 74: pb.FileOptions.metadata:type_name -> pb.FileOptions.Metadata + 137, // 75: pb.FileOptions.chunk:type_name -> pb.FileOptions.Chunk + 66, // 76: pb.BuildImageMessage.error_detail:type_name -> pb.ErrorDetail + 138, // 77: pb.CreateWorkloadMessage.publish:type_name -> pb.CreateWorkloadMessage.PublishEntry + 53, // 78: pb.CreateWorkloadMessage.resource:type_name -> pb.Resource + 68, // 79: pb.ReplaceWorkloadMessage.create:type_name -> pb.CreateWorkloadMessage + 74, // 80: pb.ReplaceWorkloadMessage.remove:type_name -> pb.RemoveWorkloadMessage + 72, // 81: pb.ListImageMessage.images:type_name -> pb.ImageItem + 1, // 82: pb.AttachWorkloadMessage.std_stream_type:type_name -> pb.StdStreamType + 55, // 83: pb.RunAndWaitOptions.deploy_options:type_name -> pb.DeployOptions + 1, // 84: pb.LogStreamMessage.std_stream_type:type_name -> pb.StdStreamType + 139, // 85: pb.CapacityMessage.node_capacities:type_name -> pb.CapacityMessage.NodeCapacitiesEntry + 45, // 86: pb.Builds.BuildsEntry.value:type_name -> pb.Build + 54, // 87: pb.Resource.VolumePlanLimitEntry.value:type_name -> pb.Volume + 54, // 88: pb.Resource.VolumePlanRequestEntry.value:type_name -> pb.Volume + 63, // 89: pb.DeployOptions.ModesEntry.value:type_name -> pb.FileMode + 62, // 90: pb.DeployOptions.OwnersEntry.value:type_name -> pb.FileOwner + 60, // 91: pb.CopyOptions.TargetsEntry.value:type_name -> pb.CopyPaths + 63, // 92: pb.SendOptions.ModesEntry.value:type_name -> pb.FileMode + 62, // 93: pb.SendOptions.OwnersEntry.value:type_name -> pb.FileOwner + 63, // 94: pb.FileOptions.Metadata.mode:type_name -> pb.FileMode + 62, // 95: pb.FileOptions.Metadata.owner:type_name -> pb.FileOwner + 4, // 96: pb.CoreRPC.Info:input_type -> pb.Empty + 4, // 97: pb.CoreRPC.WatchServiceStatus:input_type -> pb.Empty + 12, // 98: pb.CoreRPC.ListNetworks:input_type -> pb.ListNetworkOptions + 13, // 99: pb.CoreRPC.ConnectNetwork:input_type -> pb.ConnectNetworkOptions + 14, // 100: pb.CoreRPC.DisconnectNetwork:input_type -> pb.DisconnectNetworkOptions + 37, // 101: pb.CoreRPC.AddPod:input_type -> pb.AddPodOptions + 38, // 102: pb.CoreRPC.RemovePod:input_type -> pb.RemovePodOptions + 39, // 103: pb.CoreRPC.GetPod:input_type -> pb.GetPodOptions + 4, // 104: pb.CoreRPC.ListPods:input_type -> pb.Empty + 39, // 105: pb.CoreRPC.GetPodResource:input_type -> pb.GetPodOptions + 39, // 106: pb.CoreRPC.PodResourceStream:input_type -> pb.GetPodOptions + 40, // 107: pb.CoreRPC.AddNode:input_type -> pb.AddNodeOptions + 41, // 108: pb.CoreRPC.RemoveNode:input_type -> pb.RemoveNodeOptions + 44, // 109: pb.CoreRPC.ListPodNodes:input_type -> pb.ListNodesOptions + 44, // 110: pb.CoreRPC.PodNodesStream:input_type -> pb.ListNodesOptions + 42, // 111: pb.CoreRPC.GetNode:input_type -> pb.GetNodeOptions + 20, // 112: pb.CoreRPC.SetNode:input_type -> pb.SetNodeOptions + 21, // 113: pb.CoreRPC.SetNodeStatus:input_type -> pb.SetNodeStatusOptions + 22, // 114: pb.CoreRPC.GetNodeStatus:input_type -> pb.GetNodeStatusOptions + 4, // 115: pb.CoreRPC.NodeStatusStream:input_type -> pb.Empty + 43, // 116: pb.CoreRPC.GetNodeResource:input_type -> pb.GetNodeResourceOptions + 55, // 117: pb.CoreRPC.CalculateCapacity:input_type -> pb.DeployOptions + 32, // 118: pb.CoreRPC.GetWorkload:input_type -> pb.WorkloadID + 33, // 119: pb.CoreRPC.GetWorkloads:input_type -> pb.WorkloadIDs + 7, // 120: pb.CoreRPC.ListWorkloads:input_type -> pb.ListWorkloadsOptions + 42, // 121: pb.CoreRPC.ListNodeWorkloads:input_type -> pb.GetNodeOptions + 33, // 122: pb.CoreRPC.GetWorkloadsStatus:input_type -> pb.WorkloadIDs + 28, // 123: pb.CoreRPC.SetWorkloadsStatus:input_type -> pb.SetWorkloadsStatusOptions + 29, // 124: pb.CoreRPC.WorkloadStatusStream:input_type -> pb.WorkloadStatusStreamOptions + 61, // 125: pb.CoreRPC.Copy:input_type -> pb.CopyOptions + 64, // 126: pb.CoreRPC.Send:input_type -> pb.SendOptions + 65, // 127: pb.CoreRPC.SendLargeFile:input_type -> pb.FileOptions + 47, // 128: pb.CoreRPC.BuildImage:input_type -> pb.BuildImageOptions + 57, // 129: pb.CoreRPC.CacheImage:input_type -> pb.CacheImageOptions + 58, // 130: pb.CoreRPC.RemoveImage:input_type -> pb.RemoveImageOptions + 59, // 131: pb.CoreRPC.ListImage:input_type -> pb.ListImageOptions + 55, // 132: pb.CoreRPC.CreateWorkload:input_type -> pb.DeployOptions + 56, // 133: pb.CoreRPC.ReplaceWorkload:input_type -> pb.ReplaceOptions + 34, // 134: pb.CoreRPC.RemoveWorkload:input_type -> pb.RemoveWorkloadOptions + 35, // 135: pb.CoreRPC.DissociateWorkload:input_type -> pb.DissociateWorkloadOptions + 81, // 136: pb.CoreRPC.ControlWorkload:input_type -> pb.ControlWorkloadOptions + 85, // 137: pb.CoreRPC.ExecuteWorkload:input_type -> pb.ExecuteWorkloadOptions + 36, // 138: pb.CoreRPC.ReallocResource:input_type -> pb.ReallocOptions + 83, // 139: pb.CoreRPC.LogStream:input_type -> pb.LogStreamOptions + 80, // 140: pb.CoreRPC.RunAndWait:input_type -> pb.RunAndWaitOptions + 5, // 141: pb.CoreRPC.Info:output_type -> pb.CoreInfo + 6, // 142: pb.CoreRPC.WatchServiceStatus:output_type -> pb.ServiceStatus + 16, // 143: pb.CoreRPC.ListNetworks:output_type -> pb.Networks + 15, // 144: pb.CoreRPC.ConnectNetwork:output_type -> pb.Network + 4, // 145: pb.CoreRPC.DisconnectNetwork:output_type -> pb.Empty + 8, // 146: pb.CoreRPC.AddPod:output_type -> pb.Pod + 4, // 147: pb.CoreRPC.RemovePod:output_type -> pb.Empty + 8, // 148: pb.CoreRPC.GetPod:output_type -> pb.Pod + 9, // 149: pb.CoreRPC.ListPods:output_type -> pb.Pods + 10, // 150: pb.CoreRPC.GetPodResource:output_type -> pb.PodResource + 11, // 151: pb.CoreRPC.PodResourceStream:output_type -> pb.NodeResource + 17, // 152: pb.CoreRPC.AddNode:output_type -> pb.Node + 4, // 153: pb.CoreRPC.RemoveNode:output_type -> pb.Empty + 18, // 154: pb.CoreRPC.ListPodNodes:output_type -> pb.Nodes + 17, // 155: pb.CoreRPC.PodNodesStream:output_type -> pb.Node + 17, // 156: pb.CoreRPC.GetNode:output_type -> pb.Node + 17, // 157: pb.CoreRPC.SetNode:output_type -> pb.Node + 4, // 158: pb.CoreRPC.SetNodeStatus:output_type -> pb.Empty + 23, // 159: pb.CoreRPC.GetNodeStatus:output_type -> pb.NodeStatusStreamMessage + 23, // 160: pb.CoreRPC.NodeStatusStream:output_type -> pb.NodeStatusStreamMessage + 11, // 161: pb.CoreRPC.GetNodeResource:output_type -> pb.NodeResource + 86, // 162: pb.CoreRPC.CalculateCapacity:output_type -> pb.CapacityMessage + 25, // 163: pb.CoreRPC.GetWorkload:output_type -> pb.Workload + 31, // 164: pb.CoreRPC.GetWorkloads:output_type -> pb.Workloads + 25, // 165: pb.CoreRPC.ListWorkloads:output_type -> pb.Workload + 31, // 166: pb.CoreRPC.ListNodeWorkloads:output_type -> pb.Workloads + 27, // 167: pb.CoreRPC.GetWorkloadsStatus:output_type -> pb.WorkloadsStatus + 27, // 168: pb.CoreRPC.SetWorkloadsStatus:output_type -> pb.WorkloadsStatus + 30, // 169: pb.CoreRPC.WorkloadStatusStream:output_type -> pb.WorkloadStatusStreamMessage + 77, // 170: pb.CoreRPC.Copy:output_type -> pb.CopyMessage + 78, // 171: pb.CoreRPC.Send:output_type -> pb.SendMessage + 78, // 172: pb.CoreRPC.SendLargeFile:output_type -> pb.SendMessage + 67, // 173: pb.CoreRPC.BuildImage:output_type -> pb.BuildImageMessage + 70, // 174: pb.CoreRPC.CacheImage:output_type -> pb.CacheImageMessage + 71, // 175: pb.CoreRPC.RemoveImage:output_type -> pb.RemoveImageMessage + 73, // 176: pb.CoreRPC.ListImage:output_type -> pb.ListImageMessage + 68, // 177: pb.CoreRPC.CreateWorkload:output_type -> pb.CreateWorkloadMessage + 69, // 178: pb.CoreRPC.ReplaceWorkload:output_type -> pb.ReplaceWorkloadMessage + 74, // 179: pb.CoreRPC.RemoveWorkload:output_type -> pb.RemoveWorkloadMessage + 75, // 180: pb.CoreRPC.DissociateWorkload:output_type -> pb.DissociateWorkloadMessage + 82, // 181: pb.CoreRPC.ControlWorkload:output_type -> pb.ControlWorkloadMessage + 79, // 182: pb.CoreRPC.ExecuteWorkload:output_type -> pb.AttachWorkloadMessage + 76, // 183: pb.CoreRPC.ReallocResource:output_type -> pb.ReallocResourceMessage + 84, // 184: pb.CoreRPC.LogStream:output_type -> pb.LogStreamMessage + 79, // 185: pb.CoreRPC.RunAndWait:output_type -> pb.AttachWorkloadMessage + 141, // [141:186] is the sub-list for method output_type + 96, // [96:141] is the sub-list for method input_type + 96, // [96:96] is the sub-list for extension type_name + 96, // [96:96] is the sub-list for extension extendee + 0, // [0:96] is the sub-list for field type_name } func init() { file_rpc_gen_core_proto_init() } @@ -8477,7 +8679,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ErrorDetail); i { + switch v := v.(*FileOptions); i { case 0: return &v.state case 1: @@ -8489,7 +8691,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildImageMessage); i { + switch v := v.(*ErrorDetail); i { case 0: return &v.state case 1: @@ -8501,7 +8703,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateWorkloadMessage); i { + switch v := v.(*BuildImageMessage); i { case 0: return &v.state case 1: @@ -8513,7 +8715,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReplaceWorkloadMessage); i { + switch v := v.(*CreateWorkloadMessage); i { case 0: return &v.state case 1: @@ -8525,7 +8727,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CacheImageMessage); i { + switch v := v.(*ReplaceWorkloadMessage); i { case 0: return &v.state case 1: @@ -8537,7 +8739,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveImageMessage); i { + switch v := v.(*CacheImageMessage); i { case 0: return &v.state case 1: @@ -8549,7 +8751,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImageItem); i { + switch v := v.(*RemoveImageMessage); i { case 0: return &v.state case 1: @@ -8561,7 +8763,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListImageMessage); i { + switch v := v.(*ImageItem); i { case 0: return &v.state case 1: @@ -8573,7 +8775,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RemoveWorkloadMessage); i { + switch v := v.(*ListImageMessage); i { case 0: return &v.state case 1: @@ -8585,7 +8787,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DissociateWorkloadMessage); i { + switch v := v.(*RemoveWorkloadMessage); i { case 0: return &v.state case 1: @@ -8597,7 +8799,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReallocResourceMessage); i { + switch v := v.(*DissociateWorkloadMessage); i { case 0: return &v.state case 1: @@ -8609,7 +8811,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CopyMessage); i { + switch v := v.(*ReallocResourceMessage); i { case 0: return &v.state case 1: @@ -8621,7 +8823,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendMessage); i { + switch v := v.(*CopyMessage); i { case 0: return &v.state case 1: @@ -8633,7 +8835,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AttachWorkloadMessage); i { + switch v := v.(*SendMessage); i { case 0: return &v.state case 1: @@ -8645,7 +8847,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunAndWaitOptions); i { + switch v := v.(*AttachWorkloadMessage); i { case 0: return &v.state case 1: @@ -8657,7 +8859,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ControlWorkloadOptions); i { + switch v := v.(*RunAndWaitOptions); i { case 0: return &v.state case 1: @@ -8669,7 +8871,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ControlWorkloadMessage); i { + switch v := v.(*ControlWorkloadOptions); i { case 0: return &v.state case 1: @@ -8681,7 +8883,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogStreamOptions); i { + switch v := v.(*ControlWorkloadMessage); i { case 0: return &v.state case 1: @@ -8693,7 +8895,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogStreamMessage); i { + switch v := v.(*LogStreamOptions); i { case 0: return &v.state case 1: @@ -8705,7 +8907,7 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExecuteWorkloadOptions); i { + switch v := v.(*LogStreamMessage); i { case 0: return &v.state case 1: @@ -8717,6 +8919,18 @@ func file_rpc_gen_core_proto_init() { } } file_rpc_gen_core_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExecuteWorkloadOptions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rpc_gen_core_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CapacityMessage); i { case 0: return &v.state @@ -8728,6 +8942,30 @@ func file_rpc_gen_core_proto_init() { return nil } } + file_rpc_gen_core_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FileOptions_Metadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_rpc_gen_core_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*FileOptions_Chunk); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -8735,7 +8973,7 @@ func file_rpc_gen_core_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_rpc_gen_core_proto_rawDesc, NumEnums: 4, - NumMessages: 133, + NumMessages: 136, NumExtensions: 0, NumServices: 1, }, diff --git a/rpc/gen/core.proto b/rpc/gen/core.proto index b8eb02e2a..33c356ddf 100644 --- a/rpc/gen/core.proto +++ b/rpc/gen/core.proto @@ -44,6 +44,7 @@ service CoreRPC { rpc Copy(CopyOptions) returns (stream CopyMessage) {}; rpc Send(SendOptions) returns (stream SendMessage) {}; + rpc SendLargeFile(stream FileOptions) returns (stream SendMessage) {}; rpc BuildImage(BuildImageOptions) returns (stream BuildImageMessage) {}; rpc CacheImage(CacheImageOptions) returns (stream CacheImageMessage) {}; @@ -540,6 +541,20 @@ message SendOptions { map owners = 4; } +message FileOptions { + message Metadata { + repeated string ids = 1; + string dst = 2; + FileMode mode = 3; + FileOwner owner = 4; + } + message Chunk { + bytes data = 1; + } + Metadata metadata = 1; + Chunk chunk = 2; +} + message ErrorDetail { int64 code = 1; string message = 2; diff --git a/rpc/gen/core_grpc.pb.go b/rpc/gen/core_grpc.pb.go index 31ee5b22a..00c1fac2e 100644 --- a/rpc/gen/core_grpc.pb.go +++ b/rpc/gen/core_grpc.pb.go @@ -1,4 +1,8 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.2.0 +// - protoc v3.17.3 +// source: rpc/gen/core.proto package pb @@ -49,6 +53,7 @@ type CoreRPCClient interface { WorkloadStatusStream(ctx context.Context, in *WorkloadStatusStreamOptions, opts ...grpc.CallOption) (CoreRPC_WorkloadStatusStreamClient, error) Copy(ctx context.Context, in *CopyOptions, opts ...grpc.CallOption) (CoreRPC_CopyClient, error) Send(ctx context.Context, in *SendOptions, opts ...grpc.CallOption) (CoreRPC_SendClient, error) + SendLargeFile(ctx context.Context, opts ...grpc.CallOption) (CoreRPC_SendLargeFileClient, error) BuildImage(ctx context.Context, in *BuildImageOptions, opts ...grpc.CallOption) (CoreRPC_BuildImageClient, error) CacheImage(ctx context.Context, in *CacheImageOptions, opts ...grpc.CallOption) (CoreRPC_CacheImageClient, error) RemoveImage(ctx context.Context, in *RemoveImageOptions, opts ...grpc.CallOption) (CoreRPC_RemoveImageClient, error) @@ -535,8 +540,39 @@ func (x *coreRPCSendClient) Recv() (*SendMessage, error) { return m, nil } +func (c *coreRPCClient) SendLargeFile(ctx context.Context, opts ...grpc.CallOption) (CoreRPC_SendLargeFileClient, error) { + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[8], "/pb.CoreRPC/SendLargeFile", opts...) + if err != nil { + return nil, err + } + x := &coreRPCSendLargeFileClient{stream} + return x, nil +} + +type CoreRPC_SendLargeFileClient interface { + Send(*FileOptions) error + Recv() (*SendMessage, error) + grpc.ClientStream +} + +type coreRPCSendLargeFileClient struct { + grpc.ClientStream +} + +func (x *coreRPCSendLargeFileClient) Send(m *FileOptions) error { + return x.ClientStream.SendMsg(m) +} + +func (x *coreRPCSendLargeFileClient) Recv() (*SendMessage, error) { + m := new(SendMessage) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *coreRPCClient) BuildImage(ctx context.Context, in *BuildImageOptions, opts ...grpc.CallOption) (CoreRPC_BuildImageClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[8], "/pb.CoreRPC/BuildImage", opts...) + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[9], "/pb.CoreRPC/BuildImage", opts...) if err != nil { return nil, err } @@ -568,7 +604,7 @@ func (x *coreRPCBuildImageClient) Recv() (*BuildImageMessage, error) { } func (c *coreRPCClient) CacheImage(ctx context.Context, in *CacheImageOptions, opts ...grpc.CallOption) (CoreRPC_CacheImageClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[9], "/pb.CoreRPC/CacheImage", opts...) + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[10], "/pb.CoreRPC/CacheImage", opts...) if err != nil { return nil, err } @@ -600,7 +636,7 @@ func (x *coreRPCCacheImageClient) Recv() (*CacheImageMessage, error) { } func (c *coreRPCClient) RemoveImage(ctx context.Context, in *RemoveImageOptions, opts ...grpc.CallOption) (CoreRPC_RemoveImageClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[10], "/pb.CoreRPC/RemoveImage", opts...) + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[11], "/pb.CoreRPC/RemoveImage", opts...) if err != nil { return nil, err } @@ -632,7 +668,7 @@ func (x *coreRPCRemoveImageClient) Recv() (*RemoveImageMessage, error) { } func (c *coreRPCClient) ListImage(ctx context.Context, in *ListImageOptions, opts ...grpc.CallOption) (CoreRPC_ListImageClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[11], "/pb.CoreRPC/ListImage", opts...) + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[12], "/pb.CoreRPC/ListImage", opts...) if err != nil { return nil, err } @@ -664,7 +700,7 @@ func (x *coreRPCListImageClient) Recv() (*ListImageMessage, error) { } func (c *coreRPCClient) CreateWorkload(ctx context.Context, in *DeployOptions, opts ...grpc.CallOption) (CoreRPC_CreateWorkloadClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[12], "/pb.CoreRPC/CreateWorkload", opts...) + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[13], "/pb.CoreRPC/CreateWorkload", opts...) if err != nil { return nil, err } @@ -696,7 +732,7 @@ func (x *coreRPCCreateWorkloadClient) Recv() (*CreateWorkloadMessage, error) { } func (c *coreRPCClient) ReplaceWorkload(ctx context.Context, in *ReplaceOptions, opts ...grpc.CallOption) (CoreRPC_ReplaceWorkloadClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[13], "/pb.CoreRPC/ReplaceWorkload", opts...) + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[14], "/pb.CoreRPC/ReplaceWorkload", opts...) if err != nil { return nil, err } @@ -728,7 +764,7 @@ func (x *coreRPCReplaceWorkloadClient) Recv() (*ReplaceWorkloadMessage, error) { } func (c *coreRPCClient) RemoveWorkload(ctx context.Context, in *RemoveWorkloadOptions, opts ...grpc.CallOption) (CoreRPC_RemoveWorkloadClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[14], "/pb.CoreRPC/RemoveWorkload", opts...) + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[15], "/pb.CoreRPC/RemoveWorkload", opts...) if err != nil { return nil, err } @@ -760,7 +796,7 @@ func (x *coreRPCRemoveWorkloadClient) Recv() (*RemoveWorkloadMessage, error) { } func (c *coreRPCClient) DissociateWorkload(ctx context.Context, in *DissociateWorkloadOptions, opts ...grpc.CallOption) (CoreRPC_DissociateWorkloadClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[15], "/pb.CoreRPC/DissociateWorkload", opts...) + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[16], "/pb.CoreRPC/DissociateWorkload", opts...) if err != nil { return nil, err } @@ -792,7 +828,7 @@ func (x *coreRPCDissociateWorkloadClient) Recv() (*DissociateWorkloadMessage, er } func (c *coreRPCClient) ControlWorkload(ctx context.Context, in *ControlWorkloadOptions, opts ...grpc.CallOption) (CoreRPC_ControlWorkloadClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[16], "/pb.CoreRPC/ControlWorkload", opts...) + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[17], "/pb.CoreRPC/ControlWorkload", opts...) if err != nil { return nil, err } @@ -824,7 +860,7 @@ func (x *coreRPCControlWorkloadClient) Recv() (*ControlWorkloadMessage, error) { } func (c *coreRPCClient) ExecuteWorkload(ctx context.Context, opts ...grpc.CallOption) (CoreRPC_ExecuteWorkloadClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[17], "/pb.CoreRPC/ExecuteWorkload", opts...) + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[18], "/pb.CoreRPC/ExecuteWorkload", opts...) if err != nil { return nil, err } @@ -864,7 +900,7 @@ func (c *coreRPCClient) ReallocResource(ctx context.Context, in *ReallocOptions, } func (c *coreRPCClient) LogStream(ctx context.Context, in *LogStreamOptions, opts ...grpc.CallOption) (CoreRPC_LogStreamClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[18], "/pb.CoreRPC/LogStream", opts...) + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[19], "/pb.CoreRPC/LogStream", opts...) if err != nil { return nil, err } @@ -896,7 +932,7 @@ func (x *coreRPCLogStreamClient) Recv() (*LogStreamMessage, error) { } func (c *coreRPCClient) RunAndWait(ctx context.Context, opts ...grpc.CallOption) (CoreRPC_RunAndWaitClient, error) { - stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[19], "/pb.CoreRPC/RunAndWait", opts...) + stream, err := c.cc.NewStream(ctx, &CoreRPC_ServiceDesc.Streams[20], "/pb.CoreRPC/RunAndWait", opts...) if err != nil { return nil, err } @@ -961,6 +997,7 @@ type CoreRPCServer interface { WorkloadStatusStream(*WorkloadStatusStreamOptions, CoreRPC_WorkloadStatusStreamServer) error Copy(*CopyOptions, CoreRPC_CopyServer) error Send(*SendOptions, CoreRPC_SendServer) error + SendLargeFile(CoreRPC_SendLargeFileServer) error BuildImage(*BuildImageOptions, CoreRPC_BuildImageServer) error CacheImage(*CacheImageOptions, CoreRPC_CacheImageServer) error RemoveImage(*RemoveImageOptions, CoreRPC_RemoveImageServer) error @@ -1073,6 +1110,9 @@ func (UnimplementedCoreRPCServer) Copy(*CopyOptions, CoreRPC_CopyServer) error { func (UnimplementedCoreRPCServer) Send(*SendOptions, CoreRPC_SendServer) error { return status.Errorf(codes.Unimplemented, "method Send not implemented") } +func (UnimplementedCoreRPCServer) SendLargeFile(CoreRPC_SendLargeFileServer) error { + return status.Errorf(codes.Unimplemented, "method SendLargeFile not implemented") +} func (UnimplementedCoreRPCServer) BuildImage(*BuildImageOptions, CoreRPC_BuildImageServer) error { return status.Errorf(codes.Unimplemented, "method BuildImage not implemented") } @@ -1706,6 +1746,32 @@ func (x *coreRPCSendServer) Send(m *SendMessage) error { return x.ServerStream.SendMsg(m) } +func _CoreRPC_SendLargeFile_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(CoreRPCServer).SendLargeFile(&coreRPCSendLargeFileServer{stream}) +} + +type CoreRPC_SendLargeFileServer interface { + Send(*SendMessage) error + Recv() (*FileOptions, error) + grpc.ServerStream +} + +type coreRPCSendLargeFileServer struct { + grpc.ServerStream +} + +func (x *coreRPCSendLargeFileServer) Send(m *SendMessage) error { + return x.ServerStream.SendMsg(m) +} + +func (x *coreRPCSendLargeFileServer) Recv() (*FileOptions, error) { + m := new(FileOptions) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func _CoreRPC_BuildImage_Handler(srv interface{}, stream grpc.ServerStream) error { m := new(BuildImageOptions) if err := stream.RecvMsg(m); err != nil { @@ -2131,6 +2197,12 @@ var CoreRPC_ServiceDesc = grpc.ServiceDesc{ Handler: _CoreRPC_Send_Handler, ServerStreams: true, }, + { + StreamName: "SendLargeFile", + Handler: _CoreRPC_SendLargeFile_Handler, + ServerStreams: true, + ClientStreams: true, + }, { StreamName: "BuildImage", Handler: _CoreRPC_BuildImage_Handler, diff --git a/rpc/rpc.go b/rpc/rpc.go index 912b4fb69..6215a5098 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -586,6 +586,63 @@ func (v *Vibranium) Send(opts *pb.SendOptions, stream pb.CoreRPC_SendServer) err return nil } +func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { + ctx := v.taskAdd(server.Context(), "SendLargeFile", true) + defer v.taskDone(ctx, "SendLargeFile", true) + + fileDetails := &pb.SendOptions{ + Ids: []string{}, + Data: make(map[string][]byte), + Modes: make(map[string]*pb.FileMode), + Owners: make(map[string]*pb.FileOwner), + } + for { + req, err := server.Recv() + if err == io.EOF { + break + } + if err != nil { + return grpcstatus.Error(SendLargeFile, err.Error()) + } + metaData := req.Metadata + chunk := req.Chunk + + if _, ok := fileDetails.Data[metaData.Dst]; !ok { + fileDetails.Ids = metaData.Ids + fileDetails.Data[metaData.Dst] = make([]byte, 0) + fileDetails.Modes[metaData.Dst] = metaData.Mode + fileDetails.Owners[metaData.Dst] = metaData.Owner + } + fileDetails.Data[metaData.Dst] = append(fileDetails.Data[metaData.Dst], chunk.Data...) + } + + sendOpts, err := toCoreSendOptions(fileDetails) + if err != nil { + return grpcstatus.Error(SendLargeFile, err.Error()) + } + + ch, err := v.cluster.Send(ctx, sendOpts) + if err != nil { + return grpcstatus.Error(SendLargeFile, err.Error()) + } + + for m := range ch { + msg := &pb.SendMessage{ + Id: m.ID, + Path: m.Path, + } + + if m.Error != nil { + msg.Error = m.Error.Error() + } + + if err := server.Send(msg); err != nil { + v.logUnsentMessages(ctx, "SendLargeFile", err, m) + } + } + return nil +} + // BuildImage streamed returned functions func (v *Vibranium) BuildImage(opts *pb.BuildImageOptions, stream pb.CoreRPC_BuildImageServer) error { ctx := v.taskAdd(stream.Context(), "BuildImage", true) From ef9967fee46fdda64b07d81c5a31619f516d47c4 Mon Sep 17 00:00:00 2001 From: HJ Date: Sun, 16 Jan 2022 20:51:14 +0800 Subject: [PATCH 02/29] Finished the code and can compile successfully, but it hasn't been tested yet --- cluster/calcium/sendlarge.go | 58 +++++++++++++++++++++++++++++++++ cluster/cluster.go | 1 + engine/docker/container.go | 32 ++++++++++++++++++ engine/engine.go | 1 + engine/fake/fake.go | 5 +++ engine/mocks/API.go | 14 ++++++++ engine/mocks/fakeengine/mock.go | 1 + engine/types/virtualization.go | 7 ++++ engine/virt/virt.go | 5 +++ rpc/rpc.go | 45 +++++++++++-------------- types/options.go | 35 ++++++++++++++++++++ 11 files changed, 178 insertions(+), 26 deletions(-) create mode 100644 cluster/calcium/sendlarge.go diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go new file mode 100644 index 000000000..50ce1a4b5 --- /dev/null +++ b/cluster/calcium/sendlarge.go @@ -0,0 +1,58 @@ +package calcium + +import ( + "context" + "github.com/pkg/errors" + "github.com/projecteru2/core/engine" + "github.com/projecteru2/core/log" + "github.com/projecteru2/core/types" + "github.com/projecteru2/core/utils" + "io" + "sync" +) + +// SendLargeFile send large files by stream to workload +func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeFileOptions, resp chan *types.SendMessage) error { + logger := log.WithField("Calcium", "SendLargeFile").WithField("opts", opts) + utils.SentryGo(func() { + defer close(resp) + wg := &sync.WaitGroup{} + + writerMap := make(map[string]map[string]*io.PipeWriter) + for data := range opts { + if err := data.Validate(); err != nil { + continue + } + + dst := data.FileMetadataOptions.Dst + for _, id := range data.FileMetadataOptions.Ids { + if _, ok := writerMap[id]; !ok { + writerMap[id] = make(map[string]*io.PipeWriter) + } + if _, ok := writerMap[id][dst]; !ok { + pr, pw := io.Pipe() + writerMap[id][dst] = pw + utils.SentryGo(func(id string) func() { + return func() { + defer wg.Done() + if err := c.withWorkloadLocked(ctx, id, func(ctx context.Context, workload *types.Workload) error { + err := c.doSendChunkFileToWorkload(ctx, workload.Engine, workload.ID, dst, pr, data.Uid, data.Gid, data.Mode) + resp <- &types.SendMessage{ID: id, Path: dst, Error: logger.Err(ctx, err)} + return nil + }); err != nil { + resp <- &types.SendMessage{ID: id, Error: logger.Err(ctx, err)} + } + } + }(id)) + } + writerMap[id][dst].Write(data.Data) + } + } + }) + return nil +} + +func (c *Calcium) doSendChunkFileToWorkload(ctx context.Context, engine engine.API, ID, name string, content io.Reader, uid, gid int, mode int64) error { + log.Infof(ctx, "[doSendChunkFileToWorkload] Send file to %s:%s", ID, name) + return errors.WithStack(engine.VirtualizationCopyChunkTo(ctx, ID, name, content, uid, gid, mode)) +} \ No newline at end of file diff --git a/cluster/cluster.go b/cluster/cluster.go index 2d9a8b108..967226303 100644 --- a/cluster/cluster.go +++ b/cluster/cluster.go @@ -73,6 +73,7 @@ type Cluster interface { // file methods Copy(ctx context.Context, opts *types.CopyOptions) (chan *types.CopyMessage, error) Send(ctx context.Context, opts *types.SendOptions) (chan *types.SendMessage, error) + SendLargeFile(ctx context.Context, opts chan *types.SendLargeFileOptions, resp chan *types.SendMessage) error // image methods BuildImage(ctx context.Context, opts *types.BuildOptions) (chan *types.BuildImageMessage, error) CacheImage(ctx context.Context, opts *types.ImageOptions) (chan *types.CacheImageMessage, error) diff --git a/engine/docker/container.go b/engine/docker/container.go index b5dc2a576..93abcce4a 100644 --- a/engine/docker/container.go +++ b/engine/docker/container.go @@ -331,6 +331,38 @@ func (e *Engine) VirtualizationCopyTo(ctx context.Context, ID, target string, co }) } +// VirtualizationCopyChunkTo copy chunk to virtualization +func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target string, content io.Reader, uid, gid int, mode int64) error { + // todo 把reader转为tar reader + pr, pw := io.Pipe() + tw := tar.NewWriter(pw) + defer tw.Close() + hdr := &tar.Header{ + Name: filepath.Base(target), + //Size: int64(len(data)), + Mode: mode, + Uid: uid, + Gid: gid, + } + if err := tw.WriteHeader(hdr); err != nil { + return err + } + utils.SentryGo(func(writer io.Writer, reader io.Reader) func() { + return func() { + data := make([]byte, 0) + _, err := content.Read(data) + if err != nil { + return + } + _, err = tw.Write(data) + if err != nil { + return + } + } + }(pw, content)) + return e.client.CopyToContainer(ctx, ID, filepath.Dir(target), pr, dockertypes.CopyToContainerOptions{AllowOverwriteDirWithFile: true, CopyUIDGID: false}) +} + // VirtualizationStart start virtualization func (e *Engine) VirtualizationStart(ctx context.Context, ID string) error { return e.client.ContainerStart(ctx, ID, dockertypes.ContainerStartOptions{}) diff --git a/engine/engine.go b/engine/engine.go index b2a117378..aea19f1a2 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -39,6 +39,7 @@ type API interface { VirtualizationCreate(ctx context.Context, opts *enginetypes.VirtualizationCreateOptions) (*enginetypes.VirtualizationCreated, error) VirtualizationResourceRemap(context.Context, *enginetypes.VirtualizationRemapOptions) (<-chan enginetypes.VirtualizationRemapMessage, error) VirtualizationCopyTo(ctx context.Context, ID, target string, content []byte, uid, gid int, mode int64) error + VirtualizationCopyChunkTo(ctx context.Context, ID, target string, content io.Reader, uid, gid int, mode int64) error VirtualizationStart(ctx context.Context, ID string) error VirtualizationStop(ctx context.Context, ID string, gracefulTimeout time.Duration) error VirtualizationRemove(ctx context.Context, ID string, volumes, force bool) error diff --git a/engine/fake/fake.go b/engine/fake/fake.go index f9b7992b5..7b64784d1 100644 --- a/engine/fake/fake.go +++ b/engine/fake/fake.go @@ -128,6 +128,11 @@ func (f *Engine) VirtualizationCopyTo(ctx context.Context, ID, target string, co return types.ErrNilEngine } +// VirtualizationCopyChunkTo . +func (f *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target string, content io.Reader, uid, gid int, mode int64) error { + return types.ErrNilEngine +} + // VirtualizationStart . func (f *Engine) VirtualizationStart(ctx context.Context, ID string) error { return types.ErrNilEngine diff --git a/engine/mocks/API.go b/engine/mocks/API.go index de04eb33f..91352e933 100644 --- a/engine/mocks/API.go +++ b/engine/mocks/API.go @@ -575,6 +575,20 @@ func (_m *API) VirtualizationCopyTo(ctx context.Context, ID string, target strin return r0 } +// VVirtualizationCopyChunkTo provides a mock function with given fields: ctx, ID, target, content, uid, gid, mode +func (_m *API) VirtualizationCopyChunkTo(ctx context.Context, ID, target string, content io.Reader, uid, gid int, mode int64) error { + ret := _m.Called(ctx, ID, target, content, uid, gid, mode) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, io.Reader, int, int, int64) error); ok { + r0 = rf(ctx, ID, target, content, uid, gid, mode) + } else { + r0 = ret.Error(0) + } + + return r0 +} + // VirtualizationCreate provides a mock function with given fields: ctx, opts func (_m *API) VirtualizationCreate(ctx context.Context, opts *types.VirtualizationCreateOptions) (*types.VirtualizationCreated, error) { ret := _m.Called(ctx, opts) diff --git a/engine/mocks/fakeengine/mock.go b/engine/mocks/fakeengine/mock.go index 37e5ae43b..389648a92 100644 --- a/engine/mocks/fakeengine/mock.go +++ b/engine/mocks/fakeengine/mock.go @@ -95,6 +95,7 @@ func MakeClient(ctx context.Context, config coretypes.Config, nodename, endpoint close(ch) e.On("VirtualizationResourceRemap", mock.Anything, mock.Anything).Return((<-chan enginetypes.VirtualizationRemapMessage)(ch), nil) e.On("VirtualizationCopyTo", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) + e.On("VVirtualizationCopyChunkTo", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) e.On("VirtualizationStart", mock.Anything, mock.Anything).Return(nil) e.On("VirtualizationStop", mock.Anything, mock.Anything, mock.Anything).Return(nil) e.On("VirtualizationRemove", mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) diff --git a/engine/types/virtualization.go b/engine/types/virtualization.go index e987c6a74..0f025fe41 100644 --- a/engine/types/virtualization.go +++ b/engine/types/virtualization.go @@ -82,3 +82,10 @@ type VirtualizationRemapMessage struct { ID string Error error } + +// SendMessage returns from engine +type SendMessage struct { + ID string + Path string + Error error +} \ No newline at end of file diff --git a/engine/virt/virt.go b/engine/virt/virt.go index 645360749..d6e5ef2f7 100644 --- a/engine/virt/virt.go +++ b/engine/virt/virt.go @@ -214,6 +214,11 @@ func (v *Virt) VirtualizationCopyTo(ctx context.Context, ID, dest string, conten return v.client.CopyToGuest(ctx, ID, dest, bytes.NewReader(content), true, true) } +// VirtualizationCopyChunkTo copies one. +func (v *Virt) VirtualizationCopyChunkTo(ctx context.Context, ID, dest string, content io.Reader, uid, gid int, mode int64) error { + return v.client.CopyToGuest(ctx, ID, dest, content, true, true) +} + // VirtualizationStart boots a guest. func (v *Virt) VirtualizationStart(ctx context.Context, ID string) (err error) { _, err = v.client.StartGuest(ctx, ID) diff --git a/rpc/rpc.go b/rpc/rpc.go index 6215a5098..40e162698 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -590,12 +590,18 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { ctx := v.taskAdd(server.Context(), "SendLargeFile", true) defer v.taskDone(ctx, "SendLargeFile", true) - fileDetails := &pb.SendOptions{ - Ids: []string{}, - Data: make(map[string][]byte), - Modes: make(map[string]*pb.FileMode), - Owners: make(map[string]*pb.FileOwner), - } + dc := make(chan *types.SendLargeFileOptions, 0) + ch := make(chan *types.SendMessage, 0) + data := &types.SendLargeFileOptions{} + utils.SentryGo(func(ctx context.Context, opts chan *types.SendLargeFileOptions, resp chan *types.SendMessage) func() { + return func() { + err := v.cluster.SendLargeFile(ctx, opts, resp) + if err != nil { + v.logUnsentMessages(ctx, "SendLargeFile", err, "SendLargeFile") + } + } + }(ctx, dc, ch)) + for { req, err := server.Recv() if err == io.EOF { @@ -604,26 +610,13 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { if err != nil { return grpcstatus.Error(SendLargeFile, err.Error()) } - metaData := req.Metadata - chunk := req.Chunk - - if _, ok := fileDetails.Data[metaData.Dst]; !ok { - fileDetails.Ids = metaData.Ids - fileDetails.Data[metaData.Dst] = make([]byte, 0) - fileDetails.Modes[metaData.Dst] = metaData.Mode - fileDetails.Owners[metaData.Dst] = metaData.Owner - } - fileDetails.Data[metaData.Dst] = append(fileDetails.Data[metaData.Dst], chunk.Data...) - } - - sendOpts, err := toCoreSendOptions(fileDetails) - if err != nil { - return grpcstatus.Error(SendLargeFile, err.Error()) - } - - ch, err := v.cluster.Send(ctx, sendOpts) - if err != nil { - return grpcstatus.Error(SendLargeFile, err.Error()) + data.FileMetadataOptions.Ids = req.Metadata.Ids + data.FileMetadataOptions.Dst = req.Metadata.Dst + data.FileMetadataOptions.Uid = int(req.Metadata.Owner.Uid) + data.FileMetadataOptions.Gid = int(req.Metadata.Owner.Gid) + data.FileMetadataOptions.Mode = req.Metadata.Mode.Mode + data.Data = req.Chunk.Data + dc <- data } for m := range ch { diff --git a/types/options.go b/types/options.go index a76be79f9..c2c250005 100644 --- a/types/options.go +++ b/types/options.go @@ -358,3 +358,38 @@ func (r RawArgs) String() string { func (r RawArgs) LitterDump(w io.Writer) { w.Write(r) // nolint:errcheck // here can't import core/log due to cycle dependence } + +// SendLargeFileOptions for LargeFileTransfer +type SendLargeFileOptions struct { + FileMetadataOptions + FileChunkOptions +} + +// FileMetadataOptions for LargeFileTransfer +type FileMetadataOptions struct { + Ids []string + Dst string + Mode int64 + Uid int + Gid int +} + +// FileChunkOptions for LargeFileTransfer +type FileChunkOptions struct { + Data []byte +} + +// Validate checks options +func (o *SendLargeFileOptions) Validate() error { + if len(o.Ids) == 0 { + return errors.WithStack(ErrNoWorkloadIDs) + } + if len(o.Data) == 0 { + return errors.WithStack(ErrNoFilesToSend) + } + if o.Uid == 0 && o.Gid == 0 && o.Mode == 0 { + // we see it as requiring "default perm" + o.Mode = 0755 + } + return nil +} \ No newline at end of file From afceac3ca1e6c0e6b9551b9e9f9438ab8b1a2045 Mon Sep 17 00:00:00 2001 From: HJ Date: Wed, 19 Jan 2022 02:13:10 +0800 Subject: [PATCH 03/29] now it can send large file chunk by chunk, but still need to make some adjustments --- cluster/calcium/sendlarge.go | 16 ++++++++++ engine/docker/container.go | 61 ++++++++++++++++++++++++++---------- rpc/rpc.go | 2 +- 3 files changed, 61 insertions(+), 18 deletions(-) diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index 50ce1a4b5..3c0e07a12 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -7,6 +7,7 @@ import ( "github.com/projecteru2/core/log" "github.com/projecteru2/core/types" "github.com/projecteru2/core/utils" + "github.com/sirupsen/logrus" "io" "sync" ) @@ -20,6 +21,7 @@ func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeF writerMap := make(map[string]map[string]*io.PipeWriter) for data := range opts { + logrus.Debugf("[SendLargeFile] receive some msg, len: %d", len(data.Data)) if err := data.Validate(); err != nil { continue } @@ -27,14 +29,17 @@ func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeF dst := data.FileMetadataOptions.Dst for _, id := range data.FileMetadataOptions.Ids { if _, ok := writerMap[id]; !ok { + logrus.Debugf("[SendLargeFile] gen writerMap[%s]", id) writerMap[id] = make(map[string]*io.PipeWriter) } if _, ok := writerMap[id][dst]; !ok { + wg.Add(1) pr, pw := io.Pipe() writerMap[id][dst] = pw utils.SentryGo(func(id string) func() { return func() { defer wg.Done() + logrus.Debugf("[SendLargeFile] gen goroutine for id:%s", id) if err := c.withWorkloadLocked(ctx, id, func(ctx context.Context, workload *types.Workload) error { err := c.doSendChunkFileToWorkload(ctx, workload.Engine, workload.ID, dst, pr, data.Uid, data.Gid, data.Mode) resp <- &types.SendMessage{ID: id, Path: dst, Error: logger.Err(ctx, err)} @@ -45,9 +50,20 @@ func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeF } }(id)) } + logrus.Debugf("[SendLargeFile] send somethine id: %s; dst: %s", id, dst) writerMap[id][dst].Write(data.Data) } } + logrus.Debugf("[SendLargeFile] send to the end") + for _, m := range writerMap { + for _, w := range m{ + err := w.Close() + if err != nil { + logrus.Debugf("[SendLargeFile] close writer error: %v", err) + } + } + } + wg.Wait() }) return nil } diff --git a/engine/docker/container.go b/engine/docker/container.go index 93abcce4a..69e1f0ed7 100644 --- a/engine/docker/container.go +++ b/engine/docker/container.go @@ -5,6 +5,7 @@ import ( "context" "encoding/json" "fmt" + "github.com/sirupsen/logrus" "io" "io/ioutil" "math" @@ -333,31 +334,57 @@ func (e *Engine) VirtualizationCopyTo(ctx context.Context, ID, target string, co // VirtualizationCopyChunkTo copy chunk to virtualization func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target string, content io.Reader, uid, gid int, mode int64) error { - // todo 把reader转为tar reader + // todo err 怎么抛出 pr, pw := io.Pipe() + //bf := new(bytes.Buffer) tw := tar.NewWriter(pw) defer tw.Close() - hdr := &tar.Header{ - Name: filepath.Base(target), - //Size: int64(len(data)), - Mode: mode, - Uid: uid, - Gid: gid, - } - if err := tw.WriteHeader(hdr); err != nil { - return err - } utils.SentryGo(func(writer io.Writer, reader io.Reader) func() { return func() { - data := make([]byte, 0) - _, err := content.Read(data) - if err != nil { - return + hdr := &tar.Header{ + Name: filepath.Base(target), + // todo client 传过来 + Size: 26357760, + Mode: mode, + Uid: uid, + Gid: gid, } - _, err = tw.Write(data) - if err != nil { + logrus.Debugf("[VirtualizationCopyChunkTo] write header, target: %s, id: %s", target, ID) + if err := tw.WriteHeader(hdr); err != nil { + logrus.Debugf("[VirtualizationCopyChunkTo] write header err, err: %v", err) return } + logrus.Debugf("[VirtualizationCopyChunkTo] write header done, target: %s, id: %s", target, ID) + for { + data := make([]byte, 10 * 1024 * 1024) + logrus.Debugf("try to read.....") + n, err := reader.Read(data) + logrus.Debugf("[VirtualizationCopyChunkTo] read something, len: %d", n) + if err != nil { + if err == io.EOF { + logrus.Debugf("[VirtualizationCopyChunkTo] end!!, target: %s, id: %s", target, ID) + } + logrus.Debugf("[VirtualizationCopyChunkTo] read something error, len: %d", n) + err := writer.(*io.PipeWriter).Close() + if err != nil { + logrus.Debugf("[VirtualizationCopyChunkTo] close pipe writer, err: %v", err) + } + return + } + if n < len(data) { + data = data[:n] + } + _, err = tw.Write(data) + logrus.Debugf("[VirtualizationCopyChunkTo] write something, len: %d", len(data)) + if err != nil { + logrus.Debugf("[VirtualizationCopyChunkTo] write something err, err: %v", err) + err := writer.(*io.PipeWriter).Close() + if err != nil { + logrus.Debugf("[VirtualizationCopyChunkTo] close pipe writer, err: %v", err) + } + return + } + } } }(pw, content)) return e.client.CopyToContainer(ctx, ID, filepath.Dir(target), pr, dockertypes.CopyToContainerOptions{AllowOverwriteDirWithFile: true, CopyUIDGID: false}) diff --git a/rpc/rpc.go b/rpc/rpc.go index 40e162698..92c16495c 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -618,7 +618,7 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { data.Data = req.Chunk.Data dc <- data } - + close(dc) for m := range ch { msg := &pb.SendMessage{ Id: m.ID, From f373ad49357f85d9b5e6ebd151979cd61059bbe7 Mon Sep 17 00:00:00 2001 From: HJ Date: Wed, 19 Jan 2022 18:01:12 +0800 Subject: [PATCH 04/29] add file size in metadata --- cluster/calcium/sendlarge.go | 18 +- engine/docker/container.go | 5 +- engine/engine.go | 2 +- engine/fake/fake.go | 2 +- engine/mocks/API.go | 6 +- engine/virt/virt.go | 2 +- rpc/gen/core.pb.go | 709 ++++++++++++++++++----------------- rpc/gen/core.proto | 5 +- rpc/rpc.go | 1 + types/options.go | 1 + 10 files changed, 381 insertions(+), 370 deletions(-) diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index 3c0e07a12..792d6087c 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -36,19 +36,19 @@ func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeF wg.Add(1) pr, pw := io.Pipe() writerMap[id][dst] = pw - utils.SentryGo(func(id string) func() { + utils.SentryGo(func(ID, name string, size int64, content io.Reader, uid, gid int, mode int64) func() { return func() { defer wg.Done() - logrus.Debugf("[SendLargeFile] gen goroutine for id:%s", id) - if err := c.withWorkloadLocked(ctx, id, func(ctx context.Context, workload *types.Workload) error { - err := c.doSendChunkFileToWorkload(ctx, workload.Engine, workload.ID, dst, pr, data.Uid, data.Gid, data.Mode) - resp <- &types.SendMessage{ID: id, Path: dst, Error: logger.Err(ctx, err)} + logrus.Debugf("[SendLargeFile] gen goroutine for id:%s", ID) + if err := c.withWorkloadLocked(ctx, ID, func(ctx context.Context, workload *types.Workload) error { + err := c.doSendChunkFileToWorkload(ctx, workload.Engine, workload.ID, name, size, content, uid, gid, mode) + resp <- &types.SendMessage{ID: ID, Path: dst, Error: logger.Err(ctx, err)} return nil }); err != nil { - resp <- &types.SendMessage{ID: id, Error: logger.Err(ctx, err)} + resp <- &types.SendMessage{ID: ID, Error: logger.Err(ctx, err)} } } - }(id)) + }(id, dst, data.Size, pr, data.Uid, data.Gid, data.Mode)) } logrus.Debugf("[SendLargeFile] send somethine id: %s; dst: %s", id, dst) writerMap[id][dst].Write(data.Data) @@ -68,7 +68,7 @@ func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeF return nil } -func (c *Calcium) doSendChunkFileToWorkload(ctx context.Context, engine engine.API, ID, name string, content io.Reader, uid, gid int, mode int64) error { +func (c *Calcium) doSendChunkFileToWorkload(ctx context.Context, engine engine.API, ID, name string, size int64, content io.Reader, uid, gid int, mode int64) error { log.Infof(ctx, "[doSendChunkFileToWorkload] Send file to %s:%s", ID, name) - return errors.WithStack(engine.VirtualizationCopyChunkTo(ctx, ID, name, content, uid, gid, mode)) + return errors.WithStack(engine.VirtualizationCopyChunkTo(ctx, ID, name, size, content, uid, gid, mode)) } \ No newline at end of file diff --git a/engine/docker/container.go b/engine/docker/container.go index 69e1f0ed7..ba2915817 100644 --- a/engine/docker/container.go +++ b/engine/docker/container.go @@ -333,7 +333,7 @@ func (e *Engine) VirtualizationCopyTo(ctx context.Context, ID, target string, co } // VirtualizationCopyChunkTo copy chunk to virtualization -func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target string, content io.Reader, uid, gid int, mode int64) error { +func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target string, size int64, content io.Reader, uid, gid int, mode int64) error { // todo err 怎么抛出 pr, pw := io.Pipe() //bf := new(bytes.Buffer) @@ -343,8 +343,7 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin return func() { hdr := &tar.Header{ Name: filepath.Base(target), - // todo client 传过来 - Size: 26357760, + Size: size, Mode: mode, Uid: uid, Gid: gid, diff --git a/engine/engine.go b/engine/engine.go index aea19f1a2..04ee28285 100644 --- a/engine/engine.go +++ b/engine/engine.go @@ -39,7 +39,7 @@ type API interface { VirtualizationCreate(ctx context.Context, opts *enginetypes.VirtualizationCreateOptions) (*enginetypes.VirtualizationCreated, error) VirtualizationResourceRemap(context.Context, *enginetypes.VirtualizationRemapOptions) (<-chan enginetypes.VirtualizationRemapMessage, error) VirtualizationCopyTo(ctx context.Context, ID, target string, content []byte, uid, gid int, mode int64) error - VirtualizationCopyChunkTo(ctx context.Context, ID, target string, content io.Reader, uid, gid int, mode int64) error + VirtualizationCopyChunkTo(ctx context.Context, ID, target string, size int64, content io.Reader, uid, gid int, mode int64) error VirtualizationStart(ctx context.Context, ID string) error VirtualizationStop(ctx context.Context, ID string, gracefulTimeout time.Duration) error VirtualizationRemove(ctx context.Context, ID string, volumes, force bool) error diff --git a/engine/fake/fake.go b/engine/fake/fake.go index 7b64784d1..c78bb16a8 100644 --- a/engine/fake/fake.go +++ b/engine/fake/fake.go @@ -129,7 +129,7 @@ func (f *Engine) VirtualizationCopyTo(ctx context.Context, ID, target string, co } // VirtualizationCopyChunkTo . -func (f *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target string, content io.Reader, uid, gid int, mode int64) error { +func (f *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target string, size int64, content io.Reader, uid, gid int, mode int64) error { return types.ErrNilEngine } diff --git a/engine/mocks/API.go b/engine/mocks/API.go index 91352e933..d10ba9a01 100644 --- a/engine/mocks/API.go +++ b/engine/mocks/API.go @@ -576,12 +576,12 @@ func (_m *API) VirtualizationCopyTo(ctx context.Context, ID string, target strin } // VVirtualizationCopyChunkTo provides a mock function with given fields: ctx, ID, target, content, uid, gid, mode -func (_m *API) VirtualizationCopyChunkTo(ctx context.Context, ID, target string, content io.Reader, uid, gid int, mode int64) error { +func (_m *API) VirtualizationCopyChunkTo(ctx context.Context, ID, target string, size int64, content io.Reader, uid, gid int, mode int64) error { ret := _m.Called(ctx, ID, target, content, uid, gid, mode) var r0 error - if rf, ok := ret.Get(0).(func(context.Context, string, string, io.Reader, int, int, int64) error); ok { - r0 = rf(ctx, ID, target, content, uid, gid, mode) + if rf, ok := ret.Get(0).(func(context.Context, string, string, int64, io.Reader, int, int, int64) error); ok { + r0 = rf(ctx, ID, target, size, content, uid, gid, mode) } else { r0 = ret.Error(0) } diff --git a/engine/virt/virt.go b/engine/virt/virt.go index d6e5ef2f7..7db2008b3 100644 --- a/engine/virt/virt.go +++ b/engine/virt/virt.go @@ -215,7 +215,7 @@ func (v *Virt) VirtualizationCopyTo(ctx context.Context, ID, dest string, conten } // VirtualizationCopyChunkTo copies one. -func (v *Virt) VirtualizationCopyChunkTo(ctx context.Context, ID, dest string, content io.Reader, uid, gid int, mode int64) error { +func (v *Virt) VirtualizationCopyChunkTo(ctx context.Context, ID, dest string, size int64, content io.Reader, uid, gid int, mode int64) error { return v.client.CopyToGuest(ctx, ID, dest, content, true, true) } diff --git a/rpc/gen/core.pb.go b/rpc/gen/core.pb.go index 4e1939e31..cbeecdced 100644 --- a/rpc/gen/core.pb.go +++ b/rpc/gen/core.pb.go @@ -6275,8 +6275,9 @@ type FileOptions_Metadata struct { Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` Dst string `protobuf:"bytes,2,opt,name=dst,proto3" json:"dst,omitempty"` - Mode *FileMode `protobuf:"bytes,3,opt,name=mode,proto3" json:"mode,omitempty"` - Owner *FileOwner `protobuf:"bytes,4,opt,name=owner,proto3" json:"owner,omitempty"` + Size int64 `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"` + Mode *FileMode `protobuf:"bytes,4,opt,name=mode,proto3" json:"mode,omitempty"` + Owner *FileOwner `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` } func (x *FileOptions_Metadata) Reset() { @@ -6325,6 +6326,13 @@ func (x *FileOptions_Metadata) GetDst() string { return "" } +func (x *FileOptions_Metadata) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + func (x *FileOptions_Metadata) GetMode() *FileMode { if x != nil { return x.Mode @@ -7228,366 +7236,367 @@ var file_rpc_gen_core_proto_rawDesc = []byte{ 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x84, 0x02, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x01, 0x22, 0x99, 0x02, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x05, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x75, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, - 0x64, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x64, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, - 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, - 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x1a, 0x1b, 0x0a, 0x05, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3b, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xb9, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x32, 0x0a, - 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x52, 0x0b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x22, 0xdd, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, - 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, - 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x28, 0x0a, 0x08, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x3a, 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x94, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x06, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, - 0x31, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x79, 0x0a, 0x11, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0x60, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x74, - 0x65, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x67, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, - 0x03, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x72, 0x72, 0x22, - 0x55, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x89, 0x01, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, + 0x69, 0x64, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x64, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x6d, 0x6f, 0x64, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, + 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x6f, + 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, + 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, + 0x1a, 0x1b, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3b, 0x0a, + 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, + 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xb9, 0x01, 0x0a, 0x11, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x12, 0x32, 0x0a, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x0b, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0xdd, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, + 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, + 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, + 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, + 0x12, 0x28, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x3a, 0x0a, 0x0c, 0x50, 0x75, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x94, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x6c, 0x61, + 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x31, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, + 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x79, 0x0a, + 0x11, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x41, 0x0a, 0x19, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, - 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2e, 0x0a, 0x16, 0x52, 0x65, 0x61, - 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6f, 0x0a, 0x0b, 0x43, 0x6f, 0x70, - 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, - 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x47, 0x0a, 0x0b, 0x53, 0x65, - 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x22, 0x87, 0x01, 0x0a, 0x15, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, - 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x39, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, - 0x73, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x22, 0x9a, 0x01, - 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x6f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x62, - 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, - 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, - 0x03, 0x63, 0x6d, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x63, 0x6d, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x61, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x73, - 0x79, 0x6e, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x54, 0x0a, 0x16, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, - 0x22, 0x52, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x60, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x67, 0x0a, 0x10, 0x4c, + 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x25, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x65, 0x72, 0x72, 0x22, 0x55, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x41, 0x0a, 0x19, 0x44, + 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2e, + 0x0a, 0x16, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6f, + 0x0a, 0x0b, 0x43, 0x6f, 0x70, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, + 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, + 0x47, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x87, 0x01, 0x0a, 0x15, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, + 0x70, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, + 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, + 0x6f, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x6d, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x03, 0x63, 0x6d, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x73, + 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, + 0x54, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x52, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x7a, 0x0a, 0x10, 0x4c, 0x6f, 0x67, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, + 0x04, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x69, + 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x12, 0x16, 0x0a, + 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, + 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x22, 0x87, 0x01, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x7a, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x69, 0x6c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, - 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x69, 0x6e, - 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x6c, - 0x6f, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, - 0x22, 0x87, 0x01, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x39, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x74, - 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x64, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x16, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x64, 0x69, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x64, 0x69, 0x72, - 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x12, - 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x5f, 0x63, 0x6d, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x43, 0x6d, 0x64, 0x22, 0xbc, 0x01, 0x0a, 0x0f, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x50, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x70, 0x62, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x27, 0x0a, 0x06, 0x54, 0x72, 0x69, - 0x4f, 0x70, 0x74, 0x12, 0x08, 0x0a, 0x04, 0x4b, 0x45, 0x45, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, - 0x04, 0x54, 0x52, 0x55, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x41, 0x4c, 0x53, 0x45, - 0x10, 0x02, 0x2a, 0x52, 0x0a, 0x0d, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x54, - 0x59, 0x50, 0x45, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x49, 0x44, 0x10, 0x06, 0x12, - 0x15, 0x0a, 0x08, 0x45, 0x52, 0x55, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x32, 0xfa, 0x14, 0x0a, 0x07, 0x43, 0x6f, 0x72, 0x65, 0x52, - 0x50, 0x43, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x12, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x09, 0x2e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x30, 0x01, 0x12, 0x36, 0x0a, - 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x16, 0x2e, - 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x73, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x1a, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, - 0x00, 0x12, 0x3e, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, - 0x00, 0x12, 0x26, 0x0a, 0x06, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, - 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x07, - 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x09, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x26, 0x0a, 0x06, 0x47, 0x65, 0x74, - 0x50, 0x6f, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x07, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x22, - 0x00, 0x12, 0x21, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x09, 0x2e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, - 0x64, 0x73, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, - 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x50, - 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x11, - 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x29, 0x0a, 0x07, 0x41, 0x64, - 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, - 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, - 0x6f, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, - 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x00, 0x12, 0x34, 0x0a, 0x0e, 0x50, 0x6f, - 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x2e, 0x70, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, + 0x70, 0x62, 0x2e, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x0d, 0x73, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x22, + 0xbd, 0x01, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x77, + 0x6f, 0x72, 0x6b, 0x64, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x6f, + 0x72, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x73, 0x74, + 0x64, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x6e, 0x53, + 0x74, 0x64, 0x69, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x5f, 0x63, 0x6d, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x43, 0x6d, 0x64, 0x22, + 0xbc, 0x01, 0x0a, 0x0f, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x50, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x6f, 0x64, + 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x4e, + 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x27, + 0x0a, 0x06, 0x54, 0x72, 0x69, 0x4f, 0x70, 0x74, 0x12, 0x08, 0x0a, 0x04, 0x4b, 0x45, 0x45, 0x50, + 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x52, 0x55, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, + 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10, 0x02, 0x2a, 0x52, 0x0a, 0x0d, 0x53, 0x74, 0x64, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x4f, + 0x55, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x10, 0x01, + 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x59, 0x50, 0x45, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, + 0x49, 0x44, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x08, 0x45, 0x52, 0x55, 0x45, 0x52, 0x52, 0x4f, 0x52, + 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x32, 0xfa, 0x14, 0x0a, 0x07, + 0x43, 0x6f, 0x72, 0x65, 0x52, 0x50, 0x43, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, + 0x43, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x12, 0x57, 0x61, + 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x70, 0x62, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x36, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x73, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0e, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x2e, 0x70, + 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x1c, 0x2e, 0x70, 0x62, + 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x26, 0x0a, 0x06, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x64, + 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x1a, 0x07, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x22, 0x00, 0x12, 0x2e, + 0x0a, 0x09, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x12, 0x14, 0x2e, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x26, + 0x0a, 0x06, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, + 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x07, 0x2e, 0x70, 0x62, + 0x2e, 0x50, 0x6f, 0x64, 0x22, 0x00, 0x12, 0x21, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, + 0x64, 0x73, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x08, 0x2e, + 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x73, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x11, 0x2e, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, + 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, + 0x00, 0x12, 0x3c, 0x0a, 0x11, 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, + 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x29, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, + 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, + 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0a, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x0c, + 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x29, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x29, 0x0a, 0x07, 0x53, - 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, - 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, - 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x48, - 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x09, 0x2e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x41, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x11, 0x43, - 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x73, 0x1a, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x0d, 0x4c, 0x69, 0x73, - 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, - 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x22, 0x00, 0x30, 0x01, 0x12, 0x38, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x12, 0x2e, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x00, - 0x12, 0x3c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x4a, - 0x0a, 0x12, 0x53, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x14, 0x57, 0x6f, + 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x00, 0x12, + 0x34, 0x0a, 0x0e, 0x50, 0x6f, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x29, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, + 0x12, 0x29, 0x0a, 0x07, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, + 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0d, 0x53, + 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1b, + 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, + 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x70, + 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x41, 0x0a, + 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x10, 0x2e, 0x70, + 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, + 0x12, 0x3b, 0x0a, 0x11, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, + 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, + 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x0e, 0x2e, 0x70, + 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x1a, 0x0c, 0x2e, 0x70, + 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0c, + 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x70, + 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x73, 0x1a, 0x0d, 0x2e, + 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x00, 0x12, 0x3b, + 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, + 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x00, 0x30, 0x01, 0x12, 0x38, 0x0a, 0x11, 0x4c, + 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x2e, 0x70, 0x62, + 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x73, 0x1a, 0x13, 0x2e, 0x70, + 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x53, + 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, + 0x5c, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x12, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x43, 0x6f, 0x70, 0x79, - 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x0f, - 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x4c, 0x61, 0x72, 0x67, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x3e, 0x0a, - 0x0a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x62, - 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x1a, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, - 0x0a, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x62, - 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x1a, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x41, 0x0a, - 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x3b, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x14, 0x2e, - 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, - 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x45, 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4a, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x12, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, - 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1d, 0x2e, 0x70, 0x62, 0x2e, - 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x44, - 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4d, 0x0a, 0x0f, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1a, 0x2e, 0x70, 0x62, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x0f, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1a, - 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2c, 0x0a, + 0x04, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x53, + 0x65, 0x6e, 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x6e, + 0x64, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, + 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, + 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, + 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, + 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x41, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3b, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x45, 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, + 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1a, 0x2e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4a, 0x0a, + 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x43, 0x0a, 0x0f, 0x52, - 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, - 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x52, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, - 0x12, 0x3b, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x2e, - 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, - 0x0a, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, 0x12, 0x15, 0x2e, 0x70, 0x62, - 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, - 0x01, 0x30, 0x01, 0x42, 0x28, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x72, 0x75, 0x32, 0x2f, 0x63, 0x6f, - 0x72, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x65, 0x6e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x12, 0x44, 0x69, 0x73, + 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1d, + 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, + 0x01, 0x12, 0x4d, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, + 0x12, 0x4e, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, + 0x12, 0x43, 0x0a, 0x0f, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x6f, + 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, + 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x28, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x72, + 0x75, 0x32, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x65, 0x6e, 0x3b, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/rpc/gen/core.proto b/rpc/gen/core.proto index 33c356ddf..a5fb67cb1 100644 --- a/rpc/gen/core.proto +++ b/rpc/gen/core.proto @@ -545,8 +545,9 @@ message FileOptions { message Metadata { repeated string ids = 1; string dst = 2; - FileMode mode = 3; - FileOwner owner = 4; + int64 size = 3; + FileMode mode = 4; + FileOwner owner = 5; } message Chunk { bytes data = 1; diff --git a/rpc/rpc.go b/rpc/rpc.go index 92c16495c..af4b96443 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -612,6 +612,7 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { } data.FileMetadataOptions.Ids = req.Metadata.Ids data.FileMetadataOptions.Dst = req.Metadata.Dst + data.FileMetadataOptions.Size = req.Metadata.Size data.FileMetadataOptions.Uid = int(req.Metadata.Owner.Uid) data.FileMetadataOptions.Gid = int(req.Metadata.Owner.Gid) data.FileMetadataOptions.Mode = req.Metadata.Mode.Mode diff --git a/types/options.go b/types/options.go index c2c250005..fb6fb50f7 100644 --- a/types/options.go +++ b/types/options.go @@ -369,6 +369,7 @@ type SendLargeFileOptions struct { type FileMetadataOptions struct { Ids []string Dst string + Size int64 Mode int64 Uid int Gid int From 27cd4920911da8df79b463be8a6bec8f4ce5be91 Mon Sep 17 00:00:00 2001 From: HJ Date: Tue, 1 Feb 2022 15:21:02 +0800 Subject: [PATCH 05/29] now it can send servel large file, but sometimes they faild and i don't know the reason --- cluster/calcium/sendlarge.go | 90 ++++++++++++++++++++---------------- engine/docker/container.go | 20 +++----- 2 files changed, 58 insertions(+), 52 deletions(-) diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index 792d6087c..fd58a08af 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -7,67 +7,79 @@ import ( "github.com/projecteru2/core/log" "github.com/projecteru2/core/types" "github.com/projecteru2/core/utils" - "github.com/sirupsen/logrus" "io" "sync" ) // SendLargeFile send large files by stream to workload func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeFileOptions, resp chan *types.SendMessage) error { - logger := log.WithField("Calcium", "SendLargeFile").WithField("opts", opts) + //logger := log.WithField("Calcium", "SendLargeFile").WithField("opts", opts) + wg := &sync.WaitGroup{} utils.SentryGo(func() { defer close(resp) - wg := &sync.WaitGroup{} - writerMap := make(map[string]map[string]*io.PipeWriter) + handlers := make(map[string]chan *types.SendLargeFileOptions) for data := range opts { - logrus.Debugf("[SendLargeFile] receive some msg, len: %d", len(data.Data)) if err := data.Validate(); err != nil { continue } - - dst := data.FileMetadataOptions.Dst - for _, id := range data.FileMetadataOptions.Ids { - if _, ok := writerMap[id]; !ok { - logrus.Debugf("[SendLargeFile] gen writerMap[%s]", id) - writerMap[id] = make(map[string]*io.PipeWriter) - } - if _, ok := writerMap[id][dst]; !ok { - wg.Add(1) - pr, pw := io.Pipe() - writerMap[id][dst] = pw - utils.SentryGo(func(ID, name string, size int64, content io.Reader, uid, gid int, mode int64) func() { - return func() { - defer wg.Done() - logrus.Debugf("[SendLargeFile] gen goroutine for id:%s", ID) - if err := c.withWorkloadLocked(ctx, ID, func(ctx context.Context, workload *types.Workload) error { - err := c.doSendChunkFileToWorkload(ctx, workload.Engine, workload.ID, name, size, content, uid, gid, mode) - resp <- &types.SendMessage{ID: ID, Path: dst, Error: logger.Err(ctx, err)} - return nil - }); err != nil { - resp <- &types.SendMessage{ID: ID, Error: logger.Err(ctx, err)} - } - } - }(id, dst, data.Size, pr, data.Uid, data.Gid, data.Mode)) + for _, id := range data.Ids { + if _, ok := handlers[id]; !ok { + log.Debugf(ctx, "[SendLargeFile] create handler for %s", id) + handler := c.newWorkloadExecutor(ctx, id, resp, wg) + handlers[id] = handler } - logrus.Debugf("[SendLargeFile] send somethine id: %s; dst: %s", id, dst) - writerMap[id][dst].Write(data.Data) + handlers[id] <- data } } - logrus.Debugf("[SendLargeFile] send to the end") - for _, m := range writerMap { - for _, w := range m{ - err := w.Close() - if err != nil { - logrus.Debugf("[SendLargeFile] close writer error: %v", err) - } - } + for _, handler := range handlers{ + close(handler) } wg.Wait() }) return nil } +func (c *Calcium) newWorkloadExecutor(ctx context.Context, ID string, resp chan *types.SendMessage, wg *sync.WaitGroup) chan *types.SendLargeFileOptions { + input := make(chan *types.SendLargeFileOptions, 10) + utils.SentryGo(func() { + writerMap := make(map[string]*io.PipeWriter) + preFile := "" + for data := range input { + curFile := data.Dst + if preFile == "" || preFile != curFile { + wg.Add(1) + log.Debugf(ctx, "[newWorkloadExecutor]Receive new file file %s to %s", curFile, ID) + if preFile != "" { + writerMap[preFile].Close() + delete(writerMap, preFile) + } + preFile = curFile + pr, pw := io.Pipe() + writerMap[curFile] = pw + utils.SentryGo(func(ID, name string, size int64, content io.Reader, uid, gid int, mode int64) func() { + return func() { + defer wg.Done() + if err := c.withWorkloadLocked(ctx, ID, func(ctx context.Context, workload *types.Workload) error { + err := c.doSendChunkFileToWorkload(ctx, workload.Engine, workload.ID, name, size, content, uid, gid, mode) + resp <- &types.SendMessage{ID: ID, Path: name, Error: err} + return nil + }); err != nil { + log.Debugf(ctx, "[newWorkloadExecutor]container %s exec %s err, err=%v", ID, name, err) + resp <- &types.SendMessage{ID: ID, Error: err} + } + } + }(ID, curFile, data.Size, pr, data.Uid, data.Gid, data.Mode)) + } + writerMap[curFile].Write(data.Data) + } + for _, pw := range writerMap { + pw.Close() + } + }) + return input +} + func (c *Calcium) doSendChunkFileToWorkload(ctx context.Context, engine engine.API, ID, name string, size int64, content io.Reader, uid, gid int, mode int64) error { log.Infof(ctx, "[doSendChunkFileToWorkload] Send file to %s:%s", ID, name) return errors.WithStack(engine.VirtualizationCopyChunkTo(ctx, ID, name, size, content, uid, gid, mode)) diff --git a/engine/docker/container.go b/engine/docker/container.go index ba2915817..93908c7de 100644 --- a/engine/docker/container.go +++ b/engine/docker/container.go @@ -334,9 +334,7 @@ func (e *Engine) VirtualizationCopyTo(ctx context.Context, ID, target string, co // VirtualizationCopyChunkTo copy chunk to virtualization func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target string, size int64, content io.Reader, uid, gid int, mode int64) error { - // todo err 怎么抛出 pr, pw := io.Pipe() - //bf := new(bytes.Buffer) tw := tar.NewWriter(pw) defer tw.Close() utils.SentryGo(func(writer io.Writer, reader io.Reader) func() { @@ -348,22 +346,18 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin Uid: uid, Gid: gid, } - logrus.Debugf("[VirtualizationCopyChunkTo] write header, target: %s, id: %s", target, ID) if err := tw.WriteHeader(hdr); err != nil { - logrus.Debugf("[VirtualizationCopyChunkTo] write header err, err: %v", err) + logrus.Infof("[VirtualizationCopyChunkTo] write header to %s err, err: %v", ID, err) return } - logrus.Debugf("[VirtualizationCopyChunkTo] write header done, target: %s, id: %s", target, ID) for { data := make([]byte, 10 * 1024 * 1024) - logrus.Debugf("try to read.....") n, err := reader.Read(data) - logrus.Debugf("[VirtualizationCopyChunkTo] read something, len: %d", n) - if err != nil { - if err == io.EOF { - logrus.Debugf("[VirtualizationCopyChunkTo] end!!, target: %s, id: %s", target, ID) + if err != nil { + if err != io.EOF { + logrus.Debugf("[VirtualizationCopyChunkTo] read data from pipe err, err: %v", err) } - logrus.Debugf("[VirtualizationCopyChunkTo] read something error, len: %d", n) + logrus.Debugf("[VirtualizationCopyChunkTo] read data end, try to close the pipe, ID=%s, file=%s", ID, target) err := writer.(*io.PipeWriter).Close() if err != nil { logrus.Debugf("[VirtualizationCopyChunkTo] close pipe writer, err: %v", err) @@ -373,10 +367,10 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin if n < len(data) { data = data[:n] } + logrus.Debugf("[VirtualizationCopyChunkTo] have read data length=%d , and try to write data into %s", len(data), ID) _, err = tw.Write(data) - logrus.Debugf("[VirtualizationCopyChunkTo] write something, len: %d", len(data)) if err != nil { - logrus.Debugf("[VirtualizationCopyChunkTo] write something err, err: %v", err) + logrus.Debugf("[VirtualizationCopyChunkTo] write data into %s err, err: %v", ID, err) err := writer.(*io.PipeWriter).Close() if err != nil { logrus.Debugf("[VirtualizationCopyChunkTo] close pipe writer, err: %v", err) From 9c1d310b603fd8377da9d169b7c9ae34d7e7c04a Mon Sep 17 00:00:00 2001 From: HJ Date: Tue, 1 Feb 2022 16:26:09 +0800 Subject: [PATCH 06/29] modify return parameters for `SendLargeFile` --- cluster/calcium/sendlarge.go | 7 +++---- cluster/cluster.go | 2 +- rpc/rpc.go | 23 ++++------------------- rpc/transform.go | 16 ++++++++++++++++ 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index fd58a08af..d23b62a92 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -12,12 +12,11 @@ import ( ) // SendLargeFile send large files by stream to workload -func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeFileOptions, resp chan *types.SendMessage) error { - //logger := log.WithField("Calcium", "SendLargeFile").WithField("opts", opts) +func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeFileOptions) chan *types.SendMessage { + resp := make(chan *types.SendMessage) wg := &sync.WaitGroup{} utils.SentryGo(func() { defer close(resp) - handlers := make(map[string]chan *types.SendLargeFileOptions) for data := range opts { if err := data.Validate(); err != nil { @@ -37,7 +36,7 @@ func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeF } wg.Wait() }) - return nil + return resp } func (c *Calcium) newWorkloadExecutor(ctx context.Context, ID string, resp chan *types.SendMessage, wg *sync.WaitGroup) chan *types.SendLargeFileOptions { diff --git a/cluster/cluster.go b/cluster/cluster.go index 967226303..8bcf93658 100644 --- a/cluster/cluster.go +++ b/cluster/cluster.go @@ -73,7 +73,7 @@ type Cluster interface { // file methods Copy(ctx context.Context, opts *types.CopyOptions) (chan *types.CopyMessage, error) Send(ctx context.Context, opts *types.SendOptions) (chan *types.SendMessage, error) - SendLargeFile(ctx context.Context, opts chan *types.SendLargeFileOptions, resp chan *types.SendMessage) error + SendLargeFile(ctx context.Context, opts chan *types.SendLargeFileOptions) chan *types.SendMessage // image methods BuildImage(ctx context.Context, opts *types.BuildOptions) (chan *types.BuildImageMessage, error) CacheImage(ctx context.Context, opts *types.ImageOptions) (chan *types.CacheImageMessage, error) diff --git a/rpc/rpc.go b/rpc/rpc.go index af4b96443..50a937f67 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -591,17 +591,7 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { defer v.taskDone(ctx, "SendLargeFile", true) dc := make(chan *types.SendLargeFileOptions, 0) - ch := make(chan *types.SendMessage, 0) - data := &types.SendLargeFileOptions{} - utils.SentryGo(func(ctx context.Context, opts chan *types.SendLargeFileOptions, resp chan *types.SendMessage) func() { - return func() { - err := v.cluster.SendLargeFile(ctx, opts, resp) - if err != nil { - v.logUnsentMessages(ctx, "SendLargeFile", err, "SendLargeFile") - } - } - }(ctx, dc, ch)) - + ch := v.cluster.SendLargeFile(ctx, dc) for { req, err := server.Recv() if err == io.EOF { @@ -610,18 +600,13 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { if err != nil { return grpcstatus.Error(SendLargeFile, err.Error()) } - data.FileMetadataOptions.Ids = req.Metadata.Ids - data.FileMetadataOptions.Dst = req.Metadata.Dst - data.FileMetadataOptions.Size = req.Metadata.Size - data.FileMetadataOptions.Uid = int(req.Metadata.Owner.Uid) - data.FileMetadataOptions.Gid = int(req.Metadata.Owner.Gid) - data.FileMetadataOptions.Mode = req.Metadata.Mode.Mode - data.Data = req.Chunk.Data + data := toSendLargeFileOptions(req) dc <- data } close(dc) + // todo 可能会死锁,后面需要改一下 for m := range ch { - msg := &pb.SendMessage{ + msg := &pb.SendMessage { Id: m.ID, Path: m.Path, } diff --git a/rpc/transform.go b/rpc/transform.go index ee6cc6c47..a1e06eae4 100644 --- a/rpc/transform.go +++ b/rpc/transform.go @@ -642,3 +642,19 @@ func toCoreListImageOptions(opts *pb.ListImageOptions) *types.ImageOptions { Filter: opts.Filter, } } + +func toSendLargeFileOptions(opts *pb.FileOptions) *types.SendLargeFileOptions { + return &types.SendLargeFileOptions{ + FileMetadataOptions: types.FileMetadataOptions{ + Ids: opts.Metadata.Ids, + Dst: opts.Metadata.Dst, + Size: opts.Metadata.Size, + Mode: opts.Metadata.Mode.Mode, + Uid: int(opts.Metadata.Owner.Uid), + Gid: int(opts.Metadata.Owner.Gid), + }, + FileChunkOptions: types.FileChunkOptions{ + Data: opts.Chunk.Data, + }, + } +} \ No newline at end of file From a7212f8fcd3e38cd1334a31e35c13fd48c7cf7a2 Mon Sep 17 00:00:00 2001 From: HJ Date: Tue, 1 Feb 2022 16:45:41 +0800 Subject: [PATCH 07/29] bug fix --- engine/docker/container.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/engine/docker/container.go b/engine/docker/container.go index 93908c7de..82bc42b5a 100644 --- a/engine/docker/container.go +++ b/engine/docker/container.go @@ -337,8 +337,8 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin pr, pw := io.Pipe() tw := tar.NewWriter(pw) defer tw.Close() - utils.SentryGo(func(writer io.Writer, reader io.Reader) func() { - return func() { + // todo 这里有点奇怪,之前带参数的匿名函数会随机报错,现在改成无参的函数后就不报错了,还没找到原因 + utils.SentryGo(func() { hdr := &tar.Header{ Name: filepath.Base(target), Size: size, @@ -352,13 +352,13 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin } for { data := make([]byte, 10 * 1024 * 1024) - n, err := reader.Read(data) + n, err := content.Read(data) if err != nil { if err != io.EOF { logrus.Debugf("[VirtualizationCopyChunkTo] read data from pipe err, err: %v", err) } logrus.Debugf("[VirtualizationCopyChunkTo] read data end, try to close the pipe, ID=%s, file=%s", ID, target) - err := writer.(*io.PipeWriter).Close() + err := pw.Close() if err != nil { logrus.Debugf("[VirtualizationCopyChunkTo] close pipe writer, err: %v", err) } @@ -371,15 +371,14 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin _, err = tw.Write(data) if err != nil { logrus.Debugf("[VirtualizationCopyChunkTo] write data into %s err, err: %v", ID, err) - err := writer.(*io.PipeWriter).Close() + err := pw.Close() if err != nil { logrus.Debugf("[VirtualizationCopyChunkTo] close pipe writer, err: %v", err) } return } } - } - }(pw, content)) + }) return e.client.CopyToContainer(ctx, ID, filepath.Dir(target), pr, dockertypes.CopyToContainerOptions{AllowOverwriteDirWithFile: true, CopyUIDGID: false}) } From 123ac04da70d53939159d0ba63d74086767eac71 Mon Sep 17 00:00:00 2001 From: HJ Date: Mon, 14 Feb 2022 18:40:33 +0800 Subject: [PATCH 08/29] modify the definition of grpc --- rpc/gen/core.pb.go | 1093 +++++++++++++++++++------------------------- rpc/gen/core.proto | 18 +- rpc/transform.go | 14 +- 3 files changed, 495 insertions(+), 630 deletions(-) diff --git a/rpc/gen/core.pb.go b/rpc/gen/core.pb.go index cbeecdced..37d4e5686 100644 --- a/rpc/gen/core.pb.go +++ b/rpc/gen/core.pb.go @@ -4791,8 +4791,12 @@ type FileOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Metadata *FileOptions_Metadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"` - Chunk *FileOptions_Chunk `protobuf:"bytes,2,opt,name=chunk,proto3" json:"chunk,omitempty"` + Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` + Dst string `protobuf:"bytes,2,opt,name=dst,proto3" json:"dst,omitempty"` + Size int64 `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"` + Mode *FileMode `protobuf:"bytes,4,opt,name=mode,proto3" json:"mode,omitempty"` + Owner *FileOwner `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` + Chunk []byte `protobuf:"bytes,6,opt,name=chunk,proto3" json:"chunk,omitempty"` } func (x *FileOptions) Reset() { @@ -4827,14 +4831,42 @@ func (*FileOptions) Descriptor() ([]byte, []int) { return file_rpc_gen_core_proto_rawDescGZIP(), []int{61} } -func (x *FileOptions) GetMetadata() *FileOptions_Metadata { +func (x *FileOptions) GetIds() []string { + if x != nil { + return x.Ids + } + return nil +} + +func (x *FileOptions) GetDst() string { + if x != nil { + return x.Dst + } + return "" +} + +func (x *FileOptions) GetSize() int64 { + if x != nil { + return x.Size + } + return 0 +} + +func (x *FileOptions) GetMode() *FileMode { if x != nil { - return x.Metadata + return x.Mode } return nil } -func (x *FileOptions) GetChunk() *FileOptions_Chunk { +func (x *FileOptions) GetOwner() *FileOwner { + if x != nil { + return x.Owner + } + return nil +} + +func (x *FileOptions) GetChunk() []byte { if x != nil { return x.Chunk } @@ -6268,132 +6300,6 @@ func (x *CapacityMessage) GetNodeCapacities() map[string]int64 { return nil } -type FileOptions_Metadata struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ids []string `protobuf:"bytes,1,rep,name=ids,proto3" json:"ids,omitempty"` - Dst string `protobuf:"bytes,2,opt,name=dst,proto3" json:"dst,omitempty"` - Size int64 `protobuf:"varint,3,opt,name=size,proto3" json:"size,omitempty"` - Mode *FileMode `protobuf:"bytes,4,opt,name=mode,proto3" json:"mode,omitempty"` - Owner *FileOwner `protobuf:"bytes,5,opt,name=owner,proto3" json:"owner,omitempty"` -} - -func (x *FileOptions_Metadata) Reset() { - *x = FileOptions_Metadata{} - if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[132] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FileOptions_Metadata) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FileOptions_Metadata) ProtoMessage() {} - -func (x *FileOptions_Metadata) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[132] - 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 FileOptions_Metadata.ProtoReflect.Descriptor instead. -func (*FileOptions_Metadata) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{61, 0} -} - -func (x *FileOptions_Metadata) GetIds() []string { - if x != nil { - return x.Ids - } - return nil -} - -func (x *FileOptions_Metadata) GetDst() string { - if x != nil { - return x.Dst - } - return "" -} - -func (x *FileOptions_Metadata) GetSize() int64 { - if x != nil { - return x.Size - } - return 0 -} - -func (x *FileOptions_Metadata) GetMode() *FileMode { - if x != nil { - return x.Mode - } - return nil -} - -func (x *FileOptions_Metadata) GetOwner() *FileOwner { - if x != nil { - return x.Owner - } - return nil -} - -type FileOptions_Chunk struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` -} - -func (x *FileOptions_Chunk) Reset() { - *x = FileOptions_Chunk{} - if protoimpl.UnsafeEnabled { - mi := &file_rpc_gen_core_proto_msgTypes[133] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FileOptions_Chunk) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FileOptions_Chunk) ProtoMessage() {} - -func (x *FileOptions_Chunk) ProtoReflect() protoreflect.Message { - mi := &file_rpc_gen_core_proto_msgTypes[133] - 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 FileOptions_Chunk.ProtoReflect.Descriptor instead. -func (*FileOptions_Chunk) Descriptor() ([]byte, []int) { - return file_rpc_gen_core_proto_rawDescGZIP(), []int{61, 1} -} - -func (x *FileOptions_Chunk) GetData() []byte { - if x != nil { - return x.Data - } - return nil -} - var File_rpc_gen_core_proto protoreflect.FileDescriptor var file_rpc_gen_core_proto_rawDesc = []byte{ @@ -7236,15 +7142,8 @@ var file_rpc_gen_core_proto_rawDesc = []byte{ 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x23, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x99, 0x02, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x34, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x05, 0x63, - 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x89, 0x01, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, + 0x01, 0x22, 0xa2, 0x01, 0x0a, 0x0b, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x6d, 0x6f, 0x64, @@ -7252,351 +7151,351 @@ var file_rpc_gen_core_proto_rawDesc = []byte{ 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, - 0x1a, 0x1b, 0x0a, 0x05, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x3b, 0x0a, - 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0xb9, 0x01, 0x0a, 0x11, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x12, 0x32, 0x0a, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x0b, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0xdd, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, - 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, - 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, - 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, - 0x12, 0x28, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x1a, 0x3a, 0x0a, 0x0c, 0x50, 0x75, - 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x94, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x6c, 0x61, - 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x12, 0x31, 0x0a, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, - 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x79, 0x0a, - 0x11, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x60, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x49, 0x6d, - 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x22, 0x67, 0x0a, 0x10, 0x4c, - 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x25, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x65, 0x72, 0x72, 0x22, 0x55, 0x0a, 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, + 0x12, 0x14, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x3b, 0x0a, 0x0b, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0xb9, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, + 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, + 0x72, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x32, 0x0a, 0x0c, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x52, 0x0b, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, + 0xdd, 0x02, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x6f, 0x64, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x6f, 0x64, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x75, + 0x62, 0x6c, 0x69, 0x73, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x12, 0x28, 0x0a, 0x08, 0x72, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x08, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x1a, 0x3a, 0x0a, 0x0c, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x94, 0x01, 0x0a, 0x16, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x31, 0x0a, 0x06, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x31, 0x0a, + 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x79, 0x0a, 0x11, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, + 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6e, + 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6e, + 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x22, 0x60, 0x0a, 0x12, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x41, 0x0a, 0x19, 0x44, - 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, + 0x74, 0x61, 0x67, 0x73, 0x22, 0x67, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, + 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x25, 0x0a, 0x06, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x49, 0x74, 0x65, 0x6d, 0x52, 0x06, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, + 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x72, 0x72, 0x22, 0x55, 0x0a, + 0x15, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x41, 0x0a, 0x19, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, + 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, + 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2e, 0x0a, 0x16, 0x52, 0x65, 0x61, 0x6c, 0x6c, + 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6f, 0x0a, 0x0b, 0x43, 0x6f, 0x70, 0x79, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, + 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x47, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x22, 0x87, 0x01, 0x0a, 0x15, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x77, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x39, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, + 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x73, 0x74, + 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x11, + 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, + 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x64, 0x65, + 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x63, + 0x6d, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x63, 0x6d, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x73, + 0x79, 0x6e, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x61, 0x73, 0x79, 0x6e, + 0x63, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x54, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x03, 0x69, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x52, + 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x2e, - 0x0a, 0x16, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x6f, - 0x0a, 0x0b, 0x43, 0x6f, 0x70, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, - 0x47, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, - 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x87, 0x01, 0x0a, 0x15, 0x41, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, - 0x70, 0x65, 0x22, 0x9a, 0x01, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, - 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x38, 0x0a, 0x0e, 0x64, 0x65, 0x70, 0x6c, - 0x6f, 0x79, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x0d, 0x64, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x6d, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x63, 0x6d, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x73, - 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0c, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, - 0x54, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x52, 0x0a, 0x16, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x22, 0x7a, 0x0a, 0x10, 0x4c, 0x6f, 0x67, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x69, - 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x12, 0x16, 0x0a, - 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, - 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x22, 0x87, 0x01, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, - 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x0d, 0x73, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x22, - 0xbd, 0x01, 0x0a, 0x16, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x77, - 0x6f, 0x72, 0x6b, 0x64, 0x69, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x6f, - 0x72, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x73, 0x74, - 0x64, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x6e, 0x53, - 0x74, 0x64, 0x69, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x65, 0x70, 0x6c, 0x5f, 0x63, 0x6d, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x72, 0x65, 0x70, 0x6c, 0x43, 0x6d, 0x64, 0x22, - 0xbc, 0x01, 0x0a, 0x0f, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x50, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x6f, 0x64, - 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x4e, - 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x27, - 0x0a, 0x06, 0x54, 0x72, 0x69, 0x4f, 0x70, 0x74, 0x12, 0x08, 0x0a, 0x04, 0x4b, 0x45, 0x45, 0x50, - 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x52, 0x55, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, - 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10, 0x02, 0x2a, 0x52, 0x0a, 0x0d, 0x53, 0x74, 0x64, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x4f, - 0x55, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x10, 0x01, - 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x59, 0x50, 0x45, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, - 0x49, 0x44, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x08, 0x45, 0x52, 0x55, 0x45, 0x52, 0x52, 0x4f, 0x52, - 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x32, 0xfa, 0x14, 0x0a, 0x07, - 0x43, 0x6f, 0x72, 0x65, 0x52, 0x50, 0x43, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, - 0x43, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x12, 0x57, 0x61, - 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x36, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x73, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0e, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x2e, 0x70, - 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x1c, 0x2e, 0x70, 0x62, - 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x26, 0x0a, 0x06, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x64, - 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x1a, 0x07, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x22, 0x00, 0x12, 0x2e, - 0x0a, 0x09, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x12, 0x14, 0x2e, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x26, - 0x0a, 0x06, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, - 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x07, 0x2e, 0x70, 0x62, - 0x2e, 0x50, 0x6f, 0x64, 0x22, 0x00, 0x12, 0x21, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, - 0x64, 0x73, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x08, 0x2e, - 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x73, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0e, 0x47, 0x65, 0x74, - 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x11, 0x2e, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, - 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, - 0x00, 0x12, 0x3c, 0x0a, 0x11, 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, - 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x29, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, - 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, - 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0a, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x0c, - 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x70, - 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x00, 0x12, - 0x34, 0x0a, 0x0e, 0x50, 0x6f, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x68, 0x6f, 0x6f, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x68, 0x6f, + 0x6f, 0x6b, 0x22, 0x7a, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x69, + 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x73, 0x69, 0x6e, 0x63, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x22, 0x87, + 0x01, 0x0a, 0x10, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x39, 0x0a, + 0x0f, 0x73, 0x74, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x64, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x64, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x22, 0xbd, 0x01, 0x0a, 0x16, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x65, 0x6e, 0x76, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, + 0x65, 0x6e, 0x76, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x64, 0x69, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x6f, 0x72, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x1d, + 0x0a, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x5f, 0x73, 0x74, 0x64, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x6e, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x12, 0x19, 0x0a, + 0x08, 0x72, 0x65, 0x70, 0x6c, 0x5f, 0x63, 0x6d, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x72, 0x65, 0x70, 0x6c, 0x43, 0x6d, 0x64, 0x22, 0xbc, 0x01, 0x0a, 0x0f, 0x43, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x12, 0x50, 0x0a, 0x0f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x70, 0x62, + 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0e, 0x6e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x1a, 0x41, 0x0a, 0x13, 0x4e, 0x6f, 0x64, 0x65, 0x43, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x27, 0x0a, 0x06, 0x54, 0x72, 0x69, 0x4f, 0x70, + 0x74, 0x12, 0x08, 0x0a, 0x04, 0x4b, 0x45, 0x45, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x54, + 0x52, 0x55, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x41, 0x4c, 0x53, 0x45, 0x10, 0x02, + 0x2a, 0x52, 0x0a, 0x0d, 0x53, 0x74, 0x64, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x44, 0x4f, 0x55, 0x54, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x53, 0x54, 0x44, 0x45, 0x52, 0x52, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x59, 0x50, + 0x45, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x49, 0x44, 0x10, 0x06, 0x12, 0x15, 0x0a, + 0x08, 0x45, 0x52, 0x55, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x01, 0x32, 0xfa, 0x14, 0x0a, 0x07, 0x43, 0x6f, 0x72, 0x65, 0x52, 0x50, 0x43, + 0x12, 0x21, 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x12, 0x57, 0x61, 0x74, 0x63, 0x68, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x30, 0x01, 0x12, 0x36, 0x0a, 0x0c, 0x4c, + 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x12, 0x16, 0x2e, 0x70, 0x62, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x73, 0x22, 0x00, 0x12, 0x3a, 0x0a, 0x0e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x0b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x22, 0x00, 0x12, + 0x3e, 0x0a, 0x11, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x12, 0x1c, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, + 0x26, 0x0a, 0x06, 0x41, 0x64, 0x64, 0x50, 0x6f, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x41, + 0x64, 0x64, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x07, 0x2e, 0x70, + 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x22, 0x00, 0x12, 0x2e, 0x0a, 0x09, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x50, 0x6f, 0x64, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x26, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x50, 0x6f, + 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x07, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x22, 0x00, 0x12, + 0x21, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, 0x73, 0x12, 0x09, 0x2e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, 0x73, + 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x64, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x11, 0x50, 0x6f, + 0x64, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, + 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x6f, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x29, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x64, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, - 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x29, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, - 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, - 0x12, 0x29, 0x0a, 0x07, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0d, 0x53, - 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x70, - 0x62, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1b, - 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, - 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x70, - 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x41, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x10, 0x2e, 0x70, - 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, - 0x12, 0x3b, 0x0a, 0x11, 0x43, 0x61, 0x6c, 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, - 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, - 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x0e, 0x2e, 0x70, - 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x1a, 0x0c, 0x2e, 0x70, - 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0c, - 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x70, - 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x73, 0x1a, 0x0d, 0x2e, - 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x00, 0x12, 0x3b, - 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, - 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x22, 0x00, 0x30, 0x01, 0x12, 0x38, 0x0a, 0x11, 0x4c, - 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, - 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x22, 0x00, 0x12, 0x3c, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x2e, 0x70, 0x62, - 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x49, 0x44, 0x73, 0x1a, 0x13, 0x2e, 0x70, - 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x53, - 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, - 0x5c, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2c, 0x0a, - 0x04, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x53, - 0x65, 0x6e, 0x64, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x74, + 0x65, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0a, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x31, 0x0a, 0x0c, 0x4c, 0x69, 0x73, 0x74, 0x50, 0x6f, 0x64, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x09, 0x2e, 0x70, 0x62, + 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x00, 0x12, 0x34, 0x0a, 0x0e, 0x50, 0x6f, 0x64, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x29, + 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, + 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x00, 0x12, 0x29, 0x0a, 0x07, 0x53, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x08, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, + 0x64, 0x65, 0x22, 0x00, 0x12, 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x4e, 0x6f, + 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x09, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x2e, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x10, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x09, 0x2e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x41, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, + 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x10, 0x2e, 0x70, 0x62, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x11, 0x43, 0x61, 0x6c, + 0x63, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x11, + 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x0e, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x49, 0x44, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x22, 0x00, 0x12, 0x30, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x49, 0x44, 0x73, 0x1a, 0x0d, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x18, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x1a, 0x0c, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x38, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4e, 0x6f, 0x64, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0d, 0x2e, + 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x00, 0x12, 0x3c, + 0x0a, 0x12, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x49, 0x44, 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x12, + 0x53, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x73, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x13, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x5c, 0x0a, 0x14, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x12, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x1f, 0x2e, 0x70, 0x62, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x43, 0x6f, 0x70, 0x79, 0x12, 0x0f, + 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, + 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x00, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x04, 0x53, 0x65, 0x6e, 0x64, 0x12, 0x0f, 0x2e, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, + 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x46, + 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x0d, 0x53, 0x65, 0x6e, - 0x64, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x2e, 0x70, 0x62, 0x2e, - 0x46, 0x69, 0x6c, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x0f, 0x2e, 0x70, 0x62, - 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, - 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, - 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x41, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3b, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, - 0x67, 0x65, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x11, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x45, 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, - 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1a, 0x2e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4a, 0x0a, - 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x56, 0x0a, 0x12, 0x44, 0x69, 0x73, - 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1d, - 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, - 0x01, 0x12, 0x4d, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x4e, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, - 0x12, 0x43, 0x0a, 0x0f, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, - 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x12, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x6f, - 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0a, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, - 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, - 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x28, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x72, - 0x75, 0x32, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x65, 0x6e, 0x3b, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3e, 0x0a, 0x0a, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x43, + 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x41, 0x0a, 0x0b, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x1a, 0x16, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x49, 0x6d, + 0x61, 0x67, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x3b, + 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x14, 0x2e, 0x70, 0x62, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x49, 0x6d, 0x61, 0x67, 0x65, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x11, 0x2e, + 0x70, 0x62, 0x2e, 0x44, 0x65, 0x70, 0x6c, 0x6f, 0x79, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x45, 0x0a, 0x0f, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x12, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x70, 0x6c, + 0x61, 0x63, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4a, 0x0a, 0x0e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, + 0x30, 0x01, 0x12, 0x56, 0x0a, 0x12, 0x44, 0x69, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, + 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1d, 0x2e, 0x70, 0x62, 0x2e, 0x44, 0x69, 0x73, + 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4d, 0x0a, 0x0f, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x2e, + 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x4e, 0x0a, 0x0f, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x1a, 0x2e, 0x70, + 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, + 0x64, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x43, 0x0a, 0x0f, 0x52, 0x65, 0x61, + 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x12, 0x2e, 0x70, + 0x62, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x1a, 0x2e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x12, 0x3b, + 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x14, 0x2e, 0x70, 0x62, + 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x14, 0x2e, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x44, 0x0a, 0x0a, 0x52, + 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, 0x12, 0x15, 0x2e, 0x70, 0x62, 0x2e, 0x52, + 0x75, 0x6e, 0x41, 0x6e, 0x64, 0x57, 0x61, 0x69, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x1a, 0x19, 0x2e, 0x70, 0x62, 0x2e, 0x41, 0x74, 0x74, 0x61, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x00, 0x28, 0x01, 0x30, + 0x01, 0x42, 0x28, 0x5a, 0x26, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x72, 0x75, 0x32, 0x2f, 0x63, 0x6f, 0x72, 0x65, + 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x67, 0x65, 0x6e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -7612,7 +7511,7 @@ func file_rpc_gen_core_proto_rawDescGZIP() []byte { } var file_rpc_gen_core_proto_enumTypes = make([]protoimpl.EnumInfo, 4) -var file_rpc_gen_core_proto_msgTypes = make([]protoimpl.MessageInfo, 136) +var file_rpc_gen_core_proto_msgTypes = make([]protoimpl.MessageInfo, 134) var file_rpc_gen_core_proto_goTypes = []interface{}{ (TriOpt)(0), // 0: pb.TriOpt (StdStreamType)(0), // 1: pb.StdStreamType @@ -7750,10 +7649,8 @@ var file_rpc_gen_core_proto_goTypes = []interface{}{ nil, // 133: pb.SendOptions.DataEntry nil, // 134: pb.SendOptions.ModesEntry nil, // 135: pb.SendOptions.OwnersEntry - (*FileOptions_Metadata)(nil), // 136: pb.FileOptions.Metadata - (*FileOptions_Chunk)(nil), // 137: pb.FileOptions.Chunk - nil, // 138: pb.CreateWorkloadMessage.PublishEntry - nil, // 139: pb.CapacityMessage.NodeCapacitiesEntry + nil, // 136: pb.CreateWorkloadMessage.PublishEntry + nil, // 137: pb.CapacityMessage.NodeCapacitiesEntry } var file_rpc_gen_core_proto_depIdxs = []int32{ 87, // 0: pb.ListWorkloadsOptions.labels:type_name -> pb.ListWorkloadsOptions.LabelsEntry @@ -7830,10 +7727,10 @@ var file_rpc_gen_core_proto_depIdxs = []int32{ 133, // 71: pb.SendOptions.data:type_name -> pb.SendOptions.DataEntry 134, // 72: pb.SendOptions.modes:type_name -> pb.SendOptions.ModesEntry 135, // 73: pb.SendOptions.owners:type_name -> pb.SendOptions.OwnersEntry - 136, // 74: pb.FileOptions.metadata:type_name -> pb.FileOptions.Metadata - 137, // 75: pb.FileOptions.chunk:type_name -> pb.FileOptions.Chunk + 63, // 74: pb.FileOptions.mode:type_name -> pb.FileMode + 62, // 75: pb.FileOptions.owner:type_name -> pb.FileOwner 66, // 76: pb.BuildImageMessage.error_detail:type_name -> pb.ErrorDetail - 138, // 77: pb.CreateWorkloadMessage.publish:type_name -> pb.CreateWorkloadMessage.PublishEntry + 136, // 77: pb.CreateWorkloadMessage.publish:type_name -> pb.CreateWorkloadMessage.PublishEntry 53, // 78: pb.CreateWorkloadMessage.resource:type_name -> pb.Resource 68, // 79: pb.ReplaceWorkloadMessage.create:type_name -> pb.CreateWorkloadMessage 74, // 80: pb.ReplaceWorkloadMessage.remove:type_name -> pb.RemoveWorkloadMessage @@ -7841,7 +7738,7 @@ var file_rpc_gen_core_proto_depIdxs = []int32{ 1, // 82: pb.AttachWorkloadMessage.std_stream_type:type_name -> pb.StdStreamType 55, // 83: pb.RunAndWaitOptions.deploy_options:type_name -> pb.DeployOptions 1, // 84: pb.LogStreamMessage.std_stream_type:type_name -> pb.StdStreamType - 139, // 85: pb.CapacityMessage.node_capacities:type_name -> pb.CapacityMessage.NodeCapacitiesEntry + 137, // 85: pb.CapacityMessage.node_capacities:type_name -> pb.CapacityMessage.NodeCapacitiesEntry 45, // 86: pb.Builds.BuildsEntry.value:type_name -> pb.Build 54, // 87: pb.Resource.VolumePlanLimitEntry.value:type_name -> pb.Volume 54, // 88: pb.Resource.VolumePlanRequestEntry.value:type_name -> pb.Volume @@ -7850,103 +7747,101 @@ var file_rpc_gen_core_proto_depIdxs = []int32{ 60, // 91: pb.CopyOptions.TargetsEntry.value:type_name -> pb.CopyPaths 63, // 92: pb.SendOptions.ModesEntry.value:type_name -> pb.FileMode 62, // 93: pb.SendOptions.OwnersEntry.value:type_name -> pb.FileOwner - 63, // 94: pb.FileOptions.Metadata.mode:type_name -> pb.FileMode - 62, // 95: pb.FileOptions.Metadata.owner:type_name -> pb.FileOwner - 4, // 96: pb.CoreRPC.Info:input_type -> pb.Empty - 4, // 97: pb.CoreRPC.WatchServiceStatus:input_type -> pb.Empty - 12, // 98: pb.CoreRPC.ListNetworks:input_type -> pb.ListNetworkOptions - 13, // 99: pb.CoreRPC.ConnectNetwork:input_type -> pb.ConnectNetworkOptions - 14, // 100: pb.CoreRPC.DisconnectNetwork:input_type -> pb.DisconnectNetworkOptions - 37, // 101: pb.CoreRPC.AddPod:input_type -> pb.AddPodOptions - 38, // 102: pb.CoreRPC.RemovePod:input_type -> pb.RemovePodOptions - 39, // 103: pb.CoreRPC.GetPod:input_type -> pb.GetPodOptions - 4, // 104: pb.CoreRPC.ListPods:input_type -> pb.Empty - 39, // 105: pb.CoreRPC.GetPodResource:input_type -> pb.GetPodOptions - 39, // 106: pb.CoreRPC.PodResourceStream:input_type -> pb.GetPodOptions - 40, // 107: pb.CoreRPC.AddNode:input_type -> pb.AddNodeOptions - 41, // 108: pb.CoreRPC.RemoveNode:input_type -> pb.RemoveNodeOptions - 44, // 109: pb.CoreRPC.ListPodNodes:input_type -> pb.ListNodesOptions - 44, // 110: pb.CoreRPC.PodNodesStream:input_type -> pb.ListNodesOptions - 42, // 111: pb.CoreRPC.GetNode:input_type -> pb.GetNodeOptions - 20, // 112: pb.CoreRPC.SetNode:input_type -> pb.SetNodeOptions - 21, // 113: pb.CoreRPC.SetNodeStatus:input_type -> pb.SetNodeStatusOptions - 22, // 114: pb.CoreRPC.GetNodeStatus:input_type -> pb.GetNodeStatusOptions - 4, // 115: pb.CoreRPC.NodeStatusStream:input_type -> pb.Empty - 43, // 116: pb.CoreRPC.GetNodeResource:input_type -> pb.GetNodeResourceOptions - 55, // 117: pb.CoreRPC.CalculateCapacity:input_type -> pb.DeployOptions - 32, // 118: pb.CoreRPC.GetWorkload:input_type -> pb.WorkloadID - 33, // 119: pb.CoreRPC.GetWorkloads:input_type -> pb.WorkloadIDs - 7, // 120: pb.CoreRPC.ListWorkloads:input_type -> pb.ListWorkloadsOptions - 42, // 121: pb.CoreRPC.ListNodeWorkloads:input_type -> pb.GetNodeOptions - 33, // 122: pb.CoreRPC.GetWorkloadsStatus:input_type -> pb.WorkloadIDs - 28, // 123: pb.CoreRPC.SetWorkloadsStatus:input_type -> pb.SetWorkloadsStatusOptions - 29, // 124: pb.CoreRPC.WorkloadStatusStream:input_type -> pb.WorkloadStatusStreamOptions - 61, // 125: pb.CoreRPC.Copy:input_type -> pb.CopyOptions - 64, // 126: pb.CoreRPC.Send:input_type -> pb.SendOptions - 65, // 127: pb.CoreRPC.SendLargeFile:input_type -> pb.FileOptions - 47, // 128: pb.CoreRPC.BuildImage:input_type -> pb.BuildImageOptions - 57, // 129: pb.CoreRPC.CacheImage:input_type -> pb.CacheImageOptions - 58, // 130: pb.CoreRPC.RemoveImage:input_type -> pb.RemoveImageOptions - 59, // 131: pb.CoreRPC.ListImage:input_type -> pb.ListImageOptions - 55, // 132: pb.CoreRPC.CreateWorkload:input_type -> pb.DeployOptions - 56, // 133: pb.CoreRPC.ReplaceWorkload:input_type -> pb.ReplaceOptions - 34, // 134: pb.CoreRPC.RemoveWorkload:input_type -> pb.RemoveWorkloadOptions - 35, // 135: pb.CoreRPC.DissociateWorkload:input_type -> pb.DissociateWorkloadOptions - 81, // 136: pb.CoreRPC.ControlWorkload:input_type -> pb.ControlWorkloadOptions - 85, // 137: pb.CoreRPC.ExecuteWorkload:input_type -> pb.ExecuteWorkloadOptions - 36, // 138: pb.CoreRPC.ReallocResource:input_type -> pb.ReallocOptions - 83, // 139: pb.CoreRPC.LogStream:input_type -> pb.LogStreamOptions - 80, // 140: pb.CoreRPC.RunAndWait:input_type -> pb.RunAndWaitOptions - 5, // 141: pb.CoreRPC.Info:output_type -> pb.CoreInfo - 6, // 142: pb.CoreRPC.WatchServiceStatus:output_type -> pb.ServiceStatus - 16, // 143: pb.CoreRPC.ListNetworks:output_type -> pb.Networks - 15, // 144: pb.CoreRPC.ConnectNetwork:output_type -> pb.Network - 4, // 145: pb.CoreRPC.DisconnectNetwork:output_type -> pb.Empty - 8, // 146: pb.CoreRPC.AddPod:output_type -> pb.Pod - 4, // 147: pb.CoreRPC.RemovePod:output_type -> pb.Empty - 8, // 148: pb.CoreRPC.GetPod:output_type -> pb.Pod - 9, // 149: pb.CoreRPC.ListPods:output_type -> pb.Pods - 10, // 150: pb.CoreRPC.GetPodResource:output_type -> pb.PodResource - 11, // 151: pb.CoreRPC.PodResourceStream:output_type -> pb.NodeResource - 17, // 152: pb.CoreRPC.AddNode:output_type -> pb.Node - 4, // 153: pb.CoreRPC.RemoveNode:output_type -> pb.Empty - 18, // 154: pb.CoreRPC.ListPodNodes:output_type -> pb.Nodes - 17, // 155: pb.CoreRPC.PodNodesStream:output_type -> pb.Node - 17, // 156: pb.CoreRPC.GetNode:output_type -> pb.Node - 17, // 157: pb.CoreRPC.SetNode:output_type -> pb.Node - 4, // 158: pb.CoreRPC.SetNodeStatus:output_type -> pb.Empty - 23, // 159: pb.CoreRPC.GetNodeStatus:output_type -> pb.NodeStatusStreamMessage - 23, // 160: pb.CoreRPC.NodeStatusStream:output_type -> pb.NodeStatusStreamMessage - 11, // 161: pb.CoreRPC.GetNodeResource:output_type -> pb.NodeResource - 86, // 162: pb.CoreRPC.CalculateCapacity:output_type -> pb.CapacityMessage - 25, // 163: pb.CoreRPC.GetWorkload:output_type -> pb.Workload - 31, // 164: pb.CoreRPC.GetWorkloads:output_type -> pb.Workloads - 25, // 165: pb.CoreRPC.ListWorkloads:output_type -> pb.Workload - 31, // 166: pb.CoreRPC.ListNodeWorkloads:output_type -> pb.Workloads - 27, // 167: pb.CoreRPC.GetWorkloadsStatus:output_type -> pb.WorkloadsStatus - 27, // 168: pb.CoreRPC.SetWorkloadsStatus:output_type -> pb.WorkloadsStatus - 30, // 169: pb.CoreRPC.WorkloadStatusStream:output_type -> pb.WorkloadStatusStreamMessage - 77, // 170: pb.CoreRPC.Copy:output_type -> pb.CopyMessage - 78, // 171: pb.CoreRPC.Send:output_type -> pb.SendMessage - 78, // 172: pb.CoreRPC.SendLargeFile:output_type -> pb.SendMessage - 67, // 173: pb.CoreRPC.BuildImage:output_type -> pb.BuildImageMessage - 70, // 174: pb.CoreRPC.CacheImage:output_type -> pb.CacheImageMessage - 71, // 175: pb.CoreRPC.RemoveImage:output_type -> pb.RemoveImageMessage - 73, // 176: pb.CoreRPC.ListImage:output_type -> pb.ListImageMessage - 68, // 177: pb.CoreRPC.CreateWorkload:output_type -> pb.CreateWorkloadMessage - 69, // 178: pb.CoreRPC.ReplaceWorkload:output_type -> pb.ReplaceWorkloadMessage - 74, // 179: pb.CoreRPC.RemoveWorkload:output_type -> pb.RemoveWorkloadMessage - 75, // 180: pb.CoreRPC.DissociateWorkload:output_type -> pb.DissociateWorkloadMessage - 82, // 181: pb.CoreRPC.ControlWorkload:output_type -> pb.ControlWorkloadMessage - 79, // 182: pb.CoreRPC.ExecuteWorkload:output_type -> pb.AttachWorkloadMessage - 76, // 183: pb.CoreRPC.ReallocResource:output_type -> pb.ReallocResourceMessage - 84, // 184: pb.CoreRPC.LogStream:output_type -> pb.LogStreamMessage - 79, // 185: pb.CoreRPC.RunAndWait:output_type -> pb.AttachWorkloadMessage - 141, // [141:186] is the sub-list for method output_type - 96, // [96:141] is the sub-list for method input_type - 96, // [96:96] is the sub-list for extension type_name - 96, // [96:96] is the sub-list for extension extendee - 0, // [0:96] is the sub-list for field type_name + 4, // 94: pb.CoreRPC.Info:input_type -> pb.Empty + 4, // 95: pb.CoreRPC.WatchServiceStatus:input_type -> pb.Empty + 12, // 96: pb.CoreRPC.ListNetworks:input_type -> pb.ListNetworkOptions + 13, // 97: pb.CoreRPC.ConnectNetwork:input_type -> pb.ConnectNetworkOptions + 14, // 98: pb.CoreRPC.DisconnectNetwork:input_type -> pb.DisconnectNetworkOptions + 37, // 99: pb.CoreRPC.AddPod:input_type -> pb.AddPodOptions + 38, // 100: pb.CoreRPC.RemovePod:input_type -> pb.RemovePodOptions + 39, // 101: pb.CoreRPC.GetPod:input_type -> pb.GetPodOptions + 4, // 102: pb.CoreRPC.ListPods:input_type -> pb.Empty + 39, // 103: pb.CoreRPC.GetPodResource:input_type -> pb.GetPodOptions + 39, // 104: pb.CoreRPC.PodResourceStream:input_type -> pb.GetPodOptions + 40, // 105: pb.CoreRPC.AddNode:input_type -> pb.AddNodeOptions + 41, // 106: pb.CoreRPC.RemoveNode:input_type -> pb.RemoveNodeOptions + 44, // 107: pb.CoreRPC.ListPodNodes:input_type -> pb.ListNodesOptions + 44, // 108: pb.CoreRPC.PodNodesStream:input_type -> pb.ListNodesOptions + 42, // 109: pb.CoreRPC.GetNode:input_type -> pb.GetNodeOptions + 20, // 110: pb.CoreRPC.SetNode:input_type -> pb.SetNodeOptions + 21, // 111: pb.CoreRPC.SetNodeStatus:input_type -> pb.SetNodeStatusOptions + 22, // 112: pb.CoreRPC.GetNodeStatus:input_type -> pb.GetNodeStatusOptions + 4, // 113: pb.CoreRPC.NodeStatusStream:input_type -> pb.Empty + 43, // 114: pb.CoreRPC.GetNodeResource:input_type -> pb.GetNodeResourceOptions + 55, // 115: pb.CoreRPC.CalculateCapacity:input_type -> pb.DeployOptions + 32, // 116: pb.CoreRPC.GetWorkload:input_type -> pb.WorkloadID + 33, // 117: pb.CoreRPC.GetWorkloads:input_type -> pb.WorkloadIDs + 7, // 118: pb.CoreRPC.ListWorkloads:input_type -> pb.ListWorkloadsOptions + 42, // 119: pb.CoreRPC.ListNodeWorkloads:input_type -> pb.GetNodeOptions + 33, // 120: pb.CoreRPC.GetWorkloadsStatus:input_type -> pb.WorkloadIDs + 28, // 121: pb.CoreRPC.SetWorkloadsStatus:input_type -> pb.SetWorkloadsStatusOptions + 29, // 122: pb.CoreRPC.WorkloadStatusStream:input_type -> pb.WorkloadStatusStreamOptions + 61, // 123: pb.CoreRPC.Copy:input_type -> pb.CopyOptions + 64, // 124: pb.CoreRPC.Send:input_type -> pb.SendOptions + 65, // 125: pb.CoreRPC.SendLargeFile:input_type -> pb.FileOptions + 47, // 126: pb.CoreRPC.BuildImage:input_type -> pb.BuildImageOptions + 57, // 127: pb.CoreRPC.CacheImage:input_type -> pb.CacheImageOptions + 58, // 128: pb.CoreRPC.RemoveImage:input_type -> pb.RemoveImageOptions + 59, // 129: pb.CoreRPC.ListImage:input_type -> pb.ListImageOptions + 55, // 130: pb.CoreRPC.CreateWorkload:input_type -> pb.DeployOptions + 56, // 131: pb.CoreRPC.ReplaceWorkload:input_type -> pb.ReplaceOptions + 34, // 132: pb.CoreRPC.RemoveWorkload:input_type -> pb.RemoveWorkloadOptions + 35, // 133: pb.CoreRPC.DissociateWorkload:input_type -> pb.DissociateWorkloadOptions + 81, // 134: pb.CoreRPC.ControlWorkload:input_type -> pb.ControlWorkloadOptions + 85, // 135: pb.CoreRPC.ExecuteWorkload:input_type -> pb.ExecuteWorkloadOptions + 36, // 136: pb.CoreRPC.ReallocResource:input_type -> pb.ReallocOptions + 83, // 137: pb.CoreRPC.LogStream:input_type -> pb.LogStreamOptions + 80, // 138: pb.CoreRPC.RunAndWait:input_type -> pb.RunAndWaitOptions + 5, // 139: pb.CoreRPC.Info:output_type -> pb.CoreInfo + 6, // 140: pb.CoreRPC.WatchServiceStatus:output_type -> pb.ServiceStatus + 16, // 141: pb.CoreRPC.ListNetworks:output_type -> pb.Networks + 15, // 142: pb.CoreRPC.ConnectNetwork:output_type -> pb.Network + 4, // 143: pb.CoreRPC.DisconnectNetwork:output_type -> pb.Empty + 8, // 144: pb.CoreRPC.AddPod:output_type -> pb.Pod + 4, // 145: pb.CoreRPC.RemovePod:output_type -> pb.Empty + 8, // 146: pb.CoreRPC.GetPod:output_type -> pb.Pod + 9, // 147: pb.CoreRPC.ListPods:output_type -> pb.Pods + 10, // 148: pb.CoreRPC.GetPodResource:output_type -> pb.PodResource + 11, // 149: pb.CoreRPC.PodResourceStream:output_type -> pb.NodeResource + 17, // 150: pb.CoreRPC.AddNode:output_type -> pb.Node + 4, // 151: pb.CoreRPC.RemoveNode:output_type -> pb.Empty + 18, // 152: pb.CoreRPC.ListPodNodes:output_type -> pb.Nodes + 17, // 153: pb.CoreRPC.PodNodesStream:output_type -> pb.Node + 17, // 154: pb.CoreRPC.GetNode:output_type -> pb.Node + 17, // 155: pb.CoreRPC.SetNode:output_type -> pb.Node + 4, // 156: pb.CoreRPC.SetNodeStatus:output_type -> pb.Empty + 23, // 157: pb.CoreRPC.GetNodeStatus:output_type -> pb.NodeStatusStreamMessage + 23, // 158: pb.CoreRPC.NodeStatusStream:output_type -> pb.NodeStatusStreamMessage + 11, // 159: pb.CoreRPC.GetNodeResource:output_type -> pb.NodeResource + 86, // 160: pb.CoreRPC.CalculateCapacity:output_type -> pb.CapacityMessage + 25, // 161: pb.CoreRPC.GetWorkload:output_type -> pb.Workload + 31, // 162: pb.CoreRPC.GetWorkloads:output_type -> pb.Workloads + 25, // 163: pb.CoreRPC.ListWorkloads:output_type -> pb.Workload + 31, // 164: pb.CoreRPC.ListNodeWorkloads:output_type -> pb.Workloads + 27, // 165: pb.CoreRPC.GetWorkloadsStatus:output_type -> pb.WorkloadsStatus + 27, // 166: pb.CoreRPC.SetWorkloadsStatus:output_type -> pb.WorkloadsStatus + 30, // 167: pb.CoreRPC.WorkloadStatusStream:output_type -> pb.WorkloadStatusStreamMessage + 77, // 168: pb.CoreRPC.Copy:output_type -> pb.CopyMessage + 78, // 169: pb.CoreRPC.Send:output_type -> pb.SendMessage + 78, // 170: pb.CoreRPC.SendLargeFile:output_type -> pb.SendMessage + 67, // 171: pb.CoreRPC.BuildImage:output_type -> pb.BuildImageMessage + 70, // 172: pb.CoreRPC.CacheImage:output_type -> pb.CacheImageMessage + 71, // 173: pb.CoreRPC.RemoveImage:output_type -> pb.RemoveImageMessage + 73, // 174: pb.CoreRPC.ListImage:output_type -> pb.ListImageMessage + 68, // 175: pb.CoreRPC.CreateWorkload:output_type -> pb.CreateWorkloadMessage + 69, // 176: pb.CoreRPC.ReplaceWorkload:output_type -> pb.ReplaceWorkloadMessage + 74, // 177: pb.CoreRPC.RemoveWorkload:output_type -> pb.RemoveWorkloadMessage + 75, // 178: pb.CoreRPC.DissociateWorkload:output_type -> pb.DissociateWorkloadMessage + 82, // 179: pb.CoreRPC.ControlWorkload:output_type -> pb.ControlWorkloadMessage + 79, // 180: pb.CoreRPC.ExecuteWorkload:output_type -> pb.AttachWorkloadMessage + 76, // 181: pb.CoreRPC.ReallocResource:output_type -> pb.ReallocResourceMessage + 84, // 182: pb.CoreRPC.LogStream:output_type -> pb.LogStreamMessage + 79, // 183: pb.CoreRPC.RunAndWait:output_type -> pb.AttachWorkloadMessage + 139, // [139:184] is the sub-list for method output_type + 94, // [94:139] is the sub-list for method input_type + 94, // [94:94] is the sub-list for extension type_name + 94, // [94:94] is the sub-list for extension extendee + 0, // [0:94] is the sub-list for field type_name } func init() { file_rpc_gen_core_proto_init() } @@ -8951,30 +8846,6 @@ func file_rpc_gen_core_proto_init() { return nil } } - file_rpc_gen_core_proto_msgTypes[132].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileOptions_Metadata); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_rpc_gen_core_proto_msgTypes[133].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileOptions_Chunk); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } } type x struct{} out := protoimpl.TypeBuilder{ @@ -8982,7 +8853,7 @@ func file_rpc_gen_core_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_rpc_gen_core_proto_rawDesc, NumEnums: 4, - NumMessages: 136, + NumMessages: 134, NumExtensions: 0, NumServices: 1, }, diff --git a/rpc/gen/core.proto b/rpc/gen/core.proto index a5fb67cb1..255769f83 100644 --- a/rpc/gen/core.proto +++ b/rpc/gen/core.proto @@ -542,18 +542,12 @@ message SendOptions { } message FileOptions { - message Metadata { - repeated string ids = 1; - string dst = 2; - int64 size = 3; - FileMode mode = 4; - FileOwner owner = 5; - } - message Chunk { - bytes data = 1; - } - Metadata metadata = 1; - Chunk chunk = 2; + repeated string ids = 1; + string dst = 2; + int64 size = 3; + FileMode mode = 4; + FileOwner owner = 5; + bytes chunk = 6; } message ErrorDetail { diff --git a/rpc/transform.go b/rpc/transform.go index a1e06eae4..2bd4393d2 100644 --- a/rpc/transform.go +++ b/rpc/transform.go @@ -646,15 +646,15 @@ func toCoreListImageOptions(opts *pb.ListImageOptions) *types.ImageOptions { func toSendLargeFileOptions(opts *pb.FileOptions) *types.SendLargeFileOptions { return &types.SendLargeFileOptions{ FileMetadataOptions: types.FileMetadataOptions{ - Ids: opts.Metadata.Ids, - Dst: opts.Metadata.Dst, - Size: opts.Metadata.Size, - Mode: opts.Metadata.Mode.Mode, - Uid: int(opts.Metadata.Owner.Uid), - Gid: int(opts.Metadata.Owner.Gid), + Ids: opts.Ids, + Dst: opts.Dst, + Size: opts.Size, + Mode: opts.Mode.Mode, + Uid: int(opts.Owner.Uid), + Gid: int(opts.Owner.Gid), }, FileChunkOptions: types.FileChunkOptions{ - Data: opts.Chunk.Data, + Data: opts.Chunk, }, } } \ No newline at end of file From bcd421abbc950754bf6804c0051273dfd3ae1cd6 Mon Sep 17 00:00:00 2001 From: HJ Date: Mon, 14 Feb 2022 18:51:19 +0800 Subject: [PATCH 09/29] delete some annotation and modify the code --- cluster/calcium/sendlarge.go | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index d23b62a92..faf117080 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -3,7 +3,6 @@ package calcium import ( "context" "github.com/pkg/errors" - "github.com/projecteru2/core/engine" "github.com/projecteru2/core/log" "github.com/projecteru2/core/types" "github.com/projecteru2/core/utils" @@ -60,7 +59,7 @@ func (c *Calcium) newWorkloadExecutor(ctx context.Context, ID string, resp chan return func() { defer wg.Done() if err := c.withWorkloadLocked(ctx, ID, func(ctx context.Context, workload *types.Workload) error { - err := c.doSendChunkFileToWorkload(ctx, workload.Engine, workload.ID, name, size, content, uid, gid, mode) + err := errors.WithStack(workload.Engine.VirtualizationCopyChunkTo(ctx, ID, name, size, content, uid, gid, mode)) resp <- &types.SendMessage{ID: ID, Path: name, Error: err} return nil }); err != nil { @@ -77,9 +76,4 @@ func (c *Calcium) newWorkloadExecutor(ctx context.Context, ID string, resp chan } }) return input -} - -func (c *Calcium) doSendChunkFileToWorkload(ctx context.Context, engine engine.API, ID, name string, size int64, content io.Reader, uid, gid int, mode int64) error { - log.Infof(ctx, "[doSendChunkFileToWorkload] Send file to %s:%s", ID, name) - return errors.WithStack(engine.VirtualizationCopyChunkTo(ctx, ID, name, size, content, uid, gid, mode)) } \ No newline at end of file From ffddadf79d906182bee78b7810434d320656668d Mon Sep 17 00:00:00 2001 From: HJ Date: Wed, 16 Feb 2022 18:42:06 +0800 Subject: [PATCH 10/29] fix dead lock, modify chunk size --- engine/docker/container.go | 21 ++++++++++++--------- rpc/rpc.go | 33 ++++++++++++++++++--------------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/engine/docker/container.go b/engine/docker/container.go index 82bc42b5a..7961aebfa 100644 --- a/engine/docker/container.go +++ b/engine/docker/container.go @@ -337,6 +337,7 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin pr, pw := io.Pipe() tw := tar.NewWriter(pw) defer tw.Close() + const maxChunkSize = 2 << 10 // todo 这里有点奇怪,之前带参数的匿名函数会随机报错,现在改成无参的函数后就不报错了,还没找到原因 utils.SentryGo(func() { hdr := &tar.Header{ @@ -347,39 +348,41 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin Gid: gid, } if err := tw.WriteHeader(hdr); err != nil { - logrus.Infof("[VirtualizationCopyChunkTo] write header to %s err, err: %v", ID, err) + log.Errorf(ctx, "[VirtualizationCopyChunkTo] write header to %s err, err: %v", ID, err) return } for { - data := make([]byte, 10 * 1024 * 1024) + data := make([]byte, maxChunkSize) n, err := content.Read(data) if err != nil { if err != io.EOF { - logrus.Debugf("[VirtualizationCopyChunkTo] read data from pipe err, err: %v", err) + log.Errorf(ctx, "[VirtualizationCopyChunkTo] read data from pipe err, err: %v", err) } - logrus.Debugf("[VirtualizationCopyChunkTo] read data end, try to close the pipe, ID=%s, file=%s", ID, target) err := pw.Close() if err != nil { - logrus.Debugf("[VirtualizationCopyChunkTo] close pipe writer, err: %v", err) + log.Errorf(ctx, "[VirtualizationCopyChunkTo] close pipe writer, err: %v", err) } return } if n < len(data) { data = data[:n] } - logrus.Debugf("[VirtualizationCopyChunkTo] have read data length=%d , and try to write data into %s", len(data), ID) _, err = tw.Write(data) if err != nil { - logrus.Debugf("[VirtualizationCopyChunkTo] write data into %s err, err: %v", ID, err) + log.Debugf(ctx, "[VirtualizationCopyChunkTo] write data into %s err, err: %v", ID, err) err := pw.Close() if err != nil { - logrus.Debugf("[VirtualizationCopyChunkTo] close pipe writer, err: %v", err) + log.Errorf(ctx, "[VirtualizationCopyChunkTo] close pipe writer, err: %v", err) } return } } }) - return e.client.CopyToContainer(ctx, ID, filepath.Dir(target), pr, dockertypes.CopyToContainerOptions{AllowOverwriteDirWithFile: true, CopyUIDGID: false}) + err := e.client.CopyToContainer(ctx, ID, filepath.Dir(target), pr, dockertypes.CopyToContainerOptions{AllowOverwriteDirWithFile: true, CopyUIDGID: false}) + if err != nil { + logrus.Debugf("[VirtualizationCopyChunkTo] call CopyToContainer, err: %v", err) + } + return err } // VirtualizationStart start virtualization diff --git a/rpc/rpc.go b/rpc/rpc.go index 50a937f67..051e1a3fd 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -592,6 +592,24 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { dc := make(chan *types.SendLargeFileOptions, 0) ch := v.cluster.SendLargeFile(ctx, dc) + + utils.SentryGo(func() { + for m := range ch { + msg := &pb.SendMessage { + Id: m.ID, + Path: m.Path, + } + + if m.Error != nil { + msg.Error = m.Error.Error() + } + + if err := server.Send(msg); err != nil { + v.logUnsentMessages(ctx, "SendLargeFile", err, m) + } + } + }) + for { req, err := server.Recv() if err == io.EOF { @@ -604,21 +622,6 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { dc <- data } close(dc) - // todo 可能会死锁,后面需要改一下 - for m := range ch { - msg := &pb.SendMessage { - Id: m.ID, - Path: m.Path, - } - - if m.Error != nil { - msg.Error = m.Error.Error() - } - - if err := server.Send(msg); err != nil { - v.logUnsentMessages(ctx, "SendLargeFile", err, m) - } - } return nil } From a2a04b042f8747e6108c016363feb48261d710a8 Mon Sep 17 00:00:00 2001 From: HJ Date: Thu, 17 Feb 2022 17:29:13 +0800 Subject: [PATCH 11/29] bug fix --- cluster/calcium/sendlarge.go | 1 - engine/docker/container.go | 9 ++------- rpc/rpc.go | 4 +++- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index faf117080..d9aca3f15 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -63,7 +63,6 @@ func (c *Calcium) newWorkloadExecutor(ctx context.Context, ID string, resp chan resp <- &types.SendMessage{ID: ID, Path: name, Error: err} return nil }); err != nil { - log.Debugf(ctx, "[newWorkloadExecutor]container %s exec %s err, err=%v", ID, name, err) resp <- &types.SendMessage{ID: ID, Error: err} } } diff --git a/engine/docker/container.go b/engine/docker/container.go index 7961aebfa..c20da7fe6 100644 --- a/engine/docker/container.go +++ b/engine/docker/container.go @@ -5,7 +5,6 @@ import ( "context" "encoding/json" "fmt" - "github.com/sirupsen/logrus" "io" "io/ioutil" "math" @@ -338,7 +337,7 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin tw := tar.NewWriter(pw) defer tw.Close() const maxChunkSize = 2 << 10 - // todo 这里有点奇怪,之前带参数的匿名函数会随机报错,现在改成无参的函数后就不报错了,还没找到原因 + // todo 这里有点奇怪,之前带参数的匿名函数会随机报错,现在改成无参的函数后就不报错了,还没找到原因, 且之前的参数writer用的是interface utils.SentryGo(func() { hdr := &tar.Header{ Name: filepath.Base(target), @@ -378,11 +377,7 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin } } }) - err := e.client.CopyToContainer(ctx, ID, filepath.Dir(target), pr, dockertypes.CopyToContainerOptions{AllowOverwriteDirWithFile: true, CopyUIDGID: false}) - if err != nil { - logrus.Debugf("[VirtualizationCopyChunkTo] call CopyToContainer, err: %v", err) - } - return err + return e.client.CopyToContainer(ctx, ID, filepath.Dir(target), pr, dockertypes.CopyToContainerOptions{AllowOverwriteDirWithFile: true, CopyUIDGID: false}) } // VirtualizationStart start virtualization diff --git a/rpc/rpc.go b/rpc/rpc.go index 051e1a3fd..7859e6120 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -592,7 +592,7 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { dc := make(chan *types.SendLargeFileOptions, 0) ch := v.cluster.SendLargeFile(ctx, dc) - + waitCh := make(chan bool) utils.SentryGo(func() { for m := range ch { msg := &pb.SendMessage { @@ -608,6 +608,7 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { v.logUnsentMessages(ctx, "SendLargeFile", err, m) } } + waitCh <- true }) for { @@ -622,6 +623,7 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { dc <- data } close(dc) + <- waitCh return nil } From 70fc7408369c7d085fbcf647ffcb8790bfe51b6c Mon Sep 17 00:00:00 2001 From: HJ Date: Fri, 18 Feb 2022 10:37:06 +0800 Subject: [PATCH 12/29] add some annotation --- Makefile | 2 +- engine/docker/container.go | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index b9a620496..0d0e59de2 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ deps: env GO111MODULE=on go mod vendor binary: - CGO_ENABLED=0 go build -ldflags "$(GO_LDFLAGS)" -o eru-core + CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "$(GO_LDFLAGS)" -o eru-core build: deps binary diff --git a/engine/docker/container.go b/engine/docker/container.go index c20da7fe6..9df695af9 100644 --- a/engine/docker/container.go +++ b/engine/docker/container.go @@ -377,7 +377,11 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin } } }) - return e.client.CopyToContainer(ctx, ID, filepath.Dir(target), pr, dockertypes.CopyToContainerOptions{AllowOverwriteDirWithFile: true, CopyUIDGID: false}) + err := e.client.CopyToContainer(ctx, ID, filepath.Dir(target), pr, dockertypes.CopyToContainerOptions{AllowOverwriteDirWithFile: true, CopyUIDGID: false}) + if err != nil { + log.Errorf(ctx, "[VirtualizationCopyChunkTo] copy %s to container %s err, err:%v", target, ID, err) + } + return err } // VirtualizationStart start virtualization From 05d309af319b7fb44538cab5c7d9ccaf33b2909b Mon Sep 17 00:00:00 2001 From: HJ Date: Fri, 18 Feb 2022 10:38:30 +0800 Subject: [PATCH 13/29] rollback makefile --- Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile b/Makefile index 0d0e59de2..b9a620496 100644 --- a/Makefile +++ b/Makefile @@ -22,7 +22,7 @@ deps: env GO111MODULE=on go mod vendor binary: - CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "$(GO_LDFLAGS)" -o eru-core + CGO_ENABLED=0 go build -ldflags "$(GO_LDFLAGS)" -o eru-core build: deps binary From 9094e0a6a1d10794191be4b2e9b3b58cb7a9a6d8 Mon Sep 17 00:00:00 2001 From: HJ Date: Tue, 1 Mar 2022 17:45:31 +0800 Subject: [PATCH 14/29] modify the function 'newWorkloadExecutor' and let it just send one file --- cluster/calcium/sendlarge.go | 28 ++++++++++------------ rpc/rpc.go | 46 +++++++++++++++++------------------- 2 files changed, 35 insertions(+), 39 deletions(-) diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index d9aca3f15..98648dada 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -41,20 +41,20 @@ func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeF func (c *Calcium) newWorkloadExecutor(ctx context.Context, ID string, resp chan *types.SendMessage, wg *sync.WaitGroup) chan *types.SendLargeFileOptions { input := make(chan *types.SendLargeFileOptions, 10) utils.SentryGo(func() { - writerMap := make(map[string]*io.PipeWriter) - preFile := "" + var writer *io.PipeWriter + curFile := "" for data := range input { - curFile := data.Dst - if preFile == "" || preFile != curFile { + if curFile != "" && curFile != data.Dst { + // todo 报错之后返回一下? + log.Errorf(ctx, "[newWorkloadExecutor] receive different files %s, %s", curFile, data.Dst) + break + } + if curFile == "" { wg.Add(1) - log.Debugf(ctx, "[newWorkloadExecutor]Receive new file file %s to %s", curFile, ID) - if preFile != "" { - writerMap[preFile].Close() - delete(writerMap, preFile) - } - preFile = curFile + log.Debugf(ctx, "[newWorkloadExecutor]Receive new file %s to %s", curFile, ID) + curFile = data.Dst pr, pw := io.Pipe() - writerMap[curFile] = pw + writer = pw utils.SentryGo(func(ID, name string, size int64, content io.Reader, uid, gid int, mode int64) func() { return func() { defer wg.Done() @@ -68,11 +68,9 @@ func (c *Calcium) newWorkloadExecutor(ctx context.Context, ID string, resp chan } }(ID, curFile, data.Size, pr, data.Uid, data.Gid, data.Mode)) } - writerMap[curFile].Write(data.Data) - } - for _, pw := range writerMap { - pw.Close() + writer.Write(data.Data) } + writer.Close() }) return input } \ No newline at end of file diff --git a/rpc/rpc.go b/rpc/rpc.go index 7859e6120..37a1cbc0f 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -590,40 +590,38 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { ctx := v.taskAdd(server.Context(), "SendLargeFile", true) defer v.taskDone(ctx, "SendLargeFile", true) - dc := make(chan *types.SendLargeFileOptions, 0) + dc := make(chan *types.SendLargeFileOptions) ch := v.cluster.SendLargeFile(ctx, dc) - waitCh := make(chan bool) utils.SentryGo(func() { - for m := range ch { - msg := &pb.SendMessage { - Id: m.ID, - Path: m.Path, - } - - if m.Error != nil { - msg.Error = m.Error.Error() + for { + req, err := server.Recv() + if err == io.EOF { + break } - - if err := server.Send(msg); err != nil { - v.logUnsentMessages(ctx, "SendLargeFile", err, m) + if err != nil { + log.Errorf(ctx, "[SendLargeFile]receive from rpc err: %v", err) + return } + data := toSendLargeFileOptions(req) + dc <- data } - waitCh <- true + close(dc) }) - for { - req, err := server.Recv() - if err == io.EOF { - break + for m := range ch { + msg := &pb.SendMessage { + Id: m.ID, + Path: m.Path, } - if err != nil { - return grpcstatus.Error(SendLargeFile, err.Error()) + + if m.Error != nil { + msg.Error = m.Error.Error() + } + + if err := server.Send(msg); err != nil { + v.logUnsentMessages(ctx, "SendLargeFile", err, m) } - data := toSendLargeFileOptions(req) - dc <- data } - close(dc) - <- waitCh return nil } From 20e8d54131c6d8828066f57100c921ddb882a0bf Mon Sep 17 00:00:00 2001 From: HJ Date: Tue, 1 Mar 2022 23:25:13 +0800 Subject: [PATCH 15/29] modify the RPC method 'send', let it call 'SendLargeFile' --- rpc/rpc.go | 35 +++++++++++++++++++++-------------- rpc/transform.go | 25 +++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 14 deletions(-) diff --git a/rpc/rpc.go b/rpc/rpc.go index 37a1cbc0f..e1032c530 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -564,23 +564,30 @@ func (v *Vibranium) Send(opts *pb.SendOptions, stream pb.CoreRPC_SendServer) err return grpcstatus.Error(Send, err.Error()) } - ch, err := v.cluster.Send(ctx, sendOpts) - if err != nil { - return grpcstatus.Error(Send, err.Error()) - } + for _, file := range sendOpts.Files { + dc := make(chan *types.SendLargeFileOptions) + ch := v.cluster.SendLargeFile(ctx, dc) + utils.SentryGo(func() { + data := toSendLargeFileChunks(file, sendOpts.IDs) + for _, chunk := range data { + dc <- chunk + } + close(dc) + }) - for m := range ch { - msg := &pb.SendMessage{ - Id: m.ID, - Path: m.Path, - } + for m := range ch { + msg := &pb.SendMessage { + Id: m.ID, + Path: m.Path, + } - if m.Error != nil { - msg.Error = m.Error.Error() - } + if m.Error != nil { + msg.Error = m.Error.Error() + } - if err := stream.Send(msg); err != nil { - v.logUnsentMessages(ctx, "Send", err, m) + if err := stream.Send(msg); err != nil { + v.logUnsentMessages(ctx, "Send", err, m) + } } } return nil diff --git a/rpc/transform.go b/rpc/transform.go index 2bd4393d2..ae6caee27 100644 --- a/rpc/transform.go +++ b/rpc/transform.go @@ -657,4 +657,29 @@ func toSendLargeFileOptions(opts *pb.FileOptions) *types.SendLargeFileOptions { Data: opts.Chunk, }, } +} + +func toSendLargeFileChunks(file types.LinuxFile, ids []string) []*types.SendLargeFileOptions { + const maxChunkSize = 2 << 10 + ret := make([]*types.SendLargeFileOptions, 0) + for idx := 0; idx < len(file.Content); idx += maxChunkSize { + sendLargeFileOptions := &types.SendLargeFileOptions{ + FileMetadataOptions: types.FileMetadataOptions{ + Ids: ids, + Dst: file.Filename, + Size: int64(len(file.Content)), + Mode: file.Mode, + Uid: file.UID, + Gid: file.GID, + }, + FileChunkOptions: types.FileChunkOptions{}, + } + if idx + maxChunkSize > len(file.Content) { + sendLargeFileOptions.Data = file.Content[idx:] + } else { + sendLargeFileOptions.Data = file.Content[idx: idx+maxChunkSize] + } + ret = append(ret, sendLargeFileOptions) + } + return ret } \ No newline at end of file From 3be2694abbc222c74ca2b8746d7be82f55429858 Mon Sep 17 00:00:00 2001 From: HJ Date: Tue, 1 Mar 2022 23:37:34 +0800 Subject: [PATCH 16/29] modify the struct of 'SendLargeFileOptions' --- cluster/calcium/sendlarge.go | 2 +- rpc/transform.go | 37 +++++++++++++++--------------------- types/options.go | 14 ++------------ 3 files changed, 18 insertions(+), 35 deletions(-) diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index 98648dada..ec86d6a34 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -68,7 +68,7 @@ func (c *Calcium) newWorkloadExecutor(ctx context.Context, ID string, resp chan } }(ID, curFile, data.Size, pr, data.Uid, data.Gid, data.Mode)) } - writer.Write(data.Data) + writer.Write(data.Chunk) } writer.Close() }) diff --git a/rpc/transform.go b/rpc/transform.go index ae6caee27..82e741737 100644 --- a/rpc/transform.go +++ b/rpc/transform.go @@ -645,17 +645,13 @@ func toCoreListImageOptions(opts *pb.ListImageOptions) *types.ImageOptions { func toSendLargeFileOptions(opts *pb.FileOptions) *types.SendLargeFileOptions { return &types.SendLargeFileOptions{ - FileMetadataOptions: types.FileMetadataOptions{ - Ids: opts.Ids, - Dst: opts.Dst, - Size: opts.Size, - Mode: opts.Mode.Mode, - Uid: int(opts.Owner.Uid), - Gid: int(opts.Owner.Gid), - }, - FileChunkOptions: types.FileChunkOptions{ - Data: opts.Chunk, - }, + Ids: opts.Ids, + Dst: opts.Dst, + Size: opts.Size, + Mode: opts.Mode.Mode, + Uid: int(opts.Owner.Uid), + Gid: int(opts.Owner.Gid), + Chunk: opts.Chunk, } } @@ -664,20 +660,17 @@ func toSendLargeFileChunks(file types.LinuxFile, ids []string) []*types.SendLarg ret := make([]*types.SendLargeFileOptions, 0) for idx := 0; idx < len(file.Content); idx += maxChunkSize { sendLargeFileOptions := &types.SendLargeFileOptions{ - FileMetadataOptions: types.FileMetadataOptions{ - Ids: ids, - Dst: file.Filename, - Size: int64(len(file.Content)), - Mode: file.Mode, - Uid: file.UID, - Gid: file.GID, - }, - FileChunkOptions: types.FileChunkOptions{}, + Ids: ids, + Dst: file.Filename, + Size: int64(len(file.Content)), + Mode: file.Mode, + Uid: file.UID, + Gid: file.GID, } if idx + maxChunkSize > len(file.Content) { - sendLargeFileOptions.Data = file.Content[idx:] + sendLargeFileOptions.Chunk = file.Content[idx:] } else { - sendLargeFileOptions.Data = file.Content[idx: idx+maxChunkSize] + sendLargeFileOptions.Chunk = file.Content[idx: idx+maxChunkSize] } ret = append(ret, sendLargeFileOptions) } diff --git a/types/options.go b/types/options.go index fb6fb50f7..303b40181 100644 --- a/types/options.go +++ b/types/options.go @@ -361,23 +361,13 @@ func (r RawArgs) LitterDump(w io.Writer) { // SendLargeFileOptions for LargeFileTransfer type SendLargeFileOptions struct { - FileMetadataOptions - FileChunkOptions -} - -// FileMetadataOptions for LargeFileTransfer -type FileMetadataOptions struct { Ids []string Dst string Size int64 Mode int64 Uid int Gid int -} - -// FileChunkOptions for LargeFileTransfer -type FileChunkOptions struct { - Data []byte + Chunk []byte } // Validate checks options @@ -385,7 +375,7 @@ func (o *SendLargeFileOptions) Validate() error { if len(o.Ids) == 0 { return errors.WithStack(ErrNoWorkloadIDs) } - if len(o.Data) == 0 { + if len(o.Chunk) == 0 { return errors.WithStack(ErrNoFilesToSend) } if o.Uid == 0 && o.Gid == 0 && o.Mode == 0 { From 8b886ee6d92ca7cc6f918d3fc73c42a9759149d8 Mon Sep 17 00:00:00 2001 From: HJ Date: Tue, 8 Mar 2022 23:29:12 +0800 Subject: [PATCH 17/29] clean up the code --- cluster/calcium/sendlarge.go | 52 +++++++++++++++++++++++++----------- rpc/rpc.go | 6 ++++- rpc/transform.go | 6 +++-- 3 files changed, 46 insertions(+), 18 deletions(-) diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index ec86d6a34..d3d1ff280 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -16,34 +16,48 @@ func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeF wg := &sync.WaitGroup{} utils.SentryGo(func() { defer close(resp) - handlers := make(map[string]chan *types.SendLargeFileOptions) + senders := make(map[string]*workloadSender) for data := range opts { if err := data.Validate(); err != nil { continue } for _, id := range data.Ids { - if _, ok := handlers[id]; !ok { - log.Debugf(ctx, "[SendLargeFile] create handler for %s", id) - handler := c.newWorkloadExecutor(ctx, id, resp, wg) - handlers[id] = handler + if _, ok := senders[id]; !ok { + log.Debugf(ctx, "[SendLargeFile] create sender for %s", id) + sender := c.newWorkloadSender(ctx, id, resp, wg) + senders[id] = sender } - handlers[id] <- data + senders[id].send(data) } } - for _, handler := range handlers{ - close(handler) + for _, sender := range senders{ + sender.close() } wg.Wait() }) return resp } -func (c *Calcium) newWorkloadExecutor(ctx context.Context, ID string, resp chan *types.SendMessage, wg *sync.WaitGroup) chan *types.SendLargeFileOptions { - input := make(chan *types.SendLargeFileOptions, 10) +type workloadSender struct { + calcium *Calcium + id string + wg *sync.WaitGroup + buffer chan *types.SendLargeFileOptions + resp chan *types.SendMessage +} + +func (c *Calcium) newWorkloadSender(ctx context.Context, ID string, resp chan *types.SendMessage, wg *sync.WaitGroup) *workloadSender { + sender := &workloadSender{ + calcium: c, + id: ID, + wg: wg, + buffer: make(chan *types.SendLargeFileOptions, 10), + resp: resp, + } utils.SentryGo(func() { var writer *io.PipeWriter curFile := "" - for data := range input { + for data := range sender.buffer { if curFile != "" && curFile != data.Dst { // todo 报错之后返回一下? log.Errorf(ctx, "[newWorkloadExecutor] receive different files %s, %s", curFile, data.Dst) @@ -51,14 +65,14 @@ func (c *Calcium) newWorkloadExecutor(ctx context.Context, ID string, resp chan } if curFile == "" { wg.Add(1) - log.Debugf(ctx, "[newWorkloadExecutor]Receive new file %s to %s", curFile, ID) + log.Debugf(ctx, "[newWorkloadExecutor]Receive new file %s to %s", curFile, sender.id) curFile = data.Dst pr, pw := io.Pipe() writer = pw utils.SentryGo(func(ID, name string, size int64, content io.Reader, uid, gid int, mode int64) func() { return func() { defer wg.Done() - if err := c.withWorkloadLocked(ctx, ID, func(ctx context.Context, workload *types.Workload) error { + if err := sender.calcium.withWorkloadLocked(ctx, ID, func(ctx context.Context, workload *types.Workload) error { err := errors.WithStack(workload.Engine.VirtualizationCopyChunkTo(ctx, ID, name, size, content, uid, gid, mode)) resp <- &types.SendMessage{ID: ID, Path: name, Error: err} return nil @@ -72,5 +86,13 @@ func (c *Calcium) newWorkloadExecutor(ctx context.Context, ID string, resp chan } writer.Close() }) - return input -} \ No newline at end of file + return sender +} + +func (s *workloadSender) send(chunk *types.SendLargeFileOptions) { + s.buffer <- chunk +} + +func (s *workloadSender) close() { + close(s.buffer) +} diff --git a/rpc/rpc.go b/rpc/rpc.go index e1032c530..07a470d4c 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -609,7 +609,11 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { log.Errorf(ctx, "[SendLargeFile]receive from rpc err: %v", err) return } - data := toSendLargeFileOptions(req) + data, err := toSendLargeFileOptions(req) + if err != nil { + log.Errorf(ctx, "[SendLargeFile]transform data err: %v", err) + return + } dc <- data } close(dc) diff --git a/rpc/transform.go b/rpc/transform.go index 82e741737..9a9794176 100644 --- a/rpc/transform.go +++ b/rpc/transform.go @@ -643,8 +643,8 @@ func toCoreListImageOptions(opts *pb.ListImageOptions) *types.ImageOptions { } } -func toSendLargeFileOptions(opts *pb.FileOptions) *types.SendLargeFileOptions { - return &types.SendLargeFileOptions{ +func toSendLargeFileOptions(opts *pb.FileOptions) (*types.SendLargeFileOptions, error) { + ret := &types.SendLargeFileOptions{ Ids: opts.Ids, Dst: opts.Dst, Size: opts.Size, @@ -653,6 +653,8 @@ func toSendLargeFileOptions(opts *pb.FileOptions) *types.SendLargeFileOptions { Gid: int(opts.Owner.Gid), Chunk: opts.Chunk, } + err := ret.Validate() + return ret, err } func toSendLargeFileChunks(file types.LinuxFile, ids []string) []*types.SendLargeFileOptions { From 3ac63abf3c1dfbcb304060c0812815f82381871e Mon Sep 17 00:00:00 2001 From: HJ Date: Tue, 8 Mar 2022 23:36:02 +0800 Subject: [PATCH 18/29] clean up the code --- cluster/calcium/sendlarge.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index d3d1ff280..856fe5038 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -18,9 +18,6 @@ func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeF defer close(resp) senders := make(map[string]*workloadSender) for data := range opts { - if err := data.Validate(); err != nil { - continue - } for _, id := range data.Ids { if _, ok := senders[id]; !ok { log.Debugf(ctx, "[SendLargeFile] create sender for %s", id) From 3f17845fa8a2953cb3175e94ad0daf7d608f180a Mon Sep 17 00:00:00 2001 From: hongji Date: Tue, 11 Jul 2023 09:59:41 +0800 Subject: [PATCH 19/29] regenerate mock --- 3rdmocks/ServerStream.go | 16 +- cluster/calcium/send_test.go | 2 + cluster/mocks/Cluster.go | 199 +++++++++-- engine/docker/mocks/APIClient.go | 423 +++++++++++++++++++----- engine/mocks/API.go | 174 +++++++--- go.sum | 32 ++ lock/mocks/DistributedLock.go | 26 +- rpc/mocks/CoreRPC_RunAndWaitServer.go | 21 +- scheduler/mocks/Scheduler.go | 71 +++- source/mocks/Source.go | 16 +- store/etcdv3/meta/mocks/ETCDClientV3.go | 71 +++- store/etcdv3/meta/mocks/KV.go | 88 ++++- store/etcdv3/meta/mocks/Txn.go | 21 +- store/mocks/Store.go | 105 ++++-- 14 files changed, 1019 insertions(+), 246 deletions(-) diff --git a/3rdmocks/ServerStream.go b/3rdmocks/ServerStream.go index 3f2cebdfc..26314a0b0 100644 --- a/3rdmocks/ServerStream.go +++ b/3rdmocks/ServerStream.go @@ -1,4 +1,4 @@ -// Code generated by mockery v0.0.0-dev. DO NOT EDIT. +// Code generated by mockery v2.30.1. DO NOT EDIT. package mocks @@ -91,3 +91,17 @@ func (_m *ServerStream) SetHeader(_a0 metadata.MD) error { func (_m *ServerStream) SetTrailer(_a0 metadata.MD) { _m.Called(_a0) } + +// NewServerStream creates a new instance of ServerStream. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewServerStream(t interface { + mock.TestingT + Cleanup(func()) +}) *ServerStream { + mock := &ServerStream{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/cluster/calcium/send_test.go b/cluster/calcium/send_test.go index 453e976bc..7bef406cf 100644 --- a/cluster/calcium/send_test.go +++ b/cluster/calcium/send_test.go @@ -16,6 +16,7 @@ import ( ) func TestSend(t *testing.T) { + panic("oh") c := NewTestCluster() ctx := context.Background() @@ -80,4 +81,5 @@ func TestSend(t *testing.T) { assert.Equal(t, r.ID, "cid") assert.Equal(t, r.Path, "/tmp/1") } + t.Log("ceshi yixia") } diff --git a/cluster/mocks/Cluster.go b/cluster/mocks/Cluster.go index aca0d84a8..de9b6bf0f 100644 --- a/cluster/mocks/Cluster.go +++ b/cluster/mocks/Cluster.go @@ -1,4 +1,4 @@ -// Code generated by mockery v0.0.0-dev. DO NOT EDIT. +// Code generated by mockery v2.30.1. DO NOT EDIT. package mocks @@ -21,6 +21,10 @@ func (_m *Cluster) AddNode(_a0 context.Context, _a1 *types.AddNodeOptions) (*typ ret := _m.Called(_a0, _a1) var r0 *types.Node + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.AddNodeOptions) (*types.Node, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, *types.AddNodeOptions) *types.Node); ok { r0 = rf(_a0, _a1) } else { @@ -29,7 +33,6 @@ func (_m *Cluster) AddNode(_a0 context.Context, _a1 *types.AddNodeOptions) (*typ } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.AddNodeOptions) error); ok { r1 = rf(_a0, _a1) } else { @@ -44,6 +47,10 @@ func (_m *Cluster) AddPod(ctx context.Context, podname string, desc string) (*ty ret := _m.Called(ctx, podname, desc) var r0 *types.Pod + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (*types.Pod, error)); ok { + return rf(ctx, podname, desc) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) *types.Pod); ok { r0 = rf(ctx, podname, desc) } else { @@ -52,7 +59,6 @@ func (_m *Cluster) AddPod(ctx context.Context, podname string, desc string) (*ty } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, podname, desc) } else { @@ -67,6 +73,10 @@ func (_m *Cluster) BuildImage(ctx context.Context, opts *types.BuildOptions) (ch ret := _m.Called(ctx, opts) var r0 chan *types.BuildImageMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.BuildOptions) (chan *types.BuildImageMessage, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, *types.BuildOptions) chan *types.BuildImageMessage); ok { r0 = rf(ctx, opts) } else { @@ -75,7 +85,6 @@ func (_m *Cluster) BuildImage(ctx context.Context, opts *types.BuildOptions) (ch } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.BuildOptions) error); ok { r1 = rf(ctx, opts) } else { @@ -90,6 +99,10 @@ func (_m *Cluster) CacheImage(ctx context.Context, opts *types.ImageOptions) (ch ret := _m.Called(ctx, opts) var r0 chan *types.CacheImageMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.ImageOptions) (chan *types.CacheImageMessage, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, *types.ImageOptions) chan *types.CacheImageMessage); ok { r0 = rf(ctx, opts) } else { @@ -98,7 +111,6 @@ func (_m *Cluster) CacheImage(ctx context.Context, opts *types.ImageOptions) (ch } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.ImageOptions) error); ok { r1 = rf(ctx, opts) } else { @@ -113,6 +125,10 @@ func (_m *Cluster) CalculateCapacity(_a0 context.Context, _a1 *types.DeployOptio ret := _m.Called(_a0, _a1) var r0 *types.CapacityMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.DeployOptions) (*types.CapacityMessage, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, *types.DeployOptions) *types.CapacityMessage); ok { r0 = rf(_a0, _a1) } else { @@ -121,7 +137,6 @@ func (_m *Cluster) CalculateCapacity(_a0 context.Context, _a1 *types.DeployOptio } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.DeployOptions) error); ok { r1 = rf(_a0, _a1) } else { @@ -136,6 +151,10 @@ func (_m *Cluster) ConnectNetwork(ctx context.Context, network string, target st ret := _m.Called(ctx, network, target, ipv4, ipv6) var r0 []string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) ([]string, error)); ok { + return rf(ctx, network, target, ipv4, ipv6) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) []string); ok { r0 = rf(ctx, network, target, ipv4, ipv6) } else { @@ -144,7 +163,6 @@ func (_m *Cluster) ConnectNetwork(ctx context.Context, network string, target st } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { r1 = rf(ctx, network, target, ipv4, ipv6) } else { @@ -159,6 +177,10 @@ func (_m *Cluster) ControlWorkload(ctx context.Context, ids []string, t string, ret := _m.Called(ctx, ids, t, force) var r0 chan *types.ControlWorkloadMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string, string, bool) (chan *types.ControlWorkloadMessage, error)); ok { + return rf(ctx, ids, t, force) + } if rf, ok := ret.Get(0).(func(context.Context, []string, string, bool) chan *types.ControlWorkloadMessage); ok { r0 = rf(ctx, ids, t, force) } else { @@ -167,7 +189,6 @@ func (_m *Cluster) ControlWorkload(ctx context.Context, ids []string, t string, } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string, string, bool) error); ok { r1 = rf(ctx, ids, t, force) } else { @@ -182,6 +203,10 @@ func (_m *Cluster) Copy(ctx context.Context, opts *types.CopyOptions) (chan *typ ret := _m.Called(ctx, opts) var r0 chan *types.CopyMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.CopyOptions) (chan *types.CopyMessage, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, *types.CopyOptions) chan *types.CopyMessage); ok { r0 = rf(ctx, opts) } else { @@ -190,7 +215,6 @@ func (_m *Cluster) Copy(ctx context.Context, opts *types.CopyOptions) (chan *typ } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.CopyOptions) error); ok { r1 = rf(ctx, opts) } else { @@ -205,6 +229,10 @@ func (_m *Cluster) CreateWorkload(ctx context.Context, opts *types.DeployOptions ret := _m.Called(ctx, opts) var r0 chan *types.CreateWorkloadMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.DeployOptions) (chan *types.CreateWorkloadMessage, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, *types.DeployOptions) chan *types.CreateWorkloadMessage); ok { r0 = rf(ctx, opts) } else { @@ -213,7 +241,6 @@ func (_m *Cluster) CreateWorkload(ctx context.Context, opts *types.DeployOptions } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.DeployOptions) error); ok { r1 = rf(ctx, opts) } else { @@ -242,6 +269,10 @@ func (_m *Cluster) DissociateWorkload(ctx context.Context, ids []string) (chan * ret := _m.Called(ctx, ids) var r0 chan *types.DissociateWorkloadMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string) (chan *types.DissociateWorkloadMessage, error)); ok { + return rf(ctx, ids) + } if rf, ok := ret.Get(0).(func(context.Context, []string) chan *types.DissociateWorkloadMessage); ok { r0 = rf(ctx, ids) } else { @@ -250,7 +281,6 @@ func (_m *Cluster) DissociateWorkload(ctx context.Context, ids []string) (chan * } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string) error); ok { r1 = rf(ctx, ids) } else { @@ -300,6 +330,10 @@ func (_m *Cluster) GetNode(ctx context.Context, nodename string) (*types.Node, e ret := _m.Called(ctx, nodename) var r0 *types.Node + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*types.Node, error)); ok { + return rf(ctx, nodename) + } if rf, ok := ret.Get(0).(func(context.Context, string) *types.Node); ok { r0 = rf(ctx, nodename) } else { @@ -308,7 +342,6 @@ func (_m *Cluster) GetNode(ctx context.Context, nodename string) (*types.Node, e } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, nodename) } else { @@ -323,6 +356,10 @@ func (_m *Cluster) GetNodeStatus(ctx context.Context, nodename string) (*types.N ret := _m.Called(ctx, nodename) var r0 *types.NodeStatus + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*types.NodeStatus, error)); ok { + return rf(ctx, nodename) + } if rf, ok := ret.Get(0).(func(context.Context, string) *types.NodeStatus); ok { r0 = rf(ctx, nodename) } else { @@ -331,7 +368,6 @@ func (_m *Cluster) GetNodeStatus(ctx context.Context, nodename string) (*types.N } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, nodename) } else { @@ -346,6 +382,10 @@ func (_m *Cluster) GetPod(ctx context.Context, podname string) (*types.Pod, erro ret := _m.Called(ctx, podname) var r0 *types.Pod + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*types.Pod, error)); ok { + return rf(ctx, podname) + } if rf, ok := ret.Get(0).(func(context.Context, string) *types.Pod); ok { r0 = rf(ctx, podname) } else { @@ -354,7 +394,6 @@ func (_m *Cluster) GetPod(ctx context.Context, podname string) (*types.Pod, erro } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, podname) } else { @@ -369,6 +408,10 @@ func (_m *Cluster) GetWorkload(ctx context.Context, id string) (*types.Workload, ret := _m.Called(ctx, id) var r0 *types.Workload + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*types.Workload, error)); ok { + return rf(ctx, id) + } if rf, ok := ret.Get(0).(func(context.Context, string) *types.Workload); ok { r0 = rf(ctx, id) } else { @@ -377,7 +420,6 @@ func (_m *Cluster) GetWorkload(ctx context.Context, id string) (*types.Workload, } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, id) } else { @@ -392,6 +434,10 @@ func (_m *Cluster) GetWorkloads(ctx context.Context, ids []string) ([]*types.Wor ret := _m.Called(ctx, ids) var r0 []*types.Workload + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string) ([]*types.Workload, error)); ok { + return rf(ctx, ids) + } if rf, ok := ret.Get(0).(func(context.Context, []string) []*types.Workload); ok { r0 = rf(ctx, ids) } else { @@ -400,7 +446,6 @@ func (_m *Cluster) GetWorkloads(ctx context.Context, ids []string) ([]*types.Wor } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string) error); ok { r1 = rf(ctx, ids) } else { @@ -415,6 +460,10 @@ func (_m *Cluster) GetWorkloadsStatus(ctx context.Context, ids []string) ([]*typ ret := _m.Called(ctx, ids) var r0 []*types.StatusMeta + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string) ([]*types.StatusMeta, error)); ok { + return rf(ctx, ids) + } if rf, ok := ret.Get(0).(func(context.Context, []string) []*types.StatusMeta); ok { r0 = rf(ctx, ids) } else { @@ -423,7 +472,6 @@ func (_m *Cluster) GetWorkloadsStatus(ctx context.Context, ids []string) ([]*typ } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string) error); ok { r1 = rf(ctx, ids) } else { @@ -438,6 +486,10 @@ func (_m *Cluster) ListImage(ctx context.Context, opts *types.ImageOptions) (cha ret := _m.Called(ctx, opts) var r0 chan *types.ListImageMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.ImageOptions) (chan *types.ListImageMessage, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, *types.ImageOptions) chan *types.ListImageMessage); ok { r0 = rf(ctx, opts) } else { @@ -446,7 +498,6 @@ func (_m *Cluster) ListImage(ctx context.Context, opts *types.ImageOptions) (cha } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.ImageOptions) error); ok { r1 = rf(ctx, opts) } else { @@ -461,6 +512,10 @@ func (_m *Cluster) ListNetworks(ctx context.Context, podname string, driver stri ret := _m.Called(ctx, podname, driver) var r0 []*enginetypes.Network + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) ([]*enginetypes.Network, error)); ok { + return rf(ctx, podname, driver) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) []*enginetypes.Network); ok { r0 = rf(ctx, podname, driver) } else { @@ -469,7 +524,6 @@ func (_m *Cluster) ListNetworks(ctx context.Context, podname string, driver stri } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, podname, driver) } else { @@ -484,6 +538,10 @@ func (_m *Cluster) ListNodeWorkloads(ctx context.Context, nodename string, label ret := _m.Called(ctx, nodename, labels) var r0 []*types.Workload + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, map[string]string) ([]*types.Workload, error)); ok { + return rf(ctx, nodename, labels) + } if rf, ok := ret.Get(0).(func(context.Context, string, map[string]string) []*types.Workload); ok { r0 = rf(ctx, nodename, labels) } else { @@ -492,7 +550,6 @@ func (_m *Cluster) ListNodeWorkloads(ctx context.Context, nodename string, label } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, map[string]string) error); ok { r1 = rf(ctx, nodename, labels) } else { @@ -507,6 +564,10 @@ func (_m *Cluster) ListPodNodes(_a0 context.Context, _a1 *types.ListNodesOptions ret := _m.Called(_a0, _a1) var r0 <-chan *types.Node + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.ListNodesOptions) (<-chan *types.Node, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, *types.ListNodesOptions) <-chan *types.Node); ok { r0 = rf(_a0, _a1) } else { @@ -515,7 +576,6 @@ func (_m *Cluster) ListPodNodes(_a0 context.Context, _a1 *types.ListNodesOptions } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.ListNodesOptions) error); ok { r1 = rf(_a0, _a1) } else { @@ -530,6 +590,10 @@ func (_m *Cluster) ListPods(ctx context.Context) ([]*types.Pod, error) { ret := _m.Called(ctx) var r0 []*types.Pod + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) ([]*types.Pod, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) []*types.Pod); ok { r0 = rf(ctx) } else { @@ -538,7 +602,6 @@ func (_m *Cluster) ListPods(ctx context.Context) ([]*types.Pod, error) { } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -553,6 +616,10 @@ func (_m *Cluster) ListWorkloads(ctx context.Context, opts *types.ListWorkloadsO ret := _m.Called(ctx, opts) var r0 []*types.Workload + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.ListWorkloadsOptions) ([]*types.Workload, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, *types.ListWorkloadsOptions) []*types.Workload); ok { r0 = rf(ctx, opts) } else { @@ -561,7 +628,6 @@ func (_m *Cluster) ListWorkloads(ctx context.Context, opts *types.ListWorkloadsO } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.ListWorkloadsOptions) error); ok { r1 = rf(ctx, opts) } else { @@ -576,6 +642,10 @@ func (_m *Cluster) LogStream(ctx context.Context, opts *types.LogStreamOptions) ret := _m.Called(ctx, opts) var r0 chan *types.LogStreamMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.LogStreamOptions) (chan *types.LogStreamMessage, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, *types.LogStreamOptions) chan *types.LogStreamMessage); ok { r0 = rf(ctx, opts) } else { @@ -584,7 +654,6 @@ func (_m *Cluster) LogStream(ctx context.Context, opts *types.LogStreamOptions) } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.LogStreamOptions) error); ok { r1 = rf(ctx, opts) } else { @@ -599,6 +668,10 @@ func (_m *Cluster) NodeResource(ctx context.Context, nodename string, fix bool) ret := _m.Called(ctx, nodename, fix) var r0 *types.NodeResource + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, bool) (*types.NodeResource, error)); ok { + return rf(ctx, nodename, fix) + } if rf, ok := ret.Get(0).(func(context.Context, string, bool) *types.NodeResource); ok { r0 = rf(ctx, nodename, fix) } else { @@ -607,7 +680,6 @@ func (_m *Cluster) NodeResource(ctx context.Context, nodename string, fix bool) } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, bool) error); ok { r1 = rf(ctx, nodename, fix) } else { @@ -638,6 +710,10 @@ func (_m *Cluster) PodResource(ctx context.Context, podname string) (chan *types ret := _m.Called(ctx, podname) var r0 chan *types.NodeResource + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (chan *types.NodeResource, error)); ok { + return rf(ctx, podname) + } if rf, ok := ret.Get(0).(func(context.Context, string) chan *types.NodeResource); ok { r0 = rf(ctx, podname) } else { @@ -646,7 +722,6 @@ func (_m *Cluster) PodResource(ctx context.Context, podname string) (chan *types } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, podname) } else { @@ -675,6 +750,10 @@ func (_m *Cluster) RemoveImage(ctx context.Context, opts *types.ImageOptions) (c ret := _m.Called(ctx, opts) var r0 chan *types.RemoveImageMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.ImageOptions) (chan *types.RemoveImageMessage, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, *types.ImageOptions) chan *types.RemoveImageMessage); ok { r0 = rf(ctx, opts) } else { @@ -683,7 +762,6 @@ func (_m *Cluster) RemoveImage(ctx context.Context, opts *types.ImageOptions) (c } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.ImageOptions) error); ok { r1 = rf(ctx, opts) } else { @@ -726,6 +804,10 @@ func (_m *Cluster) RemoveWorkload(ctx context.Context, ids []string, force bool, ret := _m.Called(ctx, ids, force, step) var r0 chan *types.RemoveWorkloadMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string, bool, int) (chan *types.RemoveWorkloadMessage, error)); ok { + return rf(ctx, ids, force, step) + } if rf, ok := ret.Get(0).(func(context.Context, []string, bool, int) chan *types.RemoveWorkloadMessage); ok { r0 = rf(ctx, ids, force, step) } else { @@ -734,7 +816,6 @@ func (_m *Cluster) RemoveWorkload(ctx context.Context, ids []string, force bool, } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string, bool, int) error); ok { r1 = rf(ctx, ids, force, step) } else { @@ -749,6 +830,10 @@ func (_m *Cluster) ReplaceWorkload(ctx context.Context, opts *types.ReplaceOptio ret := _m.Called(ctx, opts) var r0 chan *types.ReplaceWorkloadMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.ReplaceOptions) (chan *types.ReplaceWorkloadMessage, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, *types.ReplaceOptions) chan *types.ReplaceWorkloadMessage); ok { r0 = rf(ctx, opts) } else { @@ -757,7 +842,6 @@ func (_m *Cluster) ReplaceWorkload(ctx context.Context, opts *types.ReplaceOptio } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.ReplaceOptions) error); ok { r1 = rf(ctx, opts) } else { @@ -772,6 +856,11 @@ func (_m *Cluster) RunAndWait(ctx context.Context, opts *types.DeployOptions, in ret := _m.Called(ctx, opts, inCh) var r0 []string + var r1 <-chan *types.AttachWorkloadMessage + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, *types.DeployOptions, <-chan []byte) ([]string, <-chan *types.AttachWorkloadMessage, error)); ok { + return rf(ctx, opts, inCh) + } if rf, ok := ret.Get(0).(func(context.Context, *types.DeployOptions, <-chan []byte) []string); ok { r0 = rf(ctx, opts, inCh) } else { @@ -780,7 +869,6 @@ func (_m *Cluster) RunAndWait(ctx context.Context, opts *types.DeployOptions, in } } - var r1 <-chan *types.AttachWorkloadMessage if rf, ok := ret.Get(1).(func(context.Context, *types.DeployOptions, <-chan []byte) <-chan *types.AttachWorkloadMessage); ok { r1 = rf(ctx, opts, inCh) } else { @@ -789,7 +877,6 @@ func (_m *Cluster) RunAndWait(ctx context.Context, opts *types.DeployOptions, in } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, *types.DeployOptions, <-chan []byte) error); ok { r2 = rf(ctx, opts, inCh) } else { @@ -804,6 +891,10 @@ func (_m *Cluster) Send(ctx context.Context, opts *types.SendOptions) (chan *typ ret := _m.Called(ctx, opts) var r0 chan *types.SendMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.SendOptions) (chan *types.SendMessage, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, *types.SendOptions) chan *types.SendMessage); ok { r0 = rf(ctx, opts) } else { @@ -812,7 +903,6 @@ func (_m *Cluster) Send(ctx context.Context, opts *types.SendOptions) (chan *typ } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.SendOptions) error); ok { r1 = rf(ctx, opts) } else { @@ -822,11 +912,31 @@ func (_m *Cluster) Send(ctx context.Context, opts *types.SendOptions) (chan *typ return r0, r1 } +// SendLargeFile provides a mock function with given fields: ctx, opts +func (_m *Cluster) SendLargeFile(ctx context.Context, opts chan *types.SendLargeFileOptions) chan *types.SendMessage { + ret := _m.Called(ctx, opts) + + var r0 chan *types.SendMessage + if rf, ok := ret.Get(0).(func(context.Context, chan *types.SendLargeFileOptions) chan *types.SendMessage); ok { + r0 = rf(ctx, opts) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(chan *types.SendMessage) + } + } + + return r0 +} + // SetNode provides a mock function with given fields: ctx, opts func (_m *Cluster) SetNode(ctx context.Context, opts *types.SetNodeOptions) (*types.Node, error) { ret := _m.Called(ctx, opts) var r0 *types.Node + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.SetNodeOptions) (*types.Node, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, *types.SetNodeOptions) *types.Node); ok { r0 = rf(ctx, opts) } else { @@ -835,7 +945,6 @@ func (_m *Cluster) SetNode(ctx context.Context, opts *types.SetNodeOptions) (*ty } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.SetNodeOptions) error); ok { r1 = rf(ctx, opts) } else { @@ -864,6 +973,10 @@ func (_m *Cluster) SetWorkloadsStatus(ctx context.Context, status []*types.Statu ret := _m.Called(ctx, status, ttls) var r0 []*types.StatusMeta + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []*types.StatusMeta, map[string]int64) ([]*types.StatusMeta, error)); ok { + return rf(ctx, status, ttls) + } if rf, ok := ret.Get(0).(func(context.Context, []*types.StatusMeta, map[string]int64) []*types.StatusMeta); ok { r0 = rf(ctx, status, ttls) } else { @@ -872,7 +985,6 @@ func (_m *Cluster) SetWorkloadsStatus(ctx context.Context, status []*types.Statu } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []*types.StatusMeta, map[string]int64) error); ok { r1 = rf(ctx, status, ttls) } else { @@ -887,6 +999,10 @@ func (_m *Cluster) WatchServiceStatus(_a0 context.Context) (<-chan types.Service ret := _m.Called(_a0) var r0 <-chan types.ServiceStatus + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (<-chan types.ServiceStatus, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) <-chan types.ServiceStatus); ok { r0 = rf(_a0) } else { @@ -895,7 +1011,6 @@ func (_m *Cluster) WatchServiceStatus(_a0 context.Context) (<-chan types.Service } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -920,3 +1035,17 @@ func (_m *Cluster) WorkloadStatusStream(ctx context.Context, appname string, ent return r0 } + +// NewCluster creates a new instance of Cluster. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewCluster(t interface { + mock.TestingT + Cleanup(func()) +}) *Cluster { + mock := &Cluster{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/engine/docker/mocks/APIClient.go b/engine/docker/mocks/APIClient.go index 3783fd42e..787aaa31d 100644 --- a/engine/docker/mocks/APIClient.go +++ b/engine/docker/mocks/APIClient.go @@ -1,4 +1,4 @@ -// Code generated by mockery v0.0.0-dev. DO NOT EDIT. +// Code generated by mockery v2.30.1. DO NOT EDIT. package mocks @@ -46,6 +46,10 @@ func (_m *APIClient) BuildCachePrune(ctx context.Context, opts types.BuildCacheP ret := _m.Called(ctx, opts) var r0 *types.BuildCachePruneReport + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.BuildCachePruneOptions) (*types.BuildCachePruneReport, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, types.BuildCachePruneOptions) *types.BuildCachePruneReport); ok { r0 = rf(ctx, opts) } else { @@ -54,7 +58,6 @@ func (_m *APIClient) BuildCachePrune(ctx context.Context, opts types.BuildCacheP } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.BuildCachePruneOptions) error); ok { r1 = rf(ctx, opts) } else { @@ -111,6 +114,10 @@ func (_m *APIClient) CheckpointList(ctx context.Context, _a1 string, options typ ret := _m.Called(ctx, _a1, options) var r0 []types.Checkpoint + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.CheckpointListOptions) ([]types.Checkpoint, error)); ok { + return rf(ctx, _a1, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.CheckpointListOptions) []types.Checkpoint); ok { r0 = rf(ctx, _a1, options) } else { @@ -119,7 +126,6 @@ func (_m *APIClient) CheckpointList(ctx context.Context, _a1 string, options typ } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.CheckpointListOptions) error); ok { r1 = rf(ctx, _a1, options) } else { @@ -162,13 +168,16 @@ func (_m *APIClient) ConfigCreate(ctx context.Context, config swarm.ConfigSpec) ret := _m.Called(ctx, config) var r0 types.ConfigCreateResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, swarm.ConfigSpec) (types.ConfigCreateResponse, error)); ok { + return rf(ctx, config) + } if rf, ok := ret.Get(0).(func(context.Context, swarm.ConfigSpec) types.ConfigCreateResponse); ok { r0 = rf(ctx, config) } else { r0 = ret.Get(0).(types.ConfigCreateResponse) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, swarm.ConfigSpec) error); ok { r1 = rf(ctx, config) } else { @@ -183,13 +192,17 @@ func (_m *APIClient) ConfigInspectWithRaw(ctx context.Context, name string) (swa ret := _m.Called(ctx, name) var r0 swarm.Config + var r1 []byte + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string) (swarm.Config, []byte, error)); ok { + return rf(ctx, name) + } if rf, ok := ret.Get(0).(func(context.Context, string) swarm.Config); ok { r0 = rf(ctx, name) } else { r0 = ret.Get(0).(swarm.Config) } - var r1 []byte if rf, ok := ret.Get(1).(func(context.Context, string) []byte); ok { r1 = rf(ctx, name) } else { @@ -198,7 +211,6 @@ func (_m *APIClient) ConfigInspectWithRaw(ctx context.Context, name string) (swa } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { r2 = rf(ctx, name) } else { @@ -213,6 +225,10 @@ func (_m *APIClient) ConfigList(ctx context.Context, options types.ConfigListOpt ret := _m.Called(ctx, options) var r0 []swarm.Config + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.ConfigListOptions) ([]swarm.Config, error)); ok { + return rf(ctx, options) + } if rf, ok := ret.Get(0).(func(context.Context, types.ConfigListOptions) []swarm.Config); ok { r0 = rf(ctx, options) } else { @@ -221,7 +237,6 @@ func (_m *APIClient) ConfigList(ctx context.Context, options types.ConfigListOpt } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.ConfigListOptions) error); ok { r1 = rf(ctx, options) } else { @@ -264,13 +279,16 @@ func (_m *APIClient) ContainerAttach(ctx context.Context, _a1 string, options ty ret := _m.Called(ctx, _a1, options) var r0 types.HijackedResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ContainerAttachOptions) (types.HijackedResponse, error)); ok { + return rf(ctx, _a1, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ContainerAttachOptions) types.HijackedResponse); ok { r0 = rf(ctx, _a1, options) } else { r0 = ret.Get(0).(types.HijackedResponse) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.ContainerAttachOptions) error); ok { r1 = rf(ctx, _a1, options) } else { @@ -285,13 +303,16 @@ func (_m *APIClient) ContainerCommit(ctx context.Context, _a1 string, options ty ret := _m.Called(ctx, _a1, options) var r0 types.IDResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ContainerCommitOptions) (types.IDResponse, error)); ok { + return rf(ctx, _a1, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ContainerCommitOptions) types.IDResponse); ok { r0 = rf(ctx, _a1, options) } else { r0 = ret.Get(0).(types.IDResponse) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.ContainerCommitOptions) error); ok { r1 = rf(ctx, _a1, options) } else { @@ -306,13 +327,16 @@ func (_m *APIClient) ContainerCreate(ctx context.Context, config *container.Conf ret := _m.Called(ctx, config, hostConfig, networkingConfig, platform, containerName) var r0 container.ContainerCreateCreatedBody + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *container.Config, *container.HostConfig, *network.NetworkingConfig, *v1.Platform, string) (container.ContainerCreateCreatedBody, error)); ok { + return rf(ctx, config, hostConfig, networkingConfig, platform, containerName) + } if rf, ok := ret.Get(0).(func(context.Context, *container.Config, *container.HostConfig, *network.NetworkingConfig, *v1.Platform, string) container.ContainerCreateCreatedBody); ok { r0 = rf(ctx, config, hostConfig, networkingConfig, platform, containerName) } else { r0 = ret.Get(0).(container.ContainerCreateCreatedBody) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *container.Config, *container.HostConfig, *network.NetworkingConfig, *v1.Platform, string) error); ok { r1 = rf(ctx, config, hostConfig, networkingConfig, platform, containerName) } else { @@ -327,6 +351,10 @@ func (_m *APIClient) ContainerDiff(ctx context.Context, _a1 string) ([]container ret := _m.Called(ctx, _a1) var r0 []container.ContainerChangeResponseItem + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) ([]container.ContainerChangeResponseItem, error)); ok { + return rf(ctx, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, string) []container.ContainerChangeResponseItem); ok { r0 = rf(ctx, _a1) } else { @@ -335,7 +363,6 @@ func (_m *APIClient) ContainerDiff(ctx context.Context, _a1 string) ([]container } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, _a1) } else { @@ -350,13 +377,16 @@ func (_m *APIClient) ContainerExecAttach(ctx context.Context, execID string, con ret := _m.Called(ctx, execID, config) var r0 types.HijackedResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ExecStartCheck) (types.HijackedResponse, error)); ok { + return rf(ctx, execID, config) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ExecStartCheck) types.HijackedResponse); ok { r0 = rf(ctx, execID, config) } else { r0 = ret.Get(0).(types.HijackedResponse) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.ExecStartCheck) error); ok { r1 = rf(ctx, execID, config) } else { @@ -371,13 +401,16 @@ func (_m *APIClient) ContainerExecCreate(ctx context.Context, _a1 string, config ret := _m.Called(ctx, _a1, config) var r0 types.IDResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ExecConfig) (types.IDResponse, error)); ok { + return rf(ctx, _a1, config) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ExecConfig) types.IDResponse); ok { r0 = rf(ctx, _a1, config) } else { r0 = ret.Get(0).(types.IDResponse) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.ExecConfig) error); ok { r1 = rf(ctx, _a1, config) } else { @@ -392,13 +425,16 @@ func (_m *APIClient) ContainerExecInspect(ctx context.Context, execID string) (t ret := _m.Called(ctx, execID) var r0 types.ContainerExecInspect + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (types.ContainerExecInspect, error)); ok { + return rf(ctx, execID) + } if rf, ok := ret.Get(0).(func(context.Context, string) types.ContainerExecInspect); ok { r0 = rf(ctx, execID) } else { r0 = ret.Get(0).(types.ContainerExecInspect) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, execID) } else { @@ -441,6 +477,10 @@ func (_m *APIClient) ContainerExport(ctx context.Context, _a1 string) (io.ReadCl ret := _m.Called(ctx, _a1) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (io.ReadCloser, error)); ok { + return rf(ctx, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, string) io.ReadCloser); ok { r0 = rf(ctx, _a1) } else { @@ -449,7 +489,6 @@ func (_m *APIClient) ContainerExport(ctx context.Context, _a1 string) (io.ReadCl } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, _a1) } else { @@ -464,13 +503,16 @@ func (_m *APIClient) ContainerInspect(ctx context.Context, _a1 string) (types.Co ret := _m.Called(ctx, _a1) var r0 types.ContainerJSON + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (types.ContainerJSON, error)); ok { + return rf(ctx, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, string) types.ContainerJSON); ok { r0 = rf(ctx, _a1) } else { r0 = ret.Get(0).(types.ContainerJSON) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, _a1) } else { @@ -485,13 +527,17 @@ func (_m *APIClient) ContainerInspectWithRaw(ctx context.Context, _a1 string, ge ret := _m.Called(ctx, _a1, getSize) var r0 types.ContainerJSON + var r1 []byte + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string, bool) (types.ContainerJSON, []byte, error)); ok { + return rf(ctx, _a1, getSize) + } if rf, ok := ret.Get(0).(func(context.Context, string, bool) types.ContainerJSON); ok { r0 = rf(ctx, _a1, getSize) } else { r0 = ret.Get(0).(types.ContainerJSON) } - var r1 []byte if rf, ok := ret.Get(1).(func(context.Context, string, bool) []byte); ok { r1 = rf(ctx, _a1, getSize) } else { @@ -500,7 +546,6 @@ func (_m *APIClient) ContainerInspectWithRaw(ctx context.Context, _a1 string, ge } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string, bool) error); ok { r2 = rf(ctx, _a1, getSize) } else { @@ -529,6 +574,10 @@ func (_m *APIClient) ContainerList(ctx context.Context, options types.ContainerL ret := _m.Called(ctx, options) var r0 []types.Container + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.ContainerListOptions) ([]types.Container, error)); ok { + return rf(ctx, options) + } if rf, ok := ret.Get(0).(func(context.Context, types.ContainerListOptions) []types.Container); ok { r0 = rf(ctx, options) } else { @@ -537,7 +586,6 @@ func (_m *APIClient) ContainerList(ctx context.Context, options types.ContainerL } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.ContainerListOptions) error); ok { r1 = rf(ctx, options) } else { @@ -552,6 +600,10 @@ func (_m *APIClient) ContainerLogs(ctx context.Context, _a1 string, options type ret := _m.Called(ctx, _a1, options) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ContainerLogsOptions) (io.ReadCloser, error)); ok { + return rf(ctx, _a1, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ContainerLogsOptions) io.ReadCloser); ok { r0 = rf(ctx, _a1, options) } else { @@ -560,7 +612,6 @@ func (_m *APIClient) ContainerLogs(ctx context.Context, _a1 string, options type } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.ContainerLogsOptions) error); ok { r1 = rf(ctx, _a1, options) } else { @@ -659,13 +710,16 @@ func (_m *APIClient) ContainerStatPath(ctx context.Context, _a1 string, path str ret := _m.Called(ctx, _a1, path) var r0 types.ContainerPathStat + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (types.ContainerPathStat, error)); ok { + return rf(ctx, _a1, path) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) types.ContainerPathStat); ok { r0 = rf(ctx, _a1, path) } else { r0 = ret.Get(0).(types.ContainerPathStat) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, _a1, path) } else { @@ -680,13 +734,16 @@ func (_m *APIClient) ContainerStats(ctx context.Context, _a1 string, stream bool ret := _m.Called(ctx, _a1, stream) var r0 types.ContainerStats + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, bool) (types.ContainerStats, error)); ok { + return rf(ctx, _a1, stream) + } if rf, ok := ret.Get(0).(func(context.Context, string, bool) types.ContainerStats); ok { r0 = rf(ctx, _a1, stream) } else { r0 = ret.Get(0).(types.ContainerStats) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, bool) error); ok { r1 = rf(ctx, _a1, stream) } else { @@ -701,13 +758,16 @@ func (_m *APIClient) ContainerStatsOneShot(ctx context.Context, _a1 string) (typ ret := _m.Called(ctx, _a1) var r0 types.ContainerStats + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (types.ContainerStats, error)); ok { + return rf(ctx, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, string) types.ContainerStats); ok { r0 = rf(ctx, _a1) } else { r0 = ret.Get(0).(types.ContainerStats) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, _a1) } else { @@ -736,13 +796,16 @@ func (_m *APIClient) ContainerTop(ctx context.Context, _a1 string, arguments []s ret := _m.Called(ctx, _a1, arguments) var r0 container.ContainerTopOKBody + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, []string) (container.ContainerTopOKBody, error)); ok { + return rf(ctx, _a1, arguments) + } if rf, ok := ret.Get(0).(func(context.Context, string, []string) container.ContainerTopOKBody); ok { r0 = rf(ctx, _a1, arguments) } else { r0 = ret.Get(0).(container.ContainerTopOKBody) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, []string) error); ok { r1 = rf(ctx, _a1, arguments) } else { @@ -771,13 +834,16 @@ func (_m *APIClient) ContainerUpdate(ctx context.Context, _a1 string, updateConf ret := _m.Called(ctx, _a1, updateConfig) var r0 container.ContainerUpdateOKBody + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, container.UpdateConfig) (container.ContainerUpdateOKBody, error)); ok { + return rf(ctx, _a1, updateConfig) + } if rf, ok := ret.Get(0).(func(context.Context, string, container.UpdateConfig) container.ContainerUpdateOKBody); ok { r0 = rf(ctx, _a1, updateConfig) } else { r0 = ret.Get(0).(container.ContainerUpdateOKBody) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, container.UpdateConfig) error); ok { r1 = rf(ctx, _a1, updateConfig) } else { @@ -792,6 +858,10 @@ func (_m *APIClient) ContainerWait(ctx context.Context, _a1 string, condition co ret := _m.Called(ctx, _a1, condition) var r0 <-chan container.ContainerWaitOKBody + var r1 <-chan error + if rf, ok := ret.Get(0).(func(context.Context, string, container.WaitCondition) (<-chan container.ContainerWaitOKBody, <-chan error)); ok { + return rf(ctx, _a1, condition) + } if rf, ok := ret.Get(0).(func(context.Context, string, container.WaitCondition) <-chan container.ContainerWaitOKBody); ok { r0 = rf(ctx, _a1, condition) } else { @@ -800,7 +870,6 @@ func (_m *APIClient) ContainerWait(ctx context.Context, _a1 string, condition co } } - var r1 <-chan error if rf, ok := ret.Get(1).(func(context.Context, string, container.WaitCondition) <-chan error); ok { r1 = rf(ctx, _a1, condition) } else { @@ -817,13 +886,16 @@ func (_m *APIClient) ContainersPrune(ctx context.Context, pruneFilters filters.A ret := _m.Called(ctx, pruneFilters) var r0 types.ContainersPruneReport + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, filters.Args) (types.ContainersPruneReport, error)); ok { + return rf(ctx, pruneFilters) + } if rf, ok := ret.Get(0).(func(context.Context, filters.Args) types.ContainersPruneReport); ok { r0 = rf(ctx, pruneFilters) } else { r0 = ret.Get(0).(types.ContainersPruneReport) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, filters.Args) error); ok { r1 = rf(ctx, pruneFilters) } else { @@ -838,6 +910,11 @@ func (_m *APIClient) CopyFromContainer(ctx context.Context, _a1 string, srcPath ret := _m.Called(ctx, _a1, srcPath) var r0 io.ReadCloser + var r1 types.ContainerPathStat + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (io.ReadCloser, types.ContainerPathStat, error)); ok { + return rf(ctx, _a1, srcPath) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) io.ReadCloser); ok { r0 = rf(ctx, _a1, srcPath) } else { @@ -846,14 +923,12 @@ func (_m *APIClient) CopyFromContainer(ctx context.Context, _a1 string, srcPath } } - var r1 types.ContainerPathStat if rf, ok := ret.Get(1).(func(context.Context, string, string) types.ContainerPathStat); ok { r1 = rf(ctx, _a1, srcPath) } else { r1 = ret.Get(1).(types.ContainerPathStat) } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string, string) error); ok { r2 = rf(ctx, _a1, srcPath) } else { @@ -896,6 +971,10 @@ func (_m *APIClient) DialHijack(ctx context.Context, url string, proto string, m ret := _m.Called(ctx, url, proto, meta) var r0 net.Conn + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, map[string][]string) (net.Conn, error)); ok { + return rf(ctx, url, proto, meta) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, map[string][]string) net.Conn); ok { r0 = rf(ctx, url, proto, meta) } else { @@ -904,7 +983,6 @@ func (_m *APIClient) DialHijack(ctx context.Context, url string, proto string, m } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, map[string][]string) error); ok { r1 = rf(ctx, url, proto, meta) } else { @@ -935,13 +1013,16 @@ func (_m *APIClient) DiskUsage(ctx context.Context) (types.DiskUsage, error) { ret := _m.Called(ctx) var r0 types.DiskUsage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (types.DiskUsage, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) types.DiskUsage); ok { r0 = rf(ctx) } else { r0 = ret.Get(0).(types.DiskUsage) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -956,13 +1037,16 @@ func (_m *APIClient) DistributionInspect(ctx context.Context, _a1 string, encode ret := _m.Called(ctx, _a1, encodedRegistryAuth) var r0 registry.DistributionInspect + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (registry.DistributionInspect, error)); ok { + return rf(ctx, _a1, encodedRegistryAuth) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) registry.DistributionInspect); ok { r0 = rf(ctx, _a1, encodedRegistryAuth) } else { r0 = ret.Get(0).(registry.DistributionInspect) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, _a1, encodedRegistryAuth) } else { @@ -977,6 +1061,10 @@ func (_m *APIClient) Events(ctx context.Context, options types.EventsOptions) (< ret := _m.Called(ctx, options) var r0 <-chan events.Message + var r1 <-chan error + if rf, ok := ret.Get(0).(func(context.Context, types.EventsOptions) (<-chan events.Message, <-chan error)); ok { + return rf(ctx, options) + } if rf, ok := ret.Get(0).(func(context.Context, types.EventsOptions) <-chan events.Message); ok { r0 = rf(ctx, options) } else { @@ -985,7 +1073,6 @@ func (_m *APIClient) Events(ctx context.Context, options types.EventsOptions) (< } } - var r1 <-chan error if rf, ok := ret.Get(1).(func(context.Context, types.EventsOptions) <-chan error); ok { r1 = rf(ctx, options) } else { @@ -1018,13 +1105,16 @@ func (_m *APIClient) ImageBuild(ctx context.Context, _a1 io.Reader, options type ret := _m.Called(ctx, _a1, options) var r0 types.ImageBuildResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, io.Reader, types.ImageBuildOptions) (types.ImageBuildResponse, error)); ok { + return rf(ctx, _a1, options) + } if rf, ok := ret.Get(0).(func(context.Context, io.Reader, types.ImageBuildOptions) types.ImageBuildResponse); ok { r0 = rf(ctx, _a1, options) } else { r0 = ret.Get(0).(types.ImageBuildResponse) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, io.Reader, types.ImageBuildOptions) error); ok { r1 = rf(ctx, _a1, options) } else { @@ -1039,6 +1129,10 @@ func (_m *APIClient) ImageCreate(ctx context.Context, parentReference string, op ret := _m.Called(ctx, parentReference, options) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ImageCreateOptions) (io.ReadCloser, error)); ok { + return rf(ctx, parentReference, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ImageCreateOptions) io.ReadCloser); ok { r0 = rf(ctx, parentReference, options) } else { @@ -1047,7 +1141,6 @@ func (_m *APIClient) ImageCreate(ctx context.Context, parentReference string, op } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.ImageCreateOptions) error); ok { r1 = rf(ctx, parentReference, options) } else { @@ -1062,6 +1155,10 @@ func (_m *APIClient) ImageHistory(ctx context.Context, _a1 string) ([]image.Hist ret := _m.Called(ctx, _a1) var r0 []image.HistoryResponseItem + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) ([]image.HistoryResponseItem, error)); ok { + return rf(ctx, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, string) []image.HistoryResponseItem); ok { r0 = rf(ctx, _a1) } else { @@ -1070,7 +1167,6 @@ func (_m *APIClient) ImageHistory(ctx context.Context, _a1 string) ([]image.Hist } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, _a1) } else { @@ -1085,6 +1181,10 @@ func (_m *APIClient) ImageImport(ctx context.Context, source types.ImageImportSo ret := _m.Called(ctx, source, ref, options) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.ImageImportSource, string, types.ImageImportOptions) (io.ReadCloser, error)); ok { + return rf(ctx, source, ref, options) + } if rf, ok := ret.Get(0).(func(context.Context, types.ImageImportSource, string, types.ImageImportOptions) io.ReadCloser); ok { r0 = rf(ctx, source, ref, options) } else { @@ -1093,7 +1193,6 @@ func (_m *APIClient) ImageImport(ctx context.Context, source types.ImageImportSo } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.ImageImportSource, string, types.ImageImportOptions) error); ok { r1 = rf(ctx, source, ref, options) } else { @@ -1108,13 +1207,17 @@ func (_m *APIClient) ImageInspectWithRaw(ctx context.Context, _a1 string) (types ret := _m.Called(ctx, _a1) var r0 types.ImageInspect + var r1 []byte + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string) (types.ImageInspect, []byte, error)); ok { + return rf(ctx, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, string) types.ImageInspect); ok { r0 = rf(ctx, _a1) } else { r0 = ret.Get(0).(types.ImageInspect) } - var r1 []byte if rf, ok := ret.Get(1).(func(context.Context, string) []byte); ok { r1 = rf(ctx, _a1) } else { @@ -1123,7 +1226,6 @@ func (_m *APIClient) ImageInspectWithRaw(ctx context.Context, _a1 string) (types } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { r2 = rf(ctx, _a1) } else { @@ -1138,6 +1240,10 @@ func (_m *APIClient) ImageList(ctx context.Context, options types.ImageListOptio ret := _m.Called(ctx, options) var r0 []types.ImageSummary + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.ImageListOptions) ([]types.ImageSummary, error)); ok { + return rf(ctx, options) + } if rf, ok := ret.Get(0).(func(context.Context, types.ImageListOptions) []types.ImageSummary); ok { r0 = rf(ctx, options) } else { @@ -1146,7 +1252,6 @@ func (_m *APIClient) ImageList(ctx context.Context, options types.ImageListOptio } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.ImageListOptions) error); ok { r1 = rf(ctx, options) } else { @@ -1161,13 +1266,16 @@ func (_m *APIClient) ImageLoad(ctx context.Context, input io.Reader, quiet bool) ret := _m.Called(ctx, input, quiet) var r0 types.ImageLoadResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, io.Reader, bool) (types.ImageLoadResponse, error)); ok { + return rf(ctx, input, quiet) + } if rf, ok := ret.Get(0).(func(context.Context, io.Reader, bool) types.ImageLoadResponse); ok { r0 = rf(ctx, input, quiet) } else { r0 = ret.Get(0).(types.ImageLoadResponse) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, io.Reader, bool) error); ok { r1 = rf(ctx, input, quiet) } else { @@ -1182,6 +1290,10 @@ func (_m *APIClient) ImagePull(ctx context.Context, ref string, options types.Im ret := _m.Called(ctx, ref, options) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ImagePullOptions) (io.ReadCloser, error)); ok { + return rf(ctx, ref, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ImagePullOptions) io.ReadCloser); ok { r0 = rf(ctx, ref, options) } else { @@ -1190,7 +1302,6 @@ func (_m *APIClient) ImagePull(ctx context.Context, ref string, options types.Im } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.ImagePullOptions) error); ok { r1 = rf(ctx, ref, options) } else { @@ -1205,6 +1316,10 @@ func (_m *APIClient) ImagePush(ctx context.Context, ref string, options types.Im ret := _m.Called(ctx, ref, options) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ImagePushOptions) (io.ReadCloser, error)); ok { + return rf(ctx, ref, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ImagePushOptions) io.ReadCloser); ok { r0 = rf(ctx, ref, options) } else { @@ -1213,7 +1328,6 @@ func (_m *APIClient) ImagePush(ctx context.Context, ref string, options types.Im } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.ImagePushOptions) error); ok { r1 = rf(ctx, ref, options) } else { @@ -1228,6 +1342,10 @@ func (_m *APIClient) ImageRemove(ctx context.Context, _a1 string, options types. ret := _m.Called(ctx, _a1, options) var r0 []types.ImageDeleteResponseItem + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ImageRemoveOptions) ([]types.ImageDeleteResponseItem, error)); ok { + return rf(ctx, _a1, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ImageRemoveOptions) []types.ImageDeleteResponseItem); ok { r0 = rf(ctx, _a1, options) } else { @@ -1236,7 +1354,6 @@ func (_m *APIClient) ImageRemove(ctx context.Context, _a1 string, options types. } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.ImageRemoveOptions) error); ok { r1 = rf(ctx, _a1, options) } else { @@ -1251,6 +1368,10 @@ func (_m *APIClient) ImageSave(ctx context.Context, images []string) (io.ReadClo ret := _m.Called(ctx, images) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string) (io.ReadCloser, error)); ok { + return rf(ctx, images) + } if rf, ok := ret.Get(0).(func(context.Context, []string) io.ReadCloser); ok { r0 = rf(ctx, images) } else { @@ -1259,7 +1380,6 @@ func (_m *APIClient) ImageSave(ctx context.Context, images []string) (io.ReadClo } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string) error); ok { r1 = rf(ctx, images) } else { @@ -1274,6 +1394,10 @@ func (_m *APIClient) ImageSearch(ctx context.Context, term string, options types ret := _m.Called(ctx, term, options) var r0 []registry.SearchResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ImageSearchOptions) ([]registry.SearchResult, error)); ok { + return rf(ctx, term, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ImageSearchOptions) []registry.SearchResult); ok { r0 = rf(ctx, term, options) } else { @@ -1282,7 +1406,6 @@ func (_m *APIClient) ImageSearch(ctx context.Context, term string, options types } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.ImageSearchOptions) error); ok { r1 = rf(ctx, term, options) } else { @@ -1311,13 +1434,16 @@ func (_m *APIClient) ImagesPrune(ctx context.Context, pruneFilter filters.Args) ret := _m.Called(ctx, pruneFilter) var r0 types.ImagesPruneReport + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, filters.Args) (types.ImagesPruneReport, error)); ok { + return rf(ctx, pruneFilter) + } if rf, ok := ret.Get(0).(func(context.Context, filters.Args) types.ImagesPruneReport); ok { r0 = rf(ctx, pruneFilter) } else { r0 = ret.Get(0).(types.ImagesPruneReport) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, filters.Args) error); ok { r1 = rf(ctx, pruneFilter) } else { @@ -1332,13 +1458,16 @@ func (_m *APIClient) Info(ctx context.Context) (types.Info, error) { ret := _m.Called(ctx) var r0 types.Info + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (types.Info, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) types.Info); ok { r0 = rf(ctx) } else { r0 = ret.Get(0).(types.Info) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -1377,13 +1506,16 @@ func (_m *APIClient) NetworkCreate(ctx context.Context, name string, options typ ret := _m.Called(ctx, name, options) var r0 types.NetworkCreateResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.NetworkCreate) (types.NetworkCreateResponse, error)); ok { + return rf(ctx, name, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.NetworkCreate) types.NetworkCreateResponse); ok { r0 = rf(ctx, name, options) } else { r0 = ret.Get(0).(types.NetworkCreateResponse) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.NetworkCreate) error); ok { r1 = rf(ctx, name, options) } else { @@ -1412,13 +1544,16 @@ func (_m *APIClient) NetworkInspect(ctx context.Context, _a1 string, options typ ret := _m.Called(ctx, _a1, options) var r0 types.NetworkResource + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.NetworkInspectOptions) (types.NetworkResource, error)); ok { + return rf(ctx, _a1, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.NetworkInspectOptions) types.NetworkResource); ok { r0 = rf(ctx, _a1, options) } else { r0 = ret.Get(0).(types.NetworkResource) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.NetworkInspectOptions) error); ok { r1 = rf(ctx, _a1, options) } else { @@ -1433,13 +1568,17 @@ func (_m *APIClient) NetworkInspectWithRaw(ctx context.Context, _a1 string, opti ret := _m.Called(ctx, _a1, options) var r0 types.NetworkResource + var r1 []byte + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.NetworkInspectOptions) (types.NetworkResource, []byte, error)); ok { + return rf(ctx, _a1, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.NetworkInspectOptions) types.NetworkResource); ok { r0 = rf(ctx, _a1, options) } else { r0 = ret.Get(0).(types.NetworkResource) } - var r1 []byte if rf, ok := ret.Get(1).(func(context.Context, string, types.NetworkInspectOptions) []byte); ok { r1 = rf(ctx, _a1, options) } else { @@ -1448,7 +1587,6 @@ func (_m *APIClient) NetworkInspectWithRaw(ctx context.Context, _a1 string, opti } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string, types.NetworkInspectOptions) error); ok { r2 = rf(ctx, _a1, options) } else { @@ -1463,6 +1601,10 @@ func (_m *APIClient) NetworkList(ctx context.Context, options types.NetworkListO ret := _m.Called(ctx, options) var r0 []types.NetworkResource + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.NetworkListOptions) ([]types.NetworkResource, error)); ok { + return rf(ctx, options) + } if rf, ok := ret.Get(0).(func(context.Context, types.NetworkListOptions) []types.NetworkResource); ok { r0 = rf(ctx, options) } else { @@ -1471,7 +1613,6 @@ func (_m *APIClient) NetworkList(ctx context.Context, options types.NetworkListO } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.NetworkListOptions) error); ok { r1 = rf(ctx, options) } else { @@ -1500,13 +1641,16 @@ func (_m *APIClient) NetworksPrune(ctx context.Context, pruneFilter filters.Args ret := _m.Called(ctx, pruneFilter) var r0 types.NetworksPruneReport + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, filters.Args) (types.NetworksPruneReport, error)); ok { + return rf(ctx, pruneFilter) + } if rf, ok := ret.Get(0).(func(context.Context, filters.Args) types.NetworksPruneReport); ok { r0 = rf(ctx, pruneFilter) } else { r0 = ret.Get(0).(types.NetworksPruneReport) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, filters.Args) error); ok { r1 = rf(ctx, pruneFilter) } else { @@ -1521,13 +1665,17 @@ func (_m *APIClient) NodeInspectWithRaw(ctx context.Context, nodeID string) (swa ret := _m.Called(ctx, nodeID) var r0 swarm.Node + var r1 []byte + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string) (swarm.Node, []byte, error)); ok { + return rf(ctx, nodeID) + } if rf, ok := ret.Get(0).(func(context.Context, string) swarm.Node); ok { r0 = rf(ctx, nodeID) } else { r0 = ret.Get(0).(swarm.Node) } - var r1 []byte if rf, ok := ret.Get(1).(func(context.Context, string) []byte); ok { r1 = rf(ctx, nodeID) } else { @@ -1536,7 +1684,6 @@ func (_m *APIClient) NodeInspectWithRaw(ctx context.Context, nodeID string) (swa } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { r2 = rf(ctx, nodeID) } else { @@ -1551,6 +1698,10 @@ func (_m *APIClient) NodeList(ctx context.Context, options types.NodeListOptions ret := _m.Called(ctx, options) var r0 []swarm.Node + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.NodeListOptions) ([]swarm.Node, error)); ok { + return rf(ctx, options) + } if rf, ok := ret.Get(0).(func(context.Context, types.NodeListOptions) []swarm.Node); ok { r0 = rf(ctx, options) } else { @@ -1559,7 +1710,6 @@ func (_m *APIClient) NodeList(ctx context.Context, options types.NodeListOptions } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.NodeListOptions) error); ok { r1 = rf(ctx, options) } else { @@ -1602,13 +1752,16 @@ func (_m *APIClient) Ping(ctx context.Context) (types.Ping, error) { ret := _m.Called(ctx) var r0 types.Ping + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (types.Ping, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) types.Ping); ok { r0 = rf(ctx) } else { r0 = ret.Get(0).(types.Ping) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -1665,6 +1818,11 @@ func (_m *APIClient) PluginInspectWithRaw(ctx context.Context, name string) (*ty ret := _m.Called(ctx, name) var r0 *types.Plugin + var r1 []byte + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*types.Plugin, []byte, error)); ok { + return rf(ctx, name) + } if rf, ok := ret.Get(0).(func(context.Context, string) *types.Plugin); ok { r0 = rf(ctx, name) } else { @@ -1673,7 +1831,6 @@ func (_m *APIClient) PluginInspectWithRaw(ctx context.Context, name string) (*ty } } - var r1 []byte if rf, ok := ret.Get(1).(func(context.Context, string) []byte); ok { r1 = rf(ctx, name) } else { @@ -1682,7 +1839,6 @@ func (_m *APIClient) PluginInspectWithRaw(ctx context.Context, name string) (*ty } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { r2 = rf(ctx, name) } else { @@ -1697,6 +1853,10 @@ func (_m *APIClient) PluginInstall(ctx context.Context, name string, options typ ret := _m.Called(ctx, name, options) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.PluginInstallOptions) (io.ReadCloser, error)); ok { + return rf(ctx, name, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.PluginInstallOptions) io.ReadCloser); ok { r0 = rf(ctx, name, options) } else { @@ -1705,7 +1865,6 @@ func (_m *APIClient) PluginInstall(ctx context.Context, name string, options typ } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.PluginInstallOptions) error); ok { r1 = rf(ctx, name, options) } else { @@ -1720,6 +1879,10 @@ func (_m *APIClient) PluginList(ctx context.Context, filter filters.Args) (types ret := _m.Called(ctx, filter) var r0 types.PluginsListResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, filters.Args) (types.PluginsListResponse, error)); ok { + return rf(ctx, filter) + } if rf, ok := ret.Get(0).(func(context.Context, filters.Args) types.PluginsListResponse); ok { r0 = rf(ctx, filter) } else { @@ -1728,7 +1891,6 @@ func (_m *APIClient) PluginList(ctx context.Context, filter filters.Args) (types } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, filters.Args) error); ok { r1 = rf(ctx, filter) } else { @@ -1743,6 +1905,10 @@ func (_m *APIClient) PluginPush(ctx context.Context, name string, registryAuth s ret := _m.Called(ctx, name, registryAuth) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (io.ReadCloser, error)); ok { + return rf(ctx, name, registryAuth) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) io.ReadCloser); ok { r0 = rf(ctx, name, registryAuth) } else { @@ -1751,7 +1917,6 @@ func (_m *APIClient) PluginPush(ctx context.Context, name string, registryAuth s } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, name, registryAuth) } else { @@ -1794,6 +1959,10 @@ func (_m *APIClient) PluginUpgrade(ctx context.Context, name string, options typ ret := _m.Called(ctx, name, options) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.PluginInstallOptions) (io.ReadCloser, error)); ok { + return rf(ctx, name, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.PluginInstallOptions) io.ReadCloser); ok { r0 = rf(ctx, name, options) } else { @@ -1802,7 +1971,6 @@ func (_m *APIClient) PluginUpgrade(ctx context.Context, name string, options typ } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.PluginInstallOptions) error); ok { r1 = rf(ctx, name, options) } else { @@ -1817,13 +1985,16 @@ func (_m *APIClient) RegistryLogin(ctx context.Context, auth types.AuthConfig) ( ret := _m.Called(ctx, auth) var r0 registry.AuthenticateOKBody + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.AuthConfig) (registry.AuthenticateOKBody, error)); ok { + return rf(ctx, auth) + } if rf, ok := ret.Get(0).(func(context.Context, types.AuthConfig) registry.AuthenticateOKBody); ok { r0 = rf(ctx, auth) } else { r0 = ret.Get(0).(registry.AuthenticateOKBody) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.AuthConfig) error); ok { r1 = rf(ctx, auth) } else { @@ -1838,13 +2009,16 @@ func (_m *APIClient) SecretCreate(ctx context.Context, secret swarm.SecretSpec) ret := _m.Called(ctx, secret) var r0 types.SecretCreateResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, swarm.SecretSpec) (types.SecretCreateResponse, error)); ok { + return rf(ctx, secret) + } if rf, ok := ret.Get(0).(func(context.Context, swarm.SecretSpec) types.SecretCreateResponse); ok { r0 = rf(ctx, secret) } else { r0 = ret.Get(0).(types.SecretCreateResponse) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, swarm.SecretSpec) error); ok { r1 = rf(ctx, secret) } else { @@ -1859,13 +2033,17 @@ func (_m *APIClient) SecretInspectWithRaw(ctx context.Context, name string) (swa ret := _m.Called(ctx, name) var r0 swarm.Secret + var r1 []byte + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string) (swarm.Secret, []byte, error)); ok { + return rf(ctx, name) + } if rf, ok := ret.Get(0).(func(context.Context, string) swarm.Secret); ok { r0 = rf(ctx, name) } else { r0 = ret.Get(0).(swarm.Secret) } - var r1 []byte if rf, ok := ret.Get(1).(func(context.Context, string) []byte); ok { r1 = rf(ctx, name) } else { @@ -1874,7 +2052,6 @@ func (_m *APIClient) SecretInspectWithRaw(ctx context.Context, name string) (swa } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { r2 = rf(ctx, name) } else { @@ -1889,6 +2066,10 @@ func (_m *APIClient) SecretList(ctx context.Context, options types.SecretListOpt ret := _m.Called(ctx, options) var r0 []swarm.Secret + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.SecretListOptions) ([]swarm.Secret, error)); ok { + return rf(ctx, options) + } if rf, ok := ret.Get(0).(func(context.Context, types.SecretListOptions) []swarm.Secret); ok { r0 = rf(ctx, options) } else { @@ -1897,7 +2078,6 @@ func (_m *APIClient) SecretList(ctx context.Context, options types.SecretListOpt } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.SecretListOptions) error); ok { r1 = rf(ctx, options) } else { @@ -1940,13 +2120,16 @@ func (_m *APIClient) ServerVersion(ctx context.Context) (types.Version, error) { ret := _m.Called(ctx) var r0 types.Version + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (types.Version, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) types.Version); ok { r0 = rf(ctx) } else { r0 = ret.Get(0).(types.Version) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -1961,13 +2144,16 @@ func (_m *APIClient) ServiceCreate(ctx context.Context, service swarm.ServiceSpe ret := _m.Called(ctx, service, options) var r0 types.ServiceCreateResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, swarm.ServiceSpec, types.ServiceCreateOptions) (types.ServiceCreateResponse, error)); ok { + return rf(ctx, service, options) + } if rf, ok := ret.Get(0).(func(context.Context, swarm.ServiceSpec, types.ServiceCreateOptions) types.ServiceCreateResponse); ok { r0 = rf(ctx, service, options) } else { r0 = ret.Get(0).(types.ServiceCreateResponse) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, swarm.ServiceSpec, types.ServiceCreateOptions) error); ok { r1 = rf(ctx, service, options) } else { @@ -1982,13 +2168,17 @@ func (_m *APIClient) ServiceInspectWithRaw(ctx context.Context, serviceID string ret := _m.Called(ctx, serviceID, options) var r0 swarm.Service + var r1 []byte + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ServiceInspectOptions) (swarm.Service, []byte, error)); ok { + return rf(ctx, serviceID, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ServiceInspectOptions) swarm.Service); ok { r0 = rf(ctx, serviceID, options) } else { r0 = ret.Get(0).(swarm.Service) } - var r1 []byte if rf, ok := ret.Get(1).(func(context.Context, string, types.ServiceInspectOptions) []byte); ok { r1 = rf(ctx, serviceID, options) } else { @@ -1997,7 +2187,6 @@ func (_m *APIClient) ServiceInspectWithRaw(ctx context.Context, serviceID string } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string, types.ServiceInspectOptions) error); ok { r2 = rf(ctx, serviceID, options) } else { @@ -2012,6 +2201,10 @@ func (_m *APIClient) ServiceList(ctx context.Context, options types.ServiceListO ret := _m.Called(ctx, options) var r0 []swarm.Service + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.ServiceListOptions) ([]swarm.Service, error)); ok { + return rf(ctx, options) + } if rf, ok := ret.Get(0).(func(context.Context, types.ServiceListOptions) []swarm.Service); ok { r0 = rf(ctx, options) } else { @@ -2020,7 +2213,6 @@ func (_m *APIClient) ServiceList(ctx context.Context, options types.ServiceListO } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.ServiceListOptions) error); ok { r1 = rf(ctx, options) } else { @@ -2035,6 +2227,10 @@ func (_m *APIClient) ServiceLogs(ctx context.Context, serviceID string, options ret := _m.Called(ctx, serviceID, options) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ContainerLogsOptions) (io.ReadCloser, error)); ok { + return rf(ctx, serviceID, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ContainerLogsOptions) io.ReadCloser); ok { r0 = rf(ctx, serviceID, options) } else { @@ -2043,7 +2239,6 @@ func (_m *APIClient) ServiceLogs(ctx context.Context, serviceID string, options } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.ContainerLogsOptions) error); ok { r1 = rf(ctx, serviceID, options) } else { @@ -2072,13 +2267,16 @@ func (_m *APIClient) ServiceUpdate(ctx context.Context, serviceID string, versio ret := _m.Called(ctx, serviceID, version, service, options) var r0 types.ServiceUpdateResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, swarm.Version, swarm.ServiceSpec, types.ServiceUpdateOptions) (types.ServiceUpdateResponse, error)); ok { + return rf(ctx, serviceID, version, service, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, swarm.Version, swarm.ServiceSpec, types.ServiceUpdateOptions) types.ServiceUpdateResponse); ok { r0 = rf(ctx, serviceID, version, service, options) } else { r0 = ret.Get(0).(types.ServiceUpdateResponse) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, swarm.Version, swarm.ServiceSpec, types.ServiceUpdateOptions) error); ok { r1 = rf(ctx, serviceID, version, service, options) } else { @@ -2093,13 +2291,16 @@ func (_m *APIClient) SwarmGetUnlockKey(ctx context.Context) (types.SwarmUnlockKe ret := _m.Called(ctx) var r0 types.SwarmUnlockKeyResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (types.SwarmUnlockKeyResponse, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) types.SwarmUnlockKeyResponse); ok { r0 = rf(ctx) } else { r0 = ret.Get(0).(types.SwarmUnlockKeyResponse) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -2114,13 +2315,16 @@ func (_m *APIClient) SwarmInit(ctx context.Context, req swarm.InitRequest) (stri ret := _m.Called(ctx, req) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, swarm.InitRequest) (string, error)); ok { + return rf(ctx, req) + } if rf, ok := ret.Get(0).(func(context.Context, swarm.InitRequest) string); ok { r0 = rf(ctx, req) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, swarm.InitRequest) error); ok { r1 = rf(ctx, req) } else { @@ -2135,13 +2339,16 @@ func (_m *APIClient) SwarmInspect(ctx context.Context) (swarm.Swarm, error) { ret := _m.Called(ctx) var r0 swarm.Swarm + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (swarm.Swarm, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) swarm.Swarm); ok { r0 = rf(ctx) } else { r0 = ret.Get(0).(swarm.Swarm) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -2212,13 +2419,17 @@ func (_m *APIClient) TaskInspectWithRaw(ctx context.Context, taskID string) (swa ret := _m.Called(ctx, taskID) var r0 swarm.Task + var r1 []byte + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string) (swarm.Task, []byte, error)); ok { + return rf(ctx, taskID) + } if rf, ok := ret.Get(0).(func(context.Context, string) swarm.Task); ok { r0 = rf(ctx, taskID) } else { r0 = ret.Get(0).(swarm.Task) } - var r1 []byte if rf, ok := ret.Get(1).(func(context.Context, string) []byte); ok { r1 = rf(ctx, taskID) } else { @@ -2227,7 +2438,6 @@ func (_m *APIClient) TaskInspectWithRaw(ctx context.Context, taskID string) (swa } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { r2 = rf(ctx, taskID) } else { @@ -2242,6 +2452,10 @@ func (_m *APIClient) TaskList(ctx context.Context, options types.TaskListOptions ret := _m.Called(ctx, options) var r0 []swarm.Task + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, types.TaskListOptions) ([]swarm.Task, error)); ok { + return rf(ctx, options) + } if rf, ok := ret.Get(0).(func(context.Context, types.TaskListOptions) []swarm.Task); ok { r0 = rf(ctx, options) } else { @@ -2250,7 +2464,6 @@ func (_m *APIClient) TaskList(ctx context.Context, options types.TaskListOptions } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, types.TaskListOptions) error); ok { r1 = rf(ctx, options) } else { @@ -2265,6 +2478,10 @@ func (_m *APIClient) TaskLogs(ctx context.Context, taskID string, options types. ret := _m.Called(ctx, taskID, options) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, types.ContainerLogsOptions) (io.ReadCloser, error)); ok { + return rf(ctx, taskID, options) + } if rf, ok := ret.Get(0).(func(context.Context, string, types.ContainerLogsOptions) io.ReadCloser); ok { r0 = rf(ctx, taskID, options) } else { @@ -2273,7 +2490,6 @@ func (_m *APIClient) TaskLogs(ctx context.Context, taskID string, options types. } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, types.ContainerLogsOptions) error); ok { r1 = rf(ctx, taskID, options) } else { @@ -2288,13 +2504,16 @@ func (_m *APIClient) VolumeCreate(ctx context.Context, options volume.VolumeCrea ret := _m.Called(ctx, options) var r0 types.Volume + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, volume.VolumeCreateBody) (types.Volume, error)); ok { + return rf(ctx, options) + } if rf, ok := ret.Get(0).(func(context.Context, volume.VolumeCreateBody) types.Volume); ok { r0 = rf(ctx, options) } else { r0 = ret.Get(0).(types.Volume) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, volume.VolumeCreateBody) error); ok { r1 = rf(ctx, options) } else { @@ -2309,13 +2528,16 @@ func (_m *APIClient) VolumeInspect(ctx context.Context, volumeID string) (types. ret := _m.Called(ctx, volumeID) var r0 types.Volume + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (types.Volume, error)); ok { + return rf(ctx, volumeID) + } if rf, ok := ret.Get(0).(func(context.Context, string) types.Volume); ok { r0 = rf(ctx, volumeID) } else { r0 = ret.Get(0).(types.Volume) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, volumeID) } else { @@ -2330,13 +2552,17 @@ func (_m *APIClient) VolumeInspectWithRaw(ctx context.Context, volumeID string) ret := _m.Called(ctx, volumeID) var r0 types.Volume + var r1 []byte + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string) (types.Volume, []byte, error)); ok { + return rf(ctx, volumeID) + } if rf, ok := ret.Get(0).(func(context.Context, string) types.Volume); ok { r0 = rf(ctx, volumeID) } else { r0 = ret.Get(0).(types.Volume) } - var r1 []byte if rf, ok := ret.Get(1).(func(context.Context, string) []byte); ok { r1 = rf(ctx, volumeID) } else { @@ -2345,7 +2571,6 @@ func (_m *APIClient) VolumeInspectWithRaw(ctx context.Context, volumeID string) } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { r2 = rf(ctx, volumeID) } else { @@ -2360,13 +2585,16 @@ func (_m *APIClient) VolumeList(ctx context.Context, filter filters.Args) (volum ret := _m.Called(ctx, filter) var r0 volume.VolumeListOKBody + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, filters.Args) (volume.VolumeListOKBody, error)); ok { + return rf(ctx, filter) + } if rf, ok := ret.Get(0).(func(context.Context, filters.Args) volume.VolumeListOKBody); ok { r0 = rf(ctx, filter) } else { r0 = ret.Get(0).(volume.VolumeListOKBody) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, filters.Args) error); ok { r1 = rf(ctx, filter) } else { @@ -2395,13 +2623,16 @@ func (_m *APIClient) VolumesPrune(ctx context.Context, pruneFilter filters.Args) ret := _m.Called(ctx, pruneFilter) var r0 types.VolumesPruneReport + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, filters.Args) (types.VolumesPruneReport, error)); ok { + return rf(ctx, pruneFilter) + } if rf, ok := ret.Get(0).(func(context.Context, filters.Args) types.VolumesPruneReport); ok { r0 = rf(ctx, pruneFilter) } else { r0 = ret.Get(0).(types.VolumesPruneReport) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, filters.Args) error); ok { r1 = rf(ctx, pruneFilter) } else { @@ -2410,3 +2641,17 @@ func (_m *APIClient) VolumesPrune(ctx context.Context, pruneFilter filters.Args) return r0, r1 } + +// NewAPIClient creates a new instance of APIClient. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewAPIClient(t interface { + mock.TestingT + Cleanup(func()) +}) *APIClient { + mock := &APIClient{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/engine/mocks/API.go b/engine/mocks/API.go index d10ba9a01..12e20756f 100644 --- a/engine/mocks/API.go +++ b/engine/mocks/API.go @@ -1,4 +1,4 @@ -// Code generated by mockery v0.0.0-dev. DO NOT EDIT. +// Code generated by mockery v2.30.1. DO NOT EDIT. package mocks @@ -26,13 +26,17 @@ func (_m *API) BuildContent(ctx context.Context, scm source.Source, opts *types. ret := _m.Called(ctx, scm, opts) var r0 string + var r1 io.Reader + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, source.Source, *types.BuildContentOptions) (string, io.Reader, error)); ok { + return rf(ctx, scm, opts) + } if rf, ok := ret.Get(0).(func(context.Context, source.Source, *types.BuildContentOptions) string); ok { r0 = rf(ctx, scm, opts) } else { r0 = ret.Get(0).(string) } - var r1 io.Reader if rf, ok := ret.Get(1).(func(context.Context, source.Source, *types.BuildContentOptions) io.Reader); ok { r1 = rf(ctx, scm, opts) } else { @@ -41,7 +45,6 @@ func (_m *API) BuildContent(ctx context.Context, scm source.Source, opts *types. } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, source.Source, *types.BuildContentOptions) error); ok { r2 = rf(ctx, scm, opts) } else { @@ -72,13 +75,16 @@ func (_m *API) ExecExitCode(ctx context.Context, ID string, result string) (int, ret := _m.Called(ctx, ID, result) var r0 int + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (int, error)); ok { + return rf(ctx, ID, result) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) int); ok { r0 = rf(ctx, ID, result) } else { r0 = ret.Get(0).(int) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, ID, result) } else { @@ -107,13 +113,19 @@ func (_m *API) Execute(ctx context.Context, ID string, config *types.ExecConfig) ret := _m.Called(ctx, ID, config) var r0 string + var r1 io.ReadCloser + var r2 io.ReadCloser + var r3 io.WriteCloser + var r4 error + if rf, ok := ret.Get(0).(func(context.Context, string, *types.ExecConfig) (string, io.ReadCloser, io.ReadCloser, io.WriteCloser, error)); ok { + return rf(ctx, ID, config) + } if rf, ok := ret.Get(0).(func(context.Context, string, *types.ExecConfig) string); ok { r0 = rf(ctx, ID, config) } else { r0 = ret.Get(0).(string) } - var r1 io.ReadCloser if rf, ok := ret.Get(1).(func(context.Context, string, *types.ExecConfig) io.ReadCloser); ok { r1 = rf(ctx, ID, config) } else { @@ -122,7 +134,6 @@ func (_m *API) Execute(ctx context.Context, ID string, config *types.ExecConfig) } } - var r2 io.ReadCloser if rf, ok := ret.Get(2).(func(context.Context, string, *types.ExecConfig) io.ReadCloser); ok { r2 = rf(ctx, ID, config) } else { @@ -131,7 +142,6 @@ func (_m *API) Execute(ctx context.Context, ID string, config *types.ExecConfig) } } - var r3 io.WriteCloser if rf, ok := ret.Get(3).(func(context.Context, string, *types.ExecConfig) io.WriteCloser); ok { r3 = rf(ctx, ID, config) } else { @@ -140,7 +150,6 @@ func (_m *API) Execute(ctx context.Context, ID string, config *types.ExecConfig) } } - var r4 error if rf, ok := ret.Get(4).(func(context.Context, string, *types.ExecConfig) error); ok { r4 = rf(ctx, ID, config) } else { @@ -155,6 +164,10 @@ func (_m *API) ImageBuild(ctx context.Context, input io.Reader, refs []string) ( ret := _m.Called(ctx, input, refs) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, io.Reader, []string) (io.ReadCloser, error)); ok { + return rf(ctx, input, refs) + } if rf, ok := ret.Get(0).(func(context.Context, io.Reader, []string) io.ReadCloser); ok { r0 = rf(ctx, input, refs) } else { @@ -163,7 +176,6 @@ func (_m *API) ImageBuild(ctx context.Context, input io.Reader, refs []string) ( } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, io.Reader, []string) error); ok { r1 = rf(ctx, input, refs) } else { @@ -178,13 +190,16 @@ func (_m *API) ImageBuildCachePrune(ctx context.Context, all bool) (uint64, erro ret := _m.Called(ctx, all) var r0 uint64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, bool) (uint64, error)); ok { + return rf(ctx, all) + } if rf, ok := ret.Get(0).(func(context.Context, bool) uint64); ok { r0 = rf(ctx, all) } else { r0 = ret.Get(0).(uint64) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, bool) error); ok { r1 = rf(ctx, all) } else { @@ -199,13 +214,16 @@ func (_m *API) ImageBuildFromExist(ctx context.Context, ID string, refs []string ret := _m.Called(ctx, ID, refs, user) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, []string, string) (string, error)); ok { + return rf(ctx, ID, refs, user) + } if rf, ok := ret.Get(0).(func(context.Context, string, []string, string) string); ok { r0 = rf(ctx, ID, refs, user) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, []string, string) error); ok { r1 = rf(ctx, ID, refs, user) } else { @@ -220,6 +238,10 @@ func (_m *API) ImageList(ctx context.Context, image string) ([]*types.Image, err ret := _m.Called(ctx, image) var r0 []*types.Image + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) ([]*types.Image, error)); ok { + return rf(ctx, image) + } if rf, ok := ret.Get(0).(func(context.Context, string) []*types.Image); ok { r0 = rf(ctx, image) } else { @@ -228,7 +250,6 @@ func (_m *API) ImageList(ctx context.Context, image string) ([]*types.Image, err } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, image) } else { @@ -243,6 +264,10 @@ func (_m *API) ImageLocalDigests(ctx context.Context, image string) ([]string, e ret := _m.Called(ctx, image) var r0 []string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) ([]string, error)); ok { + return rf(ctx, image) + } if rf, ok := ret.Get(0).(func(context.Context, string) []string); ok { r0 = rf(ctx, image) } else { @@ -251,7 +276,6 @@ func (_m *API) ImageLocalDigests(ctx context.Context, image string) ([]string, e } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, image) } else { @@ -266,6 +290,10 @@ func (_m *API) ImagePull(ctx context.Context, ref string, all bool) (io.ReadClos ret := _m.Called(ctx, ref, all) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, bool) (io.ReadCloser, error)); ok { + return rf(ctx, ref, all) + } if rf, ok := ret.Get(0).(func(context.Context, string, bool) io.ReadCloser); ok { r0 = rf(ctx, ref, all) } else { @@ -274,7 +302,6 @@ func (_m *API) ImagePull(ctx context.Context, ref string, all bool) (io.ReadClos } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, bool) error); ok { r1 = rf(ctx, ref, all) } else { @@ -289,6 +316,10 @@ func (_m *API) ImagePush(ctx context.Context, ref string) (io.ReadCloser, error) ret := _m.Called(ctx, ref) var r0 io.ReadCloser + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (io.ReadCloser, error)); ok { + return rf(ctx, ref) + } if rf, ok := ret.Get(0).(func(context.Context, string) io.ReadCloser); ok { r0 = rf(ctx, ref) } else { @@ -297,7 +328,6 @@ func (_m *API) ImagePush(ctx context.Context, ref string) (io.ReadCloser, error) } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, ref) } else { @@ -312,13 +342,16 @@ func (_m *API) ImageRemoteDigest(ctx context.Context, image string) (string, err ret := _m.Called(ctx, image) var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (string, error)); ok { + return rf(ctx, image) + } if rf, ok := ret.Get(0).(func(context.Context, string) string); ok { r0 = rf(ctx, image) } else { r0 = ret.Get(0).(string) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, image) } else { @@ -333,6 +366,10 @@ func (_m *API) ImageRemove(ctx context.Context, image string, force bool, prune ret := _m.Called(ctx, image, force, prune) var r0 []string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, bool, bool) ([]string, error)); ok { + return rf(ctx, image, force, prune) + } if rf, ok := ret.Get(0).(func(context.Context, string, bool, bool) []string); ok { r0 = rf(ctx, image, force, prune) } else { @@ -341,7 +378,6 @@ func (_m *API) ImageRemove(ctx context.Context, image string, force bool, prune } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, bool, bool) error); ok { r1 = rf(ctx, image, force, prune) } else { @@ -370,6 +406,10 @@ func (_m *API) Info(ctx context.Context) (*types.Info, error) { ret := _m.Called(ctx) var r0 *types.Info + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*types.Info, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) *types.Info); ok { r0 = rf(ctx) } else { @@ -378,7 +418,6 @@ func (_m *API) Info(ctx context.Context) (*types.Info, error) { } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -393,6 +432,10 @@ func (_m *API) NetworkConnect(ctx context.Context, network string, target string ret := _m.Called(ctx, network, target, ipv4, ipv6) var r0 []string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) ([]string, error)); ok { + return rf(ctx, network, target, ipv4, ipv6) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, string, string) []string); ok { r0 = rf(ctx, network, target, ipv4, ipv6) } else { @@ -401,7 +444,6 @@ func (_m *API) NetworkConnect(ctx context.Context, network string, target string } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, string, string) error); ok { r1 = rf(ctx, network, target, ipv4, ipv6) } else { @@ -430,6 +472,10 @@ func (_m *API) NetworkList(ctx context.Context, drivers []string) ([]*types.Netw ret := _m.Called(ctx, drivers) var r0 []*types.Network + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string) ([]*types.Network, error)); ok { + return rf(ctx, drivers) + } if rf, ok := ret.Get(0).(func(context.Context, []string) []*types.Network); ok { r0 = rf(ctx, drivers) } else { @@ -438,7 +484,6 @@ func (_m *API) NetworkList(ctx context.Context, drivers []string) ([]*types.Netw } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string) error); ok { r1 = rf(ctx, drivers) } else { @@ -481,6 +526,12 @@ func (_m *API) VirtualizationAttach(ctx context.Context, ID string, stream bool, ret := _m.Called(ctx, ID, stream, openStdin) var r0 io.ReadCloser + var r1 io.ReadCloser + var r2 io.WriteCloser + var r3 error + if rf, ok := ret.Get(0).(func(context.Context, string, bool, bool) (io.ReadCloser, io.ReadCloser, io.WriteCloser, error)); ok { + return rf(ctx, ID, stream, openStdin) + } if rf, ok := ret.Get(0).(func(context.Context, string, bool, bool) io.ReadCloser); ok { r0 = rf(ctx, ID, stream, openStdin) } else { @@ -489,7 +540,6 @@ func (_m *API) VirtualizationAttach(ctx context.Context, ID string, stream bool, } } - var r1 io.ReadCloser if rf, ok := ret.Get(1).(func(context.Context, string, bool, bool) io.ReadCloser); ok { r1 = rf(ctx, ID, stream, openStdin) } else { @@ -498,7 +548,6 @@ func (_m *API) VirtualizationAttach(ctx context.Context, ID string, stream bool, } } - var r2 io.WriteCloser if rf, ok := ret.Get(2).(func(context.Context, string, bool, bool) io.WriteCloser); ok { r2 = rf(ctx, ID, stream, openStdin) } else { @@ -507,7 +556,6 @@ func (_m *API) VirtualizationAttach(ctx context.Context, ID string, stream bool, } } - var r3 error if rf, ok := ret.Get(3).(func(context.Context, string, bool, bool) error); ok { r3 = rf(ctx, ID, stream, openStdin) } else { @@ -517,11 +565,32 @@ func (_m *API) VirtualizationAttach(ctx context.Context, ID string, stream bool, return r0, r1, r2, r3 } +// VirtualizationCopyChunkTo provides a mock function with given fields: ctx, ID, target, size, content, uid, gid, mode +func (_m *API) VirtualizationCopyChunkTo(ctx context.Context, ID string, target string, size int64, content io.Reader, uid int, gid int, mode int64) error { + ret := _m.Called(ctx, ID, target, size, content, uid, gid, mode) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, int64, io.Reader, int, int, int64) error); ok { + r0 = rf(ctx, ID, target, size, content, uid, gid, mode) + } else { + r0 = ret.Error(0) + } + + return r0 +} + // VirtualizationCopyFrom provides a mock function with given fields: ctx, ID, path func (_m *API) VirtualizationCopyFrom(ctx context.Context, ID string, path string) ([]byte, int, int, int64, error) { ret := _m.Called(ctx, ID, path) var r0 []byte + var r1 int + var r2 int + var r3 int64 + var r4 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) ([]byte, int, int, int64, error)); ok { + return rf(ctx, ID, path) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) []byte); ok { r0 = rf(ctx, ID, path) } else { @@ -530,28 +599,24 @@ func (_m *API) VirtualizationCopyFrom(ctx context.Context, ID string, path strin } } - var r1 int if rf, ok := ret.Get(1).(func(context.Context, string, string) int); ok { r1 = rf(ctx, ID, path) } else { r1 = ret.Get(1).(int) } - var r2 int if rf, ok := ret.Get(2).(func(context.Context, string, string) int); ok { r2 = rf(ctx, ID, path) } else { r2 = ret.Get(2).(int) } - var r3 int64 if rf, ok := ret.Get(3).(func(context.Context, string, string) int64); ok { r3 = rf(ctx, ID, path) } else { r3 = ret.Get(3).(int64) } - var r4 error if rf, ok := ret.Get(4).(func(context.Context, string, string) error); ok { r4 = rf(ctx, ID, path) } else { @@ -575,25 +640,15 @@ func (_m *API) VirtualizationCopyTo(ctx context.Context, ID string, target strin return r0 } -// VVirtualizationCopyChunkTo provides a mock function with given fields: ctx, ID, target, content, uid, gid, mode -func (_m *API) VirtualizationCopyChunkTo(ctx context.Context, ID, target string, size int64, content io.Reader, uid, gid int, mode int64) error { - ret := _m.Called(ctx, ID, target, content, uid, gid, mode) - - var r0 error - if rf, ok := ret.Get(0).(func(context.Context, string, string, int64, io.Reader, int, int, int64) error); ok { - r0 = rf(ctx, ID, target, size, content, uid, gid, mode) - } else { - r0 = ret.Error(0) - } - - return r0 -} - // VirtualizationCreate provides a mock function with given fields: ctx, opts func (_m *API) VirtualizationCreate(ctx context.Context, opts *types.VirtualizationCreateOptions) (*types.VirtualizationCreated, error) { ret := _m.Called(ctx, opts) var r0 *types.VirtualizationCreated + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.VirtualizationCreateOptions) (*types.VirtualizationCreated, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, *types.VirtualizationCreateOptions) *types.VirtualizationCreated); ok { r0 = rf(ctx, opts) } else { @@ -602,7 +657,6 @@ func (_m *API) VirtualizationCreate(ctx context.Context, opts *types.Virtualizat } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.VirtualizationCreateOptions) error); ok { r1 = rf(ctx, opts) } else { @@ -617,6 +671,10 @@ func (_m *API) VirtualizationInspect(ctx context.Context, ID string) (*types.Vir ret := _m.Called(ctx, ID) var r0 *types.VirtualizationInfo + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*types.VirtualizationInfo, error)); ok { + return rf(ctx, ID) + } if rf, ok := ret.Get(0).(func(context.Context, string) *types.VirtualizationInfo); ok { r0 = rf(ctx, ID) } else { @@ -625,7 +683,6 @@ func (_m *API) VirtualizationInspect(ctx context.Context, ID string) (*types.Vir } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, ID) } else { @@ -640,6 +697,11 @@ func (_m *API) VirtualizationLogs(ctx context.Context, opts *types.Virtualizatio ret := _m.Called(ctx, opts) var r0 io.ReadCloser + var r1 io.ReadCloser + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, *types.VirtualizationLogStreamOptions) (io.ReadCloser, io.ReadCloser, error)); ok { + return rf(ctx, opts) + } if rf, ok := ret.Get(0).(func(context.Context, *types.VirtualizationLogStreamOptions) io.ReadCloser); ok { r0 = rf(ctx, opts) } else { @@ -648,7 +710,6 @@ func (_m *API) VirtualizationLogs(ctx context.Context, opts *types.Virtualizatio } } - var r1 io.ReadCloser if rf, ok := ret.Get(1).(func(context.Context, *types.VirtualizationLogStreamOptions) io.ReadCloser); ok { r1 = rf(ctx, opts) } else { @@ -657,7 +718,6 @@ func (_m *API) VirtualizationLogs(ctx context.Context, opts *types.Virtualizatio } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, *types.VirtualizationLogStreamOptions) error); ok { r2 = rf(ctx, opts) } else { @@ -700,6 +760,10 @@ func (_m *API) VirtualizationResourceRemap(_a0 context.Context, _a1 *types.Virtu ret := _m.Called(_a0, _a1) var r0 <-chan types.VirtualizationRemapMessage + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.VirtualizationRemapOptions) (<-chan types.VirtualizationRemapMessage, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, *types.VirtualizationRemapOptions) <-chan types.VirtualizationRemapMessage); ok { r0 = rf(_a0, _a1) } else { @@ -708,7 +772,6 @@ func (_m *API) VirtualizationResourceRemap(_a0 context.Context, _a1 *types.Virtu } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.VirtualizationRemapOptions) error); ok { r1 = rf(_a0, _a1) } else { @@ -765,6 +828,10 @@ func (_m *API) VirtualizationWait(ctx context.Context, ID string, state string) ret := _m.Called(ctx, ID, state) var r0 *types.VirtualizationWaitResult + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (*types.VirtualizationWaitResult, error)); ok { + return rf(ctx, ID, state) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) *types.VirtualizationWaitResult); ok { r0 = rf(ctx, ID, state) } else { @@ -773,7 +840,6 @@ func (_m *API) VirtualizationWait(ctx context.Context, ID string, state string) } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, ID, state) } else { @@ -782,3 +848,17 @@ func (_m *API) VirtualizationWait(ctx context.Context, ID string, state string) return r0, r1 } + +// NewAPI creates a new instance of API. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewAPI(t interface { + mock.TestingT + Cleanup(func()) +}) *API { + mock := &API{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/go.sum b/go.sum index 76e40a808..3df9f71a6 100644 --- a/go.sum +++ b/go.sum @@ -5,6 +5,7 @@ cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSR cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= +cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y= cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= @@ -30,25 +31,30 @@ github.com/Microsoft/hcsshim v0.8.11/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2 github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= +github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7 h1:uSoVVbwJiQipAclBbw+8quDsfcvFjOpI5iCf4p/cqCs= github.com/alcortesm/tgz v0.0.0-20161220082320-9c5fe88206d7/go.mod h1:6zEj6s6u/ghQa61ZWa/C2Aw3RkjiTBOix7dkqa1VLIs= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alexcesaro/statsd v2.0.0+incompatible h1:HG17k1Qk8V1F4UOoq6tx+IUoAbOcI5PHzzEUGeDD72w= github.com/alexcesaro/statsd v2.0.0+incompatible/go.mod h1:vNepIbQAiyLe1j480173M6NYYaAsGwEcvuDTU3OCUGY= github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk= github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= github.com/alicebob/miniredis/v2 v2.14.3 h1:QWoo2wchYmLgOB6ctlTt2dewQ1Vu6phl+iQbwT8SYGo= github.com/alicebob/miniredis/v2 v2.14.3/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODVXVpYDRaGhWaL6I= +github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239 h1:kFOfPq6dUM1hTo4JG6LR5AXSUEsOjtdm0kw0FtQtMJA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= +github.com/benbjohnson/clock v1.0.3 h1:vkLuvpK4fmtSCuo60+yC63p7y0BmQ8gm5ZXGuBCJyXg= github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= @@ -60,6 +66,7 @@ github.com/cenkalti/backoff/v4 v4.0.2 h1:JIufpQLbh4DkbQoii76ItQIUFzevQSqOLZca4ea github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054 h1:uH66TXeswKn5PW5zdZ39xEwfS9an067BirqA+P4QaLI= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= @@ -75,8 +82,11 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5 h1:xD/lrqdvwsc+O2bjSSi3YqY73Ke3LAiSCx49aCesA0E= github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= +github.com/cockroachdb/errors v1.2.4 h1:Lap807SXTH5tri2TivECb/4abUkMZC9zRoLarvcKDqs= github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= +github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f h1:o/kfcElHqOiXqcou5a3rIlMc7oJbMQkeLk0VQJ7zgqY= github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59 h1:qWj4qVYZ95vLWwqyNJCQg7rDsG5wPdze0UaPolH7DUk= @@ -113,6 +123,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:ma github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= github.com/davecgh/go-spew v0.0.0-20161028175848-04cdfd42973b/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -135,6 +146,7 @@ github.com/docker/go-metrics v0.0.1 h1:AgB/0SvBxihN0X8OR4SjsblXkbMvalQ8cjmtKQ2rQ github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= github.com/docker/go-units v0.4.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= +github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4= github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo= @@ -159,21 +171,26 @@ github.com/form3tech-oss/jwt-go v3.2.3+incompatible h1:7ZaBxOI7TMoYBfyA3cQHErNNy github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= +github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs= github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= github.com/getsentry/sentry-go v0.9.0 h1:KIfpY/D9hX3gWAEd3d8z6ImuHNWtqEsjlpdF8zXFsHM= github.com/getsentry/sentry-go v0.9.0/go.mod h1:kELm/9iCblqUYh+ZRML7PNdCvEuw24wBvJPYyi86cws= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= +github.com/gliderlabs/ssh v0.2.2 h1:6zsha5zo/TWhRhwqCD3+EarCAgZ2yN28ipRnGPnwkI0= github.com/gliderlabs/ssh v0.2.2/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= +github.com/go-errors/errors v1.0.1 h1:LUHzmkK3GUKUrL/1gfBUxAHzcev3apQlezX/+O7ma6w= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-git/gcfg v1.5.0 h1:Q5ViNfGF8zFgyJWPqYwA7qGFoMTEiBmdlkcfRmpIMa4= github.com/go-git/gcfg v1.5.0/go.mod h1:5m20vg6GwYabIxaOonVkTdrILxQMpEShl1xiMF4ua+E= github.com/go-git/go-billy/v5 v5.0.0 h1:7NQHvd9FVid8VL4qVUMm8XifBK+2xCoZ2lSk0agRrHM= github.com/go-git/go-billy/v5 v5.0.0/go.mod h1:pmpqyWchKfYfrkb/UVH4otLvyi/5gJlGI4Hb3ZqZ3W0= +github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12 h1:PbKy9zOy4aAKrJ5pibIRpVO2BXnK1Tlcg+caKI7Ox5M= github.com/go-git/go-git-fixtures/v4 v4.0.2-0.20200613231340-f56387b50c12/go.mod h1:m+ICp2rF3jDhFgEZ/8yziagdT1C+ZpZcrJjappBCDSw= github.com/go-git/go-git/v5 v5.2.0 h1:YPBLG/3UK1we1ohRkncLjaXWLW+HKp5QNM/jTli2JgI= github.com/go-git/go-git/v5 v5.2.0/go.mod h1:kh02eMX+wdqqxgNMEyq8YgwlIOsDOa9homkUq1PoTMs= @@ -238,6 +255,7 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= @@ -336,6 +354,7 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/labstack/echo/v4 v4.1.11/go.mod h1:i541M3Fj6f76NZtHSj7TXnyM8n2gaodfvfxNnFqi74g= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= @@ -388,7 +407,9 @@ github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5Vgl github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= +github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= @@ -397,11 +418,13 @@ github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+ github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.1/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= +github.com/onsi/ginkgo v1.15.0 h1:1V1NfVQR87RtWAgp1lv9JZJ5Jap+XFGKPi00andXGi4= github.com/onsi/ginkgo v1.15.0/go.mod h1:hF8qUzuuC8DJGygJH3726JnCZX4MYbRB8yFfISqnKUg= github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.10.2/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.10.5 h1:7n6FEkpFmfCoo2t+YYqXH0evK+a9ICQz0xcAy9dYcaQ= github.com/onsi/gomega v1.10.5/go.mod h1:gza4q3jKQJijlu05nKWRCW/GavJumGt8aNRxWg7mt48= github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= @@ -420,6 +443,7 @@ github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FI github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -592,6 +616,7 @@ go.opentelemetry.io/otel/metric v0.19.0/go.mod h1:8f9fglJPRnXuskQmKpnad31lcLJ2Vm go.opentelemetry.io/otel/metric v0.20.0 h1:4kzhXFP+btKm4jwxpjIqjs41A7MakRFUS86bqLHTIw8= go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= go.opentelemetry.io/otel/oteltest v0.19.0/go.mod h1:tI4yxwh8U21v7JD6R3BcA/2+RBoTKFexE/PJ/nSO7IA= +go.opentelemetry.io/otel/oteltest v0.20.0 h1:HiITxCawalo5vQzdHfKeZurV8x7ljcqAgiWzF6Vaeaw= go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= go.opentelemetry.io/otel/sdk v0.20.0 h1:JsxtGXd06J8jrnya7fdI/U/MR6yXA5DtbZy+qoHQlr8= go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= @@ -609,6 +634,7 @@ go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/automaxprocs v1.3.0 h1:II28aZoGdaglS5vVNnspf28lnZpXScxtIozx1lAjdb0= go.uber.org/automaxprocs v1.3.0/go.mod h1:9CWT6lKIep8U41DDaPiH6eFscnTyjfTANNQNx6LrIcA= +go.uber.org/goleak v1.1.10 h1:z+mqJhf6ss6BSfSM671tgKyZBFPTTJM+HLxnhPC3wu0= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0 h1:y6IPFStTAIT5Ytl7/XYmHvzXQ7S3g/IeZW9hyZ5thw4= @@ -693,6 +719,7 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d h1:TzXSXBo42m9gQenoE3b9BGiEpg5IG2JkU5FkPIawgtw= golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -814,6 +841,7 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= +google.golang.org/appengine v1.6.3 h1:hvZejVcIxAKHR8Pq2gXaDggf6CWT1QEqO+JEBeOKCG8= google.golang.org/appengine v1.6.3/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -861,6 +889,7 @@ gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLks gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= @@ -873,6 +902,7 @@ gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3M gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= @@ -890,7 +920,9 @@ gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= +gotest.tools/v3 v3.0.2 h1:kG1BFyqVHuQoVQiR1bWGnfz/fmHvvuiSPIV7rvl360E= gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/lock/mocks/DistributedLock.go b/lock/mocks/DistributedLock.go index 4b941e5f1..a1113aa07 100644 --- a/lock/mocks/DistributedLock.go +++ b/lock/mocks/DistributedLock.go @@ -1,4 +1,4 @@ -// Code generated by mockery v0.0.0-dev. DO NOT EDIT. +// Code generated by mockery v2.30.1. DO NOT EDIT. package mocks @@ -18,6 +18,10 @@ func (_m *DistributedLock) Lock(ctx context.Context) (context.Context, error) { ret := _m.Called(ctx) var r0 context.Context + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (context.Context, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) context.Context); ok { r0 = rf(ctx) } else { @@ -26,7 +30,6 @@ func (_m *DistributedLock) Lock(ctx context.Context) (context.Context, error) { } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -41,6 +44,10 @@ func (_m *DistributedLock) TryLock(ctx context.Context) (context.Context, error) ret := _m.Called(ctx) var r0 context.Context + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (context.Context, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) context.Context); ok { r0 = rf(ctx) } else { @@ -49,7 +56,6 @@ func (_m *DistributedLock) TryLock(ctx context.Context) (context.Context, error) } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -72,3 +78,17 @@ func (_m *DistributedLock) Unlock(ctx context.Context) error { return r0 } + +// NewDistributedLock creates a new instance of DistributedLock. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewDistributedLock(t interface { + mock.TestingT + Cleanup(func()) +}) *DistributedLock { + mock := &DistributedLock{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/rpc/mocks/CoreRPC_RunAndWaitServer.go b/rpc/mocks/CoreRPC_RunAndWaitServer.go index 9377f73e7..66dfe4f94 100644 --- a/rpc/mocks/CoreRPC_RunAndWaitServer.go +++ b/rpc/mocks/CoreRPC_RunAndWaitServer.go @@ -1,4 +1,4 @@ -// Code generated by mockery v0.0.0-dev. DO NOT EDIT. +// Code generated by mockery v2.30.1. DO NOT EDIT. package mocks @@ -37,6 +37,10 @@ func (_m *CoreRPC_RunAndWaitServer) Recv() (*pb.RunAndWaitOptions, error) { ret := _m.Called() var r0 *pb.RunAndWaitOptions + var r1 error + if rf, ok := ret.Get(0).(func() (*pb.RunAndWaitOptions, error)); ok { + return rf() + } if rf, ok := ret.Get(0).(func() *pb.RunAndWaitOptions); ok { r0 = rf() } else { @@ -45,7 +49,6 @@ func (_m *CoreRPC_RunAndWaitServer) Recv() (*pb.RunAndWaitOptions, error) { } } - var r1 error if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { @@ -129,3 +132,17 @@ func (_m *CoreRPC_RunAndWaitServer) SetHeader(_a0 metadata.MD) error { func (_m *CoreRPC_RunAndWaitServer) SetTrailer(_a0 metadata.MD) { _m.Called(_a0) } + +// NewCoreRPC_RunAndWaitServer creates a new instance of CoreRPC_RunAndWaitServer. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewCoreRPC_RunAndWaitServer(t interface { + mock.TestingT + Cleanup(func()) +}) *CoreRPC_RunAndWaitServer { + mock := &CoreRPC_RunAndWaitServer{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/scheduler/mocks/Scheduler.go b/scheduler/mocks/Scheduler.go index 83b4f41ec..5865c69eb 100644 --- a/scheduler/mocks/Scheduler.go +++ b/scheduler/mocks/Scheduler.go @@ -1,4 +1,4 @@ -// Code generated by mockery v0.0.0-dev. DO NOT EDIT. +// Code generated by mockery v2.30.1. DO NOT EDIT. package mocks @@ -21,6 +21,10 @@ func (_m *Scheduler) MaxIdleNode(nodes []*types.Node) (*types.Node, error) { ret := _m.Called(nodes) var r0 *types.Node + var r1 error + if rf, ok := ret.Get(0).(func([]*types.Node) (*types.Node, error)); ok { + return rf(nodes) + } if rf, ok := ret.Get(0).(func([]*types.Node) *types.Node); ok { r0 = rf(nodes) } else { @@ -29,7 +33,6 @@ func (_m *Scheduler) MaxIdleNode(nodes []*types.Node) (*types.Node, error) { } } - var r1 error if rf, ok := ret.Get(1).(func([]*types.Node) error); ok { r1 = rf(nodes) } else { @@ -44,13 +47,18 @@ func (_m *Scheduler) ReselectCPUNodes(ctx context.Context, scheduleInfo resource ret := _m.Called(ctx, scheduleInfo, CPU, quota, memory) var r0 resourcestypes.ScheduleInfo + var r1 map[string][]types.ResourceMap + var r2 int + var r3 error + if rf, ok := ret.Get(0).(func(context.Context, resourcestypes.ScheduleInfo, types.ResourceMap, float64, int64) (resourcestypes.ScheduleInfo, map[string][]types.ResourceMap, int, error)); ok { + return rf(ctx, scheduleInfo, CPU, quota, memory) + } if rf, ok := ret.Get(0).(func(context.Context, resourcestypes.ScheduleInfo, types.ResourceMap, float64, int64) resourcestypes.ScheduleInfo); ok { r0 = rf(ctx, scheduleInfo, CPU, quota, memory) } else { r0 = ret.Get(0).(resourcestypes.ScheduleInfo) } - var r1 map[string][]types.ResourceMap if rf, ok := ret.Get(1).(func(context.Context, resourcestypes.ScheduleInfo, types.ResourceMap, float64, int64) map[string][]types.ResourceMap); ok { r1 = rf(ctx, scheduleInfo, CPU, quota, memory) } else { @@ -59,14 +67,12 @@ func (_m *Scheduler) ReselectCPUNodes(ctx context.Context, scheduleInfo resource } } - var r2 int if rf, ok := ret.Get(2).(func(context.Context, resourcestypes.ScheduleInfo, types.ResourceMap, float64, int64) int); ok { r2 = rf(ctx, scheduleInfo, CPU, quota, memory) } else { r2 = ret.Get(2).(int) } - var r3 error if rf, ok := ret.Get(3).(func(context.Context, resourcestypes.ScheduleInfo, types.ResourceMap, float64, int64) error); ok { r3 = rf(ctx, scheduleInfo, CPU, quota, memory) } else { @@ -81,13 +87,18 @@ func (_m *Scheduler) ReselectVolumeNodes(ctx context.Context, scheduleInfo resou ret := _m.Called(ctx, scheduleInfo, old, request) var r0 resourcestypes.ScheduleInfo + var r1 map[string][]types.VolumePlan + var r2 int + var r3 error + if rf, ok := ret.Get(0).(func(context.Context, resourcestypes.ScheduleInfo, types.VolumePlan, types.VolumeBindings) (resourcestypes.ScheduleInfo, map[string][]types.VolumePlan, int, error)); ok { + return rf(ctx, scheduleInfo, old, request) + } if rf, ok := ret.Get(0).(func(context.Context, resourcestypes.ScheduleInfo, types.VolumePlan, types.VolumeBindings) resourcestypes.ScheduleInfo); ok { r0 = rf(ctx, scheduleInfo, old, request) } else { r0 = ret.Get(0).(resourcestypes.ScheduleInfo) } - var r1 map[string][]types.VolumePlan if rf, ok := ret.Get(1).(func(context.Context, resourcestypes.ScheduleInfo, types.VolumePlan, types.VolumeBindings) map[string][]types.VolumePlan); ok { r1 = rf(ctx, scheduleInfo, old, request) } else { @@ -96,14 +107,12 @@ func (_m *Scheduler) ReselectVolumeNodes(ctx context.Context, scheduleInfo resou } } - var r2 int if rf, ok := ret.Get(2).(func(context.Context, resourcestypes.ScheduleInfo, types.VolumePlan, types.VolumeBindings) int); ok { r2 = rf(ctx, scheduleInfo, old, request) } else { r2 = ret.Get(2).(int) } - var r3 error if rf, ok := ret.Get(3).(func(context.Context, resourcestypes.ScheduleInfo, types.VolumePlan, types.VolumeBindings) error); ok { r3 = rf(ctx, scheduleInfo, old, request) } else { @@ -118,6 +127,12 @@ func (_m *Scheduler) SelectCPUNodes(ctx context.Context, scheduleInfos []resourc ret := _m.Called(ctx, scheduleInfos, quota, memory) var r0 []resourcestypes.ScheduleInfo + var r1 map[string][]types.ResourceMap + var r2 int + var r3 error + if rf, ok := ret.Get(0).(func(context.Context, []resourcestypes.ScheduleInfo, float64, int64) ([]resourcestypes.ScheduleInfo, map[string][]types.ResourceMap, int, error)); ok { + return rf(ctx, scheduleInfos, quota, memory) + } if rf, ok := ret.Get(0).(func(context.Context, []resourcestypes.ScheduleInfo, float64, int64) []resourcestypes.ScheduleInfo); ok { r0 = rf(ctx, scheduleInfos, quota, memory) } else { @@ -126,7 +141,6 @@ func (_m *Scheduler) SelectCPUNodes(ctx context.Context, scheduleInfos []resourc } } - var r1 map[string][]types.ResourceMap if rf, ok := ret.Get(1).(func(context.Context, []resourcestypes.ScheduleInfo, float64, int64) map[string][]types.ResourceMap); ok { r1 = rf(ctx, scheduleInfos, quota, memory) } else { @@ -135,14 +149,12 @@ func (_m *Scheduler) SelectCPUNodes(ctx context.Context, scheduleInfos []resourc } } - var r2 int if rf, ok := ret.Get(2).(func(context.Context, []resourcestypes.ScheduleInfo, float64, int64) int); ok { r2 = rf(ctx, scheduleInfos, quota, memory) } else { r2 = ret.Get(2).(int) } - var r3 error if rf, ok := ret.Get(3).(func(context.Context, []resourcestypes.ScheduleInfo, float64, int64) error); ok { r3 = rf(ctx, scheduleInfos, quota, memory) } else { @@ -157,6 +169,11 @@ func (_m *Scheduler) SelectMemoryNodes(ctx context.Context, scheduleInfos []reso ret := _m.Called(ctx, scheduleInfos, quota, memory) var r0 []resourcestypes.ScheduleInfo + var r1 int + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, []resourcestypes.ScheduleInfo, float64, int64) ([]resourcestypes.ScheduleInfo, int, error)); ok { + return rf(ctx, scheduleInfos, quota, memory) + } if rf, ok := ret.Get(0).(func(context.Context, []resourcestypes.ScheduleInfo, float64, int64) []resourcestypes.ScheduleInfo); ok { r0 = rf(ctx, scheduleInfos, quota, memory) } else { @@ -165,14 +182,12 @@ func (_m *Scheduler) SelectMemoryNodes(ctx context.Context, scheduleInfos []reso } } - var r1 int if rf, ok := ret.Get(1).(func(context.Context, []resourcestypes.ScheduleInfo, float64, int64) int); ok { r1 = rf(ctx, scheduleInfos, quota, memory) } else { r1 = ret.Get(1).(int) } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, []resourcestypes.ScheduleInfo, float64, int64) error); ok { r2 = rf(ctx, scheduleInfos, quota, memory) } else { @@ -187,6 +202,11 @@ func (_m *Scheduler) SelectStorageNodes(ctx context.Context, scheduleInfos []res ret := _m.Called(ctx, scheduleInfos, storage) var r0 []resourcestypes.ScheduleInfo + var r1 int + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, []resourcestypes.ScheduleInfo, int64) ([]resourcestypes.ScheduleInfo, int, error)); ok { + return rf(ctx, scheduleInfos, storage) + } if rf, ok := ret.Get(0).(func(context.Context, []resourcestypes.ScheduleInfo, int64) []resourcestypes.ScheduleInfo); ok { r0 = rf(ctx, scheduleInfos, storage) } else { @@ -195,14 +215,12 @@ func (_m *Scheduler) SelectStorageNodes(ctx context.Context, scheduleInfos []res } } - var r1 int if rf, ok := ret.Get(1).(func(context.Context, []resourcestypes.ScheduleInfo, int64) int); ok { r1 = rf(ctx, scheduleInfos, storage) } else { r1 = ret.Get(1).(int) } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, []resourcestypes.ScheduleInfo, int64) error); ok { r2 = rf(ctx, scheduleInfos, storage) } else { @@ -217,6 +235,12 @@ func (_m *Scheduler) SelectVolumeNodes(ctx context.Context, scheduleInfo []resou ret := _m.Called(ctx, scheduleInfo, vbs) var r0 []resourcestypes.ScheduleInfo + var r1 map[string][]types.VolumePlan + var r2 int + var r3 error + if rf, ok := ret.Get(0).(func(context.Context, []resourcestypes.ScheduleInfo, types.VolumeBindings) ([]resourcestypes.ScheduleInfo, map[string][]types.VolumePlan, int, error)); ok { + return rf(ctx, scheduleInfo, vbs) + } if rf, ok := ret.Get(0).(func(context.Context, []resourcestypes.ScheduleInfo, types.VolumeBindings) []resourcestypes.ScheduleInfo); ok { r0 = rf(ctx, scheduleInfo, vbs) } else { @@ -225,7 +249,6 @@ func (_m *Scheduler) SelectVolumeNodes(ctx context.Context, scheduleInfo []resou } } - var r1 map[string][]types.VolumePlan if rf, ok := ret.Get(1).(func(context.Context, []resourcestypes.ScheduleInfo, types.VolumeBindings) map[string][]types.VolumePlan); ok { r1 = rf(ctx, scheduleInfo, vbs) } else { @@ -234,14 +257,12 @@ func (_m *Scheduler) SelectVolumeNodes(ctx context.Context, scheduleInfo []resou } } - var r2 int if rf, ok := ret.Get(2).(func(context.Context, []resourcestypes.ScheduleInfo, types.VolumeBindings) int); ok { r2 = rf(ctx, scheduleInfo, vbs) } else { r2 = ret.Get(2).(int) } - var r3 error if rf, ok := ret.Get(3).(func(context.Context, []resourcestypes.ScheduleInfo, types.VolumeBindings) error); ok { r3 = rf(ctx, scheduleInfo, vbs) } else { @@ -250,3 +271,17 @@ func (_m *Scheduler) SelectVolumeNodes(ctx context.Context, scheduleInfo []resou return r0, r1, r2, r3 } + +// NewScheduler creates a new instance of Scheduler. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewScheduler(t interface { + mock.TestingT + Cleanup(func()) +}) *Scheduler { + mock := &Scheduler{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/source/mocks/Source.go b/source/mocks/Source.go index ac84f3a54..158cf1f85 100644 --- a/source/mocks/Source.go +++ b/source/mocks/Source.go @@ -1,4 +1,4 @@ -// Code generated by mockery v0.0.0-dev. DO NOT EDIT. +// Code generated by mockery v2.30.1. DO NOT EDIT. package mocks @@ -54,3 +54,17 @@ func (_m *Source) SourceCode(ctx context.Context, repository string, path string return r0 } + +// NewSource creates a new instance of Source. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewSource(t interface { + mock.TestingT + Cleanup(func()) +}) *Source { + mock := &Source{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/store/etcdv3/meta/mocks/ETCDClientV3.go b/store/etcdv3/meta/mocks/ETCDClientV3.go index 28a4221c8..2b055f6f5 100644 --- a/store/etcdv3/meta/mocks/ETCDClientV3.go +++ b/store/etcdv3/meta/mocks/ETCDClientV3.go @@ -1,4 +1,4 @@ -// Code generated by mockery v0.0.0-dev. DO NOT EDIT. +// Code generated by mockery v2.30.1. DO NOT EDIT. package mocks @@ -41,6 +41,10 @@ func (_m *ETCDClientV3) Compact(ctx context.Context, rev int64, opts ...clientv3 ret := _m.Called(_ca...) var r0 *clientv3.CompactResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, int64, ...clientv3.CompactOption) (*clientv3.CompactResponse, error)); ok { + return rf(ctx, rev, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, int64, ...clientv3.CompactOption) *clientv3.CompactResponse); ok { r0 = rf(ctx, rev, opts...) } else { @@ -49,7 +53,6 @@ func (_m *ETCDClientV3) Compact(ctx context.Context, rev int64, opts ...clientv3 } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, int64, ...clientv3.CompactOption) error); ok { r1 = rf(ctx, rev, opts...) } else { @@ -71,6 +74,10 @@ func (_m *ETCDClientV3) Delete(ctx context.Context, key string, opts ...clientv3 ret := _m.Called(_ca...) var r0 *clientv3.DeleteResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, ...clientv3.OpOption) (*clientv3.DeleteResponse, error)); ok { + return rf(ctx, key, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, string, ...clientv3.OpOption) *clientv3.DeleteResponse); ok { r0 = rf(ctx, key, opts...) } else { @@ -79,7 +86,6 @@ func (_m *ETCDClientV3) Delete(ctx context.Context, key string, opts ...clientv3 } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, key, opts...) } else { @@ -94,13 +100,16 @@ func (_m *ETCDClientV3) Do(ctx context.Context, op clientv3.Op) (clientv3.OpResp ret := _m.Called(ctx, op) var r0 clientv3.OpResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, clientv3.Op) (clientv3.OpResponse, error)); ok { + return rf(ctx, op) + } if rf, ok := ret.Get(0).(func(context.Context, clientv3.Op) clientv3.OpResponse); ok { r0 = rf(ctx, op) } else { r0 = ret.Get(0).(clientv3.OpResponse) } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, clientv3.Op) error); ok { r1 = rf(ctx, op) } else { @@ -122,6 +131,10 @@ func (_m *ETCDClientV3) Get(ctx context.Context, key string, opts ...clientv3.Op ret := _m.Called(_ca...) var r0 *clientv3.GetResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, ...clientv3.OpOption) (*clientv3.GetResponse, error)); ok { + return rf(ctx, key, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, string, ...clientv3.OpOption) *clientv3.GetResponse); ok { r0 = rf(ctx, key, opts...) } else { @@ -130,7 +143,6 @@ func (_m *ETCDClientV3) Get(ctx context.Context, key string, opts ...clientv3.Op } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, key, opts...) } else { @@ -145,6 +157,10 @@ func (_m *ETCDClientV3) Grant(ctx context.Context, ttl int64) (*clientv3.LeaseGr ret := _m.Called(ctx, ttl) var r0 *clientv3.LeaseGrantResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, int64) (*clientv3.LeaseGrantResponse, error)); ok { + return rf(ctx, ttl) + } if rf, ok := ret.Get(0).(func(context.Context, int64) *clientv3.LeaseGrantResponse); ok { r0 = rf(ctx, ttl) } else { @@ -153,7 +169,6 @@ func (_m *ETCDClientV3) Grant(ctx context.Context, ttl int64) (*clientv3.LeaseGr } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, int64) error); ok { r1 = rf(ctx, ttl) } else { @@ -168,6 +183,10 @@ func (_m *ETCDClientV3) KeepAlive(ctx context.Context, id clientv3.LeaseID) (<-c ret := _m.Called(ctx, id) var r0 <-chan *clientv3.LeaseKeepAliveResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, clientv3.LeaseID) (<-chan *clientv3.LeaseKeepAliveResponse, error)); ok { + return rf(ctx, id) + } if rf, ok := ret.Get(0).(func(context.Context, clientv3.LeaseID) <-chan *clientv3.LeaseKeepAliveResponse); ok { r0 = rf(ctx, id) } else { @@ -176,7 +195,6 @@ func (_m *ETCDClientV3) KeepAlive(ctx context.Context, id clientv3.LeaseID) (<-c } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, clientv3.LeaseID) error); ok { r1 = rf(ctx, id) } else { @@ -191,6 +209,10 @@ func (_m *ETCDClientV3) KeepAliveOnce(ctx context.Context, id clientv3.LeaseID) ret := _m.Called(ctx, id) var r0 *clientv3.LeaseKeepAliveResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, clientv3.LeaseID) (*clientv3.LeaseKeepAliveResponse, error)); ok { + return rf(ctx, id) + } if rf, ok := ret.Get(0).(func(context.Context, clientv3.LeaseID) *clientv3.LeaseKeepAliveResponse); ok { r0 = rf(ctx, id) } else { @@ -199,7 +221,6 @@ func (_m *ETCDClientV3) KeepAliveOnce(ctx context.Context, id clientv3.LeaseID) } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, clientv3.LeaseID) error); ok { r1 = rf(ctx, id) } else { @@ -214,6 +235,10 @@ func (_m *ETCDClientV3) Leases(ctx context.Context) (*clientv3.LeaseLeasesRespon ret := _m.Called(ctx) var r0 *clientv3.LeaseLeasesResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (*clientv3.LeaseLeasesResponse, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) *clientv3.LeaseLeasesResponse); ok { r0 = rf(ctx) } else { @@ -222,7 +247,6 @@ func (_m *ETCDClientV3) Leases(ctx context.Context) (*clientv3.LeaseLeasesRespon } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -244,6 +268,10 @@ func (_m *ETCDClientV3) Put(ctx context.Context, key string, val string, opts .. ret := _m.Called(_ca...) var r0 *clientv3.PutResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, ...clientv3.OpOption) (*clientv3.PutResponse, error)); ok { + return rf(ctx, key, val, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, ...clientv3.OpOption) *clientv3.PutResponse); ok { r0 = rf(ctx, key, val, opts...) } else { @@ -252,7 +280,6 @@ func (_m *ETCDClientV3) Put(ctx context.Context, key string, val string, opts .. } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, key, val, opts...) } else { @@ -281,6 +308,10 @@ func (_m *ETCDClientV3) Revoke(ctx context.Context, id clientv3.LeaseID) (*clien ret := _m.Called(ctx, id) var r0 *clientv3.LeaseRevokeResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, clientv3.LeaseID) (*clientv3.LeaseRevokeResponse, error)); ok { + return rf(ctx, id) + } if rf, ok := ret.Get(0).(func(context.Context, clientv3.LeaseID) *clientv3.LeaseRevokeResponse); ok { r0 = rf(ctx, id) } else { @@ -289,7 +320,6 @@ func (_m *ETCDClientV3) Revoke(ctx context.Context, id clientv3.LeaseID) (*clien } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, clientv3.LeaseID) error); ok { r1 = rf(ctx, id) } else { @@ -311,6 +341,10 @@ func (_m *ETCDClientV3) TimeToLive(ctx context.Context, id clientv3.LeaseID, opt ret := _m.Called(_ca...) var r0 *clientv3.LeaseTimeToLiveResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, clientv3.LeaseID, ...clientv3.LeaseOption) (*clientv3.LeaseTimeToLiveResponse, error)); ok { + return rf(ctx, id, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, clientv3.LeaseID, ...clientv3.LeaseOption) *clientv3.LeaseTimeToLiveResponse); ok { r0 = rf(ctx, id, opts...) } else { @@ -319,7 +353,6 @@ func (_m *ETCDClientV3) TimeToLive(ctx context.Context, id clientv3.LeaseID, opt } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, clientv3.LeaseID, ...clientv3.LeaseOption) error); ok { r1 = rf(ctx, id, opts...) } else { @@ -367,3 +400,17 @@ func (_m *ETCDClientV3) Watch(ctx context.Context, key string, opts ...clientv3. return r0 } + +// NewETCDClientV3 creates a new instance of ETCDClientV3. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewETCDClientV3(t interface { + mock.TestingT + Cleanup(func()) +}) *ETCDClientV3 { + mock := &ETCDClientV3{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/store/etcdv3/meta/mocks/KV.go b/store/etcdv3/meta/mocks/KV.go index 6125d4552..c23de27a6 100644 --- a/store/etcdv3/meta/mocks/KV.go +++ b/store/etcdv3/meta/mocks/KV.go @@ -1,4 +1,4 @@ -// Code generated by mockery v0.0.0-dev. DO NOT EDIT. +// Code generated by mockery v2.30.1. DO NOT EDIT. package mocks @@ -33,6 +33,10 @@ func (_m *KV) BatchCreate(ctx context.Context, data map[string]string, opts ...c ret := _m.Called(_ca...) var r0 *clientv3.TxnResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, map[string]string, ...clientv3.OpOption) (*clientv3.TxnResponse, error)); ok { + return rf(ctx, data, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, map[string]string, ...clientv3.OpOption) *clientv3.TxnResponse); ok { r0 = rf(ctx, data, opts...) } else { @@ -41,7 +45,6 @@ func (_m *KV) BatchCreate(ctx context.Context, data map[string]string, opts ...c } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, map[string]string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, data, opts...) } else { @@ -77,6 +80,10 @@ func (_m *KV) BatchDelete(ctx context.Context, keys []string, opts ...clientv3.O ret := _m.Called(_ca...) var r0 *clientv3.TxnResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string, ...clientv3.OpOption) (*clientv3.TxnResponse, error)); ok { + return rf(ctx, keys, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, []string, ...clientv3.OpOption) *clientv3.TxnResponse); ok { r0 = rf(ctx, keys, opts...) } else { @@ -85,7 +92,6 @@ func (_m *KV) BatchDelete(ctx context.Context, keys []string, opts ...clientv3.O } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, keys, opts...) } else { @@ -107,6 +113,10 @@ func (_m *KV) BatchPut(ctx context.Context, data map[string]string, opts ...clie ret := _m.Called(_ca...) var r0 *clientv3.TxnResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, map[string]string, ...clientv3.OpOption) (*clientv3.TxnResponse, error)); ok { + return rf(ctx, data, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, map[string]string, ...clientv3.OpOption) *clientv3.TxnResponse); ok { r0 = rf(ctx, data, opts...) } else { @@ -115,7 +125,6 @@ func (_m *KV) BatchPut(ctx context.Context, data map[string]string, opts ...clie } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, map[string]string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, data, opts...) } else { @@ -137,6 +146,10 @@ func (_m *KV) BatchUpdate(ctx context.Context, data map[string]string, opts ...c ret := _m.Called(_ca...) var r0 *clientv3.TxnResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, map[string]string, ...clientv3.OpOption) (*clientv3.TxnResponse, error)); ok { + return rf(ctx, data, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, map[string]string, ...clientv3.OpOption) *clientv3.TxnResponse); ok { r0 = rf(ctx, data, opts...) } else { @@ -145,7 +158,6 @@ func (_m *KV) BatchUpdate(ctx context.Context, data map[string]string, opts ...c } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, map[string]string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, data, opts...) } else { @@ -181,6 +193,10 @@ func (_m *KV) Create(ctx context.Context, key string, val string, opts ...client ret := _m.Called(_ca...) var r0 *clientv3.TxnResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, ...clientv3.OpOption) (*clientv3.TxnResponse, error)); ok { + return rf(ctx, key, val, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, ...clientv3.OpOption) *clientv3.TxnResponse); ok { r0 = rf(ctx, key, val, opts...) } else { @@ -189,7 +205,6 @@ func (_m *KV) Create(ctx context.Context, key string, val string, opts ...client } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, key, val, opts...) } else { @@ -204,6 +219,10 @@ func (_m *KV) CreateLock(key string, ttl time.Duration) (lock.DistributedLock, e ret := _m.Called(key, ttl) var r0 lock.DistributedLock + var r1 error + if rf, ok := ret.Get(0).(func(string, time.Duration) (lock.DistributedLock, error)); ok { + return rf(key, ttl) + } if rf, ok := ret.Get(0).(func(string, time.Duration) lock.DistributedLock); ok { r0 = rf(key, ttl) } else { @@ -212,7 +231,6 @@ func (_m *KV) CreateLock(key string, ttl time.Duration) (lock.DistributedLock, e } } - var r1 error if rf, ok := ret.Get(1).(func(string, time.Duration) error); ok { r1 = rf(key, ttl) } else { @@ -234,6 +252,10 @@ func (_m *KV) Delete(ctx context.Context, key string, opts ...clientv3.OpOption) ret := _m.Called(_ca...) var r0 *clientv3.DeleteResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, ...clientv3.OpOption) (*clientv3.DeleteResponse, error)); ok { + return rf(ctx, key, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, string, ...clientv3.OpOption) *clientv3.DeleteResponse); ok { r0 = rf(ctx, key, opts...) } else { @@ -242,7 +264,6 @@ func (_m *KV) Delete(ctx context.Context, key string, opts ...clientv3.OpOption) } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, key, opts...) } else { @@ -264,6 +285,10 @@ func (_m *KV) Get(ctx context.Context, key string, opts ...clientv3.OpOption) (* ret := _m.Called(_ca...) var r0 *clientv3.GetResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, ...clientv3.OpOption) (*clientv3.GetResponse, error)); ok { + return rf(ctx, key, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, string, ...clientv3.OpOption) *clientv3.GetResponse); ok { r0 = rf(ctx, key, opts...) } else { @@ -272,7 +297,6 @@ func (_m *KV) Get(ctx context.Context, key string, opts ...clientv3.OpOption) (* } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, key, opts...) } else { @@ -294,6 +318,10 @@ func (_m *KV) GetMulti(ctx context.Context, keys []string, opts ...clientv3.OpOp ret := _m.Called(_ca...) var r0 []*mvccpb.KeyValue + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string, ...clientv3.OpOption) ([]*mvccpb.KeyValue, error)); ok { + return rf(ctx, keys, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, []string, ...clientv3.OpOption) []*mvccpb.KeyValue); ok { r0 = rf(ctx, keys, opts...) } else { @@ -302,7 +330,6 @@ func (_m *KV) GetMulti(ctx context.Context, keys []string, opts ...clientv3.OpOp } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, keys, opts...) } else { @@ -324,6 +351,10 @@ func (_m *KV) GetOne(ctx context.Context, key string, opts ...clientv3.OpOption) ret := _m.Called(_ca...) var r0 *mvccpb.KeyValue + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, ...clientv3.OpOption) (*mvccpb.KeyValue, error)); ok { + return rf(ctx, key, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, string, ...clientv3.OpOption) *mvccpb.KeyValue); ok { r0 = rf(ctx, key, opts...) } else { @@ -332,7 +363,6 @@ func (_m *KV) GetOne(ctx context.Context, key string, opts ...clientv3.OpOption) } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, key, opts...) } else { @@ -347,6 +377,10 @@ func (_m *KV) Grant(ctx context.Context, ttl int64) (*clientv3.LeaseGrantRespons ret := _m.Called(ctx, ttl) var r0 *clientv3.LeaseGrantResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, int64) (*clientv3.LeaseGrantResponse, error)); ok { + return rf(ctx, ttl) + } if rf, ok := ret.Get(0).(func(context.Context, int64) *clientv3.LeaseGrantResponse); ok { r0 = rf(ctx, ttl) } else { @@ -355,7 +389,6 @@ func (_m *KV) Grant(ctx context.Context, ttl int64) (*clientv3.LeaseGrantRespons } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, int64) error); ok { r1 = rf(ctx, ttl) } else { @@ -377,6 +410,10 @@ func (_m *KV) Put(ctx context.Context, key string, val string, opts ...clientv3. ret := _m.Called(_ca...) var r0 *clientv3.PutResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, ...clientv3.OpOption) (*clientv3.PutResponse, error)); ok { + return rf(ctx, key, val, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, ...clientv3.OpOption) *clientv3.PutResponse); ok { r0 = rf(ctx, key, val, opts...) } else { @@ -385,7 +422,6 @@ func (_m *KV) Put(ctx context.Context, key string, val string, opts ...clientv3. } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, key, val, opts...) } else { @@ -400,6 +436,11 @@ func (_m *KV) StartEphemeral(ctx context.Context, path string, heartbeat time.Du ret := _m.Called(ctx, path, heartbeat) var r0 <-chan struct{} + var r1 func() + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string, time.Duration) (<-chan struct{}, func(), error)); ok { + return rf(ctx, path, heartbeat) + } if rf, ok := ret.Get(0).(func(context.Context, string, time.Duration) <-chan struct{}); ok { r0 = rf(ctx, path, heartbeat) } else { @@ -408,7 +449,6 @@ func (_m *KV) StartEphemeral(ctx context.Context, path string, heartbeat time.Du } } - var r1 func() if rf, ok := ret.Get(1).(func(context.Context, string, time.Duration) func()); ok { r1 = rf(ctx, path, heartbeat) } else { @@ -417,7 +457,6 @@ func (_m *KV) StartEphemeral(ctx context.Context, path string, heartbeat time.Du } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string, time.Duration) error); ok { r2 = rf(ctx, path, heartbeat) } else { @@ -439,6 +478,10 @@ func (_m *KV) Update(ctx context.Context, key string, val string, opts ...client ret := _m.Called(_ca...) var r0 *clientv3.TxnResponse + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, ...clientv3.OpOption) (*clientv3.TxnResponse, error)); ok { + return rf(ctx, key, val, opts...) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, ...clientv3.OpOption) *clientv3.TxnResponse); ok { r0 = rf(ctx, key, val, opts...) } else { @@ -447,7 +490,6 @@ func (_m *KV) Update(ctx context.Context, key string, val string, opts ...client } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, ...clientv3.OpOption) error); ok { r1 = rf(ctx, key, val, opts...) } else { @@ -479,3 +521,17 @@ func (_m *KV) Watch(ctx context.Context, key string, opts ...clientv3.OpOption) return r0 } + +// NewKV creates a new instance of KV. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewKV(t interface { + mock.TestingT + Cleanup(func()) +}) *KV { + mock := &KV{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/store/etcdv3/meta/mocks/Txn.go b/store/etcdv3/meta/mocks/Txn.go index 15e96cfc3..b2ca3fbc1 100644 --- a/store/etcdv3/meta/mocks/Txn.go +++ b/store/etcdv3/meta/mocks/Txn.go @@ -1,4 +1,4 @@ -// Code generated by mockery v0.0.0-dev. DO NOT EDIT. +// Code generated by mockery v2.30.1. DO NOT EDIT. package mocks @@ -17,6 +17,10 @@ func (_m *Txn) Commit() (*clientv3.TxnResponse, error) { ret := _m.Called() var r0 *clientv3.TxnResponse + var r1 error + if rf, ok := ret.Get(0).(func() (*clientv3.TxnResponse, error)); ok { + return rf() + } if rf, ok := ret.Get(0).(func() *clientv3.TxnResponse); ok { r0 = rf() } else { @@ -25,7 +29,6 @@ func (_m *Txn) Commit() (*clientv3.TxnResponse, error) { } } - var r1 error if rf, ok := ret.Get(1).(func() error); ok { r1 = rf() } else { @@ -100,3 +103,17 @@ func (_m *Txn) Then(ops ...clientv3.Op) clientv3.Txn { return r0 } + +// NewTxn creates a new instance of Txn. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewTxn(t interface { + mock.TestingT + Cleanup(func()) +}) *Txn { + mock := &Txn{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/store/mocks/Store.go b/store/mocks/Store.go index e01aa70eb..07322a82e 100644 --- a/store/mocks/Store.go +++ b/store/mocks/Store.go @@ -1,4 +1,4 @@ -// Code generated by mockery v0.0.0-dev. DO NOT EDIT. +// Code generated by mockery v2.30.1. DO NOT EDIT. package mocks @@ -25,6 +25,10 @@ func (_m *Store) AddNode(_a0 context.Context, _a1 *types.AddNodeOptions) (*types ret := _m.Called(_a0, _a1) var r0 *types.Node + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, *types.AddNodeOptions) (*types.Node, error)); ok { + return rf(_a0, _a1) + } if rf, ok := ret.Get(0).(func(context.Context, *types.AddNodeOptions) *types.Node); ok { r0 = rf(_a0, _a1) } else { @@ -33,7 +37,6 @@ func (_m *Store) AddNode(_a0 context.Context, _a1 *types.AddNodeOptions) (*types } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, *types.AddNodeOptions) error); ok { r1 = rf(_a0, _a1) } else { @@ -48,6 +51,10 @@ func (_m *Store) AddPod(ctx context.Context, name string, desc string) (*types.P ret := _m.Called(ctx, name, desc) var r0 *types.Pod + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string) (*types.Pod, error)); ok { + return rf(ctx, name, desc) + } if rf, ok := ret.Get(0).(func(context.Context, string, string) *types.Pod); ok { r0 = rf(ctx, name, desc) } else { @@ -56,7 +63,6 @@ func (_m *Store) AddPod(ctx context.Context, name string, desc string) (*types.P } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string) error); ok { r1 = rf(ctx, name, desc) } else { @@ -85,6 +91,10 @@ func (_m *Store) CreateLock(key string, ttl time.Duration) (lock.DistributedLock ret := _m.Called(key, ttl) var r0 lock.DistributedLock + var r1 error + if rf, ok := ret.Get(0).(func(string, time.Duration) (lock.DistributedLock, error)); ok { + return rf(key, ttl) + } if rf, ok := ret.Get(0).(func(string, time.Duration) lock.DistributedLock); ok { r0 = rf(key, ttl) } else { @@ -93,7 +103,6 @@ func (_m *Store) CreateLock(key string, ttl time.Duration) (lock.DistributedLock } } - var r1 error if rf, ok := ret.Get(1).(func(string, time.Duration) error); ok { r1 = rf(key, ttl) } else { @@ -136,6 +145,10 @@ func (_m *Store) GetAllPods(ctx context.Context) ([]*types.Pod, error) { ret := _m.Called(ctx) var r0 []*types.Pod + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) ([]*types.Pod, error)); ok { + return rf(ctx) + } if rf, ok := ret.Get(0).(func(context.Context) []*types.Pod); ok { r0 = rf(ctx) } else { @@ -144,7 +157,6 @@ func (_m *Store) GetAllPods(ctx context.Context) ([]*types.Pod, error) { } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(ctx) } else { @@ -159,6 +171,10 @@ func (_m *Store) GetNode(ctx context.Context, nodename string) (*types.Node, err ret := _m.Called(ctx, nodename) var r0 *types.Node + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*types.Node, error)); ok { + return rf(ctx, nodename) + } if rf, ok := ret.Get(0).(func(context.Context, string) *types.Node); ok { r0 = rf(ctx, nodename) } else { @@ -167,7 +183,6 @@ func (_m *Store) GetNode(ctx context.Context, nodename string) (*types.Node, err } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, nodename) } else { @@ -182,6 +197,10 @@ func (_m *Store) GetNodeStatus(ctx context.Context, nodename string) (*types.Nod ret := _m.Called(ctx, nodename) var r0 *types.NodeStatus + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*types.NodeStatus, error)); ok { + return rf(ctx, nodename) + } if rf, ok := ret.Get(0).(func(context.Context, string) *types.NodeStatus); ok { r0 = rf(ctx, nodename) } else { @@ -190,7 +209,6 @@ func (_m *Store) GetNodeStatus(ctx context.Context, nodename string) (*types.Nod } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, nodename) } else { @@ -205,6 +223,10 @@ func (_m *Store) GetNodes(ctx context.Context, nodenames []string) ([]*types.Nod ret := _m.Called(ctx, nodenames) var r0 []*types.Node + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string) ([]*types.Node, error)); ok { + return rf(ctx, nodenames) + } if rf, ok := ret.Get(0).(func(context.Context, []string) []*types.Node); ok { r0 = rf(ctx, nodenames) } else { @@ -213,7 +235,6 @@ func (_m *Store) GetNodes(ctx context.Context, nodenames []string) ([]*types.Nod } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string) error); ok { r1 = rf(ctx, nodenames) } else { @@ -228,6 +249,10 @@ func (_m *Store) GetNodesByPod(ctx context.Context, podname string, labels map[s ret := _m.Called(ctx, podname, labels, all) var r0 []*types.Node + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, map[string]string, bool) ([]*types.Node, error)); ok { + return rf(ctx, podname, labels, all) + } if rf, ok := ret.Get(0).(func(context.Context, string, map[string]string, bool) []*types.Node); ok { r0 = rf(ctx, podname, labels, all) } else { @@ -236,7 +261,6 @@ func (_m *Store) GetNodesByPod(ctx context.Context, podname string, labels map[s } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, map[string]string, bool) error); ok { r1 = rf(ctx, podname, labels, all) } else { @@ -251,6 +275,10 @@ func (_m *Store) GetPod(ctx context.Context, podname string) (*types.Pod, error) ret := _m.Called(ctx, podname) var r0 *types.Pod + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*types.Pod, error)); ok { + return rf(ctx, podname) + } if rf, ok := ret.Get(0).(func(context.Context, string) *types.Pod); ok { r0 = rf(ctx, podname) } else { @@ -259,7 +287,6 @@ func (_m *Store) GetPod(ctx context.Context, podname string) (*types.Pod, error) } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, podname) } else { @@ -274,6 +301,10 @@ func (_m *Store) GetWorkload(ctx context.Context, id string) (*types.Workload, e ret := _m.Called(ctx, id) var r0 *types.Workload + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*types.Workload, error)); ok { + return rf(ctx, id) + } if rf, ok := ret.Get(0).(func(context.Context, string) *types.Workload); ok { r0 = rf(ctx, id) } else { @@ -282,7 +313,6 @@ func (_m *Store) GetWorkload(ctx context.Context, id string) (*types.Workload, e } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, id) } else { @@ -297,6 +327,10 @@ func (_m *Store) GetWorkloadStatus(ctx context.Context, id string) (*types.Statu ret := _m.Called(ctx, id) var r0 *types.StatusMeta + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string) (*types.StatusMeta, error)); ok { + return rf(ctx, id) + } if rf, ok := ret.Get(0).(func(context.Context, string) *types.StatusMeta); ok { r0 = rf(ctx, id) } else { @@ -305,7 +339,6 @@ func (_m *Store) GetWorkloadStatus(ctx context.Context, id string) (*types.Statu } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string) error); ok { r1 = rf(ctx, id) } else { @@ -320,6 +353,10 @@ func (_m *Store) GetWorkloads(ctx context.Context, ids []string) ([]*types.Workl ret := _m.Called(ctx, ids) var r0 []*types.Workload + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, []string) ([]*types.Workload, error)); ok { + return rf(ctx, ids) + } if rf, ok := ret.Get(0).(func(context.Context, []string) []*types.Workload); ok { r0 = rf(ctx, ids) } else { @@ -328,7 +365,6 @@ func (_m *Store) GetWorkloads(ctx context.Context, ids []string) ([]*types.Workl } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, []string) error); ok { r1 = rf(ctx, ids) } else { @@ -343,6 +379,10 @@ func (_m *Store) ListNodeWorkloads(ctx context.Context, nodename string, labels ret := _m.Called(ctx, nodename, labels) var r0 []*types.Workload + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, map[string]string) ([]*types.Workload, error)); ok { + return rf(ctx, nodename, labels) + } if rf, ok := ret.Get(0).(func(context.Context, string, map[string]string) []*types.Workload); ok { r0 = rf(ctx, nodename, labels) } else { @@ -351,7 +391,6 @@ func (_m *Store) ListNodeWorkloads(ctx context.Context, nodename string, labels } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, map[string]string) error); ok { r1 = rf(ctx, nodename, labels) } else { @@ -366,6 +405,10 @@ func (_m *Store) ListWorkloads(ctx context.Context, appname string, entrypoint s ret := _m.Called(ctx, appname, entrypoint, nodename, limit, labels) var r0 []*types.Workload + var r1 error + if rf, ok := ret.Get(0).(func(context.Context, string, string, string, int64, map[string]string) ([]*types.Workload, error)); ok { + return rf(ctx, appname, entrypoint, nodename, limit, labels) + } if rf, ok := ret.Get(0).(func(context.Context, string, string, string, int64, map[string]string) []*types.Workload); ok { r0 = rf(ctx, appname, entrypoint, nodename, limit, labels) } else { @@ -374,7 +417,6 @@ func (_m *Store) ListWorkloads(ctx context.Context, appname string, entrypoint s } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context, string, string, string, int64, map[string]string) error); ok { r1 = rf(ctx, appname, entrypoint, nodename, limit, labels) } else { @@ -419,6 +461,11 @@ func (_m *Store) RegisterService(_a0 context.Context, _a1 string, _a2 time.Durat ret := _m.Called(_a0, _a1, _a2) var r0 <-chan struct{} + var r1 func() + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string, time.Duration) (<-chan struct{}, func(), error)); ok { + return rf(_a0, _a1, _a2) + } if rf, ok := ret.Get(0).(func(context.Context, string, time.Duration) <-chan struct{}); ok { r0 = rf(_a0, _a1, _a2) } else { @@ -427,7 +474,6 @@ func (_m *Store) RegisterService(_a0 context.Context, _a1 string, _a2 time.Durat } } - var r1 func() if rf, ok := ret.Get(1).(func(context.Context, string, time.Duration) func()); ok { r1 = rf(_a0, _a1, _a2) } else { @@ -436,7 +482,6 @@ func (_m *Store) RegisterService(_a0 context.Context, _a1 string, _a2 time.Durat } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string, time.Duration) error); ok { r2 = rf(_a0, _a1, _a2) } else { @@ -493,6 +538,10 @@ func (_m *Store) ServiceStatusStream(_a0 context.Context) (chan []string, error) ret := _m.Called(_a0) var r0 chan []string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (chan []string, error)); ok { + return rf(_a0) + } if rf, ok := ret.Get(0).(func(context.Context) chan []string); ok { r0 = rf(_a0) } else { @@ -501,7 +550,6 @@ func (_m *Store) ServiceStatusStream(_a0 context.Context) (chan []string, error) } } - var r1 error if rf, ok := ret.Get(1).(func(context.Context) error); ok { r1 = rf(_a0) } else { @@ -544,6 +592,11 @@ func (_m *Store) StartEphemeral(ctx context.Context, path string, heartbeat time ret := _m.Called(ctx, path, heartbeat) var r0 <-chan struct{} + var r1 func() + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string, time.Duration) (<-chan struct{}, func(), error)); ok { + return rf(ctx, path, heartbeat) + } if rf, ok := ret.Get(0).(func(context.Context, string, time.Duration) <-chan struct{}); ok { r0 = rf(ctx, path, heartbeat) } else { @@ -552,7 +605,6 @@ func (_m *Store) StartEphemeral(ctx context.Context, path string, heartbeat time } } - var r1 func() if rf, ok := ret.Get(1).(func(context.Context, string, time.Duration) func()); ok { r1 = rf(ctx, path, heartbeat) } else { @@ -561,7 +613,6 @@ func (_m *Store) StartEphemeral(ctx context.Context, path string, heartbeat time } } - var r2 error if rf, ok := ret.Get(2).(func(context.Context, string, time.Duration) error); ok { r2 = rf(ctx, path, heartbeat) } else { @@ -635,3 +686,17 @@ func (_m *Store) WorkloadStatusStream(ctx context.Context, appname string, entry return r0 } + +// NewStore creates a new instance of Store. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func NewStore(t interface { + mock.TestingT + Cleanup(func()) +}) *Store { + mock := &Store{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} From ffa34d6941f767a0ea477ab284b885ffe76f68df Mon Sep 17 00:00:00 2001 From: hongji Date: Tue, 11 Jul 2023 10:34:30 +0800 Subject: [PATCH 20/29] delete debug code --- cluster/calcium/send_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cluster/calcium/send_test.go b/cluster/calcium/send_test.go index 7bef406cf..2d2fc95c5 100644 --- a/cluster/calcium/send_test.go +++ b/cluster/calcium/send_test.go @@ -16,10 +16,10 @@ import ( ) func TestSend(t *testing.T) { - panic("oh") c := NewTestCluster() ctx := context.Background() + // 这部分是在测试参数合法性 _, err := c.Send(ctx, &types.SendOptions{IDs: []string{}, Files: []types.LinuxFile{{Content: []byte("xxx")}}}) assert.Error(t, err) _, err = c.Send(ctx, &types.SendOptions{IDs: []string{"id"}}) From e6a60ba44b25a4ac6c807a21e2c462e1520139af Mon Sep 17 00:00:00 2001 From: hongji Date: Tue, 11 Jul 2023 16:15:50 +0800 Subject: [PATCH 21/29] add test for SendLarge in cluster --- cluster/calcium/send_test.go | 1 - cluster/calcium/sendlarge.go | 26 ++++++---- cluster/calcium/sendlarge_test.go | 86 +++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 12 deletions(-) create mode 100644 cluster/calcium/sendlarge_test.go diff --git a/cluster/calcium/send_test.go b/cluster/calcium/send_test.go index 2d2fc95c5..daf0a7745 100644 --- a/cluster/calcium/send_test.go +++ b/cluster/calcium/send_test.go @@ -81,5 +81,4 @@ func TestSend(t *testing.T) { assert.Equal(t, r.ID, "cid") assert.Equal(t, r.Path, "/tmp/1") } - t.Log("ceshi yixia") } diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index 856fe5038..159967903 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -2,12 +2,13 @@ package calcium import ( "context" + "io" + "sync" + "github.com/pkg/errors" "github.com/projecteru2/core/log" "github.com/projecteru2/core/types" "github.com/projecteru2/core/utils" - "io" - "sync" ) // SendLargeFile send large files by stream to workload @@ -17,17 +18,19 @@ func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeF utils.SentryGo(func() { defer close(resp) senders := make(map[string]*workloadSender) + // for each file for data := range opts { for _, id := range data.Ids { if _, ok := senders[id]; !ok { log.Debugf(ctx, "[SendLargeFile] create sender for %s", id) + // for each container, let's create a new sender to send identical file chunk, each chunk will include the metadata of this file sender := c.newWorkloadSender(ctx, id, resp, wg) senders[id] = sender } senders[id].send(data) } } - for _, sender := range senders{ + for _, sender := range senders { sender.close() } wg.Wait() @@ -37,19 +40,19 @@ func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeF type workloadSender struct { calcium *Calcium - id string - wg *sync.WaitGroup - buffer chan *types.SendLargeFileOptions - resp chan *types.SendMessage + id string + wg *sync.WaitGroup + buffer chan *types.SendLargeFileOptions + resp chan *types.SendMessage } func (c *Calcium) newWorkloadSender(ctx context.Context, ID string, resp chan *types.SendMessage, wg *sync.WaitGroup) *workloadSender { sender := &workloadSender{ calcium: c, - id: ID, - wg: wg, - buffer: make(chan *types.SendLargeFileOptions, 10), - resp: resp, + id: ID, + wg: wg, + buffer: make(chan *types.SendLargeFileOptions, 10), + resp: resp, } utils.SentryGo(func() { var writer *io.PipeWriter @@ -60,6 +63,7 @@ func (c *Calcium) newWorkloadSender(ctx context.Context, ID string, resp chan *t log.Errorf(ctx, "[newWorkloadExecutor] receive different files %s, %s", curFile, data.Dst) break } + // ready to send if curFile == "" { wg.Add(1) log.Debugf(ctx, "[newWorkloadExecutor]Receive new file %s to %s", curFile, sender.id) diff --git a/cluster/calcium/sendlarge_test.go b/cluster/calcium/sendlarge_test.go new file mode 100644 index 000000000..7f9730c21 --- /dev/null +++ b/cluster/calcium/sendlarge_test.go @@ -0,0 +1,86 @@ +package calcium + +import ( + "context" + "io/ioutil" + "os" + "testing" + + enginemocks "github.com/projecteru2/core/engine/mocks" + lockmocks "github.com/projecteru2/core/lock/mocks" + storemocks "github.com/projecteru2/core/store/mocks" + "github.com/projecteru2/core/types" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +func TestSendLarge(t *testing.T) { + c := NewTestCluster() + ctx := context.Background() + + tmpfile, err := ioutil.TempFile("", "example") + assert.NoError(t, err) + defer os.RemoveAll(tmpfile.Name()) + defer tmpfile.Close() + opts := &types.SendLargeFileOptions{ + Ids: []string{"cid"}, + Size: 1, + Dst: "/tmp/1", + Chunk: []byte{}, + } + optsChan := make(chan *types.SendLargeFileOptions) + store := &storemocks.Store{} + c.store = store + lock := &lockmocks.DistributedLock{} + lock.On("Lock", mock.Anything).Return(context.TODO(), nil) + lock.On("Unlock", mock.Anything).Return(nil) + store.On("CreateLock", mock.Anything, mock.Anything).Return(lock, nil) + store.On("GetWorkloads", mock.Anything, mock.Anything).Return(nil, types.ErrNoETCD).Once() + ch := c.SendLargeFile(ctx, optsChan) + go func() { + optsChan <- opts + close(optsChan) + }() + for r := range ch { + assert.Error(t, r.Error) + } + engine := &enginemocks.API{} + store.On("GetWorkloads", mock.Anything, mock.Anything).Return( + []*types.Workload{{ID: "cid", Engine: engine}}, nil, + ) + // failed by engine + content, _ := ioutil.ReadAll(tmpfile) + opts.Chunk = content + engine.On("VirtualizationCopyChunkTo", + mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything, + ).Return(types.ErrCannotGetEngine).Once() + optsChan = make(chan *types.SendLargeFileOptions) + ch = c.SendLargeFile(ctx, optsChan) + go func() { + optsChan <- opts + close(optsChan) + }() + for r := range ch { + t.Log(r.Error) + assert.Error(t, r.Error) + } + // success + engine.On("VirtualizationCopyChunkTo", + mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything, mock.Anything, + mock.Anything, mock.Anything, + ).Return(nil) + optsChan = make(chan *types.SendLargeFileOptions) + ch = c.SendLargeFile(ctx, optsChan) + go func() { + optsChan <- opts + close(optsChan) + }() + for r := range ch { + assert.Equal(t, r.ID, "cid") + assert.Equal(t, r.Path, "/tmp/1") + assert.NoError(t, r.Error) + } +} From ed1e04045b5a1567cafae7d34220172020f4a5b6 Mon Sep 17 00:00:00 2001 From: hongji Date: Tue, 11 Jul 2023 16:52:07 +0800 Subject: [PATCH 22/29] replace copychunk to copy in send --- cluster/calcium/send.go | 3 ++- cluster/calcium/send_test.go | 8 ++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/cluster/calcium/send.go b/cluster/calcium/send.go index 2cb5ef722..82f47810d 100644 --- a/cluster/calcium/send.go +++ b/cluster/calcium/send.go @@ -1,6 +1,7 @@ package calcium import ( + "bytes" "context" "sync" @@ -50,5 +51,5 @@ func (c *Calcium) Send(ctx context.Context, opts *types.SendOptions) (chan *type func (c *Calcium) doSendFileToWorkload(ctx context.Context, engine engine.API, ID string, file types.LinuxFile) error { log.Infof(ctx, "[doSendFileToWorkload] Send file to %s:%s", ID, file.Filename) - return errors.WithStack(engine.VirtualizationCopyTo(ctx, ID, file.Filename, file.Clone().Content, file.UID, file.GID, file.Mode)) + return errors.WithStack(engine.VirtualizationCopyChunkTo(ctx, ID, file.Filename, int64(len(file.Content)), bytes.NewReader(file.Clone().Content), file.UID, file.GID, file.Mode)) } diff --git a/cluster/calcium/send_test.go b/cluster/calcium/send_test.go index daf0a7745..7ce5e2e40 100644 --- a/cluster/calcium/send_test.go +++ b/cluster/calcium/send_test.go @@ -58,10 +58,10 @@ func TestSend(t *testing.T) { // failed by engine content, _ := ioutil.ReadAll(tmpfile) opts.Files[0].Content = content - engine.On("VirtualizationCopyTo", + engine.On("VirtualizationCopyChunkTo", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, - mock.Anything, + mock.Anything, mock.Anything, ).Return(types.ErrCannotGetEngine).Once() ch, err = c.Send(ctx, opts) assert.NoError(t, err) @@ -69,10 +69,10 @@ func TestSend(t *testing.T) { assert.Error(t, r.Error) } // success - engine.On("VirtualizationCopyTo", + engine.On("VirtualizationCopyChunkTo", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, - mock.Anything, + mock.Anything, mock.Anything, ).Return(nil) ch, err = c.Send(ctx, opts) assert.NoError(t, err) From 9e32ac413abbf7150172b9aea879024dbbafe743 Mon Sep 17 00:00:00 2001 From: hongji Date: Wed, 12 Jul 2023 23:54:20 +0800 Subject: [PATCH 23/29] let chunkSize as a const --- engine/docker/container.go | 4 +--- rpc/rpc.go | 2 +- rpc/transform.go | 2 +- types/options.go | 2 ++ 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/engine/docker/container.go b/engine/docker/container.go index c7d735d89..24548b134 100644 --- a/engine/docker/container.go +++ b/engine/docker/container.go @@ -299,8 +299,6 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin pr, pw := io.Pipe() tw := tar.NewWriter(pw) defer tw.Close() - const maxChunkSize = 2 << 10 - // todo 这里有点奇怪,之前带参数的匿名函数会随机报错,现在改成无参的函数后就不报错了,还没找到原因, 且之前的参数writer用的是interface utils.SentryGo(func() { hdr := &tar.Header{ Name: filepath.Base(target), @@ -314,7 +312,7 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin return } for { - data := make([]byte, maxChunkSize) + data := make([]byte, types.SendLargeFileChunkSize) n, err := content.Read(data) if err != nil { if err != io.EOF { diff --git a/rpc/rpc.go b/rpc/rpc.go index 3f963623e..5a8e8bf36 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -604,7 +604,7 @@ func (v *Vibranium) Send(opts *pb.SendOptions, stream pb.CoreRPC_SendServer) err } func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { - task := v.newTask(server.Context(), "Send", true) + task := v.newTask(server.Context(), "SendLargeFile", true) defer task.done() dc := make(chan *types.SendLargeFileOptions) diff --git a/rpc/transform.go b/rpc/transform.go index 23fcde6b5..5c8336247 100644 --- a/rpc/transform.go +++ b/rpc/transform.go @@ -597,7 +597,7 @@ func toSendLargeFileOptions(opts *pb.FileOptions) (*types.SendLargeFileOptions, } func toSendLargeFileChunks(file types.LinuxFile, ids []string) []*types.SendLargeFileOptions { - const maxChunkSize = 2 << 10 + maxChunkSize := types.SendLargeFileChunkSize ret := make([]*types.SendLargeFileOptions, 0) for idx := 0; idx < len(file.Content); idx += maxChunkSize { sendLargeFileOptions := &types.SendLargeFileOptions{ diff --git a/types/options.go b/types/options.go index 8502d301d..40e5fec9d 100644 --- a/types/options.go +++ b/types/options.go @@ -304,6 +304,8 @@ func (r RawArgs) LitterDump(w io.Writer) { w.Write(r) //nolint:errcheck } +const SendLargeFileChunkSize = 2 << 10 + // SendLargeFileOptions for LargeFileTransfer type SendLargeFileOptions struct { Ids []string From 924a9a8788d58af9e435b2668dddcc97f47212a5 Mon Sep 17 00:00:00 2001 From: hongji Date: Wed, 19 Jul 2023 16:38:41 +0800 Subject: [PATCH 24/29] bug fix: need to add waitgroup in the very beginning --- cluster/calcium/sendlarge.go | 6 +++--- rpc/rpc.go | 11 ++++++----- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index b787fa336..2162fea62 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -12,18 +12,19 @@ import ( ) // SendLargeFile send large files by stream to workload -func (c *Calcium) SendLargeFile(ctx context.Context, opts chan *types.SendLargeFileOptions) chan *types.SendMessage { +func (c *Calcium) SendLargeFile(ctx context.Context, inputChan chan *types.SendLargeFileOptions) chan *types.SendMessage { resp := make(chan *types.SendMessage) wg := &sync.WaitGroup{} utils.SentryGo(func() { defer close(resp) senders := make(map[string]*workloadSender) // for each file - for data := range opts { + for data := range inputChan { for _, id := range data.Ids { if _, ok := senders[id]; !ok { log.Debugf(ctx, "[SendLargeFile] create sender for %s", id) // for each container, let's create a new sender to send identical file chunk, each chunk will include the metadata of this file + wg.Add(1) sender := c.newWorkloadSender(ctx, id, resp, wg) senders[id] = sender } @@ -65,7 +66,6 @@ func (c *Calcium) newWorkloadSender(ctx context.Context, ID string, resp chan *t } // ready to send if curFile == "" { - wg.Add(1) log.Debugf(ctx, "[newWorkloadExecutor]Receive new file %s to %s", curFile, sender.id) curFile = data.Dst pr, pw := io.Pipe() diff --git a/rpc/rpc.go b/rpc/rpc.go index 5a8e8bf36..84e2bbe87 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -607,8 +607,8 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { task := v.newTask(server.Context(), "SendLargeFile", true) defer task.done() - dc := make(chan *types.SendLargeFileOptions) - ch := v.cluster.SendLargeFile(task.context, dc) + inputChan := make(chan *types.SendLargeFileOptions) + resp := v.cluster.SendLargeFile(task.context, inputChan) utils.SentryGo(func() { for { req, err := server.Recv() @@ -624,12 +624,13 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { log.Errorf(task.context, err, "[SendLargeFile]transform data err: %v", err) return } - dc <- data + inputChan <- data } - close(dc) + + close(inputChan) }) - for m := range ch { + for m := range resp { msg := &pb.SendMessage{ Id: m.ID, Path: m.Path, From 865e710a608a1969962f545da7a409119886b0f3 Mon Sep 17 00:00:00 2001 From: hongji Date: Wed, 19 Jul 2023 17:32:46 +0800 Subject: [PATCH 25/29] lint --- cluster/calcium/sendlarge.go | 9 ++++++--- engine/fake/fake.go | 2 +- engine/virt/virt.go | 2 +- rpc/transform.go | 8 ++++---- types/options.go | 6 +++--- 5 files changed, 15 insertions(+), 12 deletions(-) diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index 2162fea62..9c1586585 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -60,7 +60,6 @@ func (c *Calcium) newWorkloadSender(ctx context.Context, ID string, resp chan *t curFile := "" for data := range sender.buffer { if curFile != "" && curFile != data.Dst { - // todo 报错之后返回一下? log.Warnf(ctx, "[newWorkloadExecutor] receive different files %s, %s", curFile, data.Dst) break } @@ -81,9 +80,13 @@ func (c *Calcium) newWorkloadSender(ctx context.Context, ID string, resp chan *t resp <- &types.SendMessage{ID: ID, Error: err} } } - }(ID, curFile, data.Size, pr, data.Uid, data.Gid, data.Mode)) + }(ID, curFile, data.Size, pr, data.UID, data.GID, data.Mode)) + } + n, err := writer.Write(data.Chunk) + if err != nil || n != len(data.Chunk) { + log.Errorf(ctx, err, "[newWorkloadExecutor] send file to engine err, file = %s", curFile) + break } - writer.Write(data.Chunk) } writer.Close() }) diff --git a/engine/fake/fake.go b/engine/fake/fake.go index 3fb3e0120..76b597c7a 100644 --- a/engine/fake/fake.go +++ b/engine/fake/fake.go @@ -131,7 +131,7 @@ func (f *EngineWithErr) VirtualizationCopyTo(context.Context, string, string, [] } // VirtualizationCopyChunkTo . -func (f *EngineWithErr) VirtualizationCopyChunkTo(ctx context.Context, ID, target string, size int64, content io.Reader, uid, gid int, mode int64) error { +func (f *EngineWithErr) VirtualizationCopyChunkTo(context.Context, string, string, int64, io.Reader, int, int, int64) error { return f.DefaultErr } diff --git a/engine/virt/virt.go b/engine/virt/virt.go index 973de2118..878c68b7c 100644 --- a/engine/virt/virt.go +++ b/engine/virt/virt.go @@ -235,7 +235,7 @@ func (v *Virt) VirtualizationCopyTo(ctx context.Context, ID, dest string, conten } // VirtualizationCopyChunkTo copies one. -func (v *Virt) VirtualizationCopyChunkTo(ctx context.Context, ID, dest string, size int64, content io.Reader, uid, gid int, mode int64) error { +func (v *Virt) VirtualizationCopyChunkTo(ctx context.Context, ID, dest string, _ int64, content io.Reader, _, _ int, _ int64) error { return v.client.CopyToGuest(ctx, ID, dest, content, true, true) } diff --git a/rpc/transform.go b/rpc/transform.go index 5c8336247..ee7c34af2 100644 --- a/rpc/transform.go +++ b/rpc/transform.go @@ -588,8 +588,8 @@ func toSendLargeFileOptions(opts *pb.FileOptions) (*types.SendLargeFileOptions, Dst: opts.Dst, Size: opts.Size, Mode: opts.Mode.Mode, - Uid: int(opts.Owner.Uid), - Gid: int(opts.Owner.Gid), + UID: int(opts.Owner.Uid), + GID: int(opts.Owner.Gid), Chunk: opts.Chunk, } err := ret.Validate() @@ -605,8 +605,8 @@ func toSendLargeFileChunks(file types.LinuxFile, ids []string) []*types.SendLarg Dst: file.Filename, Size: int64(len(file.Content)), Mode: file.Mode, - Uid: file.UID, - Gid: file.GID, + UID: file.UID, + GID: file.GID, } if idx+maxChunkSize > len(file.Content) { sendLargeFileOptions.Chunk = file.Content[idx:] diff --git a/types/options.go b/types/options.go index 40e5fec9d..a4658a9de 100644 --- a/types/options.go +++ b/types/options.go @@ -312,8 +312,8 @@ type SendLargeFileOptions struct { Dst string Size int64 Mode int64 - Uid int - Gid int + UID int + GID int Chunk []byte } @@ -325,7 +325,7 @@ func (o *SendLargeFileOptions) Validate() error { if len(o.Chunk) == 0 { return ErrNoFilesToSend } - if o.Uid == 0 && o.Gid == 0 && o.Mode == 0 { + if o.UID == 0 && o.GID == 0 && o.Mode == 0 { // we see it as requiring "default perm" o.Mode = 0755 } From 436148149dd512810512b2c6ba10030d69767a30 Mon Sep 17 00:00:00 2001 From: hongji Date: Thu, 27 Jul 2023 10:20:23 +0800 Subject: [PATCH 26/29] use defer --- rpc/rpc.go | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/rpc/rpc.go b/rpc/rpc.go index 84e2bbe87..1ff9b4394 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -578,11 +578,11 @@ func (v *Vibranium) Send(opts *pb.SendOptions, stream pb.CoreRPC_SendServer) err dc := make(chan *types.SendLargeFileOptions) ch := v.cluster.SendLargeFile(task.context, dc) utils.SentryGo(func() { + defer close(dc) data := toSendLargeFileChunks(file, sendOpts.IDs) for _, chunk := range data { dc <- chunk } - close(dc) }) for m := range ch { @@ -590,11 +590,9 @@ func (v *Vibranium) Send(opts *pb.SendOptions, stream pb.CoreRPC_SendServer) err Id: m.ID, Path: m.Path, } - if m.Error != nil { msg.Error = m.Error.Error() } - if err := stream.Send(msg); err != nil { v.logUnsentMessages(task.context, "Send", err, m) } @@ -610,6 +608,7 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { inputChan := make(chan *types.SendLargeFileOptions) resp := v.cluster.SendLargeFile(task.context, inputChan) utils.SentryGo(func() { + defer close(inputChan) for { req, err := server.Recv() if err == io.EOF { @@ -626,8 +625,6 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { } inputChan <- data } - - close(inputChan) }) for m := range resp { @@ -635,11 +632,9 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { Id: m.ID, Path: m.Path, } - if m.Error != nil { msg.Error = m.Error.Error() } - if err := server.Send(msg); err != nil { v.logUnsentMessages(task.context, "SendLargeFile", err, m) } From be656de51ba9c8373b518731ff6b003eefae645e Mon Sep 17 00:00:00 2001 From: hongji Date: Thu, 17 Aug 2023 18:24:27 +0800 Subject: [PATCH 27/29] fix bug that cannot return err in goroutine --- engine/docker/container.go | 45 ++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/engine/docker/container.go b/engine/docker/container.go index 24548b134..93d9d72b4 100644 --- a/engine/docker/container.go +++ b/engine/docker/container.go @@ -20,6 +20,7 @@ import ( "github.com/docker/go-connections/nat" "github.com/docker/go-units" "github.com/mitchellh/mapstructure" + "golang.org/x/sync/errgroup" "github.com/projecteru2/core/engine" enginetypes "github.com/projecteru2/core/engine/types" @@ -27,7 +28,6 @@ import ( resourcetypes "github.com/projecteru2/core/resource/types" "github.com/projecteru2/core/types" coretypes "github.com/projecteru2/core/types" - "github.com/projecteru2/core/utils" ) const ( @@ -299,7 +299,8 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin pr, pw := io.Pipe() tw := tar.NewWriter(pw) defer tw.Close() - utils.SentryGo(func() { + g, _ := errgroup.WithContext(ctx) + g.Go(func() error { hdr := &tar.Header{ Name: filepath.Base(target), Size: size, @@ -307,42 +308,44 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin Uid: uid, Gid: gid, } - if err := tw.WriteHeader(hdr); err != nil { - log.Errorf(ctx, err, "[VirtualizationCopyChunkTo] write header to %s err, err: %v", ID, err) - return + if taskErr := tw.WriteHeader(hdr); taskErr != nil { + log.Errorf(ctx, taskErr, "[VirtualizationCopyChunkTo] write header to %s err, err: %v", ID, taskErr) + return taskErr } for { data := make([]byte, types.SendLargeFileChunkSize) - n, err := content.Read(data) - if err != nil { - if err != io.EOF { - log.Errorf(ctx, err, "[VirtualizationCopyChunkTo] read data from pipe err, err: %v", err) + n, taskErr := content.Read(data) + if taskErr != nil { + if taskErr != io.EOF { + log.Errorf(ctx, taskErr, "[VirtualizationCopyChunkTo] read data from pipe err, err: %v", taskErr) + return taskErr } - err := pw.Close() - if err != nil { - log.Errorf(ctx, err, "[VirtualizationCopyChunkTo] close pipe writer, err: %v", err) + taskErr := pw.Close() + if taskErr != nil { + log.Errorf(ctx, taskErr, "[VirtualizationCopyChunkTo] close pipe writer, err: %v", taskErr) } - return + return nil } if n < len(data) { data = data[:n] } - _, err = tw.Write(data) - if err != nil { - log.Debugf(ctx, "[VirtualizationCopyChunkTo] write data into %s err, err: %v", ID, err) - err := pw.Close() - if err != nil { - log.Errorf(ctx, err, "[VirtualizationCopyChunkTo] close pipe writer, err: %v", err) + _, taskErr = tw.Write(data) + if taskErr != nil { + log.Debugf(ctx, "[VirtualizationCopyChunkTo] write data into %s err, err: %v", ID, taskErr) + taskErr := pw.Close() + if taskErr != nil { + log.Errorf(ctx, taskErr, "[VirtualizationCopyChunkTo] close pipe writer, err: %v", taskErr) } - return + return taskErr } } }) err := e.client.CopyToContainer(ctx, ID, filepath.Dir(target), pr, dockertypes.CopyToContainerOptions{AllowOverwriteDirWithFile: true, CopyUIDGID: false}) if err != nil { log.Errorf(ctx, err, "[VirtualizationCopyChunkTo] copy %s to container %s err, err:%v", target, ID, err) + return err } - return err + return g.Wait() } // VirtualizationStart start virtualization From 583ad8738b851f890b08830c80ed0647fec702f5 Mon Sep 17 00:00:00 2001 From: hongji Date: Thu, 17 Aug 2023 18:36:07 +0800 Subject: [PATCH 28/29] use different err parameter in function --- engine/docker/container.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/engine/docker/container.go b/engine/docker/container.go index 93d9d72b4..c4ec45d5a 100644 --- a/engine/docker/container.go +++ b/engine/docker/container.go @@ -320,9 +320,10 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin log.Errorf(ctx, taskErr, "[VirtualizationCopyChunkTo] read data from pipe err, err: %v", taskErr) return taskErr } - taskErr := pw.Close() - if taskErr != nil { - log.Errorf(ctx, taskErr, "[VirtualizationCopyChunkTo] close pipe writer, err: %v", taskErr) + closeErr := pw.Close() + if closeErr != nil { + log.Errorf(ctx, closeErr, "[VirtualizationCopyChunkTo] close pipe writer, err: %v", closeErr) + return closeErr } return nil } @@ -332,9 +333,10 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin _, taskErr = tw.Write(data) if taskErr != nil { log.Debugf(ctx, "[VirtualizationCopyChunkTo] write data into %s err, err: %v", ID, taskErr) - taskErr := pw.Close() - if taskErr != nil { - log.Errorf(ctx, taskErr, "[VirtualizationCopyChunkTo] close pipe writer, err: %v", taskErr) + closeErr := pw.Close() + if closeErr != nil { + log.Errorf(ctx, closeErr, "[VirtualizationCopyChunkTo] close pipe writer, err: %v", closeErr) + return closeErr } return taskErr } From 2f650173bdce98e67ecbfbd7065f888828e0829e Mon Sep 17 00:00:00 2001 From: hongji Date: Tue, 29 Aug 2023 14:09:30 +0800 Subject: [PATCH 29/29] adjust the code for CR --- cluster/calcium/sendlarge.go | 2 ++ cluster/calcium/sendlarge_test.go | 2 +- engine/docker/container.go | 6 ++---- rpc/rpc.go | 8 ++++---- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/cluster/calcium/sendlarge.go b/cluster/calcium/sendlarge.go index 9c1586585..2a7c0091e 100644 --- a/cluster/calcium/sendlarge.go +++ b/cluster/calcium/sendlarge.go @@ -24,6 +24,8 @@ func (c *Calcium) SendLargeFile(ctx context.Context, inputChan chan *types.SendL if _, ok := senders[id]; !ok { log.Debugf(ctx, "[SendLargeFile] create sender for %s", id) // for each container, let's create a new sender to send identical file chunk, each chunk will include the metadata of this file + // we need to add `waitGroup out of the `newWorkloadSender` because we need to avoid `wg.Wait()` be executing before `wg.Add()`, + // which will cause the goroutine in `c.newWorkloadSender` to be killed. wg.Add(1) sender := c.newWorkloadSender(ctx, id, resp, wg) senders[id] = sender diff --git a/cluster/calcium/sendlarge_test.go b/cluster/calcium/sendlarge_test.go index 9f93b5d21..3549c73d6 100644 --- a/cluster/calcium/sendlarge_test.go +++ b/cluster/calcium/sendlarge_test.go @@ -18,7 +18,7 @@ func TestSendLarge(t *testing.T) { c := NewTestCluster() ctx := context.Background() - tmpfile, err := ioutil.TempFile("", "example") + tmpfile, err := os.CreateTemp("", "example") assert.NoError(t, err) defer os.RemoveAll(tmpfile.Name()) defer tmpfile.Close() diff --git a/engine/docker/container.go b/engine/docker/container.go index c4ec45d5a..98f5ee726 100644 --- a/engine/docker/container.go +++ b/engine/docker/container.go @@ -320,8 +320,7 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin log.Errorf(ctx, taskErr, "[VirtualizationCopyChunkTo] read data from pipe err, err: %v", taskErr) return taskErr } - closeErr := pw.Close() - if closeErr != nil { + if closeErr := pw.Close(); closeErr != nil { log.Errorf(ctx, closeErr, "[VirtualizationCopyChunkTo] close pipe writer, err: %v", closeErr) return closeErr } @@ -333,8 +332,7 @@ func (e *Engine) VirtualizationCopyChunkTo(ctx context.Context, ID, target strin _, taskErr = tw.Write(data) if taskErr != nil { log.Debugf(ctx, "[VirtualizationCopyChunkTo] write data into %s err, err: %v", ID, taskErr) - closeErr := pw.Close() - if closeErr != nil { + if closeErr := pw.Close(); closeErr != nil { log.Errorf(ctx, closeErr, "[VirtualizationCopyChunkTo] close pipe writer, err: %v", closeErr) return closeErr } diff --git a/rpc/rpc.go b/rpc/rpc.go index 1ff9b4394..f95b887ec 100644 --- a/rpc/rpc.go +++ b/rpc/rpc.go @@ -601,8 +601,8 @@ func (v *Vibranium) Send(opts *pb.SendOptions, stream pb.CoreRPC_SendServer) err return nil } -func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { - task := v.newTask(server.Context(), "SendLargeFile", true) +func (v *Vibranium) SendLargeFile(stream pb.CoreRPC_SendLargeFileServer) error { + task := v.newTask(stream.Context(), "SendLargeFile", true) defer task.done() inputChan := make(chan *types.SendLargeFileOptions) @@ -610,7 +610,7 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { utils.SentryGo(func() { defer close(inputChan) for { - req, err := server.Recv() + req, err := stream.Recv() if err == io.EOF { break } @@ -635,7 +635,7 @@ func (v *Vibranium) SendLargeFile(server pb.CoreRPC_SendLargeFileServer) error { if m.Error != nil { msg.Error = m.Error.Error() } - if err := server.Send(msg); err != nil { + if err := stream.Send(msg); err != nil { v.logUnsentMessages(task.context, "SendLargeFile", err, m) } }