diff --git a/.circleci/config.yml b/.circleci/config.yml index aa7aba6629..c45fb984d8 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -881,6 +881,9 @@ jobs: - run: "${KURTOSIS_BINPATH} files storeservice test-enclave test1 /usr/local/apache2/conf/httpd.conf --name stored-file" - run: "${KURTOSIS_BINPATH} files download test-enclave stored-file ." + # Service update + - run: "${KURTOSIS_BINPATH} service update test-enclave test1 --image httpd:2.4.63 --env 'update=test;where=ci' --ports http=80 --files '/root/somewhere:rendered-file|stored-file'" + # Check Dump Contains files - run: "${KURTOSIS_BINPATH} enclave dump test-enclave test-dump" - run: "ls test-dump/files/rendered-file" diff --git a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go index 06d347f927..8588c10a92 100644 --- a/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go +++ b/api/golang/core/kurtosis_core_rpc_api_bindings/api_container_service.pb.go @@ -527,6 +527,189 @@ func (x *Container) GetEnvVars() map[string]string { return nil } +type FilesArtifactsList struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + FilesArtifactsIdentifiers []string `protobuf:"bytes,1,rep,name=files_artifacts_identifiers,json=filesArtifactsIdentifiers,proto3" json:"files_artifacts_identifiers,omitempty"` +} + +func (x *FilesArtifactsList) Reset() { + *x = FilesArtifactsList{} + if protoimpl.UnsafeEnabled { + mi := &file_api_container_service_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *FilesArtifactsList) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*FilesArtifactsList) ProtoMessage() {} + +func (x *FilesArtifactsList) ProtoReflect() protoreflect.Message { + mi := &file_api_container_service_proto_msgTypes[2] + 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 FilesArtifactsList.ProtoReflect.Descriptor instead. +func (*FilesArtifactsList) Descriptor() ([]byte, []int) { + return file_api_container_service_proto_rawDescGZIP(), []int{2} +} + +func (x *FilesArtifactsList) GetFilesArtifactsIdentifiers() []string { + if x != nil { + return x.FilesArtifactsIdentifiers + } + return nil +} + +// Equivalent of user on ServiceConfig +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Uid uint32 `protobuf:"varint,1,opt,name=uid,proto3" json:"uid,omitempty"` + Gid uint32 `protobuf:"varint,2,opt,name=gid,proto3" json:"gid,omitempty"` +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_api_container_service_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_api_container_service_proto_msgTypes[3] + 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 User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_api_container_service_proto_rawDescGZIP(), []int{3} +} + +func (x *User) GetUid() uint32 { + if x != nil { + return x.Uid + } + return 0 +} + +func (x *User) GetGid() uint32 { + if x != nil { + return x.Gid + } + return 0 +} + +// Equivalent of tolerations on ServiceConfig +type Toleration struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + Operator string `protobuf:"bytes,2,opt,name=operator,proto3" json:"operator,omitempty"` + Value string `protobuf:"bytes,3,opt,name=value,proto3" json:"value,omitempty"` + Effect string `protobuf:"bytes,4,opt,name=effect,proto3" json:"effect,omitempty"` + TolerationSeconds int64 `protobuf:"varint,5,opt,name=toleration_seconds,json=tolerationSeconds,proto3" json:"toleration_seconds,omitempty"` +} + +func (x *Toleration) Reset() { + *x = Toleration{} + if protoimpl.UnsafeEnabled { + mi := &file_api_container_service_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Toleration) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Toleration) ProtoMessage() {} + +func (x *Toleration) ProtoReflect() protoreflect.Message { + mi := &file_api_container_service_proto_msgTypes[4] + 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 Toleration.ProtoReflect.Descriptor instead. +func (*Toleration) Descriptor() ([]byte, []int) { + return file_api_container_service_proto_rawDescGZIP(), []int{4} +} + +func (x *Toleration) GetKey() string { + if x != nil { + return x.Key + } + return "" +} + +func (x *Toleration) GetOperator() string { + if x != nil { + return x.Operator + } + return "" +} + +func (x *Toleration) GetValue() string { + if x != nil { + return x.Value + } + return "" +} + +func (x *Toleration) GetEffect() string { + if x != nil { + return x.Effect + } + return "" +} + +func (x *Toleration) GetTolerationSeconds() int64 { + if x != nil { + return x.TolerationSeconds + } + return 0 +} + type ServiceInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -556,12 +739,28 @@ type ServiceInfo struct { ServiceStatus ServiceStatus `protobuf:"varint,8,opt,name=service_status,json=serviceStatus,proto3,enum=api_container_api.ServiceStatus" json:"service_status,omitempty"` // Docker container or Kubernetes pod container Container *Container `protobuf:"bytes,9,opt,name=container,proto3" json:"container,omitempty"` + // Mapping of directory paths on service to names of files artifacts that are mounted to that directory + ServiceDirPathsToFilesArtifactsList map[string]*FilesArtifactsList `protobuf:"bytes,10,rep,name=service_dir_paths_to_files_artifacts_list,json=serviceDirPathsToFilesArtifactsList,proto3" json:"service_dir_paths_to_files_artifacts_list,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + MaxMillicpus uint32 `protobuf:"varint,11,opt,name=max_millicpus,json=maxMillicpus,proto3" json:"max_millicpus,omitempty"` + MinMillicpus uint32 `protobuf:"varint,12,opt,name=min_millicpus,json=minMillicpus,proto3" json:"min_millicpus,omitempty"` + MaxMemoryMegabytes uint32 `protobuf:"varint,13,opt,name=max_memory_megabytes,json=maxMemoryMegabytes,proto3" json:"max_memory_megabytes,omitempty"` + MinMemoryMegabytes uint32 `protobuf:"varint,14,opt,name=min_memory_megabytes,json=minMemoryMegabytes,proto3" json:"min_memory_megabytes,omitempty"` + // Optional user identity for the service + User *User `protobuf:"bytes,15,opt,name=user,proto3,oneof" json:"user,omitempty"` + // Optional list of Kubernetes tolerations + Tolerations []*Toleration `protobuf:"bytes,16,rep,name=tolerations,proto3" json:"tolerations,omitempty"` + // Optional node selectors for pod placement + NodeSelectors map[string]string `protobuf:"bytes,17,rep,name=node_selectors,json=nodeSelectors,proto3" json:"node_selectors,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Optional labels + Labels map[string]string `protobuf:"bytes,18,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + // Whether Tini is enabled + TiniEnabled *bool `protobuf:"varint,19,opt,name=tini_enabled,json=tiniEnabled,proto3,oneof" json:"tini_enabled,omitempty"` } func (x *ServiceInfo) Reset() { *x = ServiceInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[2] + mi := &file_api_container_service_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -574,7 +773,7 @@ func (x *ServiceInfo) String() string { func (*ServiceInfo) ProtoMessage() {} func (x *ServiceInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[2] + mi := &file_api_container_service_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -587,7 +786,7 @@ func (x *ServiceInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceInfo.ProtoReflect.Descriptor instead. func (*ServiceInfo) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{2} + return file_api_container_service_proto_rawDescGZIP(), []int{5} } func (x *ServiceInfo) GetServiceUuid() string { @@ -653,6 +852,76 @@ func (x *ServiceInfo) GetContainer() *Container { return nil } +func (x *ServiceInfo) GetServiceDirPathsToFilesArtifactsList() map[string]*FilesArtifactsList { + if x != nil { + return x.ServiceDirPathsToFilesArtifactsList + } + return nil +} + +func (x *ServiceInfo) GetMaxMillicpus() uint32 { + if x != nil { + return x.MaxMillicpus + } + return 0 +} + +func (x *ServiceInfo) GetMinMillicpus() uint32 { + if x != nil { + return x.MinMillicpus + } + return 0 +} + +func (x *ServiceInfo) GetMaxMemoryMegabytes() uint32 { + if x != nil { + return x.MaxMemoryMegabytes + } + return 0 +} + +func (x *ServiceInfo) GetMinMemoryMegabytes() uint32 { + if x != nil { + return x.MinMemoryMegabytes + } + return 0 +} + +func (x *ServiceInfo) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +func (x *ServiceInfo) GetTolerations() []*Toleration { + if x != nil { + return x.Tolerations + } + return nil +} + +func (x *ServiceInfo) GetNodeSelectors() map[string]string { + if x != nil { + return x.NodeSelectors + } + return nil +} + +func (x *ServiceInfo) GetLabels() map[string]string { + if x != nil { + return x.Labels + } + return nil +} + +func (x *ServiceInfo) GetTiniEnabled() bool { + if x != nil && x.TiniEnabled != nil { + return *x.TiniEnabled + } + return false +} + type RunStarlarkScriptArgs struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -680,7 +949,7 @@ type RunStarlarkScriptArgs struct { func (x *RunStarlarkScriptArgs) Reset() { *x = RunStarlarkScriptArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[3] + mi := &file_api_container_service_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -693,7 +962,7 @@ func (x *RunStarlarkScriptArgs) String() string { func (*RunStarlarkScriptArgs) ProtoMessage() {} func (x *RunStarlarkScriptArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[3] + mi := &file_api_container_service_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -706,7 +975,7 @@ func (x *RunStarlarkScriptArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use RunStarlarkScriptArgs.ProtoReflect.Descriptor instead. func (*RunStarlarkScriptArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{3} + return file_api_container_service_proto_rawDescGZIP(), []int{6} } func (x *RunStarlarkScriptArgs) GetSerializedScript() string { @@ -828,7 +1097,7 @@ type RunStarlarkPackageArgs struct { func (x *RunStarlarkPackageArgs) Reset() { *x = RunStarlarkPackageArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[4] + mi := &file_api_container_service_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -841,7 +1110,7 @@ func (x *RunStarlarkPackageArgs) String() string { func (*RunStarlarkPackageArgs) ProtoMessage() {} func (x *RunStarlarkPackageArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[4] + mi := &file_api_container_service_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -854,7 +1123,7 @@ func (x *RunStarlarkPackageArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use RunStarlarkPackageArgs.ProtoReflect.Descriptor instead. func (*RunStarlarkPackageArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{4} + return file_api_container_service_proto_rawDescGZIP(), []int{7} } func (x *RunStarlarkPackageArgs) GetPackageId() string { @@ -1010,7 +1279,7 @@ type StarlarkRunResponseLine struct { func (x *StarlarkRunResponseLine) Reset() { *x = StarlarkRunResponseLine{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[5] + mi := &file_api_container_service_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1023,7 +1292,7 @@ func (x *StarlarkRunResponseLine) String() string { func (*StarlarkRunResponseLine) ProtoMessage() {} func (x *StarlarkRunResponseLine) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[5] + mi := &file_api_container_service_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1036,7 +1305,7 @@ func (x *StarlarkRunResponseLine) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkRunResponseLine.ProtoReflect.Descriptor instead. func (*StarlarkRunResponseLine) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{5} + return file_api_container_service_proto_rawDescGZIP(), []int{8} } func (m *StarlarkRunResponseLine) GetRunResponseLine() isStarlarkRunResponseLine_RunResponseLine { @@ -1152,7 +1421,7 @@ type StarlarkInfo struct { func (x *StarlarkInfo) Reset() { *x = StarlarkInfo{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[6] + mi := &file_api_container_service_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1165,7 +1434,7 @@ func (x *StarlarkInfo) String() string { func (*StarlarkInfo) ProtoMessage() {} func (x *StarlarkInfo) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[6] + mi := &file_api_container_service_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1178,7 +1447,7 @@ func (x *StarlarkInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInfo.ProtoReflect.Descriptor instead. func (*StarlarkInfo) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{6} + return file_api_container_service_proto_rawDescGZIP(), []int{9} } func (x *StarlarkInfo) GetInfoMessage() string { @@ -1199,7 +1468,7 @@ type StarlarkWarning struct { func (x *StarlarkWarning) Reset() { *x = StarlarkWarning{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[7] + mi := &file_api_container_service_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1212,7 +1481,7 @@ func (x *StarlarkWarning) String() string { func (*StarlarkWarning) ProtoMessage() {} func (x *StarlarkWarning) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[7] + mi := &file_api_container_service_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1225,7 +1494,7 @@ func (x *StarlarkWarning) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkWarning.ProtoReflect.Descriptor instead. func (*StarlarkWarning) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{7} + return file_api_container_service_proto_rawDescGZIP(), []int{10} } func (x *StarlarkWarning) GetWarningMessage() string { @@ -1251,7 +1520,7 @@ type StarlarkInstruction struct { func (x *StarlarkInstruction) Reset() { *x = StarlarkInstruction{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[8] + mi := &file_api_container_service_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1264,7 +1533,7 @@ func (x *StarlarkInstruction) String() string { func (*StarlarkInstruction) ProtoMessage() {} func (x *StarlarkInstruction) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[8] + mi := &file_api_container_service_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1277,7 +1546,7 @@ func (x *StarlarkInstruction) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInstruction.ProtoReflect.Descriptor instead. func (*StarlarkInstruction) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{8} + return file_api_container_service_proto_rawDescGZIP(), []int{11} } func (x *StarlarkInstruction) GetPosition() *StarlarkInstructionPosition { @@ -1333,7 +1602,7 @@ type StarlarkInstructionResult struct { func (x *StarlarkInstructionResult) Reset() { *x = StarlarkInstructionResult{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[9] + mi := &file_api_container_service_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1346,7 +1615,7 @@ func (x *StarlarkInstructionResult) String() string { func (*StarlarkInstructionResult) ProtoMessage() {} func (x *StarlarkInstructionResult) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[9] + mi := &file_api_container_service_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1359,7 +1628,7 @@ func (x *StarlarkInstructionResult) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInstructionResult.ProtoReflect.Descriptor instead. func (*StarlarkInstructionResult) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{9} + return file_api_container_service_proto_rawDescGZIP(), []int{12} } func (x *StarlarkInstructionResult) GetSerializedInstructionResult() string { @@ -1382,7 +1651,7 @@ type StarlarkInstructionArg struct { func (x *StarlarkInstructionArg) Reset() { *x = StarlarkInstructionArg{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[10] + mi := &file_api_container_service_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1395,7 +1664,7 @@ func (x *StarlarkInstructionArg) String() string { func (*StarlarkInstructionArg) ProtoMessage() {} func (x *StarlarkInstructionArg) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[10] + mi := &file_api_container_service_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1408,7 +1677,7 @@ func (x *StarlarkInstructionArg) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInstructionArg.ProtoReflect.Descriptor instead. func (*StarlarkInstructionArg) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{10} + return file_api_container_service_proto_rawDescGZIP(), []int{13} } func (x *StarlarkInstructionArg) GetSerializedArgValue() string { @@ -1445,7 +1714,7 @@ type StarlarkInstructionPosition struct { func (x *StarlarkInstructionPosition) Reset() { *x = StarlarkInstructionPosition{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[11] + mi := &file_api_container_service_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1458,7 +1727,7 @@ func (x *StarlarkInstructionPosition) String() string { func (*StarlarkInstructionPosition) ProtoMessage() {} func (x *StarlarkInstructionPosition) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[11] + mi := &file_api_container_service_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1471,7 +1740,7 @@ func (x *StarlarkInstructionPosition) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInstructionPosition.ProtoReflect.Descriptor instead. func (*StarlarkInstructionPosition) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{11} + return file_api_container_service_proto_rawDescGZIP(), []int{14} } func (x *StarlarkInstructionPosition) GetFilename() string { @@ -1511,7 +1780,7 @@ type StarlarkError struct { func (x *StarlarkError) Reset() { *x = StarlarkError{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[12] + mi := &file_api_container_service_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1524,7 +1793,7 @@ func (x *StarlarkError) String() string { func (*StarlarkError) ProtoMessage() {} func (x *StarlarkError) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[12] + mi := &file_api_container_service_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1537,7 +1806,7 @@ func (x *StarlarkError) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkError.ProtoReflect.Descriptor instead. func (*StarlarkError) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{12} + return file_api_container_service_proto_rawDescGZIP(), []int{15} } func (m *StarlarkError) GetError() isStarlarkError_Error { @@ -1601,7 +1870,7 @@ type StarlarkInterpretationError struct { func (x *StarlarkInterpretationError) Reset() { *x = StarlarkInterpretationError{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[13] + mi := &file_api_container_service_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1614,7 +1883,7 @@ func (x *StarlarkInterpretationError) String() string { func (*StarlarkInterpretationError) ProtoMessage() {} func (x *StarlarkInterpretationError) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[13] + mi := &file_api_container_service_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1627,7 +1896,7 @@ func (x *StarlarkInterpretationError) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkInterpretationError.ProtoReflect.Descriptor instead. func (*StarlarkInterpretationError) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{13} + return file_api_container_service_proto_rawDescGZIP(), []int{16} } func (x *StarlarkInterpretationError) GetErrorMessage() string { @@ -1648,7 +1917,7 @@ type StarlarkValidationError struct { func (x *StarlarkValidationError) Reset() { *x = StarlarkValidationError{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[14] + mi := &file_api_container_service_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1661,7 +1930,7 @@ func (x *StarlarkValidationError) String() string { func (*StarlarkValidationError) ProtoMessage() {} func (x *StarlarkValidationError) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[14] + mi := &file_api_container_service_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1674,7 +1943,7 @@ func (x *StarlarkValidationError) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkValidationError.ProtoReflect.Descriptor instead. func (*StarlarkValidationError) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{14} + return file_api_container_service_proto_rawDescGZIP(), []int{17} } func (x *StarlarkValidationError) GetErrorMessage() string { @@ -1695,7 +1964,7 @@ type StarlarkExecutionError struct { func (x *StarlarkExecutionError) Reset() { *x = StarlarkExecutionError{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[15] + mi := &file_api_container_service_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1708,7 +1977,7 @@ func (x *StarlarkExecutionError) String() string { func (*StarlarkExecutionError) ProtoMessage() {} func (x *StarlarkExecutionError) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[15] + mi := &file_api_container_service_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1721,7 +1990,7 @@ func (x *StarlarkExecutionError) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkExecutionError.ProtoReflect.Descriptor instead. func (*StarlarkExecutionError) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{15} + return file_api_container_service_proto_rawDescGZIP(), []int{18} } func (x *StarlarkExecutionError) GetErrorMessage() string { @@ -1744,7 +2013,7 @@ type StarlarkRunProgress struct { func (x *StarlarkRunProgress) Reset() { *x = StarlarkRunProgress{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[16] + mi := &file_api_container_service_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1757,7 +2026,7 @@ func (x *StarlarkRunProgress) String() string { func (*StarlarkRunProgress) ProtoMessage() {} func (x *StarlarkRunProgress) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[16] + mi := &file_api_container_service_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1770,7 +2039,7 @@ func (x *StarlarkRunProgress) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkRunProgress.ProtoReflect.Descriptor instead. func (*StarlarkRunProgress) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{16} + return file_api_container_service_proto_rawDescGZIP(), []int{19} } func (x *StarlarkRunProgress) GetCurrentStepInfo() []string { @@ -1806,7 +2075,7 @@ type StarlarkRunFinishedEvent struct { func (x *StarlarkRunFinishedEvent) Reset() { *x = StarlarkRunFinishedEvent{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[17] + mi := &file_api_container_service_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1819,7 +2088,7 @@ func (x *StarlarkRunFinishedEvent) String() string { func (*StarlarkRunFinishedEvent) ProtoMessage() {} func (x *StarlarkRunFinishedEvent) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[17] + mi := &file_api_container_service_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1832,7 +2101,7 @@ func (x *StarlarkRunFinishedEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkRunFinishedEvent.ProtoReflect.Descriptor instead. func (*StarlarkRunFinishedEvent) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{17} + return file_api_container_service_proto_rawDescGZIP(), []int{20} } func (x *StarlarkRunFinishedEvent) GetIsRunSuccessful() bool { @@ -1867,7 +2136,7 @@ type GetServicesArgs struct { func (x *GetServicesArgs) Reset() { *x = GetServicesArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[18] + mi := &file_api_container_service_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1880,7 +2149,7 @@ func (x *GetServicesArgs) String() string { func (*GetServicesArgs) ProtoMessage() {} func (x *GetServicesArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[18] + mi := &file_api_container_service_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1893,7 +2162,7 @@ func (x *GetServicesArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use GetServicesArgs.ProtoReflect.Descriptor instead. func (*GetServicesArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{18} + return file_api_container_service_proto_rawDescGZIP(), []int{21} } func (x *GetServicesArgs) GetServiceIdentifiers() map[string]bool { @@ -1915,7 +2184,7 @@ type GetServicesResponse struct { func (x *GetServicesResponse) Reset() { *x = GetServicesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[19] + mi := &file_api_container_service_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1928,7 +2197,7 @@ func (x *GetServicesResponse) String() string { func (*GetServicesResponse) ProtoMessage() {} func (x *GetServicesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[19] + mi := &file_api_container_service_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1941,7 +2210,7 @@ func (x *GetServicesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetServicesResponse.ProtoReflect.Descriptor instead. func (*GetServicesResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{19} + return file_api_container_service_proto_rawDescGZIP(), []int{22} } func (x *GetServicesResponse) GetServiceInfo() map[string]*ServiceInfo { @@ -1968,7 +2237,7 @@ type ServiceIdentifiers struct { func (x *ServiceIdentifiers) Reset() { *x = ServiceIdentifiers{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[20] + mi := &file_api_container_service_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1981,7 +2250,7 @@ func (x *ServiceIdentifiers) String() string { func (*ServiceIdentifiers) ProtoMessage() {} func (x *ServiceIdentifiers) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[20] + mi := &file_api_container_service_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1994,7 +2263,7 @@ func (x *ServiceIdentifiers) ProtoReflect() protoreflect.Message { // Deprecated: Use ServiceIdentifiers.ProtoReflect.Descriptor instead. func (*ServiceIdentifiers) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{20} + return file_api_container_service_proto_rawDescGZIP(), []int{23} } func (x *ServiceIdentifiers) GetServiceUuid() string { @@ -2029,7 +2298,7 @@ type GetExistingAndHistoricalServiceIdentifiersResponse struct { func (x *GetExistingAndHistoricalServiceIdentifiersResponse) Reset() { *x = GetExistingAndHistoricalServiceIdentifiersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[21] + mi := &file_api_container_service_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2042,7 +2311,7 @@ func (x *GetExistingAndHistoricalServiceIdentifiersResponse) String() string { func (*GetExistingAndHistoricalServiceIdentifiersResponse) ProtoMessage() {} func (x *GetExistingAndHistoricalServiceIdentifiersResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[21] + mi := &file_api_container_service_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2055,7 +2324,7 @@ func (x *GetExistingAndHistoricalServiceIdentifiersResponse) ProtoReflect() prot // Deprecated: Use GetExistingAndHistoricalServiceIdentifiersResponse.ProtoReflect.Descriptor instead. func (*GetExistingAndHistoricalServiceIdentifiersResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{21} + return file_api_container_service_proto_rawDescGZIP(), []int{24} } func (x *GetExistingAndHistoricalServiceIdentifiersResponse) GetAllIdentifiers() []*ServiceIdentifiers { @@ -2083,7 +2352,7 @@ type ExecCommandArgs struct { func (x *ExecCommandArgs) Reset() { *x = ExecCommandArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[22] + mi := &file_api_container_service_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2096,7 +2365,7 @@ func (x *ExecCommandArgs) String() string { func (*ExecCommandArgs) ProtoMessage() {} func (x *ExecCommandArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[22] + mi := &file_api_container_service_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2109,7 +2378,7 @@ func (x *ExecCommandArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecCommandArgs.ProtoReflect.Descriptor instead. func (*ExecCommandArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{22} + return file_api_container_service_proto_rawDescGZIP(), []int{25} } func (x *ExecCommandArgs) GetServiceIdentifier() string { @@ -2139,7 +2408,7 @@ type ExecCommandResponse struct { func (x *ExecCommandResponse) Reset() { *x = ExecCommandResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[23] + mi := &file_api_container_service_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2152,7 +2421,7 @@ func (x *ExecCommandResponse) String() string { func (*ExecCommandResponse) ProtoMessage() {} func (x *ExecCommandResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[23] + mi := &file_api_container_service_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2165,7 +2434,7 @@ func (x *ExecCommandResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExecCommandResponse.ProtoReflect.Descriptor instead. func (*ExecCommandResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{23} + return file_api_container_service_proto_rawDescGZIP(), []int{26} } func (x *ExecCommandResponse) GetExitCode() int32 { @@ -2211,7 +2480,7 @@ type WaitForHttpGetEndpointAvailabilityArgs struct { func (x *WaitForHttpGetEndpointAvailabilityArgs) Reset() { *x = WaitForHttpGetEndpointAvailabilityArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[24] + mi := &file_api_container_service_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2224,7 +2493,7 @@ func (x *WaitForHttpGetEndpointAvailabilityArgs) String() string { func (*WaitForHttpGetEndpointAvailabilityArgs) ProtoMessage() {} func (x *WaitForHttpGetEndpointAvailabilityArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[24] + mi := &file_api_container_service_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2237,7 +2506,7 @@ func (x *WaitForHttpGetEndpointAvailabilityArgs) ProtoReflect() protoreflect.Mes // Deprecated: Use WaitForHttpGetEndpointAvailabilityArgs.ProtoReflect.Descriptor instead. func (*WaitForHttpGetEndpointAvailabilityArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{24} + return file_api_container_service_proto_rawDescGZIP(), []int{27} } func (x *WaitForHttpGetEndpointAvailabilityArgs) GetServiceIdentifier() string { @@ -2320,7 +2589,7 @@ type WaitForHttpPostEndpointAvailabilityArgs struct { func (x *WaitForHttpPostEndpointAvailabilityArgs) Reset() { *x = WaitForHttpPostEndpointAvailabilityArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[25] + mi := &file_api_container_service_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2333,7 +2602,7 @@ func (x *WaitForHttpPostEndpointAvailabilityArgs) String() string { func (*WaitForHttpPostEndpointAvailabilityArgs) ProtoMessage() {} func (x *WaitForHttpPostEndpointAvailabilityArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[25] + mi := &file_api_container_service_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2346,7 +2615,7 @@ func (x *WaitForHttpPostEndpointAvailabilityArgs) ProtoReflect() protoreflect.Me // Deprecated: Use WaitForHttpPostEndpointAvailabilityArgs.ProtoReflect.Descriptor instead. func (*WaitForHttpPostEndpointAvailabilityArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{25} + return file_api_container_service_proto_rawDescGZIP(), []int{28} } func (x *WaitForHttpPostEndpointAvailabilityArgs) GetServiceIdentifier() string { @@ -2428,7 +2697,7 @@ type StreamedDataChunk struct { func (x *StreamedDataChunk) Reset() { *x = StreamedDataChunk{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[26] + mi := &file_api_container_service_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2441,7 +2710,7 @@ func (x *StreamedDataChunk) String() string { func (*StreamedDataChunk) ProtoMessage() {} func (x *StreamedDataChunk) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[26] + mi := &file_api_container_service_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2454,7 +2723,7 @@ func (x *StreamedDataChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use StreamedDataChunk.ProtoReflect.Descriptor instead. func (*StreamedDataChunk) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{26} + return file_api_container_service_proto_rawDescGZIP(), []int{29} } func (x *StreamedDataChunk) GetData() []byte { @@ -2489,7 +2758,7 @@ type DataChunkMetadata struct { func (x *DataChunkMetadata) Reset() { *x = DataChunkMetadata{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[27] + mi := &file_api_container_service_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2502,7 +2771,7 @@ func (x *DataChunkMetadata) String() string { func (*DataChunkMetadata) ProtoMessage() {} func (x *DataChunkMetadata) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[27] + mi := &file_api_container_service_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2515,7 +2784,7 @@ func (x *DataChunkMetadata) ProtoReflect() protoreflect.Message { // Deprecated: Use DataChunkMetadata.ProtoReflect.Descriptor instead. func (*DataChunkMetadata) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{27} + return file_api_container_service_proto_rawDescGZIP(), []int{30} } func (x *DataChunkMetadata) GetName() string { @@ -2544,7 +2813,7 @@ type UploadFilesArtifactResponse struct { func (x *UploadFilesArtifactResponse) Reset() { *x = UploadFilesArtifactResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[28] + mi := &file_api_container_service_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2557,7 +2826,7 @@ func (x *UploadFilesArtifactResponse) String() string { func (*UploadFilesArtifactResponse) ProtoMessage() {} func (x *UploadFilesArtifactResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[28] + mi := &file_api_container_service_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2570,7 +2839,7 @@ func (x *UploadFilesArtifactResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UploadFilesArtifactResponse.ProtoReflect.Descriptor instead. func (*UploadFilesArtifactResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{28} + return file_api_container_service_proto_rawDescGZIP(), []int{31} } func (x *UploadFilesArtifactResponse) GetUuid() string { @@ -2604,7 +2873,7 @@ type DownloadFilesArtifactArgs struct { func (x *DownloadFilesArtifactArgs) Reset() { *x = DownloadFilesArtifactArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[29] + mi := &file_api_container_service_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2617,7 +2886,7 @@ func (x *DownloadFilesArtifactArgs) String() string { func (*DownloadFilesArtifactArgs) ProtoMessage() {} func (x *DownloadFilesArtifactArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[29] + mi := &file_api_container_service_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2630,7 +2899,7 @@ func (x *DownloadFilesArtifactArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use DownloadFilesArtifactArgs.ProtoReflect.Descriptor instead. func (*DownloadFilesArtifactArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{29} + return file_api_container_service_proto_rawDescGZIP(), []int{32} } func (x *DownloadFilesArtifactArgs) GetIdentifier() string { @@ -2659,7 +2928,7 @@ type StoreWebFilesArtifactArgs struct { func (x *StoreWebFilesArtifactArgs) Reset() { *x = StoreWebFilesArtifactArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[30] + mi := &file_api_container_service_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2672,7 +2941,7 @@ func (x *StoreWebFilesArtifactArgs) String() string { func (*StoreWebFilesArtifactArgs) ProtoMessage() {} func (x *StoreWebFilesArtifactArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[30] + mi := &file_api_container_service_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2685,7 +2954,7 @@ func (x *StoreWebFilesArtifactArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use StoreWebFilesArtifactArgs.ProtoReflect.Descriptor instead. func (*StoreWebFilesArtifactArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{30} + return file_api_container_service_proto_rawDescGZIP(), []int{33} } func (x *StoreWebFilesArtifactArgs) GetUrl() string { @@ -2714,7 +2983,7 @@ type StoreWebFilesArtifactResponse struct { func (x *StoreWebFilesArtifactResponse) Reset() { *x = StoreWebFilesArtifactResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[31] + mi := &file_api_container_service_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2727,7 +2996,7 @@ func (x *StoreWebFilesArtifactResponse) String() string { func (*StoreWebFilesArtifactResponse) ProtoMessage() {} func (x *StoreWebFilesArtifactResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[31] + mi := &file_api_container_service_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2740,7 +3009,7 @@ func (x *StoreWebFilesArtifactResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StoreWebFilesArtifactResponse.ProtoReflect.Descriptor instead. func (*StoreWebFilesArtifactResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{31} + return file_api_container_service_proto_rawDescGZIP(), []int{34} } func (x *StoreWebFilesArtifactResponse) GetUuid() string { @@ -2766,7 +3035,7 @@ type StoreFilesArtifactFromServiceArgs struct { func (x *StoreFilesArtifactFromServiceArgs) Reset() { *x = StoreFilesArtifactFromServiceArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[32] + mi := &file_api_container_service_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2779,7 +3048,7 @@ func (x *StoreFilesArtifactFromServiceArgs) String() string { func (*StoreFilesArtifactFromServiceArgs) ProtoMessage() {} func (x *StoreFilesArtifactFromServiceArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[32] + mi := &file_api_container_service_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2792,7 +3061,7 @@ func (x *StoreFilesArtifactFromServiceArgs) ProtoReflect() protoreflect.Message // Deprecated: Use StoreFilesArtifactFromServiceArgs.ProtoReflect.Descriptor instead. func (*StoreFilesArtifactFromServiceArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{32} + return file_api_container_service_proto_rawDescGZIP(), []int{35} } func (x *StoreFilesArtifactFromServiceArgs) GetServiceIdentifier() string { @@ -2828,7 +3097,7 @@ type StoreFilesArtifactFromServiceResponse struct { func (x *StoreFilesArtifactFromServiceResponse) Reset() { *x = StoreFilesArtifactFromServiceResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[33] + mi := &file_api_container_service_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2841,7 +3110,7 @@ func (x *StoreFilesArtifactFromServiceResponse) String() string { func (*StoreFilesArtifactFromServiceResponse) ProtoMessage() {} func (x *StoreFilesArtifactFromServiceResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[33] + mi := &file_api_container_service_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2854,7 +3123,7 @@ func (x *StoreFilesArtifactFromServiceResponse) ProtoReflect() protoreflect.Mess // Deprecated: Use StoreFilesArtifactFromServiceResponse.ProtoReflect.Descriptor instead. func (*StoreFilesArtifactFromServiceResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{33} + return file_api_container_service_proto_rawDescGZIP(), []int{36} } func (x *StoreFilesArtifactFromServiceResponse) GetUuid() string { @@ -2878,7 +3147,7 @@ type FilesArtifactNameAndUuid struct { func (x *FilesArtifactNameAndUuid) Reset() { *x = FilesArtifactNameAndUuid{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[34] + mi := &file_api_container_service_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2891,7 +3160,7 @@ func (x *FilesArtifactNameAndUuid) String() string { func (*FilesArtifactNameAndUuid) ProtoMessage() {} func (x *FilesArtifactNameAndUuid) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[34] + mi := &file_api_container_service_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2904,7 +3173,7 @@ func (x *FilesArtifactNameAndUuid) ProtoReflect() protoreflect.Message { // Deprecated: Use FilesArtifactNameAndUuid.ProtoReflect.Descriptor instead. func (*FilesArtifactNameAndUuid) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{34} + return file_api_container_service_proto_rawDescGZIP(), []int{37} } func (x *FilesArtifactNameAndUuid) GetFileName() string { @@ -2932,7 +3201,7 @@ type ListFilesArtifactNamesAndUuidsResponse struct { func (x *ListFilesArtifactNamesAndUuidsResponse) Reset() { *x = ListFilesArtifactNamesAndUuidsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[35] + mi := &file_api_container_service_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2945,7 +3214,7 @@ func (x *ListFilesArtifactNamesAndUuidsResponse) String() string { func (*ListFilesArtifactNamesAndUuidsResponse) ProtoMessage() {} func (x *ListFilesArtifactNamesAndUuidsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[35] + mi := &file_api_container_service_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2958,7 +3227,7 @@ func (x *ListFilesArtifactNamesAndUuidsResponse) ProtoReflect() protoreflect.Mes // Deprecated: Use ListFilesArtifactNamesAndUuidsResponse.ProtoReflect.Descriptor instead. func (*ListFilesArtifactNamesAndUuidsResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{35} + return file_api_container_service_proto_rawDescGZIP(), []int{38} } func (x *ListFilesArtifactNamesAndUuidsResponse) GetFileNamesAndUuids() []*FilesArtifactNameAndUuid { @@ -2979,7 +3248,7 @@ type InspectFilesArtifactContentsRequest struct { func (x *InspectFilesArtifactContentsRequest) Reset() { *x = InspectFilesArtifactContentsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[36] + mi := &file_api_container_service_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2992,7 +3261,7 @@ func (x *InspectFilesArtifactContentsRequest) String() string { func (*InspectFilesArtifactContentsRequest) ProtoMessage() {} func (x *InspectFilesArtifactContentsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[36] + mi := &file_api_container_service_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3005,7 +3274,7 @@ func (x *InspectFilesArtifactContentsRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use InspectFilesArtifactContentsRequest.ProtoReflect.Descriptor instead. func (*InspectFilesArtifactContentsRequest) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{36} + return file_api_container_service_proto_rawDescGZIP(), []int{39} } func (x *InspectFilesArtifactContentsRequest) GetFileNamesAndUuid() *FilesArtifactNameAndUuid { @@ -3026,7 +3295,7 @@ type InspectFilesArtifactContentsResponse struct { func (x *InspectFilesArtifactContentsResponse) Reset() { *x = InspectFilesArtifactContentsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[37] + mi := &file_api_container_service_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3039,7 +3308,7 @@ func (x *InspectFilesArtifactContentsResponse) String() string { func (*InspectFilesArtifactContentsResponse) ProtoMessage() {} func (x *InspectFilesArtifactContentsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[37] + mi := &file_api_container_service_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3052,7 +3321,7 @@ func (x *InspectFilesArtifactContentsResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use InspectFilesArtifactContentsResponse.ProtoReflect.Descriptor instead. func (*InspectFilesArtifactContentsResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{37} + return file_api_container_service_proto_rawDescGZIP(), []int{40} } func (x *InspectFilesArtifactContentsResponse) GetFileDescriptions() []*FileArtifactContentsFileDescription { @@ -3078,7 +3347,7 @@ type FileArtifactContentsFileDescription struct { func (x *FileArtifactContentsFileDescription) Reset() { *x = FileArtifactContentsFileDescription{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[38] + mi := &file_api_container_service_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3091,7 +3360,7 @@ func (x *FileArtifactContentsFileDescription) String() string { func (*FileArtifactContentsFileDescription) ProtoMessage() {} func (x *FileArtifactContentsFileDescription) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[38] + mi := &file_api_container_service_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3104,7 +3373,7 @@ func (x *FileArtifactContentsFileDescription) ProtoReflect() protoreflect.Messag // Deprecated: Use FileArtifactContentsFileDescription.ProtoReflect.Descriptor instead. func (*FileArtifactContentsFileDescription) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{38} + return file_api_container_service_proto_rawDescGZIP(), []int{41} } func (x *FileArtifactContentsFileDescription) GetPath() string { @@ -3139,7 +3408,7 @@ type ConnectServicesArgs struct { func (x *ConnectServicesArgs) Reset() { *x = ConnectServicesArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[39] + mi := &file_api_container_service_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3152,7 +3421,7 @@ func (x *ConnectServicesArgs) String() string { func (*ConnectServicesArgs) ProtoMessage() {} func (x *ConnectServicesArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[39] + mi := &file_api_container_service_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3165,7 +3434,7 @@ func (x *ConnectServicesArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use ConnectServicesArgs.ProtoReflect.Descriptor instead. func (*ConnectServicesArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{39} + return file_api_container_service_proto_rawDescGZIP(), []int{42} } func (x *ConnectServicesArgs) GetConnect() Connect { @@ -3184,7 +3453,7 @@ type ConnectServicesResponse struct { func (x *ConnectServicesResponse) Reset() { *x = ConnectServicesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[40] + mi := &file_api_container_service_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3197,7 +3466,7 @@ func (x *ConnectServicesResponse) String() string { func (*ConnectServicesResponse) ProtoMessage() {} func (x *ConnectServicesResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[40] + mi := &file_api_container_service_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3210,7 +3479,7 @@ func (x *ConnectServicesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ConnectServicesResponse.ProtoReflect.Descriptor instead. func (*ConnectServicesResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{40} + return file_api_container_service_proto_rawDescGZIP(), []int{43} } type GetStarlarkRunResponse struct { @@ -3233,7 +3502,7 @@ type GetStarlarkRunResponse struct { func (x *GetStarlarkRunResponse) Reset() { *x = GetStarlarkRunResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[41] + mi := &file_api_container_service_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3246,7 +3515,7 @@ func (x *GetStarlarkRunResponse) String() string { func (*GetStarlarkRunResponse) ProtoMessage() {} func (x *GetStarlarkRunResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[41] + mi := &file_api_container_service_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3259,7 +3528,7 @@ func (x *GetStarlarkRunResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetStarlarkRunResponse.ProtoReflect.Descriptor instead. func (*GetStarlarkRunResponse) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{41} + return file_api_container_service_proto_rawDescGZIP(), []int{44} } func (x *GetStarlarkRunResponse) GetPackageId() string { @@ -3336,7 +3605,7 @@ type PlanYaml struct { func (x *PlanYaml) Reset() { *x = PlanYaml{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[42] + mi := &file_api_container_service_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3349,7 +3618,7 @@ func (x *PlanYaml) String() string { func (*PlanYaml) ProtoMessage() {} func (x *PlanYaml) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[42] + mi := &file_api_container_service_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3362,7 +3631,7 @@ func (x *PlanYaml) ProtoReflect() protoreflect.Message { // Deprecated: Use PlanYaml.ProtoReflect.Descriptor instead. func (*PlanYaml) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{42} + return file_api_container_service_proto_rawDescGZIP(), []int{45} } func (x *PlanYaml) GetPlanYaml() string { @@ -3386,7 +3655,7 @@ type StarlarkScriptPlanYamlArgs struct { func (x *StarlarkScriptPlanYamlArgs) Reset() { *x = StarlarkScriptPlanYamlArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[43] + mi := &file_api_container_service_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3399,7 +3668,7 @@ func (x *StarlarkScriptPlanYamlArgs) String() string { func (*StarlarkScriptPlanYamlArgs) ProtoMessage() {} func (x *StarlarkScriptPlanYamlArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[43] + mi := &file_api_container_service_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3412,7 +3681,7 @@ func (x *StarlarkScriptPlanYamlArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkScriptPlanYamlArgs.ProtoReflect.Descriptor instead. func (*StarlarkScriptPlanYamlArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{43} + return file_api_container_service_proto_rawDescGZIP(), []int{46} } func (x *StarlarkScriptPlanYamlArgs) GetSerializedScript() string { @@ -3456,7 +3725,7 @@ type StarlarkPackagePlanYamlArgs struct { func (x *StarlarkPackagePlanYamlArgs) Reset() { *x = StarlarkPackagePlanYamlArgs{} if protoimpl.UnsafeEnabled { - mi := &file_api_container_service_proto_msgTypes[44] + mi := &file_api_container_service_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3469,7 +3738,7 @@ func (x *StarlarkPackagePlanYamlArgs) String() string { func (*StarlarkPackagePlanYamlArgs) ProtoMessage() {} func (x *StarlarkPackagePlanYamlArgs) ProtoReflect() protoreflect.Message { - mi := &file_api_container_service_proto_msgTypes[44] + mi := &file_api_container_service_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3482,7 +3751,7 @@ func (x *StarlarkPackagePlanYamlArgs) ProtoReflect() protoreflect.Message { // Deprecated: Use StarlarkPackagePlanYamlArgs.ProtoReflect.Descriptor instead. func (*StarlarkPackagePlanYamlArgs) Descriptor() ([]byte, []int) { - return file_api_container_service_proto_rawDescGZIP(), []int{44} + return file_api_container_service_proto_rawDescGZIP(), []int{47} } func (x *StarlarkPackagePlanYamlArgs) GetPackageId() string { @@ -3572,715 +3841,790 @@ var file_api_container_service_proto_rawDesc = []byte{ 0x38, 0x01, 0x22, 0x2f, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, - 0x4e, 0x10, 0x02, 0x22, 0xbc, 0x05, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, - 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x55, - 0x0a, 0x0d, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x62, 0x0a, 0x12, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x2e, 0x4d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, - 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, - 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, - 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x47, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, - 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x09, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x1a, 0x58, 0x0a, 0x11, 0x50, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x4d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x4e, 0x10, 0x02, 0x22, 0x54, 0x0a, 0x12, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1b, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x5f, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x19, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x49, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0x2a, 0x0a, 0x04, 0x55, 0x73, 0x65, + 0x72, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, + 0x75, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x03, 0x67, 0x69, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x0a, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x12, 0x2d, 0x0a, 0x12, 0x74, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x74, 0x6f, + 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x22, + 0xdb, 0x0c, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, + 0x69, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x70, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x49, 0x70, 0x41, 0x64, 0x64, 0x72, 0x12, 0x55, 0x0a, 0x0d, 0x70, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0c, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, + 0x73, 0x12, 0x2f, 0x0a, 0x14, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x5f, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x49, 0x70, 0x41, 0x64, + 0x64, 0x72, 0x12, 0x62, 0x0a, 0x12, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x5f, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x5f, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xd0, 0x05, 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x11, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, - 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, - 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x06, - 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, - 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, - 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, - 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x10, - 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, - 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, - 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, - 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0f, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, - 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x0b, 0x63, 0x6c, 0x6f, 0x75, - 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x13, 0x69, 0x6d, - 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, - 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x06, 0x52, - 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, - 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, - 0x48, 0x07, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x4d, - 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, - 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, - 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, - 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, - 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xf4, 0x07, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, - 0x16, 0x0a, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, - 0x52, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, - 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, - 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x6e, - 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x04, 0x52, 0x0c, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, - 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x06, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, - 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, - 0x0b, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, - 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, - 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, - 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, - 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, - 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, - 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x0b, 0x63, - 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, - 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, - 0x48, 0x09, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x0a, 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, - 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x0b, 0x52, 0x0f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x41, 0x75, - 0x74, 0x68, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x73, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, - 0x5f, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, - 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, - 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, - 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, - 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, - 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, - 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, - 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, - 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x5f, 0x61, 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb6, 0x04, 0x0a, - 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, + 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x61, 0x79, 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, + 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, 0x69, + 0x64, 0x12, 0x47, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0d, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x09, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x9f, 0x01, 0x0a, 0x29, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x5f, 0x64, 0x69, 0x72, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x73, 0x5f, 0x74, 0x6f, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x5f, 0x61, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x5f, + 0x6c, 0x69, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x47, 0x2e, 0x61, 0x70, 0x69, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x23, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, + 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, + 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0c, 0x6d, 0x61, 0x78, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x12, 0x23, 0x0a, + 0x0d, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, 0x75, 0x73, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x63, 0x70, + 0x75, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x5f, 0x6d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x12, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, 0x61, 0x62, + 0x79, 0x74, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x67, 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x12, 0x6d, 0x69, 0x6e, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x67, + 0x61, 0x62, 0x79, 0x74, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x48, 0x00, 0x52, + 0x04, 0x75, 0x73, 0x65, 0x72, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, 0x0b, 0x74, 0x6f, 0x6c, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, + 0x69, 0x2e, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x6f, + 0x6c, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x31, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x6e, 0x6f, 0x64, 0x65, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x42, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x12, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x69, 0x6e, 0x69, 0x5f, + 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, + 0x0b, 0x74, 0x69, 0x6e, 0x69, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x1a, + 0x58, 0x0a, 0x11, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x5c, 0x0a, 0x15, 0x4d, 0x61, 0x79, + 0x62, 0x65, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x50, 0x6f, 0x72, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x7d, 0x0a, 0x28, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x44, 0x69, 0x72, 0x50, 0x61, 0x74, 0x68, 0x73, 0x54, 0x6f, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, + 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x40, 0x0a, 0x12, 0x4e, 0x6f, 0x64, 0x65, 0x53, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x4c, 0x61, 0x62, 0x65, + 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x74, 0x69, 0x6e, 0x69, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0xd0, 0x05, + 0x0a, 0x15, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, + 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, + 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x0b, 0x70, 0x61, 0x72, + 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, + 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x03, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x5b, + 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, + 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x11, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x49, + 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x27, 0x0a, 0x0d, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x0b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, 0x73, 0x65, 0x72, + 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x06, 0x52, 0x11, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, 0x01, + 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x48, 0x07, 0x52, 0x0f, 0x6e, + 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x88, 0x01, + 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, + 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, + 0x69, 0x73, 0x6d, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x63, + 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x64, + 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, + 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, 0x77, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x6e, + 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x22, 0xf4, 0x07, 0x0a, 0x16, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x05, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x08, 0x48, 0x00, 0x52, 0x06, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x30, 0x0a, 0x11, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1c, + 0x0a, 0x07, 0x64, 0x72, 0x79, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x48, + 0x02, 0x52, 0x06, 0x64, 0x72, 0x79, 0x52, 0x75, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x25, 0x0a, 0x0b, + 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x48, 0x03, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, + 0x88, 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x48, 0x04, 0x52, 0x0c, 0x63, 0x6c, + 0x6f, 0x6e, 0x65, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3f, 0x0a, + 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, + 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x05, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, + 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, + 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x06, 0x52, 0x10, 0x6d, 0x61, + 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, + 0x01, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, + 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0e, + 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, + 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2f, + 0x0a, 0x11, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x48, 0x07, 0x52, 0x0f, 0x63, 0x6c, 0x6f, + 0x75, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, + 0x27, 0x0a, 0x0d, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, + 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x48, 0x08, 0x52, 0x0b, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x55, + 0x73, 0x65, 0x72, 0x49, 0x64, 0x88, 0x01, 0x01, 0x12, 0x59, 0x0a, 0x13, 0x69, 0x6d, 0x61, 0x67, + 0x65, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x09, 0x52, 0x11, 0x69, + 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, + 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x48, 0x0a, + 0x52, 0x0f, 0x6e, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, + 0x65, 0x88, 0x01, 0x01, 0x12, 0x2f, 0x0a, 0x11, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, + 0x75, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x0b, 0x52, 0x0f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x41, 0x75, 0x74, 0x68, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x73, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x5f, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x64, 0x72, 0x79, 0x5f, + 0x72, 0x75, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, + 0x69, 0x73, 0x6d, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x5f, 0x70, 0x61, + 0x63, 0x6b, 0x61, 0x67, 0x65, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, + 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, + 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, + 0x5f, 0x69, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, + 0x6e, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x6f, 0x64, + 0x65, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x5f, 0x61, 0x75, 0x74, + 0x68, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xb6, 0x04, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, + 0x69, 0x6e, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x48, 0x00, 0x52, 0x0b, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x38, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4d, 0x0a, 0x0d, 0x70, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x70, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x5d, 0x0a, 0x12, 0x69, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x48, 0x00, 0x52, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x5b, 0x0a, 0x12, 0x72, 0x75, 0x6e, 0x5f, 0x66, + 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x4d, - 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x48, 0x00, 0x52, 0x10, 0x72, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x48, 0x00, 0x52, - 0x0c, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x5d, 0x0a, - 0x12, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x00, 0x52, 0x07, 0x77, 0x61, 0x72, + 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, + 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x42, 0x13, 0x0a, 0x11, 0x72, + 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x5f, 0x6c, 0x69, 0x6e, 0x65, + 0x22, 0x31, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x6f, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x22, 0x3a, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, + 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, + 0xcd, 0x02, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x11, 0x69, 0x6e, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x5b, 0x0a, 0x12, - 0x72, 0x75, 0x6e, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x72, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, - 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x77, 0x61, 0x72, - 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x48, 0x00, - 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x35, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x48, 0x00, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, - 0x42, 0x13, 0x0a, 0x11, 0x72, 0x75, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x5f, 0x6c, 0x69, 0x6e, 0x65, 0x22, 0x31, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x21, 0x0a, 0x0c, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x6d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, - 0x6f, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3a, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x57, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x27, 0x0a, 0x0f, 0x77, - 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x22, 0xcd, 0x02, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4a, 0x0a, 0x08, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, + 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x69, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x47, + 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x52, 0x09, 0x61, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x16, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1d, + 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x12, 0x20, 0x0a, + 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x5f, 0x0a, 0x19, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x42, 0x0a, 0x1d, + 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x1b, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x49, + 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x22, 0xa4, 0x01, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x41, 0x72, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, + 0x08, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x07, 0x61, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, + 0x11, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, 0x73, 0x52, 0x65, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x61, + 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, + 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x22, 0xac, + 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x12, 0x63, 0x0a, 0x14, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x0a, 0x10, 0x69, 0x6e, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0f, 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, - 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, - 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, - 0x67, 0x52, 0x09, 0x61, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x0a, 0x16, - 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x73, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x65, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, - 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x69, 0x73, 0x53, 0x6b, 0x69, 0x70, 0x70, - 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5f, 0x0a, 0x19, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x42, 0x0a, 0x1d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, - 0x69, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x22, 0xa4, 0x01, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x72, 0x67, - 0x12, 0x30, 0x0a, 0x14, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x61, - 0x72, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x41, 0x72, 0x67, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x08, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x61, 0x72, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x88, - 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, - 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x69, - 0x73, 0x52, 0x65, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, 0x42, - 0x0b, 0x0a, 0x09, 0x5f, 0x61, 0x72, 0x67, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x65, 0x0a, 0x1b, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, - 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x63, - 0x6f, 0x6c, 0x75, 0x6d, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x6f, 0x6c, - 0x75, 0x6d, 0x6e, 0x22, 0xac, 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x63, 0x0a, 0x14, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, - 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x57, 0x0a, 0x10, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x48, 0x00, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x12, 0x54, 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x22, 0x42, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3e, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, - 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x3d, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x92, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, - 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x65, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x74, 0x65, 0x70, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x53, 0x74, 0x65, 0x70, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x8e, 0x01, 0x0a, 0x18, 0x53, - 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x75, - 0x6e, 0x5f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x52, 0x75, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x66, 0x75, 0x6c, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xc5, 0x01, 0x0a, 0x0f, - 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, - 0x6b, 0x0a, 0x13, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x45, 0x0a, 0x17, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xd1, 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0c, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x5e, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x34, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, + 0x52, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x57, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x54, + 0x0a, 0x0f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, + 0x72, 0x72, 0x6f, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x42, 0x0a, + 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, + 0x65, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x22, 0x3e, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, + 0x65, 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x22, 0x3d, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x65, + 0x72, 0x72, 0x6f, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x92, 0x01, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x74, + 0x65, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x53, 0x74, 0x65, 0x70, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x11, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x65, 0x70, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x8e, 0x01, 0x0a, 0x18, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, + 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x73, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, + 0x73, 0x52, 0x75, 0x6e, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x12, 0x30, + 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, + 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x88, 0x01, 0x01, + 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, + 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, 0x6b, 0x0a, 0x13, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x1a, 0x45, 0x0a, 0x17, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd1, + 0x01, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x72, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x21, 0x0a, - 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, - 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, - 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x32, - 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, - 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x73, 0x52, 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x73, 0x22, 0x63, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x61, - 0x72, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x22, 0x51, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, - 0x09, 0x65, 0x78, 0x69, 0x74, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x65, 0x78, 0x69, 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, - 0x67, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x6c, 0x6f, 0x67, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xac, 0x03, 0x0a, 0x26, 0x57, 0x61, - 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, - 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, - 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0d, 0x48, 0x01, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, - 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, - 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, - 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, - 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, - 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, - 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, - 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, - 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, - 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, - 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0xe6, 0x03, 0x0a, 0x27, 0x57, 0x61, 0x69, - 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x69, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, - 0x12, 0x26, 0x0a, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x42, 0x6f, 0x64, 0x79, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, - 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x18, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, - 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, - 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x07, - 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, - 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x04, - 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, - 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x05, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, - 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, - 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, - 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x1a, 0x5e, 0x0a, 0x10, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x72, 0x0a, 0x12, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x55, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, 0x65, 0x64, 0x5f, 0x75, 0x75, 0x69, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, 0x6f, 0x72, 0x74, 0x65, 0x6e, + 0x65, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x83, 0x01, 0x0a, 0x32, 0x47, 0x65, 0x74, 0x45, 0x78, + 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, + 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 0x0a, + 0x0e, 0x61, 0x6c, 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0e, 0x61, 0x6c, + 0x6c, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x22, 0x63, 0x0a, 0x0f, + 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x12, + 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x21, + 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x5f, 0x61, 0x72, 0x67, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, + 0x73, 0x22, 0x51, 0x0a, 0x13, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x65, 0x78, 0x69, 0x74, + 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x69, + 0x74, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x6f, 0x67, 0x5f, 0x6f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x67, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x22, 0xac, 0x03, 0x0a, 0x26, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, + 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, + 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, + 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x48, + 0x01, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, + 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, + 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, + 0x02, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, + 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, + 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0d, 0x48, 0x03, 0x52, 0x18, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, + 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x08, 0x62, 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, + 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, + 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, + 0x65, 0x78, 0x74, 0x22, 0xe6, 0x03, 0x0a, 0x27, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, + 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x12, + 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x6f, + 0x72, 0x74, 0x12, 0x17, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x48, 0x00, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x72, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x48, 0x01, 0x52, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x42, 0x6f, 0x64, 0x79, + 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x64, + 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x02, 0x52, 0x18, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x61, 0x6c, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1d, 0x0a, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x03, 0x52, 0x07, 0x72, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, - 0x74, 0x22, 0x99, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, - 0x74, 0x61, 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, 0x12, 0x2e, 0x0a, 0x13, 0x70, - 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x68, 0x61, - 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, - 0x75, 0x73, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x27, 0x0a, - 0x11, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x45, 0x0a, 0x1b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, - 0x19, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x41, 0x0a, 0x19, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x33, 0x0a, - 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, - 0x69, 0x64, 0x22, 0x87, 0x01, 0x0a, 0x21, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, - 0x75, 0x72, 0x63, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x25, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, - 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x52, 0x0a, 0x18, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, - 0x64, 0x55, 0x75, 0x69, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x86, 0x01, - 0x0a, 0x26, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x6e, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x48, 0x04, 0x52, 0x18, 0x72, 0x65, 0x74, + 0x72, 0x69, 0x65, 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x62, 0x6f, 0x64, 0x79, + 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x48, 0x05, 0x52, 0x08, 0x62, + 0x6f, 0x64, 0x79, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x70, + 0x61, 0x74, 0x68, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, + 0x62, 0x6f, 0x64, 0x79, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, + 0x6e, 0x64, 0x73, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x42, + 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, + 0x79, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x42, 0x0c, + 0x0a, 0x0a, 0x5f, 0x62, 0x6f, 0x64, 0x79, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x22, 0x99, 0x01, 0x0a, + 0x11, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 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, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, + 0x75, 0x73, 0x5f, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x70, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x48, 0x61, 0x73, 0x68, 0x12, 0x40, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x61, 0x74, + 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x61, 0x74, 0x61, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x22, 0x45, 0x0a, 0x1b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x19, 0x44, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x22, 0x41, 0x0a, 0x19, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, + 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, + 0x67, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x75, 0x72, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x33, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x22, 0x87, 0x01, + 0x0a, 0x21, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, + 0x72, 0x67, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x69, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x11, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x74, + 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x25, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, + 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x75, 0x75, 0x69, 0x64, 0x22, 0x52, 0x0a, 0x18, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, + 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, + 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x66, 0x69, 0x6c, 0x65, 0x55, 0x75, 0x69, 0x64, 0x22, 0x86, 0x01, 0x0a, 0x26, 0x4c, 0x69, 0x73, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x14, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x11, + 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, + 0x73, 0x22, 0x81, 0x01, 0x0a, 0x23, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, 0x0a, 0x13, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, 0x5f, 0x75, 0x75, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x41, 0x6e, 0x64, 0x55, - 0x75, 0x69, 0x64, 0x52, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, - 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x22, 0x81, 0x01, 0x0a, 0x23, 0x49, 0x6e, 0x73, 0x70, 0x65, - 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x5a, - 0x0a, 0x13, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x5f, 0x61, 0x6e, 0x64, - 0x5f, 0x75, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x61, 0x70, - 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x8b, 0x01, 0x0a, 0x24, 0x49, - 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x23, 0x46, 0x69, 0x6c, - 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x65, 0x78, 0x74, - 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x0b, 0x74, 0x65, 0x78, 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x88, 0x01, 0x01, - 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, - 0x77, 0x22, 0x4b, 0x0a, 0x13, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0x19, - 0x0a, 0x17, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa2, 0x04, 0x0a, 0x16, 0x47, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, - 0x65, 0x49, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x20, 0x0a, - 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, - 0x3a, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, - 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, - 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6d, - 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, - 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, - 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, - 0x52, 0x14, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, - 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, - 0x52, 0x0d, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, - 0x3f, 0x0a, 0x19, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, - 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x17, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x65, 0x72, + 0x75, 0x69, 0x64, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, + 0x64, 0x55, 0x75, 0x69, 0x64, 0x22, 0x8b, 0x01, 0x0a, 0x24, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, + 0x0a, 0x11, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x46, 0x69, + 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x10, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0x86, 0x01, 0x0a, 0x23, 0x46, 0x69, 0x6c, 0x65, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x46, 0x69, 0x6c, 0x65, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, + 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x73, + 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, + 0x69, 0x65, 0x77, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x74, 0x65, 0x78, + 0x74, 0x50, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x88, 0x01, 0x01, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, + 0x74, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x76, 0x69, 0x65, 0x77, 0x22, 0x4b, 0x0a, 0x13, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, + 0x72, 0x67, 0x73, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x22, 0x19, 0x0a, 0x17, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa2, 0x04, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, + 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, 0x2b, + 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x73, + 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x61, + 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, + 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x69, 0x73, 0x6d, 0x12, 0x3a, 0x0a, 0x1a, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, + 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, + 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5b, 0x0a, 0x15, 0x65, 0x78, 0x70, 0x65, 0x72, 0x69, 0x6d, 0x65, + 0x6e, 0x74, 0x61, 0x6c, 0x5f, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, + 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x52, 0x14, 0x65, 0x78, 0x70, + 0x65, 0x72, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x12, 0x47, 0x0a, 0x0e, 0x72, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x70, 0x6f, 0x6c, + 0x69, 0x63, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x61, 0x70, 0x69, 0x5f, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0d, 0x72, 0x65, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x3f, 0x0a, 0x19, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, + 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x17, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x42, 0x1c, 0x0a, 0x1a, 0x5f, + 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x27, 0x0a, 0x08, 0x50, 0x6c, 0x61, + 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x6e, 0x5f, 0x79, 0x61, + 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x6e, 0x59, 0x61, + 0x6d, 0x6c, 0x22, 0xdb, 0x01, 0x0a, 0x1a, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, + 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x30, + 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, - 0x42, 0x1c, 0x0a, 0x1a, 0x5f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x27, - 0x0a, 0x08, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6c, - 0x61, 0x6e, 0x5f, 0x79, 0x61, 0x6d, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, - 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0xdb, 0x01, 0x0a, 0x1a, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, - 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, - 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x53, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, - 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, - 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, - 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x01, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, - 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x15, - 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xcb, 0x02, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, - 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, - 0x6c, 0x41, 0x72, 0x67, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, - 0x67, 0x65, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, - 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x10, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x88, 0x01, 0x01, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, - 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, - 0x69, 0x76, 0x65, 0x50, 0x61, 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x02, 0x52, 0x10, 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x4e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, - 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x1d, 0x0a, - 0x1b, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, - 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, - 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x2a, 0x36, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, - 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x2a, 0x2c, 0x0a, 0x11, 0x49, - 0x6d, 0x61, 0x67, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x0a, 0x0a, 0x06, 0x61, 0x6c, 0x77, 0x61, 0x79, 0x73, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x10, 0x01, 0x2a, 0x26, 0x0a, 0x07, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x12, 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, - 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, - 0x01, 0x2a, 0x32, 0x0a, 0x13, 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, 0x5f, 0x49, - 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x43, 0x41, 0x43, 0x48, - 0x49, 0x4e, 0x47, 0x10, 0x00, 0x2a, 0x26, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x45, 0x56, 0x45, 0x52, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, 0x01, 0x32, 0xa6, 0x10, - 0x0a, 0x13, 0x41, 0x70, 0x69, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x6d, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, - 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x59, 0x0a, 0x15, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x24, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x28, 0x01, 0x12, - 0x6f, 0x0a, 0x12, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, - 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x12, 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, + 0x6d, 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, + 0x88, 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, + 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, + 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0xcb, 0x02, 0x0a, 0x1b, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, + 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, + 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x49, 0x64, 0x12, + 0x30, 0x0a, 0x11, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x10, 0x73, 0x65, + 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x3f, + 0x0a, 0x1a, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, + 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x48, 0x01, 0x52, 0x16, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x54, 0x6f, 0x4d, 0x61, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x31, 0x0a, 0x12, 0x6d, 0x61, 0x69, 0x6e, 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x10, 0x6d, + 0x61, 0x69, 0x6e, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x88, + 0x01, 0x01, 0x42, 0x14, 0x0a, 0x12, 0x5f, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x69, 0x7a, 0x65, + 0x64, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, + 0x69, 0x6e, 0x5f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x61, 0x69, 0x6e, + 0x5f, 0x66, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x2a, 0x36, + 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x0b, 0x0a, 0x07, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, + 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x02, 0x2a, 0x2c, 0x0a, 0x11, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x44, + 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x61, + 0x6c, 0x77, 0x61, 0x79, 0x73, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x6d, 0x69, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x10, 0x01, 0x2a, 0x26, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x12, + 0x0b, 0x0a, 0x07, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, + 0x4e, 0x4f, 0x5f, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x10, 0x01, 0x2a, 0x32, 0x0a, 0x13, + 0x4b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x46, + 0x6c, 0x61, 0x67, 0x12, 0x1b, 0x0a, 0x17, 0x4e, 0x4f, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x55, + 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x43, 0x41, 0x43, 0x48, 0x49, 0x4e, 0x47, 0x10, 0x00, + 0x2a, 0x26, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x6c, 0x69, 0x63, + 0x79, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x45, 0x56, 0x45, 0x52, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, + 0x41, 0x4c, 0x57, 0x41, 0x59, 0x53, 0x10, 0x01, 0x32, 0xa6, 0x10, 0x0a, 0x13, 0x41, 0x70, 0x69, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x6d, 0x0a, 0x11, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x28, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, - 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, - 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, - 0x12, 0x5b, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, - 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, - 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8d, 0x01, - 0x0a, 0x2a, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, - 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x45, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, - 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, - 0x0b, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, - 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x22, 0x57, 0x61, - 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, - 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, - 0x12, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, - 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, - 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x23, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, - 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, - 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, - 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x13, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, - 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, - 0x61, 0x70, 0x69, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x15, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, - 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, - 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x22, 0x00, 0x30, 0x01, 0x12, 0x79, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, - 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x30, 0x2e, 0x61, 0x70, + 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, + 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x59, 0x0a, 0x15, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, + 0x65, 0x61, 0x6d, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x16, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, 0x0a, 0x12, 0x52, 0x75, + 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, + 0x12, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, + 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, + 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, - 0x69, 0x66, 0x61, 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x91, 0x01, 0x0a, 0x1d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, - 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x34, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, - 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, - 0x55, 0x75, 0x69, 0x64, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x39, 0x2e, - 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, - 0x69, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1c, 0x49, - 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, - 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x2e, 0x61, 0x70, + 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x0b, 0x47, + 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, + 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x2a, 0x47, 0x65, 0x74, + 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x45, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, + 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x41, + 0x6e, 0x64, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x69, 0x63, 0x61, 0x6c, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0b, 0x45, 0x78, 0x65, 0x63, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x22, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, - 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, - 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, - 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, - 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x12, 0x26, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x74, - 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x29, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, - 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, - 0x6b, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, - 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2d, 0x2e, 0x61, 0x70, + 0x45, 0x78, 0x65, 0x63, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x79, 0x0a, 0x22, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, + 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, + 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, + 0x12, 0x7b, 0x0a, 0x23, 0x57, 0x61, 0x69, 0x74, 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, + 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x61, 0x69, 0x74, + 0x46, 0x6f, 0x72, 0x48, 0x74, 0x74, 0x70, 0x50, 0x6f, 0x73, 0x74, 0x45, 0x6e, 0x64, 0x70, 0x6f, + 0x69, 0x6e, 0x74, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x41, + 0x72, 0x67, 0x73, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x6f, 0x0a, + 0x13, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, + 0x66, 0x61, 0x63, 0x74, 0x12, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, + 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x2e, 0x2e, 0x61, 0x70, 0x69, + 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, + 0x63, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x28, 0x01, 0x12, 0x6f, + 0x0a, 0x15, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, + 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x24, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, + 0x79, 0x0a, 0x15, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x12, 0x2c, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, + 0x63, 0x74, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x30, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x57, 0x65, 0x62, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1d, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, + 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x34, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x41, 0x72, + 0x67, 0x73, 0x1a, 0x38, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x46, 0x72, 0x6f, 0x6d, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, + 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, + 0x61, 0x63, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, + 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x39, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, + 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x55, 0x75, 0x69, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x91, 0x01, 0x0a, 0x1c, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, + 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, + 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, + 0x70, 0x69, 0x2e, 0x49, 0x6e, 0x73, 0x70, 0x65, 0x63, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x41, + 0x72, 0x74, 0x69, 0x66, 0x61, 0x63, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x67, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x41, 0x72, 0x67, 0x73, 0x1a, 0x2a, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, + 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, + 0x6b, 0x52, 0x75, 0x6e, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x29, 0x2e, 0x61, + 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x52, 0x75, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x69, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, - 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, - 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, - 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x1a, 0x47, 0x65, 0x74, - 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, - 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x6c, 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, - 0x61, 0x6d, 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, - 0x59, 0x61, 0x6d, 0x6c, 0x22, 0x00, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2d, 0x74, 0x65, - 0x63, 0x68, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x75, 0x72, 0x74, - 0x6f, 0x73, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x70, - 0x69, 0x5f, 0x62, 0x69, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x12, 0x2d, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, + 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, + 0x61, 0x72, 0x6b, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, + 0x6c, 0x41, 0x72, 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, + 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, + 0x6d, 0x6c, 0x22, 0x00, 0x12, 0x6b, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x6c, + 0x61, 0x72, 0x6b, 0x50, 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, + 0x6d, 0x6c, 0x12, 0x2e, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x6c, 0x61, 0x72, 0x6b, 0x50, + 0x61, 0x63, 0x6b, 0x61, 0x67, 0x65, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x41, 0x72, + 0x67, 0x73, 0x1a, 0x1b, 0x2e, 0x61, 0x70, 0x69, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, + 0x65, 0x72, 0x5f, 0x61, 0x70, 0x69, 0x2e, 0x50, 0x6c, 0x61, 0x6e, 0x59, 0x61, 0x6d, 0x6c, 0x22, + 0x00, 0x42, 0x52, 0x5a, 0x50, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2d, 0x74, 0x65, 0x63, 0x68, 0x2f, 0x6b, 0x75, + 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x6c, 0x61, 0x6e, + 0x67, 0x2f, 0x63, 0x6f, 0x72, 0x65, 0x2f, 0x6b, 0x75, 0x72, 0x74, 0x6f, 0x73, 0x69, 0x73, 0x5f, + 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x72, 0x70, 0x63, 0x5f, 0x61, 0x70, 0x69, 0x5f, 0x62, 0x69, 0x6e, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4296,7 +4640,7 @@ func file_api_container_service_proto_rawDescGZIP() []byte { } var file_api_container_service_proto_enumTypes = make([]protoimpl.EnumInfo, 7) -var file_api_container_service_proto_msgTypes = make([]protoimpl.MessageInfo, 50) +var file_api_container_service_proto_msgTypes = make([]protoimpl.MessageInfo, 56) var file_api_container_service_proto_goTypes = []interface{}{ (ServiceStatus)(0), // 0: api_container_api.ServiceStatus (ImageDownloadMode)(0), // 1: api_container_api.ImageDownloadMode @@ -4307,134 +4651,146 @@ var file_api_container_service_proto_goTypes = []interface{}{ (Container_Status)(0), // 6: api_container_api.Container.Status (*Port)(nil), // 7: api_container_api.Port (*Container)(nil), // 8: api_container_api.Container - (*ServiceInfo)(nil), // 9: api_container_api.ServiceInfo - (*RunStarlarkScriptArgs)(nil), // 10: api_container_api.RunStarlarkScriptArgs - (*RunStarlarkPackageArgs)(nil), // 11: api_container_api.RunStarlarkPackageArgs - (*StarlarkRunResponseLine)(nil), // 12: api_container_api.StarlarkRunResponseLine - (*StarlarkInfo)(nil), // 13: api_container_api.StarlarkInfo - (*StarlarkWarning)(nil), // 14: api_container_api.StarlarkWarning - (*StarlarkInstruction)(nil), // 15: api_container_api.StarlarkInstruction - (*StarlarkInstructionResult)(nil), // 16: api_container_api.StarlarkInstructionResult - (*StarlarkInstructionArg)(nil), // 17: api_container_api.StarlarkInstructionArg - (*StarlarkInstructionPosition)(nil), // 18: api_container_api.StarlarkInstructionPosition - (*StarlarkError)(nil), // 19: api_container_api.StarlarkError - (*StarlarkInterpretationError)(nil), // 20: api_container_api.StarlarkInterpretationError - (*StarlarkValidationError)(nil), // 21: api_container_api.StarlarkValidationError - (*StarlarkExecutionError)(nil), // 22: api_container_api.StarlarkExecutionError - (*StarlarkRunProgress)(nil), // 23: api_container_api.StarlarkRunProgress - (*StarlarkRunFinishedEvent)(nil), // 24: api_container_api.StarlarkRunFinishedEvent - (*GetServicesArgs)(nil), // 25: api_container_api.GetServicesArgs - (*GetServicesResponse)(nil), // 26: api_container_api.GetServicesResponse - (*ServiceIdentifiers)(nil), // 27: api_container_api.ServiceIdentifiers - (*GetExistingAndHistoricalServiceIdentifiersResponse)(nil), // 28: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse - (*ExecCommandArgs)(nil), // 29: api_container_api.ExecCommandArgs - (*ExecCommandResponse)(nil), // 30: api_container_api.ExecCommandResponse - (*WaitForHttpGetEndpointAvailabilityArgs)(nil), // 31: api_container_api.WaitForHttpGetEndpointAvailabilityArgs - (*WaitForHttpPostEndpointAvailabilityArgs)(nil), // 32: api_container_api.WaitForHttpPostEndpointAvailabilityArgs - (*StreamedDataChunk)(nil), // 33: api_container_api.StreamedDataChunk - (*DataChunkMetadata)(nil), // 34: api_container_api.DataChunkMetadata - (*UploadFilesArtifactResponse)(nil), // 35: api_container_api.UploadFilesArtifactResponse - (*DownloadFilesArtifactArgs)(nil), // 36: api_container_api.DownloadFilesArtifactArgs - (*StoreWebFilesArtifactArgs)(nil), // 37: api_container_api.StoreWebFilesArtifactArgs - (*StoreWebFilesArtifactResponse)(nil), // 38: api_container_api.StoreWebFilesArtifactResponse - (*StoreFilesArtifactFromServiceArgs)(nil), // 39: api_container_api.StoreFilesArtifactFromServiceArgs - (*StoreFilesArtifactFromServiceResponse)(nil), // 40: api_container_api.StoreFilesArtifactFromServiceResponse - (*FilesArtifactNameAndUuid)(nil), // 41: api_container_api.FilesArtifactNameAndUuid - (*ListFilesArtifactNamesAndUuidsResponse)(nil), // 42: api_container_api.ListFilesArtifactNamesAndUuidsResponse - (*InspectFilesArtifactContentsRequest)(nil), // 43: api_container_api.InspectFilesArtifactContentsRequest - (*InspectFilesArtifactContentsResponse)(nil), // 44: api_container_api.InspectFilesArtifactContentsResponse - (*FileArtifactContentsFileDescription)(nil), // 45: api_container_api.FileArtifactContentsFileDescription - (*ConnectServicesArgs)(nil), // 46: api_container_api.ConnectServicesArgs - (*ConnectServicesResponse)(nil), // 47: api_container_api.ConnectServicesResponse - (*GetStarlarkRunResponse)(nil), // 48: api_container_api.GetStarlarkRunResponse - (*PlanYaml)(nil), // 49: api_container_api.PlanYaml - (*StarlarkScriptPlanYamlArgs)(nil), // 50: api_container_api.StarlarkScriptPlanYamlArgs - (*StarlarkPackagePlanYamlArgs)(nil), // 51: api_container_api.StarlarkPackagePlanYamlArgs - nil, // 52: api_container_api.Container.EnvVarsEntry - nil, // 53: api_container_api.ServiceInfo.PrivatePortsEntry - nil, // 54: api_container_api.ServiceInfo.MaybePublicPortsEntry - nil, // 55: api_container_api.GetServicesArgs.ServiceIdentifiersEntry - nil, // 56: api_container_api.GetServicesResponse.ServiceInfoEntry - (*emptypb.Empty)(nil), // 57: google.protobuf.Empty + (*FilesArtifactsList)(nil), // 9: api_container_api.FilesArtifactsList + (*User)(nil), // 10: api_container_api.User + (*Toleration)(nil), // 11: api_container_api.Toleration + (*ServiceInfo)(nil), // 12: api_container_api.ServiceInfo + (*RunStarlarkScriptArgs)(nil), // 13: api_container_api.RunStarlarkScriptArgs + (*RunStarlarkPackageArgs)(nil), // 14: api_container_api.RunStarlarkPackageArgs + (*StarlarkRunResponseLine)(nil), // 15: api_container_api.StarlarkRunResponseLine + (*StarlarkInfo)(nil), // 16: api_container_api.StarlarkInfo + (*StarlarkWarning)(nil), // 17: api_container_api.StarlarkWarning + (*StarlarkInstruction)(nil), // 18: api_container_api.StarlarkInstruction + (*StarlarkInstructionResult)(nil), // 19: api_container_api.StarlarkInstructionResult + (*StarlarkInstructionArg)(nil), // 20: api_container_api.StarlarkInstructionArg + (*StarlarkInstructionPosition)(nil), // 21: api_container_api.StarlarkInstructionPosition + (*StarlarkError)(nil), // 22: api_container_api.StarlarkError + (*StarlarkInterpretationError)(nil), // 23: api_container_api.StarlarkInterpretationError + (*StarlarkValidationError)(nil), // 24: api_container_api.StarlarkValidationError + (*StarlarkExecutionError)(nil), // 25: api_container_api.StarlarkExecutionError + (*StarlarkRunProgress)(nil), // 26: api_container_api.StarlarkRunProgress + (*StarlarkRunFinishedEvent)(nil), // 27: api_container_api.StarlarkRunFinishedEvent + (*GetServicesArgs)(nil), // 28: api_container_api.GetServicesArgs + (*GetServicesResponse)(nil), // 29: api_container_api.GetServicesResponse + (*ServiceIdentifiers)(nil), // 30: api_container_api.ServiceIdentifiers + (*GetExistingAndHistoricalServiceIdentifiersResponse)(nil), // 31: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse + (*ExecCommandArgs)(nil), // 32: api_container_api.ExecCommandArgs + (*ExecCommandResponse)(nil), // 33: api_container_api.ExecCommandResponse + (*WaitForHttpGetEndpointAvailabilityArgs)(nil), // 34: api_container_api.WaitForHttpGetEndpointAvailabilityArgs + (*WaitForHttpPostEndpointAvailabilityArgs)(nil), // 35: api_container_api.WaitForHttpPostEndpointAvailabilityArgs + (*StreamedDataChunk)(nil), // 36: api_container_api.StreamedDataChunk + (*DataChunkMetadata)(nil), // 37: api_container_api.DataChunkMetadata + (*UploadFilesArtifactResponse)(nil), // 38: api_container_api.UploadFilesArtifactResponse + (*DownloadFilesArtifactArgs)(nil), // 39: api_container_api.DownloadFilesArtifactArgs + (*StoreWebFilesArtifactArgs)(nil), // 40: api_container_api.StoreWebFilesArtifactArgs + (*StoreWebFilesArtifactResponse)(nil), // 41: api_container_api.StoreWebFilesArtifactResponse + (*StoreFilesArtifactFromServiceArgs)(nil), // 42: api_container_api.StoreFilesArtifactFromServiceArgs + (*StoreFilesArtifactFromServiceResponse)(nil), // 43: api_container_api.StoreFilesArtifactFromServiceResponse + (*FilesArtifactNameAndUuid)(nil), // 44: api_container_api.FilesArtifactNameAndUuid + (*ListFilesArtifactNamesAndUuidsResponse)(nil), // 45: api_container_api.ListFilesArtifactNamesAndUuidsResponse + (*InspectFilesArtifactContentsRequest)(nil), // 46: api_container_api.InspectFilesArtifactContentsRequest + (*InspectFilesArtifactContentsResponse)(nil), // 47: api_container_api.InspectFilesArtifactContentsResponse + (*FileArtifactContentsFileDescription)(nil), // 48: api_container_api.FileArtifactContentsFileDescription + (*ConnectServicesArgs)(nil), // 49: api_container_api.ConnectServicesArgs + (*ConnectServicesResponse)(nil), // 50: api_container_api.ConnectServicesResponse + (*GetStarlarkRunResponse)(nil), // 51: api_container_api.GetStarlarkRunResponse + (*PlanYaml)(nil), // 52: api_container_api.PlanYaml + (*StarlarkScriptPlanYamlArgs)(nil), // 53: api_container_api.StarlarkScriptPlanYamlArgs + (*StarlarkPackagePlanYamlArgs)(nil), // 54: api_container_api.StarlarkPackagePlanYamlArgs + nil, // 55: api_container_api.Container.EnvVarsEntry + nil, // 56: api_container_api.ServiceInfo.PrivatePortsEntry + nil, // 57: api_container_api.ServiceInfo.MaybePublicPortsEntry + nil, // 58: api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsListEntry + nil, // 59: api_container_api.ServiceInfo.NodeSelectorsEntry + nil, // 60: api_container_api.ServiceInfo.LabelsEntry + nil, // 61: api_container_api.GetServicesArgs.ServiceIdentifiersEntry + nil, // 62: api_container_api.GetServicesResponse.ServiceInfoEntry + (*emptypb.Empty)(nil), // 63: google.protobuf.Empty } var file_api_container_service_proto_depIdxs = []int32{ 5, // 0: api_container_api.Port.transport_protocol:type_name -> api_container_api.Port.TransportProtocol 6, // 1: api_container_api.Container.status:type_name -> api_container_api.Container.Status - 52, // 2: api_container_api.Container.env_vars:type_name -> api_container_api.Container.EnvVarsEntry - 53, // 3: api_container_api.ServiceInfo.private_ports:type_name -> api_container_api.ServiceInfo.PrivatePortsEntry - 54, // 4: api_container_api.ServiceInfo.maybe_public_ports:type_name -> api_container_api.ServiceInfo.MaybePublicPortsEntry + 55, // 2: api_container_api.Container.env_vars:type_name -> api_container_api.Container.EnvVarsEntry + 56, // 3: api_container_api.ServiceInfo.private_ports:type_name -> api_container_api.ServiceInfo.PrivatePortsEntry + 57, // 4: api_container_api.ServiceInfo.maybe_public_ports:type_name -> api_container_api.ServiceInfo.MaybePublicPortsEntry 0, // 5: api_container_api.ServiceInfo.service_status:type_name -> api_container_api.ServiceStatus 8, // 6: api_container_api.ServiceInfo.container:type_name -> api_container_api.Container - 3, // 7: api_container_api.RunStarlarkScriptArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag - 1, // 8: api_container_api.RunStarlarkScriptArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode - 3, // 9: api_container_api.RunStarlarkPackageArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag - 1, // 10: api_container_api.RunStarlarkPackageArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode - 15, // 11: api_container_api.StarlarkRunResponseLine.instruction:type_name -> api_container_api.StarlarkInstruction - 19, // 12: api_container_api.StarlarkRunResponseLine.error:type_name -> api_container_api.StarlarkError - 23, // 13: api_container_api.StarlarkRunResponseLine.progress_info:type_name -> api_container_api.StarlarkRunProgress - 16, // 14: api_container_api.StarlarkRunResponseLine.instruction_result:type_name -> api_container_api.StarlarkInstructionResult - 24, // 15: api_container_api.StarlarkRunResponseLine.run_finished_event:type_name -> api_container_api.StarlarkRunFinishedEvent - 14, // 16: api_container_api.StarlarkRunResponseLine.warning:type_name -> api_container_api.StarlarkWarning - 13, // 17: api_container_api.StarlarkRunResponseLine.info:type_name -> api_container_api.StarlarkInfo - 18, // 18: api_container_api.StarlarkInstruction.position:type_name -> api_container_api.StarlarkInstructionPosition - 17, // 19: api_container_api.StarlarkInstruction.arguments:type_name -> api_container_api.StarlarkInstructionArg - 20, // 20: api_container_api.StarlarkError.interpretation_error:type_name -> api_container_api.StarlarkInterpretationError - 21, // 21: api_container_api.StarlarkError.validation_error:type_name -> api_container_api.StarlarkValidationError - 22, // 22: api_container_api.StarlarkError.execution_error:type_name -> api_container_api.StarlarkExecutionError - 55, // 23: api_container_api.GetServicesArgs.service_identifiers:type_name -> api_container_api.GetServicesArgs.ServiceIdentifiersEntry - 56, // 24: api_container_api.GetServicesResponse.service_info:type_name -> api_container_api.GetServicesResponse.ServiceInfoEntry - 27, // 25: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse.allIdentifiers:type_name -> api_container_api.ServiceIdentifiers - 34, // 26: api_container_api.StreamedDataChunk.metadata:type_name -> api_container_api.DataChunkMetadata - 41, // 27: api_container_api.ListFilesArtifactNamesAndUuidsResponse.file_names_and_uuids:type_name -> api_container_api.FilesArtifactNameAndUuid - 41, // 28: api_container_api.InspectFilesArtifactContentsRequest.file_names_and_uuid:type_name -> api_container_api.FilesArtifactNameAndUuid - 45, // 29: api_container_api.InspectFilesArtifactContentsResponse.file_descriptions:type_name -> api_container_api.FileArtifactContentsFileDescription - 2, // 30: api_container_api.ConnectServicesArgs.connect:type_name -> api_container_api.Connect - 3, // 31: api_container_api.GetStarlarkRunResponse.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag - 4, // 32: api_container_api.GetStarlarkRunResponse.restart_policy:type_name -> api_container_api.RestartPolicy - 7, // 33: api_container_api.ServiceInfo.PrivatePortsEntry.value:type_name -> api_container_api.Port - 7, // 34: api_container_api.ServiceInfo.MaybePublicPortsEntry.value:type_name -> api_container_api.Port - 9, // 35: api_container_api.GetServicesResponse.ServiceInfoEntry.value:type_name -> api_container_api.ServiceInfo - 10, // 36: api_container_api.ApiContainerService.RunStarlarkScript:input_type -> api_container_api.RunStarlarkScriptArgs - 33, // 37: api_container_api.ApiContainerService.UploadStarlarkPackage:input_type -> api_container_api.StreamedDataChunk - 11, // 38: api_container_api.ApiContainerService.RunStarlarkPackage:input_type -> api_container_api.RunStarlarkPackageArgs - 25, // 39: api_container_api.ApiContainerService.GetServices:input_type -> api_container_api.GetServicesArgs - 57, // 40: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:input_type -> google.protobuf.Empty - 29, // 41: api_container_api.ApiContainerService.ExecCommand:input_type -> api_container_api.ExecCommandArgs - 31, // 42: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:input_type -> api_container_api.WaitForHttpGetEndpointAvailabilityArgs - 32, // 43: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:input_type -> api_container_api.WaitForHttpPostEndpointAvailabilityArgs - 33, // 44: api_container_api.ApiContainerService.UploadFilesArtifact:input_type -> api_container_api.StreamedDataChunk - 36, // 45: api_container_api.ApiContainerService.DownloadFilesArtifact:input_type -> api_container_api.DownloadFilesArtifactArgs - 37, // 46: api_container_api.ApiContainerService.StoreWebFilesArtifact:input_type -> api_container_api.StoreWebFilesArtifactArgs - 39, // 47: api_container_api.ApiContainerService.StoreFilesArtifactFromService:input_type -> api_container_api.StoreFilesArtifactFromServiceArgs - 57, // 48: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:input_type -> google.protobuf.Empty - 43, // 49: api_container_api.ApiContainerService.InspectFilesArtifactContents:input_type -> api_container_api.InspectFilesArtifactContentsRequest - 46, // 50: api_container_api.ApiContainerService.ConnectServices:input_type -> api_container_api.ConnectServicesArgs - 57, // 51: api_container_api.ApiContainerService.GetStarlarkRun:input_type -> google.protobuf.Empty - 50, // 52: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:input_type -> api_container_api.StarlarkScriptPlanYamlArgs - 51, // 53: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:input_type -> api_container_api.StarlarkPackagePlanYamlArgs - 12, // 54: api_container_api.ApiContainerService.RunStarlarkScript:output_type -> api_container_api.StarlarkRunResponseLine - 57, // 55: api_container_api.ApiContainerService.UploadStarlarkPackage:output_type -> google.protobuf.Empty - 12, // 56: api_container_api.ApiContainerService.RunStarlarkPackage:output_type -> api_container_api.StarlarkRunResponseLine - 26, // 57: api_container_api.ApiContainerService.GetServices:output_type -> api_container_api.GetServicesResponse - 28, // 58: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:output_type -> api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse - 30, // 59: api_container_api.ApiContainerService.ExecCommand:output_type -> api_container_api.ExecCommandResponse - 57, // 60: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:output_type -> google.protobuf.Empty - 57, // 61: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:output_type -> google.protobuf.Empty - 35, // 62: api_container_api.ApiContainerService.UploadFilesArtifact:output_type -> api_container_api.UploadFilesArtifactResponse - 33, // 63: api_container_api.ApiContainerService.DownloadFilesArtifact:output_type -> api_container_api.StreamedDataChunk - 38, // 64: api_container_api.ApiContainerService.StoreWebFilesArtifact:output_type -> api_container_api.StoreWebFilesArtifactResponse - 40, // 65: api_container_api.ApiContainerService.StoreFilesArtifactFromService:output_type -> api_container_api.StoreFilesArtifactFromServiceResponse - 42, // 66: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:output_type -> api_container_api.ListFilesArtifactNamesAndUuidsResponse - 44, // 67: api_container_api.ApiContainerService.InspectFilesArtifactContents:output_type -> api_container_api.InspectFilesArtifactContentsResponse - 47, // 68: api_container_api.ApiContainerService.ConnectServices:output_type -> api_container_api.ConnectServicesResponse - 48, // 69: api_container_api.ApiContainerService.GetStarlarkRun:output_type -> api_container_api.GetStarlarkRunResponse - 49, // 70: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:output_type -> api_container_api.PlanYaml - 49, // 71: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:output_type -> api_container_api.PlanYaml - 54, // [54:72] is the sub-list for method output_type - 36, // [36:54] is the sub-list for method input_type - 36, // [36:36] is the sub-list for extension type_name - 36, // [36:36] is the sub-list for extension extendee - 0, // [0:36] is the sub-list for field type_name + 58, // 7: api_container_api.ServiceInfo.service_dir_paths_to_files_artifacts_list:type_name -> api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsListEntry + 10, // 8: api_container_api.ServiceInfo.user:type_name -> api_container_api.User + 11, // 9: api_container_api.ServiceInfo.tolerations:type_name -> api_container_api.Toleration + 59, // 10: api_container_api.ServiceInfo.node_selectors:type_name -> api_container_api.ServiceInfo.NodeSelectorsEntry + 60, // 11: api_container_api.ServiceInfo.labels:type_name -> api_container_api.ServiceInfo.LabelsEntry + 3, // 12: api_container_api.RunStarlarkScriptArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag + 1, // 13: api_container_api.RunStarlarkScriptArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode + 3, // 14: api_container_api.RunStarlarkPackageArgs.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag + 1, // 15: api_container_api.RunStarlarkPackageArgs.image_download_mode:type_name -> api_container_api.ImageDownloadMode + 18, // 16: api_container_api.StarlarkRunResponseLine.instruction:type_name -> api_container_api.StarlarkInstruction + 22, // 17: api_container_api.StarlarkRunResponseLine.error:type_name -> api_container_api.StarlarkError + 26, // 18: api_container_api.StarlarkRunResponseLine.progress_info:type_name -> api_container_api.StarlarkRunProgress + 19, // 19: api_container_api.StarlarkRunResponseLine.instruction_result:type_name -> api_container_api.StarlarkInstructionResult + 27, // 20: api_container_api.StarlarkRunResponseLine.run_finished_event:type_name -> api_container_api.StarlarkRunFinishedEvent + 17, // 21: api_container_api.StarlarkRunResponseLine.warning:type_name -> api_container_api.StarlarkWarning + 16, // 22: api_container_api.StarlarkRunResponseLine.info:type_name -> api_container_api.StarlarkInfo + 21, // 23: api_container_api.StarlarkInstruction.position:type_name -> api_container_api.StarlarkInstructionPosition + 20, // 24: api_container_api.StarlarkInstruction.arguments:type_name -> api_container_api.StarlarkInstructionArg + 23, // 25: api_container_api.StarlarkError.interpretation_error:type_name -> api_container_api.StarlarkInterpretationError + 24, // 26: api_container_api.StarlarkError.validation_error:type_name -> api_container_api.StarlarkValidationError + 25, // 27: api_container_api.StarlarkError.execution_error:type_name -> api_container_api.StarlarkExecutionError + 61, // 28: api_container_api.GetServicesArgs.service_identifiers:type_name -> api_container_api.GetServicesArgs.ServiceIdentifiersEntry + 62, // 29: api_container_api.GetServicesResponse.service_info:type_name -> api_container_api.GetServicesResponse.ServiceInfoEntry + 30, // 30: api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse.allIdentifiers:type_name -> api_container_api.ServiceIdentifiers + 37, // 31: api_container_api.StreamedDataChunk.metadata:type_name -> api_container_api.DataChunkMetadata + 44, // 32: api_container_api.ListFilesArtifactNamesAndUuidsResponse.file_names_and_uuids:type_name -> api_container_api.FilesArtifactNameAndUuid + 44, // 33: api_container_api.InspectFilesArtifactContentsRequest.file_names_and_uuid:type_name -> api_container_api.FilesArtifactNameAndUuid + 48, // 34: api_container_api.InspectFilesArtifactContentsResponse.file_descriptions:type_name -> api_container_api.FileArtifactContentsFileDescription + 2, // 35: api_container_api.ConnectServicesArgs.connect:type_name -> api_container_api.Connect + 3, // 36: api_container_api.GetStarlarkRunResponse.experimental_features:type_name -> api_container_api.KurtosisFeatureFlag + 4, // 37: api_container_api.GetStarlarkRunResponse.restart_policy:type_name -> api_container_api.RestartPolicy + 7, // 38: api_container_api.ServiceInfo.PrivatePortsEntry.value:type_name -> api_container_api.Port + 7, // 39: api_container_api.ServiceInfo.MaybePublicPortsEntry.value:type_name -> api_container_api.Port + 9, // 40: api_container_api.ServiceInfo.ServiceDirPathsToFilesArtifactsListEntry.value:type_name -> api_container_api.FilesArtifactsList + 12, // 41: api_container_api.GetServicesResponse.ServiceInfoEntry.value:type_name -> api_container_api.ServiceInfo + 13, // 42: api_container_api.ApiContainerService.RunStarlarkScript:input_type -> api_container_api.RunStarlarkScriptArgs + 36, // 43: api_container_api.ApiContainerService.UploadStarlarkPackage:input_type -> api_container_api.StreamedDataChunk + 14, // 44: api_container_api.ApiContainerService.RunStarlarkPackage:input_type -> api_container_api.RunStarlarkPackageArgs + 28, // 45: api_container_api.ApiContainerService.GetServices:input_type -> api_container_api.GetServicesArgs + 63, // 46: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:input_type -> google.protobuf.Empty + 32, // 47: api_container_api.ApiContainerService.ExecCommand:input_type -> api_container_api.ExecCommandArgs + 34, // 48: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:input_type -> api_container_api.WaitForHttpGetEndpointAvailabilityArgs + 35, // 49: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:input_type -> api_container_api.WaitForHttpPostEndpointAvailabilityArgs + 36, // 50: api_container_api.ApiContainerService.UploadFilesArtifact:input_type -> api_container_api.StreamedDataChunk + 39, // 51: api_container_api.ApiContainerService.DownloadFilesArtifact:input_type -> api_container_api.DownloadFilesArtifactArgs + 40, // 52: api_container_api.ApiContainerService.StoreWebFilesArtifact:input_type -> api_container_api.StoreWebFilesArtifactArgs + 42, // 53: api_container_api.ApiContainerService.StoreFilesArtifactFromService:input_type -> api_container_api.StoreFilesArtifactFromServiceArgs + 63, // 54: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:input_type -> google.protobuf.Empty + 46, // 55: api_container_api.ApiContainerService.InspectFilesArtifactContents:input_type -> api_container_api.InspectFilesArtifactContentsRequest + 49, // 56: api_container_api.ApiContainerService.ConnectServices:input_type -> api_container_api.ConnectServicesArgs + 63, // 57: api_container_api.ApiContainerService.GetStarlarkRun:input_type -> google.protobuf.Empty + 53, // 58: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:input_type -> api_container_api.StarlarkScriptPlanYamlArgs + 54, // 59: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:input_type -> api_container_api.StarlarkPackagePlanYamlArgs + 15, // 60: api_container_api.ApiContainerService.RunStarlarkScript:output_type -> api_container_api.StarlarkRunResponseLine + 63, // 61: api_container_api.ApiContainerService.UploadStarlarkPackage:output_type -> google.protobuf.Empty + 15, // 62: api_container_api.ApiContainerService.RunStarlarkPackage:output_type -> api_container_api.StarlarkRunResponseLine + 29, // 63: api_container_api.ApiContainerService.GetServices:output_type -> api_container_api.GetServicesResponse + 31, // 64: api_container_api.ApiContainerService.GetExistingAndHistoricalServiceIdentifiers:output_type -> api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse + 33, // 65: api_container_api.ApiContainerService.ExecCommand:output_type -> api_container_api.ExecCommandResponse + 63, // 66: api_container_api.ApiContainerService.WaitForHttpGetEndpointAvailability:output_type -> google.protobuf.Empty + 63, // 67: api_container_api.ApiContainerService.WaitForHttpPostEndpointAvailability:output_type -> google.protobuf.Empty + 38, // 68: api_container_api.ApiContainerService.UploadFilesArtifact:output_type -> api_container_api.UploadFilesArtifactResponse + 36, // 69: api_container_api.ApiContainerService.DownloadFilesArtifact:output_type -> api_container_api.StreamedDataChunk + 41, // 70: api_container_api.ApiContainerService.StoreWebFilesArtifact:output_type -> api_container_api.StoreWebFilesArtifactResponse + 43, // 71: api_container_api.ApiContainerService.StoreFilesArtifactFromService:output_type -> api_container_api.StoreFilesArtifactFromServiceResponse + 45, // 72: api_container_api.ApiContainerService.ListFilesArtifactNamesAndUuids:output_type -> api_container_api.ListFilesArtifactNamesAndUuidsResponse + 47, // 73: api_container_api.ApiContainerService.InspectFilesArtifactContents:output_type -> api_container_api.InspectFilesArtifactContentsResponse + 50, // 74: api_container_api.ApiContainerService.ConnectServices:output_type -> api_container_api.ConnectServicesResponse + 51, // 75: api_container_api.ApiContainerService.GetStarlarkRun:output_type -> api_container_api.GetStarlarkRunResponse + 52, // 76: api_container_api.ApiContainerService.GetStarlarkScriptPlanYaml:output_type -> api_container_api.PlanYaml + 52, // 77: api_container_api.ApiContainerService.GetStarlarkPackagePlanYaml:output_type -> api_container_api.PlanYaml + 60, // [60:78] is the sub-list for method output_type + 42, // [42:60] is the sub-list for method input_type + 42, // [42:42] is the sub-list for extension type_name + 42, // [42:42] is the sub-list for extension extendee + 0, // [0:42] is the sub-list for field type_name } func init() { file_api_container_service_proto_init() } @@ -4468,7 +4824,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceInfo); i { + switch v := v.(*FilesArtifactsList); i { case 0: return &v.state case 1: @@ -4480,7 +4836,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunStarlarkScriptArgs); i { + switch v := v.(*User); i { case 0: return &v.state case 1: @@ -4492,7 +4848,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RunStarlarkPackageArgs); i { + switch v := v.(*Toleration); i { case 0: return &v.state case 1: @@ -4504,7 +4860,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkRunResponseLine); i { + switch v := v.(*ServiceInfo); i { case 0: return &v.state case 1: @@ -4516,7 +4872,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInfo); i { + switch v := v.(*RunStarlarkScriptArgs); i { case 0: return &v.state case 1: @@ -4528,7 +4884,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkWarning); i { + switch v := v.(*RunStarlarkPackageArgs); i { case 0: return &v.state case 1: @@ -4540,7 +4896,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInstruction); i { + switch v := v.(*StarlarkRunResponseLine); i { case 0: return &v.state case 1: @@ -4552,7 +4908,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInstructionResult); i { + switch v := v.(*StarlarkInfo); i { case 0: return &v.state case 1: @@ -4564,7 +4920,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInstructionArg); i { + switch v := v.(*StarlarkWarning); i { case 0: return &v.state case 1: @@ -4576,7 +4932,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInstructionPosition); i { + switch v := v.(*StarlarkInstruction); i { case 0: return &v.state case 1: @@ -4588,7 +4944,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkError); i { + switch v := v.(*StarlarkInstructionResult); i { case 0: return &v.state case 1: @@ -4600,7 +4956,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkInterpretationError); i { + switch v := v.(*StarlarkInstructionArg); i { case 0: return &v.state case 1: @@ -4612,7 +4968,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkValidationError); i { + switch v := v.(*StarlarkInstructionPosition); i { case 0: return &v.state case 1: @@ -4624,7 +4980,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkExecutionError); i { + switch v := v.(*StarlarkError); i { case 0: return &v.state case 1: @@ -4636,7 +4992,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkRunProgress); i { + switch v := v.(*StarlarkInterpretationError); i { case 0: return &v.state case 1: @@ -4648,7 +5004,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkRunFinishedEvent); i { + switch v := v.(*StarlarkValidationError); i { case 0: return &v.state case 1: @@ -4660,7 +5016,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetServicesArgs); i { + switch v := v.(*StarlarkExecutionError); i { case 0: return &v.state case 1: @@ -4672,7 +5028,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetServicesResponse); i { + switch v := v.(*StarlarkRunProgress); i { case 0: return &v.state case 1: @@ -4684,7 +5040,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ServiceIdentifiers); i { + switch v := v.(*StarlarkRunFinishedEvent); i { case 0: return &v.state case 1: @@ -4696,7 +5052,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetExistingAndHistoricalServiceIdentifiersResponse); i { + switch v := v.(*GetServicesArgs); i { case 0: return &v.state case 1: @@ -4708,7 +5064,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExecCommandArgs); i { + switch v := v.(*GetServicesResponse); i { case 0: return &v.state case 1: @@ -4720,7 +5076,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExecCommandResponse); i { + switch v := v.(*ServiceIdentifiers); i { case 0: return &v.state case 1: @@ -4732,7 +5088,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WaitForHttpGetEndpointAvailabilityArgs); i { + switch v := v.(*GetExistingAndHistoricalServiceIdentifiersResponse); i { case 0: return &v.state case 1: @@ -4744,7 +5100,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WaitForHttpPostEndpointAvailabilityArgs); i { + switch v := v.(*ExecCommandArgs); i { case 0: return &v.state case 1: @@ -4756,7 +5112,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamedDataChunk); i { + switch v := v.(*ExecCommandResponse); i { case 0: return &v.state case 1: @@ -4768,7 +5124,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DataChunkMetadata); i { + switch v := v.(*WaitForHttpGetEndpointAvailabilityArgs); i { case 0: return &v.state case 1: @@ -4780,7 +5136,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UploadFilesArtifactResponse); i { + switch v := v.(*WaitForHttpPostEndpointAvailabilityArgs); i { case 0: return &v.state case 1: @@ -4792,7 +5148,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DownloadFilesArtifactArgs); i { + switch v := v.(*StreamedDataChunk); i { case 0: return &v.state case 1: @@ -4804,7 +5160,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreWebFilesArtifactArgs); i { + switch v := v.(*DataChunkMetadata); i { case 0: return &v.state case 1: @@ -4816,7 +5172,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreWebFilesArtifactResponse); i { + switch v := v.(*UploadFilesArtifactResponse); i { case 0: return &v.state case 1: @@ -4828,7 +5184,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreFilesArtifactFromServiceArgs); i { + switch v := v.(*DownloadFilesArtifactArgs); i { case 0: return &v.state case 1: @@ -4840,7 +5196,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StoreFilesArtifactFromServiceResponse); i { + switch v := v.(*StoreWebFilesArtifactArgs); i { case 0: return &v.state case 1: @@ -4852,7 +5208,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FilesArtifactNameAndUuid); i { + switch v := v.(*StoreWebFilesArtifactResponse); i { case 0: return &v.state case 1: @@ -4864,7 +5220,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFilesArtifactNamesAndUuidsResponse); i { + switch v := v.(*StoreFilesArtifactFromServiceArgs); i { case 0: return &v.state case 1: @@ -4876,7 +5232,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InspectFilesArtifactContentsRequest); i { + switch v := v.(*StoreFilesArtifactFromServiceResponse); i { case 0: return &v.state case 1: @@ -4888,7 +5244,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InspectFilesArtifactContentsResponse); i { + switch v := v.(*FilesArtifactNameAndUuid); i { case 0: return &v.state case 1: @@ -4900,7 +5256,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FileArtifactContentsFileDescription); i { + switch v := v.(*ListFilesArtifactNamesAndUuidsResponse); i { case 0: return &v.state case 1: @@ -4912,7 +5268,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConnectServicesArgs); i { + switch v := v.(*InspectFilesArtifactContentsRequest); i { case 0: return &v.state case 1: @@ -4924,7 +5280,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConnectServicesResponse); i { + switch v := v.(*InspectFilesArtifactContentsResponse); i { case 0: return &v.state case 1: @@ -4936,7 +5292,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetStarlarkRunResponse); i { + switch v := v.(*FileArtifactContentsFileDescription); i { case 0: return &v.state case 1: @@ -4948,7 +5304,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PlanYaml); i { + switch v := v.(*ConnectServicesArgs); i { case 0: return &v.state case 1: @@ -4960,7 +5316,7 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StarlarkScriptPlanYamlArgs); i { + switch v := v.(*ConnectServicesResponse); i { case 0: return &v.state case 1: @@ -4972,6 +5328,42 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStarlarkRunResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_container_service_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PlanYaml); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_container_service_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StarlarkScriptPlanYamlArgs); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_container_service_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StarlarkPackagePlanYamlArgs); i { case 0: return &v.state @@ -4985,12 +5377,13 @@ func file_api_container_service_proto_init() { } } file_api_container_service_proto_msgTypes[0].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[3].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[4].OneofWrappers = []interface{}{ + file_api_container_service_proto_msgTypes[5].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[6].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[7].OneofWrappers = []interface{}{ (*RunStarlarkPackageArgs_Local)(nil), (*RunStarlarkPackageArgs_Remote)(nil), } - file_api_container_service_proto_msgTypes[5].OneofWrappers = []interface{}{ + file_api_container_service_proto_msgTypes[8].OneofWrappers = []interface{}{ (*StarlarkRunResponseLine_Instruction)(nil), (*StarlarkRunResponseLine_Error)(nil), (*StarlarkRunResponseLine_ProgressInfo)(nil), @@ -4999,26 +5392,26 @@ func file_api_container_service_proto_init() { (*StarlarkRunResponseLine_Warning)(nil), (*StarlarkRunResponseLine_Info)(nil), } - file_api_container_service_proto_msgTypes[10].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[12].OneofWrappers = []interface{}{ + file_api_container_service_proto_msgTypes[13].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[15].OneofWrappers = []interface{}{ (*StarlarkError_InterpretationError)(nil), (*StarlarkError_ValidationError)(nil), (*StarlarkError_ExecutionError)(nil), } - file_api_container_service_proto_msgTypes[17].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[24].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[25].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[38].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[20].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[27].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[28].OneofWrappers = []interface{}{} file_api_container_service_proto_msgTypes[41].OneofWrappers = []interface{}{} - file_api_container_service_proto_msgTypes[43].OneofWrappers = []interface{}{} file_api_container_service_proto_msgTypes[44].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[46].OneofWrappers = []interface{}{} + file_api_container_service_proto_msgTypes[47].OneofWrappers = []interface{}{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_container_service_proto_rawDesc, NumEnums: 7, - NumMessages: 50, + NumMessages: 56, NumExtensions: 0, NumServices: 1, }, diff --git a/api/golang/core/lib/binding_constructors/binding_constructors.go b/api/golang/core/lib/binding_constructors/binding_constructors.go index d97b7ee228..2fec7d4b11 100644 --- a/api/golang/core/lib/binding_constructors/binding_constructors.go +++ b/api/golang/core/lib/binding_constructors/binding_constructors.go @@ -362,17 +362,37 @@ func NewServiceInfo( maybePublicPorts map[string]*kurtosis_core_rpc_api_bindings.Port, serviceStatus kurtosis_core_rpc_api_bindings.ServiceStatus, container *kurtosis_core_rpc_api_bindings.Container, + serviceDirPathsToFilesArtifactsList map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList, + minMillicpus uint32, + maxMillicpus uint32, + minMemoryMegabytes uint32, + maxMemoryMegabytes uint32, + user *kurtosis_core_rpc_api_bindings.User, + tolerations []*kurtosis_core_rpc_api_bindings.Toleration, + nodeSelectors map[string]string, + labels map[string]string, + tiniEnabled bool, ) *kurtosis_core_rpc_api_bindings.ServiceInfo { return &kurtosis_core_rpc_api_bindings.ServiceInfo{ - ServiceUuid: uuid, - Name: name, - ShortenedUuid: shortenedUuid, - PrivateIpAddr: privateIpAddr, - PrivatePorts: privatePorts, - MaybePublicIpAddr: maybePublicIpAddr, - MaybePublicPorts: maybePublicPorts, - ServiceStatus: serviceStatus, - Container: container, + ServiceUuid: uuid, + Name: name, + ShortenedUuid: shortenedUuid, + PrivateIpAddr: privateIpAddr, + PrivatePorts: privatePorts, + MaybePublicIpAddr: maybePublicIpAddr, + MaybePublicPorts: maybePublicPorts, + ServiceStatus: serviceStatus, + Container: container, + ServiceDirPathsToFilesArtifactsList: serviceDirPathsToFilesArtifactsList, + MaxMillicpus: maxMillicpus, + MinMillicpus: minMillicpus, + MaxMemoryMegabytes: maxMemoryMegabytes, + MinMemoryMegabytes: minMemoryMegabytes, + User: user, + Tolerations: tolerations, + NodeSelectors: nodeSelectors, + Labels: labels, + TiniEnabled: &tiniEnabled, } } diff --git a/api/golang/core/lib/services/service_config_builder.go b/api/golang/core/lib/services/service_config_builder.go index 5fc27502ac..42ca082118 100644 --- a/api/golang/core/lib/services/service_config_builder.go +++ b/api/golang/core/lib/services/service_config_builder.go @@ -9,6 +9,46 @@ import ( type FilesArtifactUUID string type FileArtifactName string +type Port struct { + Number uint32 `json:"number" yaml:"number"` + Transport int `json:"transport" yaml:"transport"` // e.g. "TCP", "UDP" + MaybeApplicationProtocol string `json:"maybe_application_protocol,omitempty" yaml:"maybe_application_protocol,omitempty"` + Wait string `json:"wait,omitempty" yaml:"wait,omitempty"` +} + +type User struct { + UID uint32 `json:"uid" yaml:"uid"` + GID uint32 `json:"gid,omitempty" yaml:"gid,omitempty"` +} + +type Toleration struct { + Key string `json:"key" yaml:"key"` + Value string `json:"value" yaml:"value"` + Operator string `json:"operator" yaml:"operator"` + Effect string `json:"effect" yaml:"effect"` + TolerationSeconds int64 `json:"toleration_seconds" yaml:"toleration_seconds"` +} + +type ServiceConfig struct { + Image string `json:"image" yaml:"image"` + PrivatePorts map[string]Port `json:"ports,omitempty" yaml:"ports,omitempty"` + PublicPorts map[string]Port `json:"public_ports,omitempty" yaml:"public_ports,omitempty"` + Files map[string][]string `json:"files,omitempty" yaml:"files,omitempty"` + Entrypoint []string `json:"entrypoint,omitempty" yaml:"entrypoint,omitempty"` + Cmd []string `json:"cmd,omitempty" yaml:"cmd,omitempty"` + EnvVars map[string]string `json:"env_vars,omitempty" yaml:"env_vars,omitempty"` + PrivateIPAddressPlaceholder string `json:"private_ip_address_placeholder,omitempty" yaml:"private_ip_address_placeholder,omitempty"` + MaxMillicpus uint32 `json:"max_cpu,omitempty" yaml:"max_cpu,omitempty"` + MinMillicpus uint32 `json:"min_cpu,omitempty" yaml:"min_cpu,omitempty"` + MaxMemory uint32 `json:"max_memory,omitempty" yaml:"max_memory,omitempty"` + MinMemory uint32 `json:"min_memory,omitempty" yaml:"min_memory,omitempty"` + User *User `json:"user,omitempty" yaml:"user,omitempty"` + Tolerations []Toleration `json:"tolerations,omitempty" yaml:"tolerations,omitempty"` + Labels map[string]string `json:"labels,omitempty" yaml:"labels,omitempty"` + NodeSelectors map[string]string `json:"node_selectors,omitempty" yaml:"node_selectors,omitempty"` + TiniEnabled *bool `json:"tini_enabled,omitempty" yaml:"tini_enabled,omitempty"` +} + func portToStarlark(port *kurtosis_core_rpc_api_bindings.Port) string { starlarkFields := []string{} starlarkFields = append(starlarkFields, fmt.Sprintf(`number=%d`, port.GetNumber())) @@ -24,10 +64,10 @@ func portToStarlark(port *kurtosis_core_rpc_api_bindings.Port) string { return fmt.Sprintf("PortSpec(%s)", strings.Join(starlarkFields, ",")) } -func GetServiceConfigStarlark( +func GetSimpleServiceConfigStarlark( containerImageName string, privatePorts map[string]*kurtosis_core_rpc_api_bindings.Port, - fileArtifactMountPoints map[string]string, + fileArtifactMountPoints map[string][]string, entrypointArgs []string, cmdArgs []string, envVars map[string]string, @@ -48,10 +88,16 @@ func GetServiceConfigStarlark( starlarkFields = append(starlarkFields, fmt.Sprintf(`ports={%s}`, strings.Join(portStrings, ","))) fileStrings := []string{} - for filePath, artifactName := range fileArtifactMountPoints { - fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, artifactName)) + for filePath, artifactNames := range fileArtifactMountPoints { + if len(artifactNames) > 1 { // if multiple files artifacts mounted, create a Directory + fileStrings = append(fileStrings, fmt.Sprintf(`%q: %s`, filePath, createDirectoryStarlarkStr(artifactNames))) + } else { + fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, artifactNames[0])) + } + } + if len(fileStrings) > 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`files={%s}`, strings.Join(fileStrings, ","))) } - starlarkFields = append(starlarkFields, fmt.Sprintf(`files={%s}`, strings.Join(fileStrings, ","))) quotedEntrypointArgs := []string{} for _, entrypointArg := range entrypointArgs { @@ -89,3 +135,210 @@ func GetServiceConfigStarlark( return fmt.Sprintf("ServiceConfig(%s)", strings.Join(starlarkFields, ",")) } + +func GetFullServiceConfigStarlark( + containerImageName string, + privatePorts map[string]*kurtosis_core_rpc_api_bindings.Port, + fileArtifactMountPoints map[string][]string, + entrypointArgs []string, + cmdArgs []string, + envVars map[string]string, + cpuAllocationMillicpus uint32, + memoryAllocationMegabytes uint32, + minCpuMilliCores uint32, + minMemoryMegaBytes uint32, + user *User, + tolerations []Toleration, + nodeSelectors map[string]string, + labels map[string]string, + tiniEnabled *bool, + privateIpAddrPlaceholder string, +) string { + starlarkFields := []string{} + starlarkFields = append(starlarkFields, fmt.Sprintf(`image=%q`, containerImageName)) + + // Ports + portStrings := []string{} + for portId, port := range privatePorts { + portStrings = append(portStrings, fmt.Sprintf(`%q: %s`, portId, portToStarlark(port))) + } + if len(portStrings) > 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`ports={%s}`, strings.Join(portStrings, ","))) + } + + // Files + fileStrings := []string{} + for filePath, artifactNames := range fileArtifactMountPoints { + if len(artifactNames) > 1 { // if multiple files artifacts mounted, create a Directory + fileStrings = append(fileStrings, fmt.Sprintf(`%q: %s`, filePath, createDirectoryStarlarkStr(artifactNames))) + } else { + fileStrings = append(fileStrings, fmt.Sprintf(`%q: %q`, filePath, artifactNames[0])) + } + } + if len(fileStrings) > 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`files={%s}`, strings.Join(fileStrings, ","))) + } + + // Entrypoint + if len(entrypointArgs) > 0 { + quotedEntrypointArgs := []string{} + for _, arg := range entrypointArgs { + quotedEntrypointArgs = append(quotedEntrypointArgs, fmt.Sprintf(`%q`, arg)) + } + starlarkFields = append(starlarkFields, fmt.Sprintf(`entrypoint=[%s]`, strings.Join(quotedEntrypointArgs, ", "))) + } + + // Cmd + if len(cmdArgs) > 0 { + quotedCmdArgs := []string{} + for _, arg := range cmdArgs { + quotedCmdArgs = append(quotedCmdArgs, fmt.Sprintf(`%q`, arg)) + } + starlarkFields = append(starlarkFields, fmt.Sprintf(`cmd=[%s]`, strings.Join(quotedCmdArgs, ", "))) + } + + // Env Vars + if len(envVars) > 0 { + envVarStrings := []string{} + for k, v := range envVars { + envVarStrings = append(envVarStrings, fmt.Sprintf(`%q: %q`, k, v)) + } + starlarkFields = append(starlarkFields, fmt.Sprintf(`env_vars={%s}`, strings.Join(envVarStrings, ","))) + } + + // Optional simple fields + if cpuAllocationMillicpus != 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`max_cpu=%d`, cpuAllocationMillicpus)) + } + if memoryAllocationMegabytes != 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`max_memory=%d`, memoryAllocationMegabytes)) + } + if minCpuMilliCores != 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`min_cpu=%d`, minCpuMilliCores)) + } + if minMemoryMegaBytes != 0 { + starlarkFields = append(starlarkFields, fmt.Sprintf(`min_memory=%d`, minMemoryMegaBytes)) + } + + if privateIpAddrPlaceholder != "" { + starlarkFields = append(starlarkFields, fmt.Sprintf(`private_ip_address_placeholder=%q`, privateIpAddrPlaceholder)) + } + + // User + if user != nil { + userStr := fmt.Sprintf("User(uid=%d", user.UID) + if user.GID != 0 { + userStr += fmt.Sprintf(", gid=%d", user.GID) + } + userStr += ")" + starlarkFields = append(starlarkFields, fmt.Sprintf(`user=%s`, userStr)) + } + + // Tolerations + if len(tolerations) > 0 { + tolerationStrs := []string{} + for _, t := range tolerations { + tolerationStrs = append(tolerationStrs, fmt.Sprintf( + `Toleration(key=%q, value=%q, operator=%q, effect=%q, toleration_seconds=%d)`, + t.Key, t.Value, t.Operator, t.Effect, t.TolerationSeconds, + )) + } + starlarkFields = append(starlarkFields, fmt.Sprintf(`tolerations=[%s]`, strings.Join(tolerationStrs, ", "))) + } + + // Node selectors + if len(nodeSelectors) > 0 { + selectorStrs := []string{} + for k, v := range nodeSelectors { + selectorStrs = append(selectorStrs, fmt.Sprintf(`%q: %q`, k, v)) + } + starlarkFields = append(starlarkFields, fmt.Sprintf(`node_selectors={%s}`, strings.Join(selectorStrs, ", "))) + } + + // Labels + if len(labels) > 0 { + labelStrs := []string{} + for k, v := range labels { + labelStrs = append(labelStrs, fmt.Sprintf(`%q: %q`, k, v)) + } + starlarkFields = append(starlarkFields, fmt.Sprintf(`labels={%s}`, strings.Join(labelStrs, ", "))) + } + + // Tini + if tiniEnabled != nil && !*tiniEnabled { + starlarkFields = append(starlarkFields, `tini_enabled=False`) + } + + return fmt.Sprintf("ServiceConfig(%s)", strings.Join(starlarkFields, ", ")) +} + +func ConvertJsonPortToApiPort(jsonPorts map[string]Port) map[string]*kurtosis_core_rpc_api_bindings.Port { + apiPorts := map[string]*kurtosis_core_rpc_api_bindings.Port{} + for portId, port := range jsonPorts { + apiPort := &kurtosis_core_rpc_api_bindings.Port{ + Number: port.Number, + TransportProtocol: kurtosis_core_rpc_api_bindings.Port_TransportProtocol(port.Transport), + MaybeApplicationProtocol: port.MaybeApplicationProtocol, + MaybeWaitTimeout: port.Wait, + Locked: nil, + Alias: nil, + } + apiPorts[portId] = apiPort + } + return apiPorts +} + +func ConvertApiPortToJsonPort(apiPorts map[string]*kurtosis_core_rpc_api_bindings.Port) map[string]Port { + jsonPorts := map[string]Port{} + for portId, apiPort := range apiPorts { + jsonPort := Port{ + Number: apiPort.GetNumber(), + Transport: int(apiPort.TransportProtocol), + MaybeApplicationProtocol: apiPort.GetMaybeApplicationProtocol(), + Wait: apiPort.GetMaybeWaitTimeout(), + } + jsonPorts[portId] = jsonPort + } + return jsonPorts +} + +func ConvertApiFilesArtifactsToJsonFiles(serviceDirPathsToFilesArtifactsList map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList) map[string][]string { + serviceDirPathsToFilesArtifacts := map[string][]string{} + for serviceDirPath, filesArtifactsList := range serviceDirPathsToFilesArtifactsList { + filesArtifactsIdentifiers := filesArtifactsList.GetFilesArtifactsIdentifiers() + serviceDirPathsToFilesArtifacts[serviceDirPath] = filesArtifactsIdentifiers + } + return serviceDirPathsToFilesArtifacts +} + +func ConvertApiUserToJsonUser(user *kurtosis_core_rpc_api_bindings.User) *User { + if user == nil { + return nil + } + return &User{ + UID: user.GetUid(), + GID: user.GetGid(), + } +} + +func ConvertApiTolerationsToJsonTolerations(tolerations []*kurtosis_core_rpc_api_bindings.Toleration) []Toleration { + jsonTolerations := []Toleration{} + for _, apiToleration := range tolerations { + jsonTolerations = append(jsonTolerations, Toleration{ + Key: apiToleration.GetKey(), + Value: apiToleration.GetValue(), + Operator: apiToleration.GetOperator(), + Effect: apiToleration.GetEffect(), + TolerationSeconds: apiToleration.GetTolerationSeconds(), + }) + } + return jsonTolerations +} + +func createDirectoryStarlarkStr(artifactNames []string) string { + quoted := make([]string, len(artifactNames)) + for i, name := range artifactNames { + quoted[i] = fmt.Sprintf("%q", name) // adds double quotes around each string needed for identifying artifacts + } + return fmt.Sprintf("Directory(artifact_names=[%s])", strings.Join(quoted, ", ")) +} diff --git a/api/protobuf/core/api_container_service.proto b/api/protobuf/core/api_container_service.proto index c29772ede3..cc8394c8ce 100644 --- a/api/protobuf/core/api_container_service.proto +++ b/api/protobuf/core/api_container_service.proto @@ -111,6 +111,30 @@ enum ImageDownloadMode { missing = 1; } +message FilesArtifactsList { + repeated string files_artifacts_identifiers = 1; +} + +// Equivalent of user on ServiceConfig +message User { + uint32 uid = 1; + + uint32 gid = 2; +} + +// Equivalent of tolerations on ServiceConfig +message Toleration { + string key = 1; + + string operator = 2; + + string value = 3; + + string effect = 4; + + int64 toleration_seconds = 5; +} + message ServiceInfo { // UUID of the service string service_uuid = 1; @@ -142,6 +166,32 @@ message ServiceInfo { // Docker container or Kubernetes pod container Container container = 9; + + // Mapping of directory paths on service to names of files artifacts that are mounted to that directory + map service_dir_paths_to_files_artifacts_list = 10; + + uint32 max_millicpus = 11; + + uint32 min_millicpus = 12; + + uint32 max_memory_megabytes = 13; + + uint32 min_memory_megabytes = 14; + + // Optional user identity for the service + optional User user = 15; + + // Optional list of Kubernetes tolerations + repeated Toleration tolerations = 16; + + // Optional node selectors for pod placement + map node_selectors = 17; + + // Optional labels + map labels = 18; + + // Whether Tini is enabled + optional bool tini_enabled = 19; } // ============================================================================================== diff --git a/api/rust/src/api_container_api.rs b/api/rust/src/api_container_api.rs index 451c0e5848..2df10e26b7 100644 --- a/api/rust/src/api_container_api.rs +++ b/api/rust/src/api_container_api.rs @@ -124,6 +124,38 @@ pub mod container { } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] +pub struct FilesArtifactsList { + #[prost(string, repeated, tag = "1")] + pub files_artifacts_identifiers: ::prost::alloc::vec::Vec< + ::prost::alloc::string::String, + >, +} +/// Equivalent of user on ServiceConfig +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct User { + #[prost(uint32, tag = "1")] + pub uid: u32, + #[prost(uint32, tag = "2")] + pub gid: u32, +} +/// Equivalent of tolerations on ServiceConfig +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct Toleration { + #[prost(string, tag = "1")] + pub key: ::prost::alloc::string::String, + #[prost(string, tag = "2")] + pub operator: ::prost::alloc::string::String, + #[prost(string, tag = "3")] + pub value: ::prost::alloc::string::String, + #[prost(string, tag = "4")] + pub effect: ::prost::alloc::string::String, + #[prost(int64, tag = "5")] + pub toleration_seconds: i64, +} +#[allow(clippy::derive_partial_eq_without_eq)] +#[derive(Clone, PartialEq, ::prost::Message)] pub struct ServiceInfo { /// UUID of the service #[prost(string, tag = "1")] @@ -159,6 +191,41 @@ pub struct ServiceInfo { /// Docker container or Kubernetes pod container #[prost(message, optional, tag = "9")] pub container: ::core::option::Option, + /// Mapping of directory paths on service to names of files artifacts that are mounted to that directory + #[prost(map = "string, message", tag = "10")] + pub service_dir_paths_to_files_artifacts_list: ::std::collections::HashMap< + ::prost::alloc::string::String, + FilesArtifactsList, + >, + #[prost(uint32, tag = "11")] + pub max_millicpus: u32, + #[prost(uint32, tag = "12")] + pub min_millicpus: u32, + #[prost(uint32, tag = "13")] + pub max_memory_megabytes: u32, + #[prost(uint32, tag = "14")] + pub min_memory_megabytes: u32, + /// Optional user identity for the service + #[prost(message, optional, tag = "15")] + pub user: ::core::option::Option, + /// Optional list of Kubernetes tolerations + #[prost(message, repeated, tag = "16")] + pub tolerations: ::prost::alloc::vec::Vec, + /// Optional node selectors for pod placement + #[prost(map = "string, string", tag = "17")] + pub node_selectors: ::std::collections::HashMap< + ::prost::alloc::string::String, + ::prost::alloc::string::String, + >, + /// Optional labels + #[prost(map = "string, string", tag = "18")] + pub labels: ::std::collections::HashMap< + ::prost::alloc::string::String, + ::prost::alloc::string::String, + >, + /// Whether Tini is enabled + #[prost(bool, optional, tag = "19")] + pub tini_enabled: ::core::option::Option, } #[allow(clippy::derive_partial_eq_without_eq)] #[derive(Clone, PartialEq, ::prost::Message)] diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts index bd338a52f8..0b4c687438 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.d.ts @@ -105,6 +105,82 @@ export namespace Container { } } +export class FilesArtifactsList extends jspb.Message { + getFilesArtifactsIdentifiersList(): Array; + setFilesArtifactsIdentifiersList(value: Array): FilesArtifactsList; + clearFilesArtifactsIdentifiersList(): FilesArtifactsList; + addFilesArtifactsIdentifiers(value: string, index?: number): FilesArtifactsList; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): FilesArtifactsList.AsObject; + static toObject(includeInstance: boolean, msg: FilesArtifactsList): FilesArtifactsList.AsObject; + static serializeBinaryToWriter(message: FilesArtifactsList, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): FilesArtifactsList; + static deserializeBinaryFromReader(message: FilesArtifactsList, reader: jspb.BinaryReader): FilesArtifactsList; +} + +export namespace FilesArtifactsList { + export type AsObject = { + filesArtifactsIdentifiersList: Array, + } +} + +export class User extends jspb.Message { + getUid(): number; + setUid(value: number): User; + + getGid(): number; + setGid(value: number): User; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): User.AsObject; + static toObject(includeInstance: boolean, msg: User): User.AsObject; + static serializeBinaryToWriter(message: User, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): User; + static deserializeBinaryFromReader(message: User, reader: jspb.BinaryReader): User; +} + +export namespace User { + export type AsObject = { + uid: number, + gid: number, + } +} + +export class Toleration extends jspb.Message { + getKey(): string; + setKey(value: string): Toleration; + + getOperator(): string; + setOperator(value: string): Toleration; + + getValue(): string; + setValue(value: string): Toleration; + + getEffect(): string; + setEffect(value: string): Toleration; + + getTolerationSeconds(): number; + setTolerationSeconds(value: number): Toleration; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): Toleration.AsObject; + static toObject(includeInstance: boolean, msg: Toleration): Toleration.AsObject; + static serializeBinaryToWriter(message: Toleration, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): Toleration; + static deserializeBinaryFromReader(message: Toleration, reader: jspb.BinaryReader): Toleration; +} + +export namespace Toleration { + export type AsObject = { + key: string, + operator: string, + value: string, + effect: string, + tolerationSeconds: number, + } +} + export class ServiceInfo extends jspb.Message { getServiceUuid(): string; setServiceUuid(value: string): ServiceInfo; @@ -135,6 +211,42 @@ export class ServiceInfo extends jspb.Message { hasContainer(): boolean; clearContainer(): ServiceInfo; + getServiceDirPathsToFilesArtifactsListMap(): jspb.Map; + clearServiceDirPathsToFilesArtifactsListMap(): ServiceInfo; + + getMaxMillicpus(): number; + setMaxMillicpus(value: number): ServiceInfo; + + getMinMillicpus(): number; + setMinMillicpus(value: number): ServiceInfo; + + getMaxMemoryMegabytes(): number; + setMaxMemoryMegabytes(value: number): ServiceInfo; + + getMinMemoryMegabytes(): number; + setMinMemoryMegabytes(value: number): ServiceInfo; + + getUser(): User | undefined; + setUser(value?: User): ServiceInfo; + hasUser(): boolean; + clearUser(): ServiceInfo; + + getTolerationsList(): Array; + setTolerationsList(value: Array): ServiceInfo; + clearTolerationsList(): ServiceInfo; + addTolerations(value?: Toleration, index?: number): Toleration; + + getNodeSelectorsMap(): jspb.Map; + clearNodeSelectorsMap(): ServiceInfo; + + getLabelsMap(): jspb.Map; + clearLabelsMap(): ServiceInfo; + + getTiniEnabled(): boolean; + setTiniEnabled(value: boolean): ServiceInfo; + hasTiniEnabled(): boolean; + clearTiniEnabled(): ServiceInfo; + serializeBinary(): Uint8Array; toObject(includeInstance?: boolean): ServiceInfo.AsObject; static toObject(includeInstance: boolean, msg: ServiceInfo): ServiceInfo.AsObject; @@ -154,6 +266,26 @@ export namespace ServiceInfo { shortenedUuid: string, serviceStatus: ServiceStatus, container?: Container.AsObject, + serviceDirPathsToFilesArtifactsListMap: Array<[string, FilesArtifactsList.AsObject]>, + maxMillicpus: number, + minMillicpus: number, + maxMemoryMegabytes: number, + minMemoryMegabytes: number, + user?: User.AsObject, + tolerationsList: Array, + nodeSelectorsMap: Array<[string, string]>, + labelsMap: Array<[string, string]>, + tiniEnabled?: boolean, + } + + export enum UserCase { + _USER_NOT_SET = 0, + USER = 15, + } + + export enum TiniEnabledCase { + _TINI_ENABLED_NOT_SET = 0, + TINI_ENABLED = 19, } } diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js index fcf85dd28d..bfa76271e3 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/api_container_service_pb.js @@ -34,6 +34,7 @@ goog.exportSymbol('proto.api_container_api.ExecCommandArgs', null, global); goog.exportSymbol('proto.api_container_api.ExecCommandResponse', null, global); goog.exportSymbol('proto.api_container_api.FileArtifactContentsFileDescription', null, global); goog.exportSymbol('proto.api_container_api.FilesArtifactNameAndUuid', null, global); +goog.exportSymbol('proto.api_container_api.FilesArtifactsList', null, global); goog.exportSymbol('proto.api_container_api.GetExistingAndHistoricalServiceIdentifiersResponse', null, global); goog.exportSymbol('proto.api_container_api.GetServicesArgs', null, global); goog.exportSymbol('proto.api_container_api.GetServicesResponse', null, global); @@ -75,7 +76,9 @@ goog.exportSymbol('proto.api_container_api.StoreFilesArtifactFromServiceResponse goog.exportSymbol('proto.api_container_api.StoreWebFilesArtifactArgs', null, global); goog.exportSymbol('proto.api_container_api.StoreWebFilesArtifactResponse', null, global); goog.exportSymbol('proto.api_container_api.StreamedDataChunk', null, global); +goog.exportSymbol('proto.api_container_api.Toleration', null, global); goog.exportSymbol('proto.api_container_api.UploadFilesArtifactResponse', null, global); +goog.exportSymbol('proto.api_container_api.User', null, global); goog.exportSymbol('proto.api_container_api.WaitForHttpGetEndpointAvailabilityArgs', null, global); goog.exportSymbol('proto.api_container_api.WaitForHttpPostEndpointAvailabilityArgs', null, global); /** @@ -130,9 +133,72 @@ if (goog.DEBUG && !COMPILED) { * @extends {jspb.Message} * @constructor */ -proto.api_container_api.ServiceInfo = function(opt_data) { +proto.api_container_api.FilesArtifactsList = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.api_container_api.FilesArtifactsList.repeatedFields_, null); +}; +goog.inherits(proto.api_container_api.FilesArtifactsList, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.api_container_api.FilesArtifactsList.displayName = 'proto.api_container_api.FilesArtifactsList'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.api_container_api.User = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.api_container_api.User, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.api_container_api.User.displayName = 'proto.api_container_api.User'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.api_container_api.Toleration = function(opt_data) { jspb.Message.initialize(this, opt_data, 0, -1, null, null); }; +goog.inherits(proto.api_container_api.Toleration, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.api_container_api.Toleration.displayName = 'proto.api_container_api.Toleration'; +} +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.api_container_api.ServiceInfo = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, proto.api_container_api.ServiceInfo.repeatedFields_, null); +}; goog.inherits(proto.api_container_api.ServiceInfo, jspb.Message); if (goog.DEBUG && !COMPILED) { /** @@ -1656,6 +1722,13 @@ proto.api_container_api.Container.prototype.clearEnvVarsMap = function() { +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.api_container_api.FilesArtifactsList.repeatedFields_ = [1]; + if (jspb.Message.GENERATE_TO_OBJECT) { @@ -1671,8 +1744,8 @@ if (jspb.Message.GENERATE_TO_OBJECT) { * http://goto/soy-param-migration * @return {!Object} */ -proto.api_container_api.ServiceInfo.prototype.toObject = function(opt_includeInstance) { - return proto.api_container_api.ServiceInfo.toObject(opt_includeInstance, this); +proto.api_container_api.FilesArtifactsList.prototype.toObject = function(opt_includeInstance) { + return proto.api_container_api.FilesArtifactsList.toObject(opt_includeInstance, this); }; @@ -1681,21 +1754,13 @@ proto.api_container_api.ServiceInfo.prototype.toObject = function(opt_includeIns * @param {boolean|undefined} includeInstance Deprecated. Whether to include * the JSPB instance for transitional soy proto support: * http://goto/soy-param-migration - * @param {!proto.api_container_api.ServiceInfo} msg The msg instance to transform. + * @param {!proto.api_container_api.FilesArtifactsList} msg The msg instance to transform. * @return {!Object} * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.api_container_api.ServiceInfo.toObject = function(includeInstance, msg) { +proto.api_container_api.FilesArtifactsList.toObject = function(includeInstance, msg) { var f, obj = { - serviceUuid: jspb.Message.getFieldWithDefault(msg, 1, ""), - privateIpAddr: jspb.Message.getFieldWithDefault(msg, 2, ""), - privatePortsMap: (f = msg.getPrivatePortsMap()) ? f.toObject(includeInstance, proto.api_container_api.Port.toObject) : [], - maybePublicIpAddr: jspb.Message.getFieldWithDefault(msg, 4, ""), - maybePublicPortsMap: (f = msg.getMaybePublicPortsMap()) ? f.toObject(includeInstance, proto.api_container_api.Port.toObject) : [], - name: jspb.Message.getFieldWithDefault(msg, 6, ""), - shortenedUuid: jspb.Message.getFieldWithDefault(msg, 7, ""), - serviceStatus: jspb.Message.getFieldWithDefault(msg, 8, 0), - container: (f = msg.getContainer()) && proto.api_container_api.Container.toObject(includeInstance, f) + filesArtifactsIdentifiersList: (f = jspb.Message.getRepeatedField(msg, 1)) == null ? undefined : f }; if (includeInstance) { @@ -1709,23 +1774,23 @@ proto.api_container_api.ServiceInfo.toObject = function(includeInstance, msg) { /** * Deserializes binary data (in protobuf wire format). * @param {jspb.ByteSource} bytes The bytes to deserialize. - * @return {!proto.api_container_api.ServiceInfo} + * @return {!proto.api_container_api.FilesArtifactsList} */ -proto.api_container_api.ServiceInfo.deserializeBinary = function(bytes) { +proto.api_container_api.FilesArtifactsList.deserializeBinary = function(bytes) { var reader = new jspb.BinaryReader(bytes); - var msg = new proto.api_container_api.ServiceInfo; - return proto.api_container_api.ServiceInfo.deserializeBinaryFromReader(msg, reader); + var msg = new proto.api_container_api.FilesArtifactsList; + return proto.api_container_api.FilesArtifactsList.deserializeBinaryFromReader(msg, reader); }; /** * Deserializes binary data (in protobuf wire format) from the * given reader into the given message object. - * @param {!proto.api_container_api.ServiceInfo} msg The message object to deserialize into. + * @param {!proto.api_container_api.FilesArtifactsList} msg The message object to deserialize into. * @param {!jspb.BinaryReader} reader The BinaryReader to use. - * @return {!proto.api_container_api.ServiceInfo} + * @return {!proto.api_container_api.FilesArtifactsList} */ -proto.api_container_api.ServiceInfo.deserializeBinaryFromReader = function(msg, reader) { +proto.api_container_api.FilesArtifactsList.deserializeBinaryFromReader = function(msg, reader) { while (reader.nextField()) { if (reader.isEndGroup()) { break; @@ -1734,44 +1799,7 @@ proto.api_container_api.ServiceInfo.deserializeBinaryFromReader = function(msg, switch (field) { case 1: var value = /** @type {string} */ (reader.readString()); - msg.setServiceUuid(value); - break; - case 2: - var value = /** @type {string} */ (reader.readString()); - msg.setPrivateIpAddr(value); - break; - case 3: - var value = msg.getPrivatePortsMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.api_container_api.Port.deserializeBinaryFromReader, "", new proto.api_container_api.Port()); - }); - break; - case 4: - var value = /** @type {string} */ (reader.readString()); - msg.setMaybePublicIpAddr(value); - break; - case 5: - var value = msg.getMaybePublicPortsMap(); - reader.readMessage(value, function(message, reader) { - jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.api_container_api.Port.deserializeBinaryFromReader, "", new proto.api_container_api.Port()); - }); - break; - case 6: - var value = /** @type {string} */ (reader.readString()); - msg.setName(value); - break; - case 7: - var value = /** @type {string} */ (reader.readString()); - msg.setShortenedUuid(value); - break; - case 8: - var value = /** @type {!proto.api_container_api.ServiceStatus} */ (reader.readEnum()); - msg.setServiceStatus(value); - break; - case 9: - var value = new proto.api_container_api.Container; - reader.readMessage(value,proto.api_container_api.Container.deserializeBinaryFromReader); - msg.setContainer(value); + msg.addFilesArtifactsIdentifiers(value); break; default: reader.skipField(); @@ -1786,9 +1814,9 @@ proto.api_container_api.ServiceInfo.deserializeBinaryFromReader = function(msg, * Serializes the message to binary data (in protobuf wire format). * @return {!Uint8Array} */ -proto.api_container_api.ServiceInfo.prototype.serializeBinary = function() { +proto.api_container_api.FilesArtifactsList.prototype.serializeBinary = function() { var writer = new jspb.BinaryWriter(); - proto.api_container_api.ServiceInfo.serializeBinaryToWriter(this, writer); + proto.api_container_api.FilesArtifactsList.serializeBinaryToWriter(this, writer); return writer.getResultBuffer(); }; @@ -1796,153 +1824,886 @@ proto.api_container_api.ServiceInfo.prototype.serializeBinary = function() { /** * Serializes the given message to binary data (in protobuf wire * format), writing to the given BinaryWriter. - * @param {!proto.api_container_api.ServiceInfo} message + * @param {!proto.api_container_api.FilesArtifactsList} message * @param {!jspb.BinaryWriter} writer * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.api_container_api.ServiceInfo.serializeBinaryToWriter = function(message, writer) { +proto.api_container_api.FilesArtifactsList.serializeBinaryToWriter = function(message, writer) { var f = undefined; - f = message.getServiceUuid(); + f = message.getFilesArtifactsIdentifiersList(); if (f.length > 0) { - writer.writeString( + writer.writeRepeatedString( 1, f ); } - f = message.getPrivateIpAddr(); - if (f.length > 0) { - writer.writeString( - 2, - f - ); - } - f = message.getPrivatePortsMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(3, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.api_container_api.Port.serializeBinaryToWriter); - } - f = message.getMaybePublicIpAddr(); - if (f.length > 0) { - writer.writeString( - 4, - f - ); - } - f = message.getMaybePublicPortsMap(true); - if (f && f.getLength() > 0) { - f.serializeBinary(5, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.api_container_api.Port.serializeBinaryToWriter); - } - f = message.getName(); - if (f.length > 0) { - writer.writeString( - 6, - f - ); - } - f = message.getShortenedUuid(); - if (f.length > 0) { - writer.writeString( - 7, - f - ); - } - f = message.getServiceStatus(); - if (f !== 0.0) { - writer.writeEnum( - 8, - f - ); - } - f = message.getContainer(); - if (f != null) { - writer.writeMessage( - 9, - f, - proto.api_container_api.Container.serializeBinaryToWriter - ); - } }; /** - * optional string service_uuid = 1; - * @return {string} + * repeated string files_artifacts_identifiers = 1; + * @return {!Array} */ -proto.api_container_api.ServiceInfo.prototype.getServiceUuid = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +proto.api_container_api.FilesArtifactsList.prototype.getFilesArtifactsIdentifiersList = function() { + return /** @type {!Array} */ (jspb.Message.getRepeatedField(this, 1)); }; /** - * @param {string} value - * @return {!proto.api_container_api.ServiceInfo} returns this + * @param {!Array} value + * @return {!proto.api_container_api.FilesArtifactsList} returns this */ -proto.api_container_api.ServiceInfo.prototype.setServiceUuid = function(value) { - return jspb.Message.setProto3StringField(this, 1, value); +proto.api_container_api.FilesArtifactsList.prototype.setFilesArtifactsIdentifiersList = function(value) { + return jspb.Message.setField(this, 1, value || []); }; /** - * optional string private_ip_addr = 2; - * @return {string} + * @param {string} value + * @param {number=} opt_index + * @return {!proto.api_container_api.FilesArtifactsList} returns this */ -proto.api_container_api.ServiceInfo.prototype.getPrivateIpAddr = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +proto.api_container_api.FilesArtifactsList.prototype.addFilesArtifactsIdentifiers = function(value, opt_index) { + return jspb.Message.addToRepeatedField(this, 1, value, opt_index); }; /** - * @param {string} value - * @return {!proto.api_container_api.ServiceInfo} returns this + * Clears the list making it empty but non-null. + * @return {!proto.api_container_api.FilesArtifactsList} returns this */ -proto.api_container_api.ServiceInfo.prototype.setPrivateIpAddr = function(value) { - return jspb.Message.setProto3StringField(this, 2, value); +proto.api_container_api.FilesArtifactsList.prototype.clearFilesArtifactsIdentifiersList = function() { + return this.setFilesArtifactsIdentifiersList([]); }; -/** - * map private_ports = 3; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` - * @return {!jspb.Map} - */ -proto.api_container_api.ServiceInfo.prototype.getPrivatePortsMap = function(opt_noLazyCreate) { - return /** @type {!jspb.Map} */ ( - jspb.Message.getMapField(this, 3, opt_noLazyCreate, - proto.api_container_api.Port)); -}; + +if (jspb.Message.GENERATE_TO_OBJECT) { /** - * Clears values from the map. The map will be non-null. - * @return {!proto.api_container_api.ServiceInfo} returns this + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} */ -proto.api_container_api.ServiceInfo.prototype.clearPrivatePortsMap = function() { - this.getPrivatePortsMap().clear(); - return this;}; +proto.api_container_api.User.prototype.toObject = function(opt_includeInstance) { + return proto.api_container_api.User.toObject(opt_includeInstance, this); +}; /** - * optional string maybe_public_ip_addr = 4; - * @return {string} + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.api_container_api.User} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages */ -proto.api_container_api.ServiceInfo.prototype.getMaybePublicIpAddr = function() { - return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +proto.api_container_api.User.toObject = function(includeInstance, msg) { + var f, obj = { + uid: jspb.Message.getFieldWithDefault(msg, 1, 0), + gid: jspb.Message.getFieldWithDefault(msg, 2, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; }; +} /** - * @param {string} value - * @return {!proto.api_container_api.ServiceInfo} returns this + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.api_container_api.User} */ -proto.api_container_api.ServiceInfo.prototype.setMaybePublicIpAddr = function(value) { - return jspb.Message.setProto3StringField(this, 4, value); +proto.api_container_api.User.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.api_container_api.User; + return proto.api_container_api.User.deserializeBinaryFromReader(msg, reader); }; /** - * map maybe_public_ports = 5; - * @param {boolean=} opt_noLazyCreate Do not create the map if - * empty, instead returning `undefined` + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.api_container_api.User} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.api_container_api.User} + */ +proto.api_container_api.User.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {number} */ (reader.readUint32()); + msg.setUid(value); + break; + case 2: + var value = /** @type {number} */ (reader.readUint32()); + msg.setGid(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.api_container_api.User.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.api_container_api.User.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.api_container_api.User} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.api_container_api.User.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getUid(); + if (f !== 0) { + writer.writeUint32( + 1, + f + ); + } + f = message.getGid(); + if (f !== 0) { + writer.writeUint32( + 2, + f + ); + } +}; + + +/** + * optional uint32 uid = 1; + * @return {number} + */ +proto.api_container_api.User.prototype.getUid = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 1, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.api_container_api.User} returns this + */ +proto.api_container_api.User.prototype.setUid = function(value) { + return jspb.Message.setProto3IntField(this, 1, value); +}; + + +/** + * optional uint32 gid = 2; + * @return {number} + */ +proto.api_container_api.User.prototype.getGid = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 2, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.api_container_api.User} returns this + */ +proto.api_container_api.User.prototype.setGid = function(value) { + return jspb.Message.setProto3IntField(this, 2, value); +}; + + + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.api_container_api.Toleration.prototype.toObject = function(opt_includeInstance) { + return proto.api_container_api.Toleration.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.api_container_api.Toleration} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.api_container_api.Toleration.toObject = function(includeInstance, msg) { + var f, obj = { + key: jspb.Message.getFieldWithDefault(msg, 1, ""), + operator: jspb.Message.getFieldWithDefault(msg, 2, ""), + value: jspb.Message.getFieldWithDefault(msg, 3, ""), + effect: jspb.Message.getFieldWithDefault(msg, 4, ""), + tolerationSeconds: jspb.Message.getFieldWithDefault(msg, 5, 0) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.api_container_api.Toleration} + */ +proto.api_container_api.Toleration.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.api_container_api.Toleration; + return proto.api_container_api.Toleration.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.api_container_api.Toleration} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.api_container_api.Toleration} + */ +proto.api_container_api.Toleration.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setKey(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setOperator(value); + break; + case 3: + var value = /** @type {string} */ (reader.readString()); + msg.setValue(value); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setEffect(value); + break; + case 5: + var value = /** @type {number} */ (reader.readInt64()); + msg.setTolerationSeconds(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.api_container_api.Toleration.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.api_container_api.Toleration.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.api_container_api.Toleration} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.api_container_api.Toleration.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getKey(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getOperator(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getValue(); + if (f.length > 0) { + writer.writeString( + 3, + f + ); + } + f = message.getEffect(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getTolerationSeconds(); + if (f !== 0) { + writer.writeInt64( + 5, + f + ); + } +}; + + +/** + * optional string key = 1; + * @return {string} + */ +proto.api_container_api.Toleration.prototype.getKey = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.Toleration} returns this + */ +proto.api_container_api.Toleration.prototype.setKey = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string operator = 2; + * @return {string} + */ +proto.api_container_api.Toleration.prototype.getOperator = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.Toleration} returns this + */ +proto.api_container_api.Toleration.prototype.setOperator = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * optional string value = 3; + * @return {string} + */ +proto.api_container_api.Toleration.prototype.getValue = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 3, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.Toleration} returns this + */ +proto.api_container_api.Toleration.prototype.setValue = function(value) { + return jspb.Message.setProto3StringField(this, 3, value); +}; + + +/** + * optional string effect = 4; + * @return {string} + */ +proto.api_container_api.Toleration.prototype.getEffect = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.Toleration} returns this + */ +proto.api_container_api.Toleration.prototype.setEffect = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * optional int64 toleration_seconds = 5; + * @return {number} + */ +proto.api_container_api.Toleration.prototype.getTolerationSeconds = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 5, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.api_container_api.Toleration} returns this + */ +proto.api_container_api.Toleration.prototype.setTolerationSeconds = function(value) { + return jspb.Message.setProto3IntField(this, 5, value); +}; + + + +/** + * List of repeated fields within this message type. + * @private {!Array} + * @const + */ +proto.api_container_api.ServiceInfo.repeatedFields_ = [16]; + + + +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.api_container_api.ServiceInfo.prototype.toObject = function(opt_includeInstance) { + return proto.api_container_api.ServiceInfo.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.api_container_api.ServiceInfo} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.api_container_api.ServiceInfo.toObject = function(includeInstance, msg) { + var f, obj = { + serviceUuid: jspb.Message.getFieldWithDefault(msg, 1, ""), + privateIpAddr: jspb.Message.getFieldWithDefault(msg, 2, ""), + privatePortsMap: (f = msg.getPrivatePortsMap()) ? f.toObject(includeInstance, proto.api_container_api.Port.toObject) : [], + maybePublicIpAddr: jspb.Message.getFieldWithDefault(msg, 4, ""), + maybePublicPortsMap: (f = msg.getMaybePublicPortsMap()) ? f.toObject(includeInstance, proto.api_container_api.Port.toObject) : [], + name: jspb.Message.getFieldWithDefault(msg, 6, ""), + shortenedUuid: jspb.Message.getFieldWithDefault(msg, 7, ""), + serviceStatus: jspb.Message.getFieldWithDefault(msg, 8, 0), + container: (f = msg.getContainer()) && proto.api_container_api.Container.toObject(includeInstance, f), + serviceDirPathsToFilesArtifactsListMap: (f = msg.getServiceDirPathsToFilesArtifactsListMap()) ? f.toObject(includeInstance, proto.api_container_api.FilesArtifactsList.toObject) : [], + maxMillicpus: jspb.Message.getFieldWithDefault(msg, 11, 0), + minMillicpus: jspb.Message.getFieldWithDefault(msg, 12, 0), + maxMemoryMegabytes: jspb.Message.getFieldWithDefault(msg, 13, 0), + minMemoryMegabytes: jspb.Message.getFieldWithDefault(msg, 14, 0), + user: (f = msg.getUser()) && proto.api_container_api.User.toObject(includeInstance, f), + tolerationsList: jspb.Message.toObjectList(msg.getTolerationsList(), + proto.api_container_api.Toleration.toObject, includeInstance), + nodeSelectorsMap: (f = msg.getNodeSelectorsMap()) ? f.toObject(includeInstance, undefined) : [], + labelsMap: (f = msg.getLabelsMap()) ? f.toObject(includeInstance, undefined) : [], + tiniEnabled: jspb.Message.getBooleanFieldWithDefault(msg, 19, false) + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.api_container_api.ServiceInfo} + */ +proto.api_container_api.ServiceInfo.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.api_container_api.ServiceInfo; + return proto.api_container_api.ServiceInfo.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.api_container_api.ServiceInfo} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.api_container_api.ServiceInfo} + */ +proto.api_container_api.ServiceInfo.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setServiceUuid(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setPrivateIpAddr(value); + break; + case 3: + var value = msg.getPrivatePortsMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.api_container_api.Port.deserializeBinaryFromReader, "", new proto.api_container_api.Port()); + }); + break; + case 4: + var value = /** @type {string} */ (reader.readString()); + msg.setMaybePublicIpAddr(value); + break; + case 5: + var value = msg.getMaybePublicPortsMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.api_container_api.Port.deserializeBinaryFromReader, "", new proto.api_container_api.Port()); + }); + break; + case 6: + var value = /** @type {string} */ (reader.readString()); + msg.setName(value); + break; + case 7: + var value = /** @type {string} */ (reader.readString()); + msg.setShortenedUuid(value); + break; + case 8: + var value = /** @type {!proto.api_container_api.ServiceStatus} */ (reader.readEnum()); + msg.setServiceStatus(value); + break; + case 9: + var value = new proto.api_container_api.Container; + reader.readMessage(value,proto.api_container_api.Container.deserializeBinaryFromReader); + msg.setContainer(value); + break; + case 10: + var value = msg.getServiceDirPathsToFilesArtifactsListMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readMessage, proto.api_container_api.FilesArtifactsList.deserializeBinaryFromReader, "", new proto.api_container_api.FilesArtifactsList()); + }); + break; + case 11: + var value = /** @type {number} */ (reader.readUint32()); + msg.setMaxMillicpus(value); + break; + case 12: + var value = /** @type {number} */ (reader.readUint32()); + msg.setMinMillicpus(value); + break; + case 13: + var value = /** @type {number} */ (reader.readUint32()); + msg.setMaxMemoryMegabytes(value); + break; + case 14: + var value = /** @type {number} */ (reader.readUint32()); + msg.setMinMemoryMegabytes(value); + break; + case 15: + var value = new proto.api_container_api.User; + reader.readMessage(value,proto.api_container_api.User.deserializeBinaryFromReader); + msg.setUser(value); + break; + case 16: + var value = new proto.api_container_api.Toleration; + reader.readMessage(value,proto.api_container_api.Toleration.deserializeBinaryFromReader); + msg.addTolerations(value); + break; + case 17: + var value = msg.getNodeSelectorsMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); + }); + break; + case 18: + var value = msg.getLabelsMap(); + reader.readMessage(value, function(message, reader) { + jspb.Map.deserializeBinary(message, reader, jspb.BinaryReader.prototype.readString, jspb.BinaryReader.prototype.readString, null, "", ""); + }); + break; + case 19: + var value = /** @type {boolean} */ (reader.readBool()); + msg.setTiniEnabled(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.api_container_api.ServiceInfo.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.api_container_api.ServiceInfo.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.api_container_api.ServiceInfo} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.api_container_api.ServiceInfo.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getServiceUuid(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getPrivateIpAddr(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } + f = message.getPrivatePortsMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(3, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.api_container_api.Port.serializeBinaryToWriter); + } + f = message.getMaybePublicIpAddr(); + if (f.length > 0) { + writer.writeString( + 4, + f + ); + } + f = message.getMaybePublicPortsMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(5, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.api_container_api.Port.serializeBinaryToWriter); + } + f = message.getName(); + if (f.length > 0) { + writer.writeString( + 6, + f + ); + } + f = message.getShortenedUuid(); + if (f.length > 0) { + writer.writeString( + 7, + f + ); + } + f = message.getServiceStatus(); + if (f !== 0.0) { + writer.writeEnum( + 8, + f + ); + } + f = message.getContainer(); + if (f != null) { + writer.writeMessage( + 9, + f, + proto.api_container_api.Container.serializeBinaryToWriter + ); + } + f = message.getServiceDirPathsToFilesArtifactsListMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(10, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeMessage, proto.api_container_api.FilesArtifactsList.serializeBinaryToWriter); + } + f = message.getMaxMillicpus(); + if (f !== 0) { + writer.writeUint32( + 11, + f + ); + } + f = message.getMinMillicpus(); + if (f !== 0) { + writer.writeUint32( + 12, + f + ); + } + f = message.getMaxMemoryMegabytes(); + if (f !== 0) { + writer.writeUint32( + 13, + f + ); + } + f = message.getMinMemoryMegabytes(); + if (f !== 0) { + writer.writeUint32( + 14, + f + ); + } + f = message.getUser(); + if (f != null) { + writer.writeMessage( + 15, + f, + proto.api_container_api.User.serializeBinaryToWriter + ); + } + f = message.getTolerationsList(); + if (f.length > 0) { + writer.writeRepeatedMessage( + 16, + f, + proto.api_container_api.Toleration.serializeBinaryToWriter + ); + } + f = message.getNodeSelectorsMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(17, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); + } + f = message.getLabelsMap(true); + if (f && f.getLength() > 0) { + f.serializeBinary(18, writer, jspb.BinaryWriter.prototype.writeString, jspb.BinaryWriter.prototype.writeString); + } + f = /** @type {boolean} */ (jspb.Message.getField(message, 19)); + if (f != null) { + writer.writeBool( + 19, + f + ); + } +}; + + +/** + * optional string service_uuid = 1; + * @return {string} + */ +proto.api_container_api.ServiceInfo.prototype.getServiceUuid = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setServiceUuid = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string private_ip_addr = 2; + * @return {string} + */ +proto.api_container_api.ServiceInfo.prototype.getPrivateIpAddr = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setPrivateIpAddr = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + +/** + * map private_ports = 3; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} + */ +proto.api_container_api.ServiceInfo.prototype.getPrivatePortsMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 3, opt_noLazyCreate, + proto.api_container_api.Port)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearPrivatePortsMap = function() { + this.getPrivatePortsMap().clear(); + return this;}; + + +/** + * optional string maybe_public_ip_addr = 4; + * @return {string} + */ +proto.api_container_api.ServiceInfo.prototype.getMaybePublicIpAddr = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 4, "")); +}; + + +/** + * @param {string} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setMaybePublicIpAddr = function(value) { + return jspb.Message.setProto3StringField(this, 4, value); +}; + + +/** + * map maybe_public_ports = 5; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` * @return {!jspb.Map} */ proto.api_container_api.ServiceInfo.prototype.getMaybePublicPortsMap = function(opt_noLazyCreate) { @@ -2052,6 +2813,255 @@ proto.api_container_api.ServiceInfo.prototype.hasContainer = function() { }; +/** + * map service_dir_paths_to_files_artifacts_list = 10; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} + */ +proto.api_container_api.ServiceInfo.prototype.getServiceDirPathsToFilesArtifactsListMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 10, opt_noLazyCreate, + proto.api_container_api.FilesArtifactsList)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearServiceDirPathsToFilesArtifactsListMap = function() { + this.getServiceDirPathsToFilesArtifactsListMap().clear(); + return this;}; + + +/** + * optional uint32 max_millicpus = 11; + * @return {number} + */ +proto.api_container_api.ServiceInfo.prototype.getMaxMillicpus = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 11, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setMaxMillicpus = function(value) { + return jspb.Message.setProto3IntField(this, 11, value); +}; + + +/** + * optional uint32 min_millicpus = 12; + * @return {number} + */ +proto.api_container_api.ServiceInfo.prototype.getMinMillicpus = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 12, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setMinMillicpus = function(value) { + return jspb.Message.setProto3IntField(this, 12, value); +}; + + +/** + * optional uint32 max_memory_megabytes = 13; + * @return {number} + */ +proto.api_container_api.ServiceInfo.prototype.getMaxMemoryMegabytes = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 13, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setMaxMemoryMegabytes = function(value) { + return jspb.Message.setProto3IntField(this, 13, value); +}; + + +/** + * optional uint32 min_memory_megabytes = 14; + * @return {number} + */ +proto.api_container_api.ServiceInfo.prototype.getMinMemoryMegabytes = function() { + return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 14, 0)); +}; + + +/** + * @param {number} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setMinMemoryMegabytes = function(value) { + return jspb.Message.setProto3IntField(this, 14, value); +}; + + +/** + * optional User user = 15; + * @return {?proto.api_container_api.User} + */ +proto.api_container_api.ServiceInfo.prototype.getUser = function() { + return /** @type{?proto.api_container_api.User} */ ( + jspb.Message.getWrapperField(this, proto.api_container_api.User, 15)); +}; + + +/** + * @param {?proto.api_container_api.User|undefined} value + * @return {!proto.api_container_api.ServiceInfo} returns this +*/ +proto.api_container_api.ServiceInfo.prototype.setUser = function(value) { + return jspb.Message.setWrapperField(this, 15, value); +}; + + +/** + * Clears the message field making it undefined. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearUser = function() { + return this.setUser(undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.api_container_api.ServiceInfo.prototype.hasUser = function() { + return jspb.Message.getField(this, 15) != null; +}; + + +/** + * repeated Toleration tolerations = 16; + * @return {!Array} + */ +proto.api_container_api.ServiceInfo.prototype.getTolerationsList = function() { + return /** @type{!Array} */ ( + jspb.Message.getRepeatedWrapperField(this, proto.api_container_api.Toleration, 16)); +}; + + +/** + * @param {!Array} value + * @return {!proto.api_container_api.ServiceInfo} returns this +*/ +proto.api_container_api.ServiceInfo.prototype.setTolerationsList = function(value) { + return jspb.Message.setRepeatedWrapperField(this, 16, value); +}; + + +/** + * @param {!proto.api_container_api.Toleration=} opt_value + * @param {number=} opt_index + * @return {!proto.api_container_api.Toleration} + */ +proto.api_container_api.ServiceInfo.prototype.addTolerations = function(opt_value, opt_index) { + return jspb.Message.addToRepeatedWrapperField(this, 16, opt_value, proto.api_container_api.Toleration, opt_index); +}; + + +/** + * Clears the list making it empty but non-null. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearTolerationsList = function() { + return this.setTolerationsList([]); +}; + + +/** + * map node_selectors = 17; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} + */ +proto.api_container_api.ServiceInfo.prototype.getNodeSelectorsMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 17, opt_noLazyCreate, + null)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearNodeSelectorsMap = function() { + this.getNodeSelectorsMap().clear(); + return this;}; + + +/** + * map labels = 18; + * @param {boolean=} opt_noLazyCreate Do not create the map if + * empty, instead returning `undefined` + * @return {!jspb.Map} + */ +proto.api_container_api.ServiceInfo.prototype.getLabelsMap = function(opt_noLazyCreate) { + return /** @type {!jspb.Map} */ ( + jspb.Message.getMapField(this, 18, opt_noLazyCreate, + null)); +}; + + +/** + * Clears values from the map. The map will be non-null. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearLabelsMap = function() { + this.getLabelsMap().clear(); + return this;}; + + +/** + * optional bool tini_enabled = 19; + * @return {boolean} + */ +proto.api_container_api.ServiceInfo.prototype.getTiniEnabled = function() { + return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 19, false)); +}; + + +/** + * @param {boolean} value + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.setTiniEnabled = function(value) { + return jspb.Message.setField(this, 19, value); +}; + + +/** + * Clears the field making it undefined. + * @return {!proto.api_container_api.ServiceInfo} returns this + */ +proto.api_container_api.ServiceInfo.prototype.clearTiniEnabled = function() { + return jspb.Message.setField(this, 19, undefined); +}; + + +/** + * Returns whether this field is set. + * @return {boolean} + */ +proto.api_container_api.ServiceInfo.prototype.hasTiniEnabled = function() { + return jspb.Message.getField(this, 19) != null; +}; + + /** * List of repeated fields within this message type. diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts index ed997492ac..f4571130a0 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.d.ts @@ -235,6 +235,107 @@ export declare enum Container_Status { UNKNOWN = 2, } +/** + * @generated from message api_container_api.FilesArtifactsList + */ +export declare class FilesArtifactsList extends Message { + /** + * @generated from field: repeated string files_artifacts_identifiers = 1; + */ + filesArtifactsIdentifiers: string[]; + + constructor(data?: PartialMessage); + + static readonly runtime: typeof proto3; + static readonly typeName = "api_container_api.FilesArtifactsList"; + static readonly fields: FieldList; + + static fromBinary(bytes: Uint8Array, options?: Partial): FilesArtifactsList; + + static fromJson(jsonValue: JsonValue, options?: Partial): FilesArtifactsList; + + static fromJsonString(jsonString: string, options?: Partial): FilesArtifactsList; + + static equals(a: FilesArtifactsList | PlainMessage | undefined, b: FilesArtifactsList | PlainMessage | undefined): boolean; +} + +/** + * Equivalent of user on ServiceConfig + * + * @generated from message api_container_api.User + */ +export declare class User extends Message { + /** + * @generated from field: uint32 uid = 1; + */ + uid: number; + + /** + * @generated from field: uint32 gid = 2; + */ + gid: number; + + constructor(data?: PartialMessage); + + static readonly runtime: typeof proto3; + static readonly typeName = "api_container_api.User"; + static readonly fields: FieldList; + + static fromBinary(bytes: Uint8Array, options?: Partial): User; + + static fromJson(jsonValue: JsonValue, options?: Partial): User; + + static fromJsonString(jsonString: string, options?: Partial): User; + + static equals(a: User | PlainMessage | undefined, b: User | PlainMessage | undefined): boolean; +} + +/** + * Equivalent of tolerations on ServiceConfig + * + * @generated from message api_container_api.Toleration + */ +export declare class Toleration extends Message { + /** + * @generated from field: string key = 1; + */ + key: string; + + /** + * @generated from field: string operator = 2; + */ + operator: string; + + /** + * @generated from field: string value = 3; + */ + value: string; + + /** + * @generated from field: string effect = 4; + */ + effect: string; + + /** + * @generated from field: int64 toleration_seconds = 5; + */ + tolerationSeconds: bigint; + + constructor(data?: PartialMessage); + + static readonly runtime: typeof proto3; + static readonly typeName = "api_container_api.Toleration"; + static readonly fields: FieldList; + + static fromBinary(bytes: Uint8Array, options?: Partial): Toleration; + + static fromJson(jsonValue: JsonValue, options?: Partial): Toleration; + + static fromJsonString(jsonString: string, options?: Partial): Toleration; + + static equals(a: Toleration | PlainMessage | undefined, b: Toleration | PlainMessage | undefined): boolean; +} + /** * @generated from message api_container_api.ServiceInfo */ @@ -306,6 +407,68 @@ export declare class ServiceInfo extends Message { */ container?: Container; + /** + * Mapping of directory paths on service to names of files artifacts that are mounted to that directory + * + * @generated from field: map service_dir_paths_to_files_artifacts_list = 10; + */ + serviceDirPathsToFilesArtifactsList: { [key: string]: FilesArtifactsList }; + + /** + * @generated from field: uint32 max_millicpus = 11; + */ + maxMillicpus: number; + + /** + * @generated from field: uint32 min_millicpus = 12; + */ + minMillicpus: number; + + /** + * @generated from field: uint32 max_memory_megabytes = 13; + */ + maxMemoryMegabytes: number; + + /** + * @generated from field: uint32 min_memory_megabytes = 14; + */ + minMemoryMegabytes: number; + + /** + * Optional user identity for the service + * + * @generated from field: optional api_container_api.User user = 15; + */ + user?: User; + + /** + * Optional list of Kubernetes tolerations + * + * @generated from field: repeated api_container_api.Toleration tolerations = 16; + */ + tolerations: Toleration[]; + + /** + * Optional node selectors for pod placement + * + * @generated from field: map node_selectors = 17; + */ + nodeSelectors: { [key: string]: string }; + + /** + * Optional labels + * + * @generated from field: map labels = 18; + */ + labels: { [key: string]: string }; + + /** + * Whether Tini is enabled + * + * @generated from field: optional bool tini_enabled = 19; + */ + tiniEnabled?: boolean; + constructor(data?: PartialMessage); static readonly runtime: typeof proto3; diff --git a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js index c19e43ab1c..4d0676658f 100644 --- a/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js +++ b/api/typescript/src/core/kurtosis_core_rpc_api_bindings/connect/api_container_service_pb.js @@ -119,6 +119,45 @@ export const Container_Status = proto3.makeEnum( ], ); +/** + * @generated from message api_container_api.FilesArtifactsList + */ +export const FilesArtifactsList = proto3.makeMessageType( + "api_container_api.FilesArtifactsList", + () => [ + { no: 1, name: "files_artifacts_identifiers", kind: "scalar", T: 9 /* ScalarType.STRING */, repeated: true }, + ], +); + +/** + * Equivalent of user on ServiceConfig + * + * @generated from message api_container_api.User + */ +export const User = proto3.makeMessageType( + "api_container_api.User", + () => [ + { no: 1, name: "uid", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 2, name: "gid", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + ], +); + +/** + * Equivalent of tolerations on ServiceConfig + * + * @generated from message api_container_api.Toleration + */ +export const Toleration = proto3.makeMessageType( + "api_container_api.Toleration", + () => [ + { no: 1, name: "key", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 2, name: "operator", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 3, name: "value", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 4, name: "effect", kind: "scalar", T: 9 /* ScalarType.STRING */ }, + { no: 5, name: "toleration_seconds", kind: "scalar", T: 3 /* ScalarType.INT64 */ }, + ], +); + /** * @generated from message api_container_api.ServiceInfo */ @@ -134,6 +173,16 @@ export const ServiceInfo = proto3.makeMessageType( { no: 7, name: "shortened_uuid", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 8, name: "service_status", kind: "enum", T: proto3.getEnumType(ServiceStatus) }, { no: 9, name: "container", kind: "message", T: Container }, + { no: 10, name: "service_dir_paths_to_files_artifacts_list", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "message", T: FilesArtifactsList} }, + { no: 11, name: "max_millicpus", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 12, name: "min_millicpus", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 13, name: "max_memory_megabytes", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 14, name: "min_memory_megabytes", kind: "scalar", T: 13 /* ScalarType.UINT32 */ }, + { no: 15, name: "user", kind: "message", T: User, opt: true }, + { no: 16, name: "tolerations", kind: "message", T: Toleration, repeated: true }, + { no: 17, name: "node_selectors", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "scalar", T: 9 /* ScalarType.STRING */} }, + { no: 18, name: "labels", kind: "map", K: 9 /* ScalarType.STRING */, V: {kind: "scalar", T: 9 /* ScalarType.STRING */} }, + { no: 19, name: "tini_enabled", kind: "scalar", T: 8 /* ScalarType.BOOL */, opt: true }, ], ); diff --git a/cli/cli/command_str_consts/command_str_consts.go b/cli/cli/command_str_consts/command_str_consts.go index 7be1a73565..1b54038ed7 100644 --- a/cli/cli/command_str_consts/command_str_consts.go +++ b/cli/cli/command_str_consts/command_str_consts.go @@ -64,6 +64,7 @@ const ( ServiceStartCmdStr = "start" ServiceStopCmdStr = "stop" ServiceInspectCmdStr = "inspect" + ServiceUpdateCmdStr = "update" StarlarkRunCmdStr = "run" TwitterCmdStr = "twitter" ConfigCmdStr = "config" diff --git a/cli/cli/commands/service/add/add.go b/cli/cli/commands/service/add/add.go index 15460c73c6..00335c66e8 100644 --- a/cli/cli/commands/service/add/add.go +++ b/cli/cli/commands/service/add/add.go @@ -2,9 +2,12 @@ package add import ( "context" + "encoding/json" "fmt" - "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/starlark_run_config" - "strconv" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/inspect" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/service_helpers" + "io" + "os" "strings" "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" @@ -35,75 +38,41 @@ const ( serviceNameTitleKey = "Name" serviceUuidTitleKey = "UUID" - serviceImageArgKey = "image" - - cmdArgsArgKey = "cmd-arg" - - entrypointBinaryFlagKey = "entrypoint" - - envvarsFlagKey = "env" - envvarKeyValueDelimiter = "=" - envvarDeclarationsDelimiter = "," - - portsFlagKey = "ports" - portIdSpecDelimiter = "=" - portNumberProtocolDelimiter = "/" - portDeclarationsDelimiter = "," - portApplicationProtocolDelimiter = ":" - portNumberUintParsingBase = 10 - portNumberUintParsingBits = 16 - - filesFlagKey = "files" - filesArtifactMountsDelimiter = "," - filesArtifactMountpointDelimiter = ":" - defaultLimits = 0 + defaultLimits = 0 kurtosisBackendCtxKey = "kurtosis-backend" engineClientCtxKey = "engine-client" privateIPAddressPlaceholderKey = "ip-address-placeholder" - privateIPAddressPlaceholderDefault = "KURTOSIS_IP_ADDR_PLACEHOLDER" - - // Each envvar should be KEY1=VALUE1, which means we should have two components to each envvar declaration - expectedNumberKeyValueComponentsInEnvvarDeclaration = 2 - portNumberIndex = 0 - transportProtocolIndex = 1 - expectedPortIdSpecComponentsCount = 2 - expectedMountFragmentsCount = 2 - - minRemainingPortSpecComponents = 1 - maxRemainingPortSpecComponents = 2 + privateIPAddressPlaceholderDefault = "" emptyApplicationProtocol = "" linkDelimiter = "://" - maybeApplicationProtocolSpecForHelp = "MAYBE_APPLICATION_PROTOCOL" - transportProtocolSpecForHelp = "TRANSPORT_PROTOCOL" - portNumberSpecForHelp = "PORT_NUMBER" - portIdSpecForHelp = "PORT_ID" - fullUuidsFlagKey = "full-uuids" fullUuidFlagKeyDefault = "false" - portMappingSeparatorForLogs = ", " + JsonConfigFlagKey = "json-service-config" + JsonConfigFlagKeyDefault = "" + readJsonConfigFromStdinInput = "-" - defaultPortWaitTimeoutStr = "30s" + portMappingSeparatorForLogs = ", " ) var ( defaultTransportProtocolStr = strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()) serviceAddSpec = fmt.Sprintf( `%v%v%v%v%v`, - maybeApplicationProtocolSpecForHelp, - portApplicationProtocolDelimiter, - portNumberSpecForHelp, - portNumberProtocolDelimiter, - transportProtocolSpecForHelp, + service_helpers.MaybeApplicationProtocolSpecForHelp, + service_helpers.PortApplicationProtocolDelimiter, + service_helpers.PortNumberSpecForHelp, + service_helpers.PortNumberProtocolDelimiter, + service_helpers.TransportProtocolSpecForHelp, ) serviceAddSpecWithPortId = fmt.Sprintf( `%v%v%v`, - portIdSpecForHelp, - portIdSpecDelimiter, + service_helpers.PortIdSpecForHelp, + service_helpers.PortIdSpecDelimiter, serviceAddSpec, ) ) @@ -125,64 +94,73 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Key: serviceNameArgKey, }, { - Key: serviceImageArgKey, - }, - { - Key: cmdArgsArgKey, + Key: service_helpers.ImageKey, IsOptional: true, - IsGreedy: true, - DefaultValue: []string{}, + DefaultValue: "", }, }, Flags: []*flags.FlagConfig{ { - Key: entrypointBinaryFlagKey, + Key: service_helpers.CmdKey, + Usage: "CMD binary that will be used when running the container", + Type: flags.FlagType_String, + Default: "", + }, + { + Key: service_helpers.EntrypointFlagKey, Usage: "ENTRYPOINT binary that will be used when running the container, overriding the image's default ENTRYPOINT", // TODO Make this a string list - Type: flags.FlagType_String, + Type: flags.FlagType_String, + Default: "", }, { // TODO We currently can't handle commas, so allow users to set the flag multiple times to set multiple envvars - Key: envvarsFlagKey, + Key: service_helpers.EnvvarsFlagKey, Usage: fmt.Sprintf( "String containing environment variables that will be set when running the container, in "+ "the form \"KEY1%vVALUE1%vKEY2%vVALUE2\"", - envvarKeyValueDelimiter, - envvarDeclarationsDelimiter, - envvarKeyValueDelimiter, + service_helpers.EnvvarKeyValueDelimiter, + service_helpers.EnvvarDeclarationsDelimiter, + service_helpers.EnvvarKeyValueDelimiter, ), - Type: flags.FlagType_String, + Type: flags.FlagType_String, + Default: "", }, { - Key: portsFlagKey, + Key: service_helpers.PortsFlagKey, Usage: fmt.Sprintf(`String containing declarations of ports that the container will listen on, in the form, %q`+ ` where %q is a user friendly string for identifying the port, %q is required field, %q is an optional field which must be either`+ ` '%v' or '%v' and defaults to '%v' if omitted and %q is user defined optional value. %v`, serviceAddSpecWithPortId, - portIdSpecForHelp, - portNumberSpecForHelp, - transportProtocolSpecForHelp, + service_helpers.PortIdSpecForHelp, + service_helpers.PortNumberSpecForHelp, + service_helpers.TransportProtocolSpecForHelp, strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()), strings.ToLower(kurtosis_core_rpc_api_bindings.Port_UDP.String()), defaultTransportProtocolStr, - maybeApplicationProtocolSpecForHelp, + service_helpers.MaybeApplicationProtocolSpecForHelp, generateExampleForPortFlag(), ), - Type: flags.FlagType_String, + Type: flags.FlagType_String, + Default: "", }, { - Key: filesFlagKey, + Key: service_helpers.FilesFlagKey, Usage: fmt.Sprintf( "String containing declarations of files paths on the container -> artifact name where the contents of those "+ "files artifacts should be mounted, in the form \"MOUNTPATH1%vARTIFACTNAME1%vMOUNTPATH2%vARTIFACTNAME2\" where "+ - "ARTIFACTNAME is the name returned by Kurtosis when uploading files to the enclave (e.g. via the '%v %v' command)", - filesArtifactMountpointDelimiter, - filesArtifactMountsDelimiter, - filesArtifactMountpointDelimiter, + "ARTIFACTNAME is the name returned by Kurtosis when uploading files to the enclave (e.g. via the '%v %v' command)."+ + "directories can be mounted by mounting multiple artifacts to the same mountpath, in the form, \"MOUNTPATH1%vARTIFACTNAME1%vARTIFACTNAME2\"", + service_helpers.FilesArtifactMountpointDelimiter, + service_helpers.FilesArtifactMountsDelimiter, + service_helpers.FilesArtifactMountpointDelimiter, command_str_consts.FilesCmdStr, command_str_consts.FilesUploadCmdStr, + service_helpers.FilesArtifactMountpointDelimiter, + service_helpers.FilesMultipleArtifactsDelimiter, ), - Type: flags.FlagType_String, + Type: flags.FlagType_String, + Default: "", }, { Key: privateIPAddressPlaceholderKey, @@ -196,6 +174,22 @@ var ServiceAddCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCo Type: flags.FlagType_Bool, Default: fullUuidFlagKeyDefault, }, + { + Key: JsonConfigFlagKey, + Usage: fmt.Sprintf("If a json formatted service config string is provided via stdin using '%v' value for this flag,"+ + "stdin will get parsed to json and used as values for the service config."+ + "The json format should be identical to the json output format from %v %v %v %v %v."+ + "If stdin value not provided, will assume input is a filepath to a service config json and attempts to read from it.", + readJsonConfigFromStdinInput, + command_str_consts.KurtosisCmdStr, + command_str_consts.ServiceCmdStr, + command_str_consts.ServiceInspectCmdStr, + inspect.OutputFormatKeyShorthand, + inspect.JsonOutputFormat, + ), + Type: flags.FlagType_String, + Default: JsonConfigFlagKeyDefault, + }, }, RunFunc: run, } @@ -218,34 +212,34 @@ func run( return stacktrace.Propagate(err, "An error occurred getting the service name value using key '%v'", serviceNameArgKey) } - image, err := args.GetNonGreedyArg(serviceImageArgKey) + image, err := args.GetNonGreedyArg(service_helpers.ImageKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the service image value using key '%v'", serviceImageArgKey) + return stacktrace.Propagate(err, "An error occurred getting the service image value using key '%v'", service_helpers.ImageKey) } - cmdArgs, err := args.GetGreedyArg(cmdArgsArgKey) + entrypointStr, err := flags.GetString(service_helpers.EntrypointFlagKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the CMD args using key '%v'", cmdArgsArgKey) + return stacktrace.Propagate(err, "An error occurred getting the ENTRYPOINT binary using key '%v'", service_helpers.EntrypointFlagKey) } - entrypointStr, err := flags.GetString(entrypointBinaryFlagKey) + cmdStr, err := flags.GetString(service_helpers.CmdKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the ENTRYPOINT binary using key '%v'", entrypointBinaryFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the CMD using key '%v'", service_helpers.CmdKey) } - envvarsStr, err := flags.GetString(envvarsFlagKey) + envVarsStr, err := flags.GetString(service_helpers.EnvvarsFlagKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the env vars string using key '%v'", envvarsFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the env vars string using key '%v'", service_helpers.EnvvarsFlagKey) } - portsStr, err := flags.GetString(portsFlagKey) + portsStr, err := flags.GetString(service_helpers.PortsFlagKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the ports string using key '%v'", portsFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the ports string using key '%v'", service_helpers.PortsFlagKey) } - filesArtifactMountsStr, err := flags.GetString(filesFlagKey) + filesArtifactMountsStr, err := flags.GetString(service_helpers.FilesFlagKey) if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the files artifact mounts string using key '%v'", filesFlagKey) + return stacktrace.Propagate(err, "An error occurred getting the files artifact mounts string using key '%v'", service_helpers.FilesFlagKey) } privateIPAddressPlaceholder, err := flags.GetString(privateIPAddressPlaceholderKey) @@ -258,6 +252,15 @@ func run( return stacktrace.Propagate(err, "Expected a value for the '%v' flag but failed to get it", fullUuidsFlagKey) } + jsonServiceConfigFlagValue, err := flags.GetString(JsonConfigFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the json service config string using key '%v'.", JsonConfigFlagKey) + } + jsonServiceConfigStr, err := processJsonServiceConfigFlagInput(jsonServiceConfigFlagValue) + if err != nil { + return err // already wrapped + } + kurtosisCtx, err := kurtosis_context.NewKurtosisContextFromLocalEngine() if err != nil { return stacktrace.Propagate(err, "An error occurred connecting to the local Kurtosis engine") @@ -268,38 +271,57 @@ func run( return stacktrace.Propagate(err, "An error occurred getting an enclave context from enclave info for enclave '%v'", enclaveIdentifier) } - entrypoint := []string{} - if entrypointStr != "" { - entrypoint = append(entrypoint, entrypointStr) - } - serviceConfigStarlark, err := GetServiceConfigStarlark(image, portsStr, cmdArgs, entrypoint, envvarsStr, filesArtifactMountsStr, defaultLimits, defaultLimits, defaultLimits, defaultLimits, privateIPAddressPlaceholder) - if err != nil { - return stacktrace.Propagate( - err, - "An error occurred getting the container config to start image '%v' with CMD '%+v', ENTRYPOINT '%v', envvars '%v' and private IP address placeholder '%v'", - image, - cmdArgs, - entrypointStr, - envvarsStr, - privateIPAddressPlaceholder, + var serviceConfigStarlarkStr string + if jsonServiceConfigStr != "" { + var serviceConfigJson services.ServiceConfig + if err = json.Unmarshal([]byte(jsonServiceConfigStr), &serviceConfigJson); err != nil { + return stacktrace.Propagate(err, "An error occurred unmarshalling json service config string:\n '%v'.", jsonServiceConfigStr) + } + serviceConfigStarlarkStr = services.GetFullServiceConfigStarlark( + serviceConfigJson.Image, + services.ConvertJsonPortToApiPort(serviceConfigJson.PrivatePorts), + serviceConfigJson.Files, + serviceConfigJson.Entrypoint, + serviceConfigJson.Cmd, + serviceConfigJson.EnvVars, + serviceConfigJson.MaxMillicpus, + serviceConfigJson.MaxMemory, + serviceConfigJson.MaxMemory, + serviceConfigJson.MinMemory, + serviceConfigJson.User, + serviceConfigJson.Tolerations, + serviceConfigJson.NodeSelectors, + serviceConfigJson.Labels, + serviceConfigJson.TiniEnabled, + serviceConfigJson.PrivateIPAddressPlaceholder, ) + } else { + entrypoint := []string{} + if entrypointStr != "" { + entrypoint = strings.Split(cmdStr, service_helpers.EntrypointAndCmdDelimiter) + } + cmd := []string{} + if cmdStr != "" { + cmd = strings.Split(cmdStr, service_helpers.EntrypointAndCmdDelimiter) + } + serviceConfigStarlarkStr, err = GetServiceConfigStarlark(image, portsStr, cmd, entrypoint, envVarsStr, filesArtifactMountsStr, defaultLimits, defaultLimits, defaultLimits, defaultLimits, privateIPAddressPlaceholder) + if err != nil { + return stacktrace.Propagate( + err, + "An error occurred getting the container config to start image '%v' with CMD '%v', ENTRYPOINT '%v', envvars '%v' and private IP address placeholder '%v'", + image, + cmdStr, + entrypointStr, + envVarsStr, + privateIPAddressPlaceholder, + ) + } } - starlarkScript := fmt.Sprintf(`def run(plan): - plan.add_service(name = "%s", config = %s) -`, serviceName, serviceConfigStarlark) - starlarkRunResult, err := enclaveCtx.RunStarlarkScriptBlocking(ctx, starlarkScript, starlark_run_config.NewRunStarlarkConfig()) + addServiceStarlark := service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStarlarkStr) + _, err = service_helpers.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, addServiceStarlark, enclaveCtx) if err != nil { - return stacktrace.Propagate(err, "An error has occurred when running Starlark to add service") - } - if starlarkRunResult.InterpretationError != nil { - return stacktrace.NewError("An error has occurred when adding service: %s\nThis is a bug in Kurtosis, please report.", starlarkRunResult.InterpretationError) - } - if len(starlarkRunResult.ValidationErrors) > 0 { - return stacktrace.NewError("An error occurred when validating add service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ValidationErrors) - } - if starlarkRunResult.ExecutionError != nil { - return stacktrace.NewError("An error occurred adding service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ExecutionError) + return err // already wrapped } serviceCtx, err := enclaveCtx.GetServiceContext(serviceName) if err != nil { @@ -404,245 +426,75 @@ func GetServiceConfigStarlark( minMemoryMegaBytes int, privateIPAddressPlaceholder string, ) (string, error) { - envvarsMap, err := parseEnvVarsStr(envvarsStr) + envvarsMap, err := service_helpers.ParseEnvVarsStr(envvarsStr) if err != nil { return "", stacktrace.Propagate(err, "An error occurred parsing environment variables string '%v'", envvarsStr) } - ports, err := parsePortsStr(portsStr) + ports, err := service_helpers.ParsePortsStr(portsStr) if err != nil { return "", stacktrace.Propagate(err, "An error occurred parsing ports string '%v'", portsStr) } - filesArtifactMounts, err := parseFilesArtifactMountsStr(filesArtifactMountsStr) + filesArtifactMounts, err := service_helpers.ParseFilesArtifactMountsStr(filesArtifactMountsStr) if err != nil { return "", stacktrace.Propagate(err, "An error occurred parsing files artifact mounts string '%v'", filesArtifactMountsStr) } - return services.GetServiceConfigStarlark(image, ports, filesArtifactMounts, entrypoint, cmdArgs, envvarsMap, privateIPAddressPlaceholder, cpuAllocationMillicpus, memoryAllocationMegabytes, minCpuMilliCores, minMemoryMegaBytes), nil + tiniEnabled := false + + emptyNodeSelecors := map[string]string{} + emptyLabels := map[string]string{} + return services.GetFullServiceConfigStarlark( + image, + ports, + filesArtifactMounts, + entrypoint, + cmdArgs, + envvarsMap, + uint32(cpuAllocationMillicpus), + uint32(memoryAllocationMegabytes), + uint32(minCpuMilliCores), + uint32(minMemoryMegaBytes), + nil, //empty user + nil, //empty tolerations + emptyNodeSelecors, + emptyLabels, + &tiniEnabled, + privateIPAddressPlaceholder), nil } -// Parses a string in the form KEY1=VALUE1,KEY2=VALUE2 into a map of strings -// An empty string will result in an empty map -// Empty strings will be skipped (e.g. ',,,' will result in an empty map) -func parseEnvVarsStr(envvarsStr string) (map[string]string, error) { - result := map[string]string{} - if envvarsStr == "" { - return result, nil - } - - allEnvvarDeclarationStrs := strings.Split(envvarsStr, envvarDeclarationsDelimiter) - for _, envvarDeclarationStr := range allEnvvarDeclarationStrs { - if len(strings.TrimSpace(envvarDeclarationStr)) == 0 { - continue - } - - envvarKeyValueComponents := strings.SplitN(envvarDeclarationStr, envvarKeyValueDelimiter, expectedNumberKeyValueComponentsInEnvvarDeclaration) - if len(envvarKeyValueComponents) < expectedNumberKeyValueComponentsInEnvvarDeclaration { - return nil, stacktrace.NewError("Environment declaration string '%v' must be of the form KEY1%vVALUE1", envvarDeclarationStr, envvarKeyValueDelimiter) - } - key := envvarKeyValueComponents[0] - value := envvarKeyValueComponents[1] - - preexistingValue, found := result[key] - if found { - return nil, stacktrace.NewError( - "Cannot declare environment variable '%v' assigned to value '%v' because the key has previously been assigned to value '%v'", - key, - value, - preexistingValue, - ) - } - - result[key] = value - } - - return result, nil +func generateExampleForPortFlag() string { + return fmt.Sprintf( + `Example: "PORTID1%v1234%vudp%vPORTID2%vhttp%v5678%vPORTID3%vhttp%v6000%vudp"`, + service_helpers.PortIdSpecDelimiter, + service_helpers.PortNumberProtocolDelimiter, + service_helpers.PortDeclarationsDelimiter, + service_helpers.PortIdSpecDelimiter, + service_helpers.PortApplicationProtocolDelimiter, + service_helpers.PortDeclarationsDelimiter, + service_helpers.PortIdSpecDelimiter, + service_helpers.PortApplicationProtocolDelimiter, + service_helpers.PortNumberProtocolDelimiter, + ) } -// Parses a string in the form PORTID1=1234,PORTID2=5678/udp -// An empty string will result in an empty map -// Empty strings will be skipped (e.g. ',,,' will result in an empty map) -func parsePortsStr(portsStr string) (map[string]*kurtosis_core_rpc_api_bindings.Port, error) { - result := map[string]*kurtosis_core_rpc_api_bindings.Port{} - if strings.TrimSpace(portsStr) == "" { - return result, nil - } - - allPortDeclarationStrs := strings.Split(portsStr, portDeclarationsDelimiter) - for _, portDeclarationStr := range allPortDeclarationStrs { - if len(strings.TrimSpace(portDeclarationStr)) == 0 { - continue - } - - portIdSpecComponents := strings.Split(portDeclarationStr, portIdSpecDelimiter) - if len(portIdSpecComponents) != expectedPortIdSpecComponentsCount { - return nil, stacktrace.NewError("Port declaration string '%v' must be of the form PORTID%vSPEC", portDeclarationStr, portIdSpecDelimiter) - } - portId := portIdSpecComponents[0] - specStr := portIdSpecComponents[1] - if len(strings.TrimSpace(portId)) == 0 { - return nil, stacktrace.NewError("Port declaration with spec string '%v' has an empty port ID", specStr) - } - portSpec, err := parsePortSpecStr(specStr) +func processJsonServiceConfigFlagInput(jsonServiceConfigFlagInput string) (string, error) { + var configBytes []byte + var err error + switch jsonServiceConfigFlagInput { + case JsonConfigFlagKeyDefault: + return JsonConfigFlagKeyDefault, nil + case readJsonConfigFromStdinInput: + configBytes, err = io.ReadAll(os.Stdin) if err != nil { - return nil, stacktrace.Propagate(err, "An error occurred parsing port spec string '%v' for port with ID '%v'", specStr, portId) - } - - if _, found := result[portId]; found { - return nil, stacktrace.NewError( - "Cannot define port '%v' with spec '%v' because it is already defined", - portId, - specStr, - ) - } - - result[portId] = portSpec - } - - return result, nil -} - -func parsePortSpecStr(specStr string) (*kurtosis_core_rpc_api_bindings.Port, error) { - if len(strings.TrimSpace(specStr)) == 0 { - return nil, stacktrace.NewError("Cannot parse empty spec string") - } - - maybeApplicationProtocol, remainingPortSpec, err := getMaybeApplicationProtocolFromPortSpecString(specStr) - if err != nil { - return nil, stacktrace.Propagate(err, "Error occurred while parsing application protocol '%v' in port spec '%v'", maybeApplicationProtocol, specStr) - } - - remainingPortSpecComponents := strings.Split(remainingPortSpec, portNumberProtocolDelimiter) - numRemainingPortSpecComponents := len(remainingPortSpecComponents) - if numRemainingPortSpecComponents > maxRemainingPortSpecComponents { - return nil, stacktrace.NewError( - `Invalid port spec string, expected format is %q but got '%v'`, - serviceAddSpec, - specStr, - ) - } - - portNumberUint16, err := getPortNumberFromPortSpecString(remainingPortSpecComponents[portNumberIndex]) - if err != nil { - return nil, stacktrace.Propagate(err, "Error occurred while parsing port number '%v' in port spec '%v'", remainingPortSpecComponents[portNumberIndex], specStr) - } - - transportProtocol := defaultTransportProtocolStr - if numRemainingPortSpecComponents > minRemainingPortSpecComponents { - transportProtocol = remainingPortSpecComponents[transportProtocolIndex] - } - - transportProtocolFromEnum, err := getTransportProtocolFromPortSpecString(transportProtocol) - if err != nil { - return nil, stacktrace.Propagate(err, "Error occurred while parsing transport protocol '%v' in port spec '%v'", remainingPortSpecComponents[transportProtocolIndex], specStr) - } - return &kurtosis_core_rpc_api_bindings.Port{ - Number: portNumberUint16, - TransportProtocol: transportProtocolFromEnum, - MaybeApplicationProtocol: maybeApplicationProtocol, - MaybeWaitTimeout: defaultPortWaitTimeoutStr, //TODO we should add this to the port's arguments instead of using only a default value - Locked: nil, - Alias: nil, - }, nil -} - -/* -* -This method takes in port protocol string and parses it to get application protocol. -It looks for `:` delimiter and splits the string into array of at most size 2. If the length -of array is 2 then application protocol exists, otherwise it does not. This is basically what -strings.Cut() does. // TODO: use that instead once we update go version -*/ -func getMaybeApplicationProtocolFromPortSpecString(portProtocolStr string) (string, string, error) { - - beforeDelimiter, afterDelimiter, foundDelimiter := strings.Cut(portProtocolStr, portApplicationProtocolDelimiter) - - if !foundDelimiter { - return emptyApplicationProtocol, beforeDelimiter, nil - } - - if foundDelimiter && beforeDelimiter == emptyApplicationProtocol { - return emptyApplicationProtocol, "", stacktrace.NewError("optional application protocol argument cannot be empty") - } - - return beforeDelimiter, afterDelimiter, nil -} - -func getPortNumberFromPortSpecString(portNumberStr string) (uint32, error) { - portNumberUint64, err := strconv.ParseUint(portNumberStr, portNumberUintParsingBase, portNumberUintParsingBits) - if err != nil { - return 0, stacktrace.Propagate( - err, - "An error occurred parsing port number string '%v' with base '%v' and bits '%v'", - portNumberStr, - portNumberUintParsingBase, - portNumberUintParsingBits, - ) - } - portNumberUint32 := uint32(portNumberUint64) - return portNumberUint32, nil -} - -func getTransportProtocolFromPortSpecString(portSpec string) (kurtosis_core_rpc_api_bindings.Port_TransportProtocol, error) { - transportProtocolEnumInt, found := kurtosis_core_rpc_api_bindings.Port_TransportProtocol_value[strings.ToUpper(portSpec)] - if !found { - return 0, stacktrace.NewError("Unrecognized port protocol '%v'", portSpec) - } - return kurtosis_core_rpc_api_bindings.Port_TransportProtocol(transportProtocolEnumInt), nil -} - -func parseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string]string, error) { - result := map[string]string{} - if strings.TrimSpace(filesArtifactMountsStr) == "" { - return result, nil - } - - // NOTE: we might actually want to allow the same artifact being mounted in multiple places - allMountStrs := strings.Split(filesArtifactMountsStr, filesArtifactMountsDelimiter) - for idx, mountStr := range allMountStrs { - trimmedMountStr := strings.TrimSpace(mountStr) - if len(trimmedMountStr) == 0 { - continue - } - - mountFragments := strings.Split(trimmedMountStr, filesArtifactMountpointDelimiter) - if len(mountFragments) != expectedMountFragmentsCount { - return nil, stacktrace.NewError( - "Files artifact mountpoint string %v was '%v' but should be in the form 'mountpoint%sfiles_artifact_name'", - idx, - trimmedMountStr, - filesArtifactMountpointDelimiter, - ) + return "", stacktrace.Propagate(err, "An error occurred reading json service config from stdin.") } - mountpoint := mountFragments[0] - filesArtifactName := mountFragments[1] - - if existingName, found := result[mountpoint]; found { - return nil, stacktrace.NewError( - "Mountpoint '%v' is declared twice; once to artifact name '%v' and again to artifact name '%v'", - mountpoint, - existingName, - filesArtifactName, - ) + default: + logrus.Infof("No json provided via stdin so attempting to read json service config input from file '%v' instead.", jsonServiceConfigFlagInput) + configBytes, err = os.ReadFile(jsonServiceConfigFlagInput) + if err != nil { + return "", stacktrace.Propagate(err, "An error occurred err when attempting to read service config from file '%v'.", jsonServiceConfigFlagInput) } - - result[mountpoint] = filesArtifactName } - - return result, nil -} - -func generateExampleForPortFlag() string { - return fmt.Sprintf( - `Example: "PORTID1%v1234%vudp%vPORTID2%vhttp%v5678%vPORTID3%vhttp%v6000%vudp"`, - portIdSpecDelimiter, - portNumberProtocolDelimiter, - portDeclarationsDelimiter, - portIdSpecDelimiter, - portApplicationProtocolDelimiter, - portDeclarationsDelimiter, - portIdSpecDelimiter, - portApplicationProtocolDelimiter, - portNumberProtocolDelimiter, - ) + return string(configBytes), nil } diff --git a/cli/cli/commands/service/inspect/inspect.go b/cli/cli/commands/service/inspect/inspect.go index d89e2d7f6f..632fa915ec 100644 --- a/cli/cli/commands/service/inspect/inspect.go +++ b/cli/cli/commands/service/inspect/inspect.go @@ -7,7 +7,12 @@ package inspect import ( "context" + "encoding/json" "fmt" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/services" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/service_helpers" + "gopkg.in/yaml.v3" + "strings" "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" "github.com/kurtosis-tech/kurtosis/api/golang/engine/kurtosis_engine_rpc_api_bindings" @@ -38,14 +43,20 @@ const ( fullUuidFlagKey = "full-uuid" fullUuidFlagKeyDefault = "false" - serviceNameTitleName = "Name" - serviceUUIDTitleName = "UUID" - serviceStatusTitleName = "Status" - serviceImageTitleName = "Image" - servicePortsTitleName = "Ports" - serviceEntrypointArgsTitleName = "ENTRYPOINT" - serviceCmdArgsTitleName = "CMD" - serviceEnvVarsTitleName = "ENV" + outputFormatKey = "output" + OutputFormatKeyShorthand = "o" + stdoutOutputFormat = "" + yamlOutputFormat = "yaml" + JsonOutputFormat = "json" + + ServiceNameTitleName = "Name" + ServiceUUIDTitleName = "UUID" + ServiceStatusTitleName = "Status" + ServiceImageTitleName = "Image" + ServicePortsTitleName = "Ports" + ServiceEntrypointArgsTitleName = "ENTRYPOINT" + ServiceCmdArgsTitleName = "CMD" + ServiceEnvVarsTitleName = "ENV" kurtosisBackendCtxKey = "kurtosis-backend" engineClientCtxKey = "engine-client" @@ -64,6 +75,13 @@ var ServiceInspectCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtos Type: flags.FlagType_Bool, Default: fullUuidFlagKeyDefault, }, + { + Key: outputFormatKey, + Shorthand: OutputFormatKeyShorthand, + Usage: "Format to output the result (yaml or json)", + Type: flags.FlagType_String, + Default: stdoutOutputFormat, + }, }, Args: []*args.ArgConfig{ enclave_id_arg.NewEnclaveIdentifierArg( @@ -97,7 +115,7 @@ func run( serviceIdentifier, err := args.GetNonGreedyArg(serviceIdentifierArgKey) if err != nil { - return stacktrace.Propagate(err, "Expected a value for non-greedy enclave identifier arg '%v' but none was found; this is a bug in the Kurtosis CLI!", enclaveIdentifierArgKey) + return stacktrace.Propagate(err, "Expected a value for non-greedy enclave identifier arg '%v' but none was found; this is a bug in the Kurtosis CLI!", serviceIdentifier) } showFullUuid, err := flags.GetBool(fullUuidFlagKey) @@ -105,59 +123,73 @@ func run( return stacktrace.Propagate(err, "Expected a value for the '%v' flag but failed to get it", fullUuidFlagKey) } + outputFormat, err := flags.GetString(outputFormatKey) + if err != nil { + return stacktrace.Propagate(err, "Expected a value for the '%v' flag but failed to get it", outputFormatKey) + } + outputFormat = strings.ToLower(strings.TrimSpace(outputFormat)) + if outputFormat != "" && outputFormat != JsonOutputFormat && outputFormat != yamlOutputFormat { + return stacktrace.NewError("Invalid output format '%s'; must be '%v' or '%v'", outputFormat, JsonOutputFormat, yamlOutputFormat) + } + kurtosisCtx, err := kurtosis_context.NewKurtosisContextFromLocalEngine() if err != nil { return stacktrace.Propagate(err, "An error occurred creating Kurtosis Context from local engine") } - if err = PrintServiceInspect(ctx, kurtosisBackend, kurtosisCtx, enclaveIdentifier, serviceIdentifier, showFullUuid); err != nil { + serviceInfo, serviceConfig, err := service_helpers.GetServiceInfo(ctx, kurtosisCtx, enclaveIdentifier, serviceIdentifier) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting service info of '%v' from '%v'.", enclaveIdentifier, serviceIdentifier) + } + + if err = PrintServiceInspect(serviceInfo, serviceConfig, showFullUuid, outputFormat); err != nil { // this is already wrapped up return err } return nil } -func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface.KurtosisBackend, kurtosisCtx *kurtosis_context.KurtosisContext, enclaveIdentifier string, serviceIdentifier string, showFullUuid bool) error { - enclaveInfo, err := kurtosisCtx.GetEnclave(ctx, enclaveIdentifier) - if err != nil { - return stacktrace.Propagate(err, "An error occurred getting the enclave for identifier '%v'", enclaveIdentifier) - } - - enclaveApiContainerStatus := enclaveInfo.ApiContainerStatus - isApiContainerRunning := enclaveApiContainerStatus == kurtosis_engine_rpc_api_bindings.EnclaveAPIContainerStatus_EnclaveAPIContainerStatus_RUNNING - - userServices := map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo{} - if isApiContainerRunning { - var err error - serviceMap := map[string]bool{ - serviceIdentifier: true, +func PrintServiceInspect(userService *kurtosis_core_rpc_api_bindings.ServiceInfo, userServiceConfig *services.ServiceConfig, showFullUuid bool, outputFormat string) error { + switch outputFormat { + case JsonOutputFormat: + jsonServiceConfigStr, err := json.MarshalIndent(userServiceConfig, "", " ") + if err != nil { + return stacktrace.Propagate(err, "Failed to marshal service info to %s", outputFormat) + } + out.PrintOutLn(string(jsonServiceConfigStr)) + case yamlOutputFormat: + yamlServiceConfigStr, err := yaml.Marshal(userServiceConfig) + if err != nil { + return stacktrace.Propagate(err, "Failed to marshal service info to %s", outputFormat) } - userServices, err = user_services.GetUserServiceInfoMapFromAPIContainer(ctx, enclaveInfo, serviceMap) + out.PrintOutLn(string(yamlServiceConfigStr)) + case stdoutOutputFormat: + err := printlnServiceInfo(userService, showFullUuid) if err != nil { - return stacktrace.Propagate(err, "Failed to get service info from API container in enclave '%v'", enclaveInfo.GetEnclaveUuid()) + return stacktrace.Propagate(err, "Failed to print service info to stdout.") } + default: + return stacktrace.NewError("Unsupported output format '%v'", outputFormat) } + return nil +} - var userService *kurtosis_core_rpc_api_bindings.ServiceInfo - for _, userServiceInfo := range userServices { - userService = userServiceInfo - break - } - out.PrintOutLn(fmt.Sprintf("%s: %s", serviceNameTitleName, userService.GetName())) +func printlnServiceInfo(userService *kurtosis_core_rpc_api_bindings.ServiceInfo, shouldShowFullUuid bool) error { + out.PrintOutLn(fmt.Sprintf("%s: %s", ServiceNameTitleName, userService.GetName())) uuidStr := userService.GetShortenedUuid() - if showFullUuid { + if shouldShowFullUuid { uuidStr = userService.GetServiceUuid() } - out.PrintOutLn(fmt.Sprintf("%s: %s", serviceUUIDTitleName, uuidStr)) + out.PrintOutLn(fmt.Sprintf("%s: %s", ServiceUUIDTitleName, uuidStr)) serviceStatus := userService.GetServiceStatus() serviceStatusStr := service_status_stringifier.ServiceStatusStringifier(serviceStatus) - out.PrintOutLn(fmt.Sprintf("%s: %s", serviceStatusTitleName, serviceStatusStr)) + out.PrintOutLn(fmt.Sprintf("%s: %s", ServiceStatusTitleName, serviceStatusStr)) - out.PrintOutLn(fmt.Sprintf("%s: %s", serviceImageTitleName, userService.GetContainer().GetImageName())) + out.PrintOutLn(fmt.Sprintf("%s: %s", ServiceImageTitleName, userService.GetContainer().GetImageName())) - out.PrintOutLn(fmt.Sprintf("%s:", servicePortsTitleName)) + out.PrintOutLn(fmt.Sprintf("%s:", ServicePortsTitleName)) portBindingLines, err := user_services.GetUserServicePortBindingStrings(userService) if err != nil { return stacktrace.Propagate(err, "An error occurred getting the port binding strings") @@ -166,20 +198,19 @@ func PrintServiceInspect(ctx context.Context, kurtosisBackend backend_interface. out.PrintOutLn(fmt.Sprintf(" %s", portBindingLine)) } - out.PrintOutLn(fmt.Sprintf("%s:", serviceEntrypointArgsTitleName)) + out.PrintOutLn(fmt.Sprintf("%s:", ServiceEntrypointArgsTitleName)) for _, entrypointArg := range userService.GetContainer().GetEntrypointArgs() { out.PrintOutLn(fmt.Sprintf(" %s", entrypointArg)) } - out.PrintOutLn(fmt.Sprintf("%s:", serviceCmdArgsTitleName)) + out.PrintOutLn(fmt.Sprintf("%s:", ServiceCmdArgsTitleName)) for _, cmdArg := range userService.GetContainer().GetCmdArgs() { out.PrintOutLn(fmt.Sprintf(" %s", cmdArg)) } - out.PrintOutLn(fmt.Sprintf("%s:", serviceEnvVarsTitleName)) + out.PrintOutLn(fmt.Sprintf("%s:", ServiceEnvVarsTitleName)) for envVarKey, envVarVal := range userService.GetContainer().GetEnvVars() { out.PrintOutLn(fmt.Sprintf(" %s: %s", envVarKey, envVarVal)) } - return nil } diff --git a/cli/cli/commands/service/service.go b/cli/cli/commands/service/service.go index 8fc9ddbd6a..077ea473ab 100644 --- a/cli/cli/commands/service/service.go +++ b/cli/cli/commands/service/service.go @@ -15,6 +15,7 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/shell" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/start" "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/stop" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/update" "github.com/spf13/cobra" ) @@ -35,4 +36,5 @@ func init() { ServiceCmd.AddCommand(start.ServiceStartCmd.MustGetCobraCommand()) ServiceCmd.AddCommand(stop.ServiceStopCmd.MustGetCobraCommand()) ServiceCmd.AddCommand(inspect.ServiceInspectCmd.MustGetCobraCommand()) + ServiceCmd.AddCommand(update.ServiceUpdateCmd.MustGetCobraCommand()) } diff --git a/cli/cli/commands/service/service_helpers/service_helpers.go b/cli/cli/commands/service/service_helpers/service_helpers.go new file mode 100644 index 0000000000..620ac11654 --- /dev/null +++ b/cli/cli/commands/service/service_helpers/service_helpers.go @@ -0,0 +1,358 @@ +package service_helpers + +import ( + "context" + "fmt" + "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/enclaves" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/services" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/starlark_run_config" + "github.com/kurtosis-tech/kurtosis/api/golang/engine/kurtosis_engine_rpc_api_bindings" + "github.com/kurtosis-tech/kurtosis/api/golang/engine/lib/kurtosis_context" + "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/user_services" + "github.com/kurtosis-tech/stacktrace" + "github.com/sirupsen/logrus" + "strconv" + "strings" +) + +const ( + ImageKey = "image" + CmdKey = "cmd" + EntrypointFlagKey = "entrypoint" + EntrypointAndCmdDelimiter = " " + + EnvvarsFlagKey = "env" + EnvvarKeyValueDelimiter = "=" + EnvvarDeclarationsDelimiter = "," + + PortsFlagKey = "ports" + PortIdSpecDelimiter = "=" + PortNumberProtocolDelimiter = "/" + PortDeclarationsDelimiter = "," + PortApplicationProtocolDelimiter = ":" + PortNumberUintParsingBase = 10 + PortNumberUintParsingBits = 16 + + FilesFlagKey = "files" + FilesArtifactMountsDelimiter = "," + FilesArtifactMountpointDelimiter = ":" + FilesMultipleArtifactsDelimiter = "|" + + EmptyApplicationProtocol = "" + + MaybeApplicationProtocolSpecForHelp = "MAYBE_APPLICATION_PROTOCOL" + TransportProtocolSpecForHelp = "TRANSPORT_PROTOCOL" + PortNumberSpecForHelp = "PORT_NUMBER" + PortIdSpecForHelp = "PORT_ID" + + // Each envvar should be KEY1=VALUE1, which means we should have two components to each envvar declaration + ExpectedNumberKeyValueComponentsInEnvvarDeclaration = 2 + PortNumberIndex = 0 + TransportProtocolIndex = 1 + ExpectedPortIdSpecComponentsCount = 2 + ExpectedMountFragmentsCount = 2 + + MinRemainingPortSpecComponents = 1 + MaxRemainingPortSpecComponents = 2 + + defaultPortWaitTimeoutStr = "30s" +) + +var ( + defaultTransportProtocolStr = strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()) + serviceAddSpec = fmt.Sprintf( + `%v%v%v%v%v`, + MaybeApplicationProtocolSpecForHelp, + PortApplicationProtocolDelimiter, + PortNumberSpecForHelp, + PortNumberProtocolDelimiter, + TransportProtocolSpecForHelp, + ) +) + +// Helpers +func GetServiceInfo(ctx context.Context, kurtosisCtx *kurtosis_context.KurtosisContext, enclaveIdentifier, serviceIdentifier string) (*kurtosis_core_rpc_api_bindings.ServiceInfo, *services.ServiceConfig, error) { + enclaveInfo, err := kurtosisCtx.GetEnclave(ctx, enclaveIdentifier) + if err != nil { + return nil, nil, stacktrace.Propagate(err, "An error occurred getting the enclave for identifier '%v'", enclaveIdentifier) + } + + enclaveApiContainerStatus := enclaveInfo.ApiContainerStatus + isApiContainerRunning := enclaveApiContainerStatus == kurtosis_engine_rpc_api_bindings.EnclaveAPIContainerStatus_EnclaveAPIContainerStatus_RUNNING + + userServices := map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo{} + if isApiContainerRunning { + var err error + serviceMap := map[string]bool{ + serviceIdentifier: true, + } + userServices, err = user_services.GetUserServiceInfoMapFromAPIContainer(ctx, enclaveInfo, serviceMap) + if err != nil { + return nil, nil, stacktrace.Propagate(err, "Failed to get service info from API container in enclave '%v'", enclaveInfo.GetEnclaveUuid()) + } + } + + var service *kurtosis_core_rpc_api_bindings.ServiceInfo + for _, serviceInfo := range userServices { + service = serviceInfo + break + } + + isTiniEnabled := service.GetTiniEnabled() + serviceConfig := &services.ServiceConfig{ + Image: service.GetContainer().GetImageName(), + PrivatePorts: services.ConvertApiPortToJsonPort(service.GetPrivatePorts()), + PublicPorts: services.ConvertApiPortToJsonPort(service.GetMaybePublicPorts()), + Files: services.ConvertApiFilesArtifactsToJsonFiles(service.GetServiceDirPathsToFilesArtifactsList()), + Entrypoint: service.GetContainer().GetEntrypointArgs(), + Cmd: service.GetContainer().GetCmdArgs(), + EnvVars: service.GetContainer().GetEnvVars(), + PrivateIPAddressPlaceholder: "", // leave empty for now + MaxMillicpus: service.GetMaxMillicpus(), + MinMillicpus: service.GetMinMillicpus(), + MaxMemory: service.GetMaxMemoryMegabytes(), + MinMemory: service.GetMinMemoryMegabytes(), + User: services.ConvertApiUserToJsonUser(service.GetUser()), + Tolerations: services.ConvertApiTolerationsToJsonTolerations(service.GetTolerations()), + NodeSelectors: service.GetNodeSelectors(), + Labels: service.GetLabels(), + TiniEnabled: &isTiniEnabled, + } + + return service, serviceConfig, nil +} + +func GetAddServiceStarlarkScript(serviceName string, serviceConfigStarlark string) string { + return fmt.Sprintf(`def run(plan): + plan.add_service(name = "%s", config = %s) +`, serviceName, serviceConfigStarlark) +} + +func RunAddServiceStarlarkScript(ctx context.Context, serviceName, enclaveIdentifier, starlarkScript string, enclaveCtx *enclaves.EnclaveContext) (*enclaves.StarlarkRunResult, error) { + logrus.Infof("ADD SERVICE STARLARK:\n%v", starlarkScript) + starlarkRunResult, err := enclaveCtx.RunStarlarkScriptBlocking(ctx, starlarkScript, starlark_run_config.NewRunStarlarkConfig()) + if err != nil { + return nil, stacktrace.Propagate(err, "An error has occurred when running Starlark to add service") + } + if starlarkRunResult.InterpretationError != nil { + return nil, stacktrace.NewError("An error has occurred when adding service: %s\nThis is a bug in Kurtosis, please report.", starlarkRunResult.InterpretationError) + } + if len(starlarkRunResult.ValidationErrors) > 0 { + return nil, stacktrace.NewError("An error occurred when validating add service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ValidationErrors) + } + if starlarkRunResult.ExecutionError != nil { + return nil, stacktrace.NewError("An error occurred adding service '%v' to enclave '%v': %s", serviceName, enclaveIdentifier, starlarkRunResult.ExecutionError) + } + return starlarkRunResult, nil +} + +// Parses a string in the form KEY1=VALUE1,KEY2=VALUE2 into a map of strings +// An empty string will result in an empty map +// Empty strings will be skipped (e.g. ',,,' will result in an empty map) +func ParseEnvVarsStr(envvarsStr string) (map[string]string, error) { + result := map[string]string{} + if envvarsStr == "" { + return result, nil + } + + allEnvvarDeclarationStrs := strings.Split(envvarsStr, EnvvarDeclarationsDelimiter) + for _, envvarDeclarationStr := range allEnvvarDeclarationStrs { + if len(strings.TrimSpace(envvarDeclarationStr)) == 0 { + continue + } + + envvarKeyValueComponents := strings.SplitN(envvarDeclarationStr, EnvvarKeyValueDelimiter, ExpectedNumberKeyValueComponentsInEnvvarDeclaration) + if len(envvarKeyValueComponents) < ExpectedNumberKeyValueComponentsInEnvvarDeclaration { + return nil, stacktrace.NewError("Environment declaration string '%v' must be of the form KEY1%vVALUE1", envvarDeclarationStr, EnvvarKeyValueDelimiter) + } + key := envvarKeyValueComponents[0] + value := envvarKeyValueComponents[1] + + preexistingValue, found := result[key] + if found { + return nil, stacktrace.NewError( + "Cannot declare environment variable '%v' assigned to value '%v' because the key has previously been assigned to value '%v'", + key, + value, + preexistingValue, + ) + } + + result[key] = value + } + + return result, nil +} + +// Parses a string in the form PORTID1=1234,PORTID2=5678/udp +// An empty string will result in an empty map +// Empty strings will be skipped (e.g. ',,,' will result in an empty map) +func ParsePortsStr(portsStr string) (map[string]*kurtosis_core_rpc_api_bindings.Port, error) { + result := map[string]*kurtosis_core_rpc_api_bindings.Port{} + if strings.TrimSpace(portsStr) == "" { + return result, nil + } + + allPortDeclarationStrs := strings.Split(portsStr, PortDeclarationsDelimiter) + for _, portDeclarationStr := range allPortDeclarationStrs { + if len(strings.TrimSpace(portDeclarationStr)) == 0 { + continue + } + + portIdSpecComponents := strings.Split(portDeclarationStr, PortIdSpecDelimiter) + if len(portIdSpecComponents) != ExpectedPortIdSpecComponentsCount { + return nil, stacktrace.NewError("Port declaration string '%v' must be of the form PORTID%vSPEC", portDeclarationStr, PortIdSpecDelimiter) + } + portId := portIdSpecComponents[0] + specStr := portIdSpecComponents[1] + if len(strings.TrimSpace(portId)) == 0 { + return nil, stacktrace.NewError("Port declaration with spec string '%v' has an empty port ID", specStr) + } + portSpec, err := parsePortSpecStr(specStr) + if err != nil { + return nil, stacktrace.Propagate(err, "An error occurred parsing port spec string '%v' for port with ID '%v'", specStr, portId) + } + + if _, found := result[portId]; found { + return nil, stacktrace.NewError( + "Cannot define port '%v' with spec '%v' because it is already defined", + portId, + specStr, + ) + } + + result[portId] = portSpec + } + + return result, nil +} + +func parsePortSpecStr(specStr string) (*kurtosis_core_rpc_api_bindings.Port, error) { + if len(strings.TrimSpace(specStr)) == 0 { + return nil, stacktrace.NewError("Cannot parse empty spec string") + } + + maybeApplicationProtocol, remainingPortSpec, err := getMaybeApplicationProtocolFromPortSpecString(specStr) + if err != nil { + return nil, stacktrace.Propagate(err, "Error occurred while parsing application protocol '%v' in port spec '%v'", maybeApplicationProtocol, specStr) + } + + remainingPortSpecComponents := strings.Split(remainingPortSpec, PortNumberProtocolDelimiter) + numRemainingPortSpecComponents := len(remainingPortSpecComponents) + if numRemainingPortSpecComponents > MaxRemainingPortSpecComponents { + return nil, stacktrace.NewError( + `Invalid port spec string, expected format is %q but got '%v'`, + serviceAddSpec, + specStr, + ) + } + + portNumberUint16, err := getPortNumberFromPortSpecString(remainingPortSpecComponents[PortNumberIndex]) + if err != nil { + return nil, stacktrace.Propagate(err, "Error occurred while parsing port number '%v' in port spec '%v'", remainingPortSpecComponents[PortNumberIndex], specStr) + } + + transportProtocol := defaultTransportProtocolStr + if numRemainingPortSpecComponents > MinRemainingPortSpecComponents { + transportProtocol = remainingPortSpecComponents[TransportProtocolIndex] + } + + transportProtocolFromEnum, err := getTransportProtocolFromPortSpecString(transportProtocol) + if err != nil { + return nil, stacktrace.Propagate(err, "Error occurred while parsing transport protocol '%v' in port spec '%v'", remainingPortSpecComponents[TransportProtocolIndex], specStr) + } + return &kurtosis_core_rpc_api_bindings.Port{ + Number: portNumberUint16, + TransportProtocol: transportProtocolFromEnum, + MaybeApplicationProtocol: maybeApplicationProtocol, + MaybeWaitTimeout: defaultPortWaitTimeoutStr, //TODO we should add this to the port's arguments instead of using only a default value + Locked: nil, + Alias: nil, + }, nil +} + +/* +* +This method takes in port protocol string and parses it to get application protocol. +It looks for `:` delimiter and splits the string into array of at most size 2. If the length +of array is 2 then application protocol exists, otherwise it does not. This is basically what +strings.Cut() does. // TODO: use that instead once we update go version +*/ +func getMaybeApplicationProtocolFromPortSpecString(portProtocolStr string) (string, string, error) { + + beforeDelimiter, afterDelimiter, foundDelimiter := strings.Cut(portProtocolStr, PortApplicationProtocolDelimiter) + + if !foundDelimiter { + return EmptyApplicationProtocol, beforeDelimiter, nil + } + + if foundDelimiter && beforeDelimiter == EmptyApplicationProtocol { + return EmptyApplicationProtocol, "", stacktrace.NewError("optional application protocol argument cannot be empty") + } + + return beforeDelimiter, afterDelimiter, nil +} + +func getPortNumberFromPortSpecString(portNumberStr string) (uint32, error) { + portNumberUint64, err := strconv.ParseUint(portNumberStr, PortNumberUintParsingBase, PortNumberUintParsingBits) + if err != nil { + return 0, stacktrace.Propagate( + err, + "An error occurred parsing port number string '%v' with base '%v' and bits '%v'", + portNumberStr, + PortNumberUintParsingBase, + PortNumberUintParsingBits, + ) + } + portNumberUint32 := uint32(portNumberUint64) + return portNumberUint32, nil +} + +func getTransportProtocolFromPortSpecString(portSpec string) (kurtosis_core_rpc_api_bindings.Port_TransportProtocol, error) { + transportProtocolEnumInt, found := kurtosis_core_rpc_api_bindings.Port_TransportProtocol_value[strings.ToUpper(portSpec)] + if !found { + return 0, stacktrace.NewError("Unrecognized port protocol '%v'", portSpec) + } + return kurtosis_core_rpc_api_bindings.Port_TransportProtocol(transportProtocolEnumInt), nil +} + +func ParseFilesArtifactMountsStr(filesArtifactMountsStr string) (map[string][]string, error) { + result := map[string][]string{} + if strings.TrimSpace(filesArtifactMountsStr) == "" { + return result, nil + } + + // NOTE: we might actually want to allow the same artifact being mounted in multiple places + allMountStrs := strings.Split(filesArtifactMountsStr, FilesArtifactMountsDelimiter) + for idx, mountStr := range allMountStrs { + trimmedMountStr := strings.TrimSpace(mountStr) + if len(trimmedMountStr) == 0 { + continue + } + + mountFragments := strings.Split(trimmedMountStr, FilesArtifactMountpointDelimiter) + if len(mountFragments) != ExpectedMountFragmentsCount { + return nil, stacktrace.NewError( + "Files artifact mountpoint string %v was '%v' but should be in the form 'mountpoint%sfiles_artifact_name'", + idx, + trimmedMountStr, + FilesArtifactMountpointDelimiter, + ) + } + mountpoint := mountFragments[0] + filesArtifactNamesStr := mountFragments[1] + if existingNames, found := result[mountpoint]; found { + return nil, stacktrace.NewError( + "Mountpoint '%v' is declared twice; once to artifact name '%v' and again to artifact name '%v'", + mountpoint, + existingNames, + filesArtifactNamesStr, + ) + } + + result[mountpoint] = strings.Split(filesArtifactNamesStr, FilesMultipleArtifactsDelimiter) + } + + return result, nil +} diff --git a/cli/cli/commands/service/add/add_test.go b/cli/cli/commands/service/service_helpers/service_helpers_test.go similarity index 82% rename from cli/cli/commands/service/add/add_test.go rename to cli/cli/commands/service/service_helpers/service_helpers_test.go index b291ff0383..523459d64e 100644 --- a/cli/cli/commands/service/add/add_test.go +++ b/cli/cli/commands/service/service_helpers/service_helpers_test.go @@ -1,4 +1,4 @@ -package add +package service_helpers import ( "fmt" @@ -140,17 +140,17 @@ func TestParsePortSpecstr_CustomProtocol(t *testing.T) { } func TestParsePortsStr_DuplicatePortsCauseError(t *testing.T) { - _, err := parsePortsStr("http=80/tcp,http=8080") + _, err := ParsePortsStr("http=80/tcp,http=8080") require.Error(t, err) } func TestParsePortsStr_EmptyPortIDCausesError(t *testing.T) { - _, err := parsePortsStr("=80/tcp") + _, err := ParsePortsStr("=80/tcp") require.Error(t, err) } func TestParsePortsStr_SuccessfulPortsString(t *testing.T) { - ports, err := parsePortsStr("port1=8080,port2=2900/udp") + ports, err := ParsePortsStr("port1=8080,port2=2900/udp") require.NoError(t, err) require.Equal(t, 2, len(ports)) @@ -166,7 +166,7 @@ func TestParsePortsStr_SuccessfulPortsString(t *testing.T) { } func TestParseEnvVarsStr_EqualSignInValueIsOkay(t *testing.T) { - envvars, err := parseEnvVarsStr("VAR=thing=otherthing") + envvars, err := ParseEnvVarsStr("VAR=thing=otherthing") require.NoError(t, err) require.Equal(t, 1, len(envvars)) @@ -176,7 +176,7 @@ func TestParseEnvVarsStr_EqualSignInValueIsOkay(t *testing.T) { } func TestParseEnvVarsStr_MultipleVarsAreOkay(t *testing.T) { - envvars, err := parseEnvVarsStr("VAR1=VALUE1,VAR2=VALUE2") + envvars, err := ParseEnvVarsStr("VAR1=VALUE1,VAR2=VALUE2") require.NoError(t, err) require.Equal(t, 2, len(envvars)) @@ -190,12 +190,12 @@ func TestParseEnvVarsStr_MultipleVarsAreOkay(t *testing.T) { } func TestParseEnvVarsStr_DuplicateVarNamesError(t *testing.T) { - _, err := parseEnvVarsStr("VAR1=VALUE1,VAR1=VALUE2") + _, err := ParseEnvVarsStr("VAR1=VALUE1,VAR1=VALUE2") require.Error(t, err) } func TestParseEnvVarsStr_EmptyDeclarations(t *testing.T) { - envvars, err := parseEnvVarsStr("VAR1=VALUE1,, , ,,") + envvars, err := ParseEnvVarsStr("VAR1=VALUE1,, , ,,") require.NoError(t, err) require.Equal(t, 1, len(envvars)) } @@ -206,7 +206,7 @@ func TestParseFilesArtifactMountStr_ValidParse(t *testing.T) { mountpoint1 := "/dest1" mountpoint2 := "/dest2" - result, err := parseFilesArtifactMountsStr(fmt.Sprintf( + result, err := ParseFilesArtifactMountsStr(fmt.Sprintf( "%v:%v,%v:%v", mountpoint1, artifactUuid1, @@ -216,13 +216,13 @@ func TestParseFilesArtifactMountStr_ValidParse(t *testing.T) { require.NoError(t, err) require.Equal(t, 2, len(result)) - parsedArtifactUuid1, found := result[mountpoint1] + parsedArtifactsUuid1, found := result[mountpoint1] require.True(t, found) - require.Equal(t, artifactUuid1, parsedArtifactUuid1) + require.Equal(t, artifactUuid1, parsedArtifactsUuid1[0]) - parsedArtifactUuid2, found := result[mountpoint2] + parsedArtifactsUuid2, found := result[mountpoint2] require.True(t, found) - require.Equal(t, artifactUuid2, parsedArtifactUuid2) + require.Equal(t, artifactUuid2, parsedArtifactsUuid2[0]) } func TestParseFilesArtifactMountStr_EmptyDeclarationsAreSkipped(t *testing.T) { @@ -231,7 +231,7 @@ func TestParseFilesArtifactMountStr_EmptyDeclarationsAreSkipped(t *testing.T) { mountpoint1 := "/dest1" mountpoint2 := "/dest2" - result, err := parseFilesArtifactMountsStr(fmt.Sprintf( + result, err := ParseFilesArtifactMountsStr(fmt.Sprintf( "%v:%v,,,,,%v:%v", mountpoint1, artifactUuid1, @@ -241,20 +241,20 @@ func TestParseFilesArtifactMountStr_EmptyDeclarationsAreSkipped(t *testing.T) { require.NoError(t, err) require.Equal(t, 2, len(result)) - parsedArtifactUuid1, found := result[mountpoint1] + parsedArtifactsUuid1, found := result[mountpoint1] require.True(t, found) - require.Equal(t, artifactUuid1, parsedArtifactUuid1) + require.Equal(t, artifactUuid1, parsedArtifactsUuid1[0]) - parsedArtifactUuid2, found := result[mountpoint2] + parsedArtifactsUuid2, found := result[mountpoint2] require.True(t, found) - require.Equal(t, artifactUuid2, parsedArtifactUuid2) + require.Equal(t, artifactUuid2, parsedArtifactsUuid2[0]) } func TestParseFilesArtifactMountStr_TooManyArtifactUuidMountpointDelimitersIsError(t *testing.T) { artifactUuid := services.FilesArtifactUUID("1234") mountpoint := "/dest" - _, err := parseFilesArtifactMountsStr(fmt.Sprintf( + _, err := ParseFilesArtifactMountsStr(fmt.Sprintf( "%v::%v", artifactUuid, mountpoint, @@ -266,7 +266,7 @@ func TestParseFilesArtifactMountStr_TooFewArtifactUuidMountpointDelimitersIsErro artifactUuid := services.FilesArtifactUUID("1234") mountpoint := "/dest" - _, err := parseFilesArtifactMountsStr(fmt.Sprintf( + _, err := ParseFilesArtifactMountsStr(fmt.Sprintf( "%v%v", artifactUuid, mountpoint, @@ -279,7 +279,7 @@ func TestParseFilesArtifactMountStr_DuplicateArtifactUuids(t *testing.T) { mountpoint1 := "/dest1" mountpoint2 := "/dest2" - _, err := parseFilesArtifactMountsStr(fmt.Sprintf( + _, err := ParseFilesArtifactMountsStr(fmt.Sprintf( "%v:%v,%v:%v", artifactUuid, mountpoint1, @@ -288,3 +288,24 @@ func TestParseFilesArtifactMountStr_DuplicateArtifactUuids(t *testing.T) { )) require.Error(t, err) } + +func TestParseMultipleFilesArtifactMountAtOneDirPathStr_ValidParse(t *testing.T) { + mountpoint1 := "/dest1" + artifactUuid1 := "1234" + artifactUuid2 := "4567" + + result, err := ParseFilesArtifactMountsStr(fmt.Sprintf( + "%v:%v|%v", + mountpoint1, + artifactUuid1, + artifactUuid2, + )) + require.NoError(t, err) + require.Equal(t, 1, len(result)) + + parsedArtifacts, found := result[mountpoint1] + require.True(t, found) + require.Len(t, parsedArtifacts, 2) + require.Equal(t, artifactUuid1, parsedArtifacts[0]) + require.Equal(t, artifactUuid2, parsedArtifacts[1]) +} diff --git a/cli/cli/commands/service/start/start.go b/cli/cli/commands/service/start/start.go index 73206466f3..f32571492a 100644 --- a/cli/cli/commands/service/start/start.go +++ b/cli/cli/commands/service/start/start.go @@ -4,6 +4,7 @@ import ( "context" "fmt" "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/starlark_run_config" + "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/metrics_client_factory" "github.com/sirupsen/logrus" "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/enclaves" @@ -91,6 +92,16 @@ func run( return stacktrace.Propagate(err, "An error occurred getting an enclave context from enclave info for enclave '%v'", enclaveIdentifier) } + metricsClient, closeMetricsClientFunc, err := metrics_client_factory.GetMetricsClient() + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting metrics client.") + } + defer func() { + if err = closeMetricsClientFunc(); err != nil { + logrus.Warnf("An error occurred closing metrics client:\n%v", closeMetricsClientFunc()) + } + }() + for _, serviceIdentifier := range serviceIdentifiers { logrus.Infof("Starting service '%v'", serviceIdentifier) serviceContext, err := enclaveCtx.GetServiceContext(serviceIdentifier) @@ -100,9 +111,15 @@ func run( serviceName := serviceContext.GetServiceName() + err = metricsClient.TrackStartService(enclaveIdentifier, string(serviceName)) + if err != nil { + return stacktrace.Propagate(err, "An error occurred tracking service update metric.") + } + if err := startServiceStarlarkCommand(ctx, enclaveCtx, serviceName); err != nil { return stacktrace.Propagate(err, "An error occurred starting service '%v' from enclave '%v'", serviceIdentifier, enclaveIdentifier) } + } return nil } diff --git a/cli/cli/commands/service/stop/stop.go b/cli/cli/commands/service/stop/stop.go index 4c69b8e17e..f784290141 100644 --- a/cli/cli/commands/service/stop/stop.go +++ b/cli/cli/commands/service/stop/stop.go @@ -10,6 +10,7 @@ import ( "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/args" "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/flags" "github.com/kurtosis-tech/kurtosis/cli/cli/command_str_consts" + "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/metrics_client_factory" "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/shared_starlark_calls" "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" "github.com/kurtosis-tech/kurtosis/metrics-library/golang/lib/metrics_client" @@ -82,6 +83,16 @@ func run( return stacktrace.Propagate(err, "An error occurred getting an enclave context from enclave info for enclave '%v'", enclaveIdentifier) } + metricsClient, closeMetricsClientFunc, err := metrics_client_factory.GetMetricsClient() + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting metrics client.") + } + defer func() { + if err = closeMetricsClientFunc(); err != nil { + logrus.Warnf("An error occurred closing metrics client:\n%v", closeMetricsClientFunc()) + } + }() + for _, serviceIdentifier := range serviceIdentifiers { logrus.Infof("Stopping service '%v'", serviceIdentifier) serviceContext, err := enclaveCtx.GetServiceContext(serviceIdentifier) @@ -91,6 +102,11 @@ func run( serviceName := serviceContext.GetServiceName() + err = metricsClient.TrackStopService(enclaveIdentifier, string(serviceName)) + if err != nil { + return stacktrace.Propagate(err, "An error occurred tracking service update metric.") + } + if err := shared_starlark_calls.StopServiceStarlarkCommand(ctx, enclaveCtx, serviceName); err != nil { return stacktrace.Propagate(err, "An error occurred stopping service '%v' from enclave '%v'", serviceIdentifier, enclaveIdentifier) } diff --git a/cli/cli/commands/service/update/update.go b/cli/cli/commands/service/update/update.go new file mode 100644 index 0000000000..98611577c4 --- /dev/null +++ b/cli/cli/commands/service/update/update.go @@ -0,0 +1,433 @@ +package update + +import ( + "context" + "fmt" + "github.com/kurtosis-tech/kurtosis/api/golang/core/kurtosis_core_rpc_api_bindings" + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/services" + "github.com/kurtosis-tech/kurtosis/api/golang/engine/kurtosis_engine_rpc_api_bindings" + "github.com/kurtosis-tech/kurtosis/api/golang/engine/lib/kurtosis_context" + "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/highlevel/enclave_id_arg" + "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/highlevel/engine_consuming_kurtosis_command" + "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/highlevel/service_identifier_arg" + "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/args" + "github.com/kurtosis-tech/kurtosis/cli/cli/command_framework/lowlevel/flags" + "github.com/kurtosis-tech/kurtosis/cli/cli/command_str_consts" + "github.com/kurtosis-tech/kurtosis/cli/cli/commands/service/service_helpers" + "github.com/kurtosis-tech/kurtosis/cli/cli/helpers/metrics_client_factory" + "github.com/kurtosis-tech/kurtosis/cli/cli/out" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface" + "github.com/kurtosis-tech/kurtosis/metrics-library/golang/lib/metrics_client" + "github.com/kurtosis-tech/stacktrace" + "github.com/sirupsen/logrus" + "strings" +) + +const ( + enclaveIdentifierArgKey = "enclave" + isEnclaveIdArgOptional = false + isEnclaveIdArgGreedy = false + + serviceIdentifierArgKey = "service" + isServiceIdentifierArgOptional = false + isServiceIdentifierArgGreedy = false + + kurtosisBackendCtxKey = "kurtosis-backend" + engineClientCtxKey = "engine-client" +) + +var ( + defaultTransportProtocolStr = strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()) + serviceAddSpec = fmt.Sprintf( + `%v%v%v%v%v`, + service_helpers.MaybeApplicationProtocolSpecForHelp, + service_helpers.PortApplicationProtocolDelimiter, + service_helpers.PortNumberSpecForHelp, + service_helpers.PortNumberProtocolDelimiter, + service_helpers.TransportProtocolSpecForHelp, + ) + serviceAddSpecWithPortId = fmt.Sprintf( + `%v%v%v`, + service_helpers.PortIdSpecForHelp, + service_helpers.PortIdSpecDelimiter, + serviceAddSpec, + ) +) + +var ServiceUpdateCmd = &engine_consuming_kurtosis_command.EngineConsumingKurtosisCommand{ + CommandStr: command_str_consts.ServiceUpdateCmdStr, + ShortDescription: "Update a service", + LongDescription: "Update a service", + KurtosisBackendContextKey: kurtosisBackendCtxKey, + EngineClientContextKey: engineClientCtxKey, + Flags: []*flags.FlagConfig{ + { + Key: service_helpers.ImageKey, + Usage: "Image to use for the service being updated.", + Type: flags.FlagType_String, + Default: "", + }, + { + Key: service_helpers.CmdKey, + Usage: "CMD to run on the service once it is restarted by the update.", + // TODO Make this a string list + Type: flags.FlagType_String, + Default: "", + }, + { + Key: service_helpers.EntrypointFlagKey, + Usage: "ENTRYPOINT binary that will be used when running the container, overriding the image's default ENTRYPOINT", + // TODO Make this a string list + Type: flags.FlagType_String, + Default: "", + }, + { + // TODO We currently can't handle commas, so allow users to set the flag multiple times to set multiple envvars + Key: service_helpers.EnvvarsFlagKey, + Usage: fmt.Sprintf( + "String containing environment variables that will be set when running the container, in "+ + "the form \"KEY1%vVALUE1%vKEY2%vVALUE2\"", + service_helpers.EnvvarKeyValueDelimiter, + service_helpers.EnvvarDeclarationsDelimiter, + service_helpers.EnvvarKeyValueDelimiter, + ), + Type: flags.FlagType_String, + Default: "", + }, + { + Key: service_helpers.PortsFlagKey, + Usage: fmt.Sprintf(`String containing declarations of ports that the container will listen on, in the form, %q`+ + ` where %q is a user friendly string for identifying the port, %q is required field, %q is an optional field which must be either`+ + ` '%v' or '%v' and defaults to '%v' if omitted and %q is user defined optional value. %v`, + serviceAddSpecWithPortId, + service_helpers.PortIdSpecForHelp, + service_helpers.PortNumberSpecForHelp, + service_helpers.TransportProtocolSpecForHelp, + strings.ToLower(kurtosis_core_rpc_api_bindings.Port_TCP.String()), + strings.ToLower(kurtosis_core_rpc_api_bindings.Port_UDP.String()), + defaultTransportProtocolStr, + service_helpers.MaybeApplicationProtocolSpecForHelp, + generateExampleForPortFlag(), + ), + Type: flags.FlagType_String, + Default: "", + }, + { + Key: service_helpers.FilesFlagKey, + Usage: fmt.Sprintf( + "String containing declarations of files paths on the container -> artifact name where the contents of those "+ + "files artifacts should be mounted, in the form \"MOUNTPATH1%vARTIFACTNAME1%vMOUNTPATH2%vARTIFACTNAME2\" where "+ + "ARTIFACTNAME is the name returned by Kurtosis when uploading files to the enclave (e.g. via the '%v %v' command)"+ + "directories can be mounted by mounting multiple artifacts to the same mountpath, in the form, \"MOUNTPATH1%vARTIFACTNAME1%vARTIFACTNAME2\"", + service_helpers.FilesArtifactMountpointDelimiter, + service_helpers.FilesArtifactMountsDelimiter, + service_helpers.FilesArtifactMountpointDelimiter, + command_str_consts.FilesCmdStr, + command_str_consts.FilesUploadCmdStr, + service_helpers.FilesArtifactMountpointDelimiter, + service_helpers.FilesMultipleArtifactsDelimiter, + ), + Type: flags.FlagType_String, + Default: "", + }, + }, + Args: []*args.ArgConfig{ + enclave_id_arg.NewEnclaveIdentifierArg( + enclaveIdentifierArgKey, + engineClientCtxKey, + isEnclaveIdArgOptional, + isEnclaveIdArgGreedy, + ), + service_identifier_arg.NewServiceIdentifierArg( + serviceIdentifierArgKey, + enclaveIdentifierArgKey, + isServiceIdentifierArgGreedy, + isServiceIdentifierArgOptional, + ), + }, + RunFunc: run, +} + +func run( + ctx context.Context, + kurtosisBackend backend_interface.KurtosisBackend, + _ kurtosis_engine_rpc_api_bindings.EngineServiceClient, + _ metrics_client.MetricsClient, + flags *flags.ParsedFlags, + args *args.ParsedArgs, +) error { + enclaveIdentifier, err := args.GetNonGreedyArg(enclaveIdentifierArgKey) + if err != nil { + return stacktrace.Propagate(err, "Expected a value for non-greedy enclave identifier arg '%v' but none was found; this is a bug in the Kurtosis CLI!", enclaveIdentifierArgKey) + } + + // TODO: need to enforce this is always service name, and not service uuid or short uuid + serviceName, err := args.GetNonGreedyArg(serviceIdentifierArgKey) + if err != nil { + return stacktrace.Propagate(err, "Expected a value for non-greedy enclave identifier arg '%v' but none was found; this is a bug in the Kurtosis CLI!", serviceIdentifierArgKey) + } + + kurtosisCtx, err := kurtosis_context.NewKurtosisContextFromLocalEngine() + if err != nil { + return stacktrace.Propagate(err, "An error occurred creating Kurtosis Context from local engine") + } + + enclaveCtx, err := kurtosisCtx.GetEnclaveContext(ctx, enclaveIdentifier) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting an enclave context from enclave info for enclave '%v'", enclaveIdentifier) + } + metricsClient, closeMetricsClientFunc, err := metrics_client_factory.GetMetricsClient() + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting metrics client.") + } + defer func() { + if err = closeMetricsClientFunc(); err != nil { + logrus.Warnf("An error occurred closing metrics client:\n%v", closeMetricsClientFunc()) + } + }() + + err = metricsClient.TrackServiceUpdate(enclaveIdentifier, serviceName) + if err != nil { + return stacktrace.Propagate(err, "An error occurred tracking service update metric.") + } + + imageStr, err := flags.GetString(service_helpers.ImageKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the image using key '%v'", service_helpers.ImageKey) + } + + cmdStr, err := flags.GetString(service_helpers.CmdKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the cmd using key '%v'", service_helpers.CmdKey) + } + + entrypointStr, err := flags.GetString(service_helpers.EntrypointFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the ENTRYPOINT binary using key '%v'", service_helpers.EntrypointFlagKey) + } + + envVarsStr, err := flags.GetString(service_helpers.EnvvarsFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the env vars string using key '%v'", service_helpers.EnvvarsFlagKey) + } + + portsStr, err := flags.GetString(service_helpers.PortsFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the ports string using key '%v'", service_helpers.PortsFlagKey) + } + + filesArtifactMountsStr, err := flags.GetString(service_helpers.FilesFlagKey) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting the files artifact mounts string using key '%v'", service_helpers.FilesFlagKey) + } + + overridesServiceConfig, err := parseOverridesServiceConfigFromFlags( + imageStr, + entrypointStr, + cmdStr, + filesArtifactMountsStr, + envVarsStr, + portsStr, + ) + if err != nil { + return stacktrace.Propagate(err, "An error occurred parsing overrides service config from flags image '%v', entrypoint '%v', cmd '%v', files artifacts mount '%v', env vars '%v', and ports '%v'.", + imageStr, + entrypointStr, + cmdStr, + filesArtifactMountsStr, + envVarsStr, + portsStr, + ) + } + + _, currServiceConfig, err := service_helpers.GetServiceInfo(ctx, kurtosisCtx, enclaveIdentifier, serviceName) + if err != nil { + return stacktrace.Propagate(err, "An error occurred getting service info of service '%v' in enclave '%v'.", serviceName, enclaveIdentifier) + } + + updatedServiceConfig := createUpdatedServiceConfigFromOverrides(overridesServiceConfig, currServiceConfig) + + // call getServiceConfig + serviceConfigStr := services.GetFullServiceConfigStarlark( + updatedServiceConfig.Image, + services.ConvertJsonPortToApiPort(updatedServiceConfig.PrivatePorts), + updatedServiceConfig.Files, + updatedServiceConfig.Entrypoint, + updatedServiceConfig.Cmd, + updatedServiceConfig.EnvVars, + updatedServiceConfig.MaxMillicpus, + updatedServiceConfig.MaxMemory, + updatedServiceConfig.MinMillicpus, + updatedServiceConfig.MinMemory, + updatedServiceConfig.User, + updatedServiceConfig.Tolerations, + updatedServiceConfig.NodeSelectors, + updatedServiceConfig.Labels, + updatedServiceConfig.TiniEnabled, + updatedServiceConfig.PrivateIPAddressPlaceholder, + ) + + addServiceStarlarkStr := service_helpers.GetAddServiceStarlarkScript(serviceName, serviceConfigStr) + + logrus.Infof("Running update service starlark for service '%v' in enclave '%v'...", serviceName, enclaveIdentifier) + starlarkRunResult, err := service_helpers.RunAddServiceStarlarkScript(ctx, serviceName, enclaveIdentifier, addServiceStarlarkStr, enclaveCtx) + if err != nil { + return err //already wrapped + } + + out.PrintOutLn(string(starlarkRunResult.RunOutput)) + return nil +} + +func generateExampleForPortFlag() string { + return fmt.Sprintf( + `Example: "PORTID1%v1234%vudp%vPORTID2%vhttp%v5678%vPORTID3%vhttp%v6000%vudp"`, + service_helpers.PortIdSpecDelimiter, + service_helpers.PortNumberProtocolDelimiter, + service_helpers.PortDeclarationsDelimiter, + service_helpers.PortIdSpecDelimiter, + service_helpers.PortApplicationProtocolDelimiter, + service_helpers.PortDeclarationsDelimiter, + service_helpers.PortIdSpecDelimiter, + service_helpers.PortApplicationProtocolDelimiter, + service_helpers.PortNumberProtocolDelimiter, + ) +} + +func parseOverridesServiceConfigFromFlags( + image string, + entrypoint string, + cmd string, + filesArtifactsMount string, + envVars string, + ports string) (*services.ServiceConfig, error) { + var err error + overrideImage := image + + var overrideCmd []string + if cmd != "" { + overrideCmd = []string{cmd} + } + + var overrideEntrypoint []string + if entrypoint != "" { + overrideEntrypoint = []string{entrypoint} + } + + var overrideEnvVars map[string]string + if envVars != "" { + overrideEnvVars, err = service_helpers.ParseEnvVarsStr(envVars) + if err != nil { + return nil, stacktrace.Propagate(err, "An error occurred parsing env vars string: %v", envVars) + } + } + + var overridePorts map[string]*kurtosis_core_rpc_api_bindings.Port + if ports != "" { + overridePorts, err = service_helpers.ParsePortsStr(ports) + if err != nil { + return nil, stacktrace.Propagate(err, "An error occurred parsing ports string: %v", ports) + } + } + + var overrideFilesArtifactsMountpoint map[string][]string + if filesArtifactsMount != "" { + overrideFilesArtifactsMountpoint, err = service_helpers.ParseFilesArtifactMountsStr(filesArtifactsMount) + if err != nil { + return nil, stacktrace.Propagate(err, "An error occurred parsing files artifacts mount points string: %v", filesArtifactsMount) + } + } + + return &services.ServiceConfig{ + Image: overrideImage, + PrivatePorts: services.ConvertApiPortToJsonPort(overridePorts), + PublicPorts: nil, + Files: overrideFilesArtifactsMountpoint, + Entrypoint: overrideEntrypoint, + Cmd: overrideCmd, + EnvVars: overrideEnvVars, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, nil +} + +func createUpdatedServiceConfigFromOverrides(overridesServiceConfig, currServiceConfig *services.ServiceConfig) *services.ServiceConfig { + // if override image was provided, use that as the image, otherwise keep curr + var updatedImage string + if overridesServiceConfig.Image != "" { + updatedImage = overridesServiceConfig.Image + } else { + updatedImage = currServiceConfig.Image + } + + // if override entrypoint was provided, use that as the entrypoint, otherwise keep curr + var updatedEntrypoint []string + if len(overridesServiceConfig.Entrypoint) > 0 { + updatedEntrypoint = overridesServiceConfig.Entrypoint + } else { + updatedEntrypoint = currServiceConfig.Entrypoint + } + + // if override cmd was provided, use that as the cmd, otherwise keep curr + var updatedCmd []string + if len(overridesServiceConfig.Cmd) > 0 { + updatedCmd = overridesServiceConfig.Cmd + } else { + updatedCmd = currServiceConfig.Cmd + } + + // combine current ports with override ports + updatedPorts := map[string]services.Port{} + for portId, port := range currServiceConfig.PrivatePorts { + updatedPorts[portId] = port + } + for portId, port := range overridesServiceConfig.PrivatePorts { + updatedPorts[portId] = port + } + + // combine current env vars with override env vars + updatedEnvVarsMap := map[string]string{} + for key, val := range currServiceConfig.EnvVars { + updatedEnvVarsMap[key] = val + } + for key, val := range overridesServiceConfig.EnvVars { + updatedEnvVarsMap[key] = val + } + + // combine current files artifacts mount points with override mount points + updatedFilesArtifactsMountpoint := map[string][]string{} + for key, val := range currServiceConfig.Files { + updatedFilesArtifactsMountpoint[key] = val + } + for key, val := range overridesServiceConfig.Files { + updatedFilesArtifactsMountpoint[key] = val + } + + return &services.ServiceConfig{ + Image: updatedImage, + PrivatePorts: updatedPorts, + PublicPorts: nil, + Files: updatedFilesArtifactsMountpoint, + Entrypoint: updatedEntrypoint, + Cmd: updatedCmd, + EnvVars: updatedEnvVarsMap, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + } +} diff --git a/cli/cli/commands/service/update/update_test.go b/cli/cli/commands/service/update/update_test.go new file mode 100644 index 0000000000..ade6387d61 --- /dev/null +++ b/cli/cli/commands/service/update/update_test.go @@ -0,0 +1,270 @@ +package update + +import ( + "testing" + + "github.com/kurtosis-tech/kurtosis/api/golang/core/lib/services" + "github.com/stretchr/testify/require" +) + +func TestCreateUpdatedServiceConfigFromOverrides(t *testing.T) { + testCases := []struct { + name string + currConfig *services.ServiceConfig + overrideConfig *services.ServiceConfig + expectedUpdatedConfig *services.ServiceConfig + }{ + { + name: "override image, entrypoint, cmd, env vars, ports, and files", + currConfig: &services.ServiceConfig{ + Image: "old-image", + PrivatePorts: map[string]services.Port{ + "port1": { + Number: 8080, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }}, + Files: map[string][]string{"/mnt/data": {"artifactA"}}, + Entrypoint: []string{"old-entry"}, + Cmd: []string{"old-cmd"}, + EnvVars: map[string]string{"FOO": "old"}, + PublicPorts: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + overrideConfig: &services.ServiceConfig{ + Image: "new-image", + Entrypoint: []string{"new-entry"}, + Cmd: []string{"new-cmd"}, + PrivatePorts: map[string]services.Port{ + "port2": { + Number: 9090, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + }, + Files: map[string][]string{"/mnt/config": {"artifactB"}}, + EnvVars: map[string]string{"FOO": "new", "BAR": "added"}, + PublicPorts: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + expectedUpdatedConfig: &services.ServiceConfig{ + Image: "new-image", + Entrypoint: []string{"new-entry"}, + Cmd: []string{"new-cmd"}, + PrivatePorts: map[string]services.Port{ + "port1": { + Number: 8080, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + "port2": { + Number: 9090, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + }, + Files: map[string][]string{"/mnt/data": {"artifactA"}, "/mnt/config": {"artifactB"}}, + EnvVars: map[string]string{"FOO": "new", "BAR": "added"}, + PublicPorts: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + }, + { + name: "no overrides applied", + currConfig: &services.ServiceConfig{ + Image: "base-image", + Entrypoint: []string{"entry"}, + Cmd: []string{"cmd"}, + PrivatePorts: map[string]services.Port{ + "http": { + Number: 80, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + }, + Files: map[string][]string{"/data": {"foo"}}, + EnvVars: map[string]string{"KEY": "VAL"}, + PublicPorts: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + overrideConfig: &services.ServiceConfig{ + Image: "", + PrivatePorts: nil, + PublicPorts: nil, + Files: nil, + Entrypoint: nil, + Cmd: nil, + EnvVars: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + expectedUpdatedConfig: &services.ServiceConfig{ + Image: "base-image", + Entrypoint: []string{"entry"}, + Cmd: []string{"cmd"}, + PrivatePorts: map[string]services.Port{ + "http": { + Number: 80, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }}, + Files: map[string][]string{"/data": {"foo"}}, + EnvVars: map[string]string{"KEY": "VAL"}, + PublicPorts: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + }, + { + name: "override overwrites duplicate env var and port", + currConfig: &services.ServiceConfig{ + Image: "original", + PrivatePorts: map[string]services.Port{ + "p": { + Number: 1000, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + }, + EnvVars: map[string]string{"K1": "V1"}, + Files: map[string][]string{}, + PublicPorts: nil, + Entrypoint: nil, + Cmd: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + overrideConfig: &services.ServiceConfig{ + Image: "", + PrivatePorts: map[string]services.Port{ + "p": { + Number: 2000, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + }, + EnvVars: map[string]string{"K1": "override"}, + Files: map[string][]string{}, + PublicPorts: nil, + Entrypoint: nil, + Cmd: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + expectedUpdatedConfig: &services.ServiceConfig{ + Image: "original", + PrivatePorts: map[string]services.Port{ + "p": { + Number: 2000, + Transport: 0, + MaybeApplicationProtocol: "", + Wait: "", + }, + }, + EnvVars: map[string]string{"K1": "override"}, + Files: map[string][]string{}, + PublicPorts: nil, + Entrypoint: nil, + Cmd: nil, + PrivateIPAddressPlaceholder: "", + MaxMillicpus: 0, + MinMillicpus: 0, + MaxMemory: 0, + MinMemory: 0, + User: nil, + Tolerations: nil, + Labels: nil, + NodeSelectors: nil, + TiniEnabled: nil, + }, + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + updated := createUpdatedServiceConfigFromOverrides(tc.overrideConfig, tc.currConfig) + require.Equal(t, tc.expectedUpdatedConfig.Image, updated.Image) + require.Equal(t, tc.expectedUpdatedConfig.Entrypoint, updated.Entrypoint) + require.Equal(t, tc.expectedUpdatedConfig.Cmd, updated.Cmd) + require.Equal(t, tc.expectedUpdatedConfig.EnvVars, updated.EnvVars) + require.Equal(t, tc.expectedUpdatedConfig.PrivatePorts, updated.PrivatePorts) + require.Equal(t, tc.expectedUpdatedConfig.Files, updated.Files) + }) + } +} diff --git a/container-engine-lib/lib/backend_interface/objects/service/service_config.go b/container-engine-lib/lib/backend_interface/objects/service/service_config.go index f336c6345c..eb79d9ff08 100644 --- a/container-engine-lib/lib/backend_interface/objects/service/service_config.go +++ b/container-engine-lib/lib/backend_interface/objects/service/service_config.go @@ -264,7 +264,6 @@ func (serviceConfig *ServiceConfig) GetTiniEnabled() bool { } func (serviceConfig *ServiceConfig) UnmarshalJSON(data []byte) error { - // Suppressing exhaustruct requirement because we want an object with zero values // nolint: exhaustruct unmarshalledPrivateStructPtr := &privateServiceConfig{} @@ -276,3 +275,38 @@ func (serviceConfig *ServiceConfig) UnmarshalJSON(data []byte) error { serviceConfig.privateServiceConfig = unmarshalledPrivateStructPtr return nil } + +func GetEmptyServiceConfig() *ServiceConfig { + emptyServiceConfig, _ := CreateServiceConfig( + "", + nil, + nil, + nil, + map[string]*port_spec.PortSpec{}, + map[string]*port_spec.PortSpec{}, + []string{}, + []string{}, + map[string]string{}, + &service_directory.FilesArtifactsExpansion{ + ExpanderImage: "", + ExpanderEnvVars: nil, + ServiceDirpathsToArtifactIdentifiers: nil, + ExpanderDirpathsToServiceDirpaths: nil, + }, + &service_directory.PersistentDirectories{ + ServiceDirpathToPersistentDirectory: map[string]service_directory.PersistentDirectory{}, + }, + 0, + 0, + "", + 0, + 0, + map[string]string{}, + nil, + []v1.Toleration{}, + map[string]string{}, + image_download_mode.ImageDownloadMode_Always, + false, + ) + return emptyServiceConfig +} diff --git a/core/server/api_container/main.go b/core/server/api_container/main.go index 80332bbbd2..0b6ad4878f 100644 --- a/core/server/api_container/main.go +++ b/core/server/api_container/main.go @@ -173,6 +173,17 @@ func runMain() error { return stacktrace.NewError("Backend type '%v' was not recognized by API container.", serverArgs.KurtosisBackendType.String()) } + starlarkValueSerde := createStarlarkValueSerde() + runtimeValueStore, err := runtime_value_store.CreateRuntimeValueStore(starlarkValueSerde, enclaveDb) + if err != nil { + return stacktrace.Propagate(err, "An error occurred creating the runtime value store") + } + + interpretationTimeValueStore, err := interpretation_time_value_store.CreateInterpretationTimeValueStore(enclaveDb, starlarkValueSerde) + if err != nil { + return stacktrace.Propagate(err, "An error occurred while creating the interpretation time value store") + } + serviceNetwork, err := createServiceNetwork(kurtosisBackend, enclaveDataDir, serverArgs, ownIpAddress, enclaveDb) if err != nil { return stacktrace.Propagate(err, "An error occurred creating the service network") @@ -203,17 +214,6 @@ func runMain() error { } }() - starlarkValueSerde := createStarlarkValueSerde() - runtimeValueStore, err := runtime_value_store.CreateRuntimeValueStore(starlarkValueSerde, enclaveDb) - if err != nil { - return stacktrace.Propagate(err, "An error occurred creating the runtime value store") - } - - interpretationTimeValueStore, err := interpretation_time_value_store.CreateInterpretationTimeValueStore(enclaveDb, starlarkValueSerde) - if err != nil { - return stacktrace.Propagate(err, "an error occurred while creating the interpretation time value store") - } - // Load the current enclave plan, in case the enclave is being restarted enclavePlan, err := enclave_plan_persistence.Load(enclaveDb) if err != nil { @@ -247,6 +247,7 @@ func runMain() error { metricsClient, githubAuthProvider, starlarkRunRepository, + interpretationTimeValueStore, ) if err != nil { return stacktrace.Propagate(err, "An error occurred creating the API container service") diff --git a/core/server/api_container/server/api_container_service.go b/core/server/api_container/server/api_container_service.go index b0a8c7aa57..8e3814afb3 100644 --- a/core/server/api_container/server/api_container_service.go +++ b/core/server/api_container/server/api_container_service.go @@ -12,10 +12,12 @@ import ( "compress/gzip" "context" "fmt" + "github.com/kurtosis-tech/kurtosis/container-engine-lib/lib/backend_interface/objects/service_user" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/docker_compose_transpiler" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/enclave_structure" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/instructions_plan/resolver" + "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/interpretation_time_value_store" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/plan_yaml" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/starlark_run" "github.com/kurtosis-tech/kurtosis/core/server/api_container/server/startosis_engine/startosis_packages/git_package_content_provider" @@ -101,6 +103,13 @@ type ApiContainerService struct { metricsClient metrics_client.MetricsClient githubAuthProvider *git_package_content_provider.GitHubPackageAuthProvider + + // NOTE: interpretationTimeValueStore is modified by the StarlarkInterpreter - allowing APIContainer to have access to it + // allows retrieving service configs of running services but it is NOT mutex protected, thus this object should never modify + // the interpretationTimeValueStore or it could mess with interpretation + // TODO: Either mutex protect the interpretationTimeValueStore OR compose the interpretationTimeValueStore of a separate mutex protected `serviceConfigRepository` object + // and allow both ApiContainerService and interpretationTimeValueStore to have access to that + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore } func NewApiContainerService( @@ -113,6 +122,7 @@ func NewApiContainerService( metricsClient metrics_client.MetricsClient, githubAuthProvider *git_package_content_provider.GitHubPackageAuthProvider, starlarkRunRepository *starlark_run.StarlarkRunRepository, + interpretationTimeValueStore *interpretation_time_value_store.InterpretationTimeValueStore, ) (*ApiContainerService, error) { if err := initStarlarkRun(starlarkRunRepository, restartPolicy); err != nil { @@ -120,14 +130,15 @@ func NewApiContainerService( } service := &ApiContainerService{ - filesArtifactStore: filesArtifactStore, - serviceNetwork: serviceNetwork, - startosisRunner: startosisRunner, - startosisInterpreter: startosisInterpreter, - packageContentProvider: startosisModuleContentProvider, - starlarkRunRepository: starlarkRunRepository, - metricsClient: metricsClient, - githubAuthProvider: githubAuthProvider, + filesArtifactStore: filesArtifactStore, + serviceNetwork: serviceNetwork, + startosisRunner: startosisRunner, + startosisInterpreter: startosisInterpreter, + packageContentProvider: startosisModuleContentProvider, + starlarkRunRepository: starlarkRunRepository, + metricsClient: metricsClient, + githubAuthProvider: githubAuthProvider, + interpretationTimeValueStore: interpretationTimeValueStore, } return service, nil @@ -453,7 +464,8 @@ func (apicService *ApiContainerService) GetServices(ctx context.Context, args *k if err != nil { return nil, stacktrace.Propagate(err, "an error occurred while fetching all services from the backend") } - serviceInfos, err = getServiceInfosFromServiceObjs(allServices) + + serviceInfos, err = apicService.getServiceInfosFromServiceObjs(allServices) if err != nil { return nil, stacktrace.Propagate(err, "an error occurred while converting the service obj into service info") } @@ -781,6 +793,17 @@ func transformPortSpecMapToApiPortsMap(apiPorts map[string]*port_spec.PortSpec) return result, nil } +func transformServiceDirPathsToFileArtifactsToApiPortsFilesArtifactsList(serviceDirPathsToFilesArtifactsIdentifiers map[string][]string) map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList { + result := map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList{} + for svcName, filesArtifactsIdentifiers := range serviceDirPathsToFilesArtifactsIdentifiers { + filesArtifactsList := &kurtosis_core_rpc_api_bindings.FilesArtifactsList{ + FilesArtifactsIdentifiers: filesArtifactsIdentifiers, + } + result[svcName] = filesArtifactsList + } + return result +} + func (apicService *ApiContainerService) waitForEndpointAvailability( ctx context.Context, serviceIdStr string, @@ -886,9 +909,20 @@ func (apicService *ApiContainerService) getServiceInfoForIdentifier(ctx context. if err != nil { return nil, stacktrace.Propagate(err, "An error occurred getting info for service '%v'", serviceIdentifier) } - serviceInfo, err := getServiceInfoFromServiceObj(serviceObj) + + var serviceConfig *service.ServiceConfig + serviceConfig, err = apicService.interpretationTimeValueStore.GetServiceConfig(serviceObj.GetRegistration().GetName()) + if err != nil { + // if no service config was found, instead of failing - we just give an empty service config + // this is because the service config info in the interpretationTimeValueStore is not persisted to the enclave db yet + // so on apic restarts the information will be lost - but we still want to service information about existing services + // in the future, service config information should be persisted + serviceConfig = service.GetEmptyServiceConfig() + } + + serviceInfo, err := getServiceInfoFromServiceObj(serviceObj, serviceConfig) if err != nil { - return nil, stacktrace.Propagate(err, "an error occurred while converting service obj for service with id '%v' to service info", serviceIdentifier) + return nil, stacktrace.Propagate(err, "A error occurred while converting service obj for service with id '%v' to service info", serviceIdentifier) } return serviceInfo, nil } @@ -1034,19 +1068,28 @@ func (apicService *ApiContainerService) runStarlark( } } -func getServiceInfosFromServiceObjs(services map[service.ServiceUUID]*service.Service) (map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo, error) { +func (apicService *ApiContainerService) getServiceInfosFromServiceObjs(services map[service.ServiceUUID]*service.Service) (map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo, error) { serviceInfos := map[string]*kurtosis_core_rpc_api_bindings.ServiceInfo{} for uuid, serviceObj := range services { - serviceInfo, err := getServiceInfoFromServiceObj(serviceObj) + var serviceConfig *service.ServiceConfig + serviceConfig, err := apicService.interpretationTimeValueStore.GetServiceConfig(serviceObj.GetRegistration().GetName()) + if err != nil { + // if no service config was found, instead of failing - we just give an empty service config + // this is because the service config info in the interpretationTimeValueStore is not persisted to the enclave db yet + // so on apic restarts the information will be lost - but we still want to service information about existing services + // in the future, service config information should be persisted + serviceConfig = service.GetEmptyServiceConfig() + } + serviceInfo, err := getServiceInfoFromServiceObj(serviceObj, serviceConfig) if err != nil { - return nil, stacktrace.Propagate(err, "there was an error converting the service obj for service with uuid '%v' and name '%v' to service info", uuid, serviceObj.GetRegistration().GetName()) + return nil, stacktrace.Propagate(err, "There was an error converting the service obj for service with uuid '%v' and name '%v' to service info", uuid, serviceObj.GetRegistration().GetName()) } serviceInfos[serviceInfo.Name] = serviceInfo } return serviceInfos, nil } -func getServiceInfoFromServiceObj(serviceObj *service.Service) (*kurtosis_core_rpc_api_bindings.ServiceInfo, error) { +func getServiceInfoFromServiceObj(serviceObj *service.Service, serviceConfig *service.ServiceConfig) (*kurtosis_core_rpc_api_bindings.ServiceInfo, error) { privatePorts := serviceObj.GetPrivatePorts() privateIp := serviceObj.GetRegistration().GetPrivateIP() maybePublicIp := serviceObj.GetMaybePublicIP() @@ -1086,6 +1129,44 @@ func getServiceInfoFromServiceObj(serviceObj *service.Service) (*kurtosis_core_r EnvVars: serviceContainer.GetEnvVars(), } + maxMillicpus := uint32(serviceConfig.GetCPUAllocationMillicpus()) + minMillicpus := uint32(serviceConfig.GetMinCPUAllocationMillicpus()) + maxMemoryMegabytes := uint32(serviceConfig.GetMemoryAllocationMegabytes()) + minMemoryMegabytes := uint32(serviceConfig.GetMinMemoryAllocationMegabytes()) + + serviceDirPathsToFilesArtifactsList := map[string]*kurtosis_core_rpc_api_bindings.FilesArtifactsList{} + + if serviceConfig.GetFilesArtifactsExpansion() != nil { + serviceDirPathsToFilesArtifactsList = transformServiceDirPathsToFileArtifactsToApiPortsFilesArtifactsList(serviceConfig.GetFilesArtifactsExpansion().ServiceDirpathsToArtifactIdentifiers) + } + + var user *service_user.ServiceUser + var apiUser *kurtosis_core_rpc_api_bindings.User + if serviceConfig.GetUser() != nil { + user = serviceConfig.GetUser() + var gid uint32 = 0 + userGid, existsGuid := user.GetGID() + if existsGuid { + gid = uint32(userGid) + } + apiUser = &kurtosis_core_rpc_api_bindings.User{ + Uid: uint32(user.GetUID()), + Gid: gid, + } + } + + tolerations := serviceConfig.GetTolerations() + apiTolerations := []*kurtosis_core_rpc_api_bindings.Toleration{} + for _, toleration := range tolerations { + apiTolerations = append(apiTolerations, &kurtosis_core_rpc_api_bindings.Toleration{ + Key: toleration.Key, + Operator: string(toleration.Operator), + Value: toleration.Value, + Effect: string(toleration.Effect), + TolerationSeconds: *toleration.TolerationSeconds, + }) + } + serviceInfoResponse := binding_constructors.NewServiceInfo( serviceUuidStr, serviceNameStr, @@ -1096,7 +1177,18 @@ func getServiceInfoFromServiceObj(serviceObj *service.Service) (*kurtosis_core_r publicApiPorts, serviceStatus, serviceInfoContainer, + serviceDirPathsToFilesArtifactsList, + maxMillicpus, + minMillicpus, + maxMemoryMegabytes, + minMemoryMegabytes, + apiUser, + apiTolerations, + serviceConfig.GetNodeSelectors(), + serviceConfig.GetLabels(), + serviceConfig.GetTiniEnabled(), ) + return serviceInfoResponse, nil } diff --git a/internal_testsuites/golang/test_helpers/test_helpers.go b/internal_testsuites/golang/test_helpers/test_helpers.go index 79f178ed88..0074a6f746 100644 --- a/internal_testsuites/golang/test_helpers/test_helpers.go +++ b/internal_testsuites/golang/test_helpers/test_helpers.go @@ -111,7 +111,7 @@ def run(plan, args): var ( emptyPrivatePorts = map[string]*kurtosis_core_rpc_api_bindings.Port{} - emptyFileArtifactMountPoints = map[string]string{} + emptyFileArtifactMountPoints = map[string][]string{} emptyEntrypointArgs = []string{} emptyCmdArgs = []string{} emptyEnvVars = map[string]string{} @@ -588,7 +588,7 @@ func GenerateRandomTempFile(byteSize int, filePathOptional string) (string, func // // ==================================================================================================== func getDatastoreServiceConfigStarlark() string { - return services.GetServiceConfigStarlark(datastoreImage, map[string]*kurtosis_core_rpc_api_bindings.Port{datastorePortId: datastorePortSpec}, emptyFileArtifactMountPoints, emptyEntrypointArgs, emptyCmdArgs, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) + return services.GetSimpleServiceConfigStarlark(datastoreImage, map[string]*kurtosis_core_rpc_api_bindings.Port{datastorePortId: datastorePortSpec}, emptyFileArtifactMountPoints, emptyEntrypointArgs, emptyCmdArgs, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) } func getApiServiceServiceConfigStarlark(apiConfigArtifactName string) string { @@ -598,7 +598,7 @@ func getApiServiceServiceConfigStarlark(apiConfigArtifactName string) string { path.Join(configMountpathOnApiContainer, configFilename), } - return services.GetServiceConfigStarlark(apiServiceImage, map[string]*kurtosis_core_rpc_api_bindings.Port{apiPortId: apiPortSpec}, map[string]string{configMountpathOnApiContainer: apiConfigArtifactName}, emptyEntrypointArgs, startCmd, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) + return services.GetSimpleServiceConfigStarlark(apiServiceImage, map[string]*kurtosis_core_rpc_api_bindings.Port{apiPortId: apiPortSpec}, map[string][]string{configMountpathOnApiContainer: {apiConfigArtifactName}}, emptyEntrypointArgs, startCmd, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) } func createApiConfigFile(datastoreIP string) (string, error) { @@ -647,12 +647,12 @@ func getFileContents(ipAddress string, portNum uint16, realtiveFilepath string) } func getFileServerServiceConfigStarlark(filesArtifactMountPoints map[string]services.FilesArtifactUUID) string { - filesArtifactMountPointsStr := map[string]string{} + filesArtifactMountPointsStr := map[string][]string{} for k, v := range filesArtifactMountPoints { - filesArtifactMountPointsStr[k] = string(v) + filesArtifactMountPointsStr[k] = []string{string(v)} } - return services.GetServiceConfigStarlark(fileServerServiceImage, map[string]*kurtosis_core_rpc_api_bindings.Port{fileServerPortId: fileServerPortSpec}, filesArtifactMountPointsStr, emptyEntrypointArgs, emptyCmdArgs, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) + return services.GetSimpleServiceConfigStarlark(fileServerServiceImage, map[string]*kurtosis_core_rpc_api_bindings.Port{fileServerPortId: fileServerPortSpec}, filesArtifactMountPointsStr, emptyEntrypointArgs, emptyCmdArgs, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) } func createDatastoreClient(ipAddr string, portNum uint16) (datastore_rpc_api_bindings.DatastoreServiceClient, func(), error) { @@ -705,7 +705,7 @@ func getServiceWithLogLinesServiceConfigStarlark(logLines []string) string { cmdArgs := []string{echoLogLinesLoopCmdStr} - return services.GetServiceConfigStarlark(dockerGettingStartedImage, emptyPrivatePorts, emptyFileArtifactMountPoints, entrypointArgs, cmdArgs, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) + return services.GetSimpleServiceConfigStarlark(dockerGettingStartedImage, emptyPrivatePorts, emptyFileArtifactMountPoints, entrypointArgs, cmdArgs, emptyEnvVars, emptyPrivateIpAddrPlaceholder, emptyCpuAllocationMillicpus, emptyMemoryAllocationMegabytes, 0, 0) } func SkipFlakyTest(t *testing.T, testName string) { diff --git a/metrics-library/golang/lib/event/event_types.go b/metrics-library/golang/lib/event/event_types.go index f5bcb44224..80e144896f 100644 --- a/metrics-library/golang/lib/event/event_types.go +++ b/metrics-library/golang/lib/event/event_types.go @@ -10,6 +10,7 @@ const ( // We are following these naming conventions for event's data // https://segment.com/docs/getting-started/04-full-install/#event-naming-best-practices enclaveIDPropertyKey = "enclave_id" + serviceIDPropertyKey = "service_id" didUserAcceptSendingMetricsKey = "did_user_accept_sending_metrics" packageIdKey = "package_id" isRemotePackageKey = "is_remote_package" @@ -36,6 +37,9 @@ const ( stopAction = "stop" destroyAction = "destroy" runAction = "run" + updateAction = "update" + serviceStartAction = "service-start" + serviceStopAction = "service-stop" runFinishedAction = "run-finished" analyticsToggleAction = "analytics-toggle" ) @@ -110,6 +114,36 @@ func NewKurtosisRunEvent(packageId string, isRemote bool, isDryRun bool, isScrip return event } +func NewStartServiceEvent(enclaveId string, serviceId string) *Event { + properties := map[string]string{ + enclaveIDPropertyKey: enclaveId, + serviceIDPropertyKey: serviceId, + } + + event := newEvent(kurtosisCategory, serviceStartAction, properties) + return event +} + +func NewStopServiceEvent(enclaveId string, serviceId string) *Event { + properties := map[string]string{ + enclaveIDPropertyKey: enclaveId, + serviceIDPropertyKey: serviceId, + } + + event := newEvent(kurtosisCategory, serviceStopAction, properties) + return event +} + +func NewUpdateServiceEvent(enclaveId string, serviceId string) *Event { + properties := map[string]string{ + enclaveIDPropertyKey: enclaveId, + serviceIDPropertyKey: serviceId, + } + + event := newEvent(kurtosisCategory, updateAction, properties) + return event +} + func NewKurtosisRunFinishedEvent(packageId string, numServices int, isSuccess bool) *Event { numServicesStr := fmt.Sprintf("%v", numServices) isSuccessStr := fmt.Sprintf("%v", isSuccess) diff --git a/metrics-library/golang/lib/metrics_client/do_nothing_client.go b/metrics-library/golang/lib/metrics_client/do_nothing_client.go index 4dc7c3fb20..1ec0800460 100644 --- a/metrics-library/golang/lib/metrics_client/do_nothing_client.go +++ b/metrics-library/golang/lib/metrics_client/do_nothing_client.go @@ -49,6 +49,24 @@ func (client *doNothingClient) TrackKurtosisRun(packageId string, isRemote bool, return nil } +func (client *doNothingClient) TrackServiceUpdate(enclaveId string, serviceId string) error { + logrus.Debugf("Do-nothing metrics client TrackServiceUpdate called with arguments enclaveId '%v', serviceId '%v'", enclaveId, serviceId) + client.callback.Success() + return nil +} + +func (client *doNothingClient) TrackStartService(enclaveId string, serviceId string) error { + logrus.Debugf("Do-nothing metrics client TrackStartService called with arguments enclaveId '%v', serviceId '%v'", enclaveId, serviceId) + client.callback.Success() + return nil +} + +func (client *doNothingClient) TrackStopService(enclaveId string, serviceId string) error { + logrus.Debugf("Do-nothing metrics client TrackStopService called with arguments enclaveId '%v', serviceId '%v'", enclaveId, serviceId) + client.callback.Success() + return nil +} + func (client *doNothingClient) TrackKurtosisRunFinishedEvent(packageId string, numberOfServices int, isSuccess bool) error { logrus.Debugf("Do-nothing metrics client TrackKurtosisRunFinishedEvent called with arguments packageId '%v', numberOfServices '%v', isSuccess '%v'; skipping sending event", packageId, numberOfServices, isSuccess) client.callback.Success() diff --git a/metrics-library/golang/lib/metrics_client/is_ci.go b/metrics-library/golang/lib/metrics_client/is_ci.go index 87eb17e889..095d1c03aa 100644 --- a/metrics-library/golang/lib/metrics_client/is_ci.go +++ b/metrics-library/golang/lib/metrics_client/is_ci.go @@ -25,7 +25,6 @@ var ciEnvironmentVariables = []string{ "TEAMCITY_VERSION", // Travis "TRAVIS", - // Platform Agnostic Variables "CI", } diff --git a/metrics-library/golang/lib/metrics_client/metrics_client.go b/metrics-library/golang/lib/metrics_client/metrics_client.go index 07b85578fc..ec3be04d29 100644 --- a/metrics-library/golang/lib/metrics_client/metrics_client.go +++ b/metrics-library/golang/lib/metrics_client/metrics_client.go @@ -7,6 +7,9 @@ type MetricsClient interface { TrackStopEnclave(enclaveId string) error TrackDestroyEnclave(enclaveId string) error TrackKurtosisRun(packageId string, isRemote bool, isDryRun bool, isScript bool) error + TrackServiceUpdate(enclaveId string, serviceId string) error + TrackStartService(enclaveId string, serviceId string) error + TrackStopService(enclaveId string, serviceId string) error TrackKurtosisRunFinishedEvent(packageId string, numberOfServices int, isSuccess bool) error TrackKurtosisAnalyticsToggle(analyticsStatus bool) error close() (err error) diff --git a/metrics-library/golang/lib/metrics_client/segment_client.go b/metrics-library/golang/lib/metrics_client/segment_client.go index 0631c51ace..ca85ff83c8 100644 --- a/metrics-library/golang/lib/metrics_client/segment_client.go +++ b/metrics-library/golang/lib/metrics_client/segment_client.go @@ -145,6 +145,30 @@ func (segment *segmentClient) TrackKurtosisRun(packageId string, isRemote bool, return nil } +func (segment *segmentClient) TrackServiceUpdate(enclaveId string, serviceId string) error { + newEvent := event.NewUpdateServiceEvent(enclaveId, serviceId) + if err := segment.track(newEvent); err != nil { + return stacktrace.Propagate(err, "An error occurred tracking service update event") + } + return nil +} + +func (segment *segmentClient) TrackStartService(enclaveId string, serviceId string) error { + newEvent := event.NewStartServiceEvent(enclaveId, serviceId) + if err := segment.track(newEvent); err != nil { + return stacktrace.Propagate(err, "An error occurred tracking start service event") + } + return nil +} + +func (segment *segmentClient) TrackStopService(enclaveId string, serviceId string) error { + newEvent := event.NewStopServiceEvent(enclaveId, serviceId) + if err := segment.track(newEvent); err != nil { + return stacktrace.Propagate(err, "An error occurred tracking stop service event") + } + return nil +} + func (segment *segmentClient) TrackKurtosisRunFinishedEvent(packageId string, numberOfServices int, isSuccess bool) error { newEvent := event.NewKurtosisRunFinishedEvent(packageId, numberOfServices, isSuccess) if err := segment.track(newEvent); err != nil {