diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index 5ae82c82f..63ac7d882 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -89,6 +89,51 @@ message HistoryEvent { } // Stable domain reason for a terminal request outcome. Empty otherwise. string outcome_reason = 5; + // Typed context retained with this occurrence. Absent when no supported metadata is available. + HistoryEventData data = 6; +} + +// HistoryEventData exposes known occurrence metadata without exposing the internal metadata map. +message HistoryEventData { + // The payload corresponds to request_state or the event string on the containing HistoryEvent. + oneof payload { + // Context recorded with a request-state transition. + HistoryRequestStateData request_state = 1; + // Context recorded when a build became durable. + HistoryBuildData build_triggered = 2; + // Context recorded when a build reached a terminal status. + HistoryBuildData build_finished = 3; + // Context recorded when a repository validation fact became durable. + HistoryValidationFactData validation_fact_recorded = 4; + // Context recorded when all project facts became durable. + HistoryProjectFactsData project_facts_recorded = 5; + // Context recorded when build analysis was abandoned. + HistoryBuildData build_analysis_abandoned = 6; + } +} + +// HistoryRequestStateData is retained context for a request-state transition. +message HistoryRequestStateData { + // Build that established the terminal request state, when retained. + string build_id = 1; +} + +// HistoryBuildData identifies the build associated with an occurrence. +message HistoryBuildData { + // Opaque runner-assigned build identifier. + string build_id = 1; +} + +// HistoryValidationFactData describes a retained whole-repository validation fact. +message HistoryValidationFactData { + // Breakage degree on [0.0, 1.0]. Zero is a recorded green result. + double fact_degree = 1; +} + +// HistoryProjectFactsData describes a completed batch of project validation facts. +message HistoryProjectFactsData { + // Number of project facts recorded, including zero for an empty batch. + uint64 project_fact_count = 1; } // RequestHistory identifies one request and contains its ordered events and current summary. diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index c4fce2348..22e99895d 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -445,6 +445,8 @@ type HistoryEvent struct { Occurrence isHistoryEvent_Occurrence `protobuf_oneof:"occurrence"` // Stable domain reason for a terminal request outcome. Empty otherwise. OutcomeReason string `protobuf:"bytes,5,opt,name=outcome_reason,json=outcomeReason,proto3" json:"outcome_reason,omitempty"` + // Typed context retained with this occurrence. Absent when no supported metadata is available. + Data *HistoryEventData `protobuf:"bytes,6,opt,name=data,proto3" json:"data,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -525,6 +527,13 @@ func (x *HistoryEvent) GetOutcomeReason() string { return "" } +func (x *HistoryEvent) GetData() *HistoryEventData { + if x != nil { + return x.Data + } + return nil +} + type isHistoryEvent_Occurrence interface { isHistoryEvent_Occurrence() } @@ -543,6 +552,345 @@ func (*HistoryEvent_RequestState) isHistoryEvent_Occurrence() {} func (*HistoryEvent_Event) isHistoryEvent_Occurrence() {} +// HistoryEventData exposes known occurrence metadata without exposing the internal metadata map. +type HistoryEventData struct { + state protoimpl.MessageState `protogen:"open.v1"` + // The payload corresponds to request_state or the event string on the containing HistoryEvent. + // + // Types that are valid to be assigned to Payload: + // + // *HistoryEventData_RequestState + // *HistoryEventData_BuildTriggered + // *HistoryEventData_BuildFinished + // *HistoryEventData_ValidationFactRecorded + // *HistoryEventData_ProjectFactsRecorded + // *HistoryEventData_BuildAnalysisAbandoned + Payload isHistoryEventData_Payload `protobuf_oneof:"payload"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HistoryEventData) Reset() { + *x = HistoryEventData{} + mi := &file_stovepipe_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HistoryEventData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryEventData) ProtoMessage() {} + +func (x *HistoryEventData) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[7] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HistoryEventData.ProtoReflect.Descriptor instead. +func (*HistoryEventData) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{7} +} + +func (x *HistoryEventData) GetPayload() isHistoryEventData_Payload { + if x != nil { + return x.Payload + } + return nil +} + +func (x *HistoryEventData) GetRequestState() *HistoryRequestStateData { + if x != nil { + if x, ok := x.Payload.(*HistoryEventData_RequestState); ok { + return x.RequestState + } + } + return nil +} + +func (x *HistoryEventData) GetBuildTriggered() *HistoryBuildData { + if x != nil { + if x, ok := x.Payload.(*HistoryEventData_BuildTriggered); ok { + return x.BuildTriggered + } + } + return nil +} + +func (x *HistoryEventData) GetBuildFinished() *HistoryBuildData { + if x != nil { + if x, ok := x.Payload.(*HistoryEventData_BuildFinished); ok { + return x.BuildFinished + } + } + return nil +} + +func (x *HistoryEventData) GetValidationFactRecorded() *HistoryValidationFactData { + if x != nil { + if x, ok := x.Payload.(*HistoryEventData_ValidationFactRecorded); ok { + return x.ValidationFactRecorded + } + } + return nil +} + +func (x *HistoryEventData) GetProjectFactsRecorded() *HistoryProjectFactsData { + if x != nil { + if x, ok := x.Payload.(*HistoryEventData_ProjectFactsRecorded); ok { + return x.ProjectFactsRecorded + } + } + return nil +} + +func (x *HistoryEventData) GetBuildAnalysisAbandoned() *HistoryBuildData { + if x != nil { + if x, ok := x.Payload.(*HistoryEventData_BuildAnalysisAbandoned); ok { + return x.BuildAnalysisAbandoned + } + } + return nil +} + +type isHistoryEventData_Payload interface { + isHistoryEventData_Payload() +} + +type HistoryEventData_RequestState struct { + // Context recorded with a request-state transition. + RequestState *HistoryRequestStateData `protobuf:"bytes,1,opt,name=request_state,json=requestState,proto3,oneof"` +} + +type HistoryEventData_BuildTriggered struct { + // Context recorded when a build became durable. + BuildTriggered *HistoryBuildData `protobuf:"bytes,2,opt,name=build_triggered,json=buildTriggered,proto3,oneof"` +} + +type HistoryEventData_BuildFinished struct { + // Context recorded when a build reached a terminal status. + BuildFinished *HistoryBuildData `protobuf:"bytes,3,opt,name=build_finished,json=buildFinished,proto3,oneof"` +} + +type HistoryEventData_ValidationFactRecorded struct { + // Context recorded when a repository validation fact became durable. + ValidationFactRecorded *HistoryValidationFactData `protobuf:"bytes,4,opt,name=validation_fact_recorded,json=validationFactRecorded,proto3,oneof"` +} + +type HistoryEventData_ProjectFactsRecorded struct { + // Context recorded when all project facts became durable. + ProjectFactsRecorded *HistoryProjectFactsData `protobuf:"bytes,5,opt,name=project_facts_recorded,json=projectFactsRecorded,proto3,oneof"` +} + +type HistoryEventData_BuildAnalysisAbandoned struct { + // Context recorded when build analysis was abandoned. + BuildAnalysisAbandoned *HistoryBuildData `protobuf:"bytes,6,opt,name=build_analysis_abandoned,json=buildAnalysisAbandoned,proto3,oneof"` +} + +func (*HistoryEventData_RequestState) isHistoryEventData_Payload() {} + +func (*HistoryEventData_BuildTriggered) isHistoryEventData_Payload() {} + +func (*HistoryEventData_BuildFinished) isHistoryEventData_Payload() {} + +func (*HistoryEventData_ValidationFactRecorded) isHistoryEventData_Payload() {} + +func (*HistoryEventData_ProjectFactsRecorded) isHistoryEventData_Payload() {} + +func (*HistoryEventData_BuildAnalysisAbandoned) isHistoryEventData_Payload() {} + +// HistoryRequestStateData is retained context for a request-state transition. +type HistoryRequestStateData struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Build that established the terminal request state, when retained. + BuildId string `protobuf:"bytes,1,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HistoryRequestStateData) Reset() { + *x = HistoryRequestStateData{} + mi := &file_stovepipe_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HistoryRequestStateData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryRequestStateData) ProtoMessage() {} + +func (x *HistoryRequestStateData) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[8] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HistoryRequestStateData.ProtoReflect.Descriptor instead. +func (*HistoryRequestStateData) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{8} +} + +func (x *HistoryRequestStateData) GetBuildId() string { + if x != nil { + return x.BuildId + } + return "" +} + +// HistoryBuildData identifies the build associated with an occurrence. +type HistoryBuildData struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Opaque runner-assigned build identifier. + BuildId string `protobuf:"bytes,1,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HistoryBuildData) Reset() { + *x = HistoryBuildData{} + mi := &file_stovepipe_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HistoryBuildData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryBuildData) ProtoMessage() {} + +func (x *HistoryBuildData) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HistoryBuildData.ProtoReflect.Descriptor instead. +func (*HistoryBuildData) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{9} +} + +func (x *HistoryBuildData) GetBuildId() string { + if x != nil { + return x.BuildId + } + return "" +} + +// HistoryValidationFactData describes a retained whole-repository validation fact. +type HistoryValidationFactData struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Breakage degree on [0.0, 1.0]. Zero is a recorded green result. + FactDegree float64 `protobuf:"fixed64,1,opt,name=fact_degree,json=factDegree,proto3" json:"fact_degree,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HistoryValidationFactData) Reset() { + *x = HistoryValidationFactData{} + mi := &file_stovepipe_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HistoryValidationFactData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryValidationFactData) ProtoMessage() {} + +func (x *HistoryValidationFactData) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HistoryValidationFactData.ProtoReflect.Descriptor instead. +func (*HistoryValidationFactData) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{10} +} + +func (x *HistoryValidationFactData) GetFactDegree() float64 { + if x != nil { + return x.FactDegree + } + return 0 +} + +// HistoryProjectFactsData describes a completed batch of project validation facts. +type HistoryProjectFactsData struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Number of project facts recorded, including zero for an empty batch. + ProjectFactCount uint64 `protobuf:"varint,1,opt,name=project_fact_count,json=projectFactCount,proto3" json:"project_fact_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *HistoryProjectFactsData) Reset() { + *x = HistoryProjectFactsData{} + mi := &file_stovepipe_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *HistoryProjectFactsData) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryProjectFactsData) ProtoMessage() {} + +func (x *HistoryProjectFactsData) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HistoryProjectFactsData.ProtoReflect.Descriptor instead. +func (*HistoryProjectFactsData) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{11} +} + +func (x *HistoryProjectFactsData) GetProjectFactCount() uint64 { + if x != nil { + return x.ProjectFactCount + } + return 0 +} + // RequestHistory identifies one request and contains its ordered events and current summary. type RequestHistory struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -558,7 +906,7 @@ type RequestHistory struct { func (x *RequestHistory) Reset() { *x = RequestHistory{} - mi := &file_stovepipe_proto_msgTypes[7] + mi := &file_stovepipe_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -570,7 +918,7 @@ func (x *RequestHistory) String() string { func (*RequestHistory) ProtoMessage() {} func (x *RequestHistory) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[7] + mi := &file_stovepipe_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -583,7 +931,7 @@ func (x *RequestHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestHistory.ProtoReflect.Descriptor instead. func (*RequestHistory) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{7} + return file_stovepipe_proto_rawDescGZIP(), []int{12} } func (x *RequestHistory) GetRequestId() string { @@ -620,7 +968,7 @@ type GetRequestHistoryByIDResponse struct { func (x *GetRequestHistoryByIDResponse) Reset() { *x = GetRequestHistoryByIDResponse{} - mi := &file_stovepipe_proto_msgTypes[8] + mi := &file_stovepipe_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -632,7 +980,7 @@ func (x *GetRequestHistoryByIDResponse) String() string { func (*GetRequestHistoryByIDResponse) ProtoMessage() {} func (x *GetRequestHistoryByIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[8] + mi := &file_stovepipe_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -645,7 +993,7 @@ func (x *GetRequestHistoryByIDResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRequestHistoryByIDResponse.ProtoReflect.Descriptor instead. func (*GetRequestHistoryByIDResponse) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{8} + return file_stovepipe_proto_rawDescGZIP(), []int{13} } func (x *GetRequestHistoryByIDResponse) GetEvents() []*HistoryEvent { @@ -673,7 +1021,7 @@ type GetRequestHistoryByURIResponse struct { func (x *GetRequestHistoryByURIResponse) Reset() { *x = GetRequestHistoryByURIResponse{} - mi := &file_stovepipe_proto_msgTypes[9] + mi := &file_stovepipe_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -685,7 +1033,7 @@ func (x *GetRequestHistoryByURIResponse) String() string { func (*GetRequestHistoryByURIResponse) ProtoMessage() {} func (x *GetRequestHistoryByURIResponse) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[9] + mi := &file_stovepipe_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -698,7 +1046,7 @@ func (x *GetRequestHistoryByURIResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetRequestHistoryByURIResponse.ProtoReflect.Descriptor instead. func (*GetRequestHistoryByURIResponse) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{9} + return file_stovepipe_proto_rawDescGZIP(), []int{14} } func (x *GetRequestHistoryByURIResponse) GetHistories() []*RequestHistory { @@ -727,7 +1075,7 @@ type GetProjectStatusByIDRequest struct { func (x *GetProjectStatusByIDRequest) Reset() { *x = GetProjectStatusByIDRequest{} - mi := &file_stovepipe_proto_msgTypes[10] + mi := &file_stovepipe_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -739,7 +1087,7 @@ func (x *GetProjectStatusByIDRequest) String() string { func (*GetProjectStatusByIDRequest) ProtoMessage() {} func (x *GetProjectStatusByIDRequest) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[10] + mi := &file_stovepipe_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -752,7 +1100,7 @@ func (x *GetProjectStatusByIDRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProjectStatusByIDRequest.ProtoReflect.Descriptor instead. func (*GetProjectStatusByIDRequest) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{10} + return file_stovepipe_proto_rawDescGZIP(), []int{15} } func (x *GetProjectStatusByIDRequest) GetQueue() string { @@ -809,7 +1157,7 @@ type GetProjectStatusByURIRequest struct { func (x *GetProjectStatusByURIRequest) Reset() { *x = GetProjectStatusByURIRequest{} - mi := &file_stovepipe_proto_msgTypes[11] + mi := &file_stovepipe_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -821,7 +1169,7 @@ func (x *GetProjectStatusByURIRequest) String() string { func (*GetProjectStatusByURIRequest) ProtoMessage() {} func (x *GetProjectStatusByURIRequest) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[11] + mi := &file_stovepipe_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -834,7 +1182,7 @@ func (x *GetProjectStatusByURIRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProjectStatusByURIRequest.ProtoReflect.Descriptor instead. func (*GetProjectStatusByURIRequest) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{11} + return file_stovepipe_proto_rawDescGZIP(), []int{16} } func (x *GetProjectStatusByURIRequest) GetQueue() string { @@ -889,7 +1237,7 @@ type ProjectValidation struct { func (x *ProjectValidation) Reset() { *x = ProjectValidation{} - mi := &file_stovepipe_proto_msgTypes[12] + mi := &file_stovepipe_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -901,7 +1249,7 @@ func (x *ProjectValidation) String() string { func (*ProjectValidation) ProtoMessage() {} func (x *ProjectValidation) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[12] + mi := &file_stovepipe_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -914,7 +1262,7 @@ func (x *ProjectValidation) ProtoReflect() protoreflect.Message { // Deprecated: Use ProjectValidation.ProtoReflect.Descriptor instead. func (*ProjectValidation) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{12} + return file_stovepipe_proto_rawDescGZIP(), []int{17} } func (x *ProjectValidation) GetProject() string { @@ -983,7 +1331,7 @@ type GetProjectStatusByIDResponse struct { func (x *GetProjectStatusByIDResponse) Reset() { *x = GetProjectStatusByIDResponse{} - mi := &file_stovepipe_proto_msgTypes[13] + mi := &file_stovepipe_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -995,7 +1343,7 @@ func (x *GetProjectStatusByIDResponse) String() string { func (*GetProjectStatusByIDResponse) ProtoMessage() {} func (x *GetProjectStatusByIDResponse) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[13] + mi := &file_stovepipe_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1008,7 +1356,7 @@ func (x *GetProjectStatusByIDResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProjectStatusByIDResponse.ProtoReflect.Descriptor instead. func (*GetProjectStatusByIDResponse) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{13} + return file_stovepipe_proto_rawDescGZIP(), []int{18} } func (x *GetProjectStatusByIDResponse) GetRequestId() string { @@ -1134,7 +1482,7 @@ type GetProjectStatusByURIResponse struct { func (x *GetProjectStatusByURIResponse) Reset() { *x = GetProjectStatusByURIResponse{} - mi := &file_stovepipe_proto_msgTypes[14] + mi := &file_stovepipe_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1146,7 +1494,7 @@ func (x *GetProjectStatusByURIResponse) String() string { func (*GetProjectStatusByURIResponse) ProtoMessage() {} func (x *GetProjectStatusByURIResponse) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[14] + mi := &file_stovepipe_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1159,7 +1507,7 @@ func (x *GetProjectStatusByURIResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetProjectStatusByURIResponse.ProtoReflect.Descriptor instead. func (*GetProjectStatusByURIResponse) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{14} + return file_stovepipe_proto_rawDescGZIP(), []int{19} } func (x *GetProjectStatusByURIResponse) GetRequestId() string { @@ -1281,7 +1629,7 @@ type RequestSummary struct { func (x *RequestSummary) Reset() { *x = RequestSummary{} - mi := &file_stovepipe_proto_msgTypes[15] + mi := &file_stovepipe_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1293,7 +1641,7 @@ func (x *RequestSummary) String() string { func (*RequestSummary) ProtoMessage() {} func (x *RequestSummary) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[15] + mi := &file_stovepipe_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1306,7 +1654,7 @@ func (x *RequestSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestSummary.ProtoReflect.Descriptor instead. func (*RequestSummary) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{15} + return file_stovepipe_proto_rawDescGZIP(), []int{20} } func (x *RequestSummary) GetRequestId() string { @@ -1402,7 +1750,7 @@ type ListRequest struct { func (x *ListRequest) Reset() { *x = ListRequest{} - mi := &file_stovepipe_proto_msgTypes[16] + mi := &file_stovepipe_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1414,7 +1762,7 @@ func (x *ListRequest) String() string { func (*ListRequest) ProtoMessage() {} func (x *ListRequest) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[16] + mi := &file_stovepipe_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1427,7 +1775,7 @@ func (x *ListRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRequest.ProtoReflect.Descriptor instead. func (*ListRequest) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{16} + return file_stovepipe_proto_rawDescGZIP(), []int{21} } func (x *ListRequest) GetQueue() string { @@ -1519,7 +1867,7 @@ type ListResponse struct { func (x *ListResponse) Reset() { *x = ListResponse{} - mi := &file_stovepipe_proto_msgTypes[17] + mi := &file_stovepipe_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1531,7 +1879,7 @@ func (x *ListResponse) String() string { func (*ListResponse) ProtoMessage() {} func (x *ListResponse) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[17] + mi := &file_stovepipe_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1544,7 +1892,7 @@ func (x *ListResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListResponse.ProtoReflect.Descriptor instead. func (*ListResponse) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{17} + return file_stovepipe_proto_rawDescGZIP(), []int{22} } func (x *ListResponse) GetRequests() []*RequestSummary { @@ -1573,7 +1921,7 @@ type GetQueueStatusRequest struct { func (x *GetQueueStatusRequest) Reset() { *x = GetQueueStatusRequest{} - mi := &file_stovepipe_proto_msgTypes[18] + mi := &file_stovepipe_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1585,7 +1933,7 @@ func (x *GetQueueStatusRequest) String() string { func (*GetQueueStatusRequest) ProtoMessage() {} func (x *GetQueueStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[18] + mi := &file_stovepipe_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1598,7 +1946,7 @@ func (x *GetQueueStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetQueueStatusRequest.ProtoReflect.Descriptor instead. func (*GetQueueStatusRequest) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{18} + return file_stovepipe_proto_rawDescGZIP(), []int{23} } func (x *GetQueueStatusRequest) GetQueue() string { @@ -1632,7 +1980,7 @@ type QueueEnablementStatus struct { func (x *QueueEnablementStatus) Reset() { *x = QueueEnablementStatus{} - mi := &file_stovepipe_proto_msgTypes[19] + mi := &file_stovepipe_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1644,7 +1992,7 @@ func (x *QueueEnablementStatus) String() string { func (*QueueEnablementStatus) ProtoMessage() {} func (x *QueueEnablementStatus) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[19] + mi := &file_stovepipe_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1657,7 +2005,7 @@ func (x *QueueEnablementStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use QueueEnablementStatus.ProtoReflect.Descriptor instead. func (*QueueEnablementStatus) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{19} + return file_stovepipe_proto_rawDescGZIP(), []int{24} } func (x *QueueEnablementStatus) GetVersion() int64 { @@ -1700,7 +2048,7 @@ type GetQueueStatusResponse struct { func (x *GetQueueStatusResponse) Reset() { *x = GetQueueStatusResponse{} - mi := &file_stovepipe_proto_msgTypes[20] + mi := &file_stovepipe_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1712,7 +2060,7 @@ func (x *GetQueueStatusResponse) String() string { func (*GetQueueStatusResponse) ProtoMessage() {} func (x *GetQueueStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[20] + mi := &file_stovepipe_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1725,7 +2073,7 @@ func (x *GetQueueStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetQueueStatusResponse.ProtoReflect.Descriptor instead. func (*GetQueueStatusResponse) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{20} + return file_stovepipe_proto_rawDescGZIP(), []int{25} } func (x *GetQueueStatusResponse) GetQueue() string { @@ -1765,7 +2113,7 @@ type IssueSummary struct { func (x *IssueSummary) Reset() { *x = IssueSummary{} - mi := &file_stovepipe_proto_msgTypes[21] + mi := &file_stovepipe_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1777,7 +2125,7 @@ func (x *IssueSummary) String() string { func (*IssueSummary) ProtoMessage() {} func (x *IssueSummary) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[21] + mi := &file_stovepipe_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1790,7 +2138,7 @@ func (x *IssueSummary) ProtoReflect() protoreflect.Message { // Deprecated: Use IssueSummary.ProtoReflect.Descriptor instead. func (*IssueSummary) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{21} + return file_stovepipe_proto_rawDescGZIP(), []int{26} } func (x *IssueSummary) GetTaskId() string { @@ -1857,7 +2205,7 @@ type ListOpenIssuesRequest struct { func (x *ListOpenIssuesRequest) Reset() { *x = ListOpenIssuesRequest{} - mi := &file_stovepipe_proto_msgTypes[22] + mi := &file_stovepipe_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1869,7 +2217,7 @@ func (x *ListOpenIssuesRequest) String() string { func (*ListOpenIssuesRequest) ProtoMessage() {} func (x *ListOpenIssuesRequest) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[22] + mi := &file_stovepipe_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1882,7 +2230,7 @@ func (x *ListOpenIssuesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOpenIssuesRequest.ProtoReflect.Descriptor instead. func (*ListOpenIssuesRequest) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{22} + return file_stovepipe_proto_rawDescGZIP(), []int{27} } func (x *ListOpenIssuesRequest) GetQueue() string { @@ -1921,7 +2269,7 @@ type ListOpenIssuesResponse struct { func (x *ListOpenIssuesResponse) Reset() { *x = ListOpenIssuesResponse{} - mi := &file_stovepipe_proto_msgTypes[23] + mi := &file_stovepipe_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1933,7 +2281,7 @@ func (x *ListOpenIssuesResponse) String() string { func (*ListOpenIssuesResponse) ProtoMessage() {} func (x *ListOpenIssuesResponse) ProtoReflect() protoreflect.Message { - mi := &file_stovepipe_proto_msgTypes[23] + mi := &file_stovepipe_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1946,7 +2294,7 @@ func (x *ListOpenIssuesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOpenIssuesResponse.ProtoReflect.Descriptor instead. func (*ListOpenIssuesResponse) Descriptor() ([]byte, []int) { - return file_stovepipe_proto_rawDescGZIP(), []int{23} + return file_stovepipe_proto_rawDescGZIP(), []int{28} } func (x *ListOpenIssuesResponse) GetIssues() []*IssueSummary { @@ -1991,15 +2339,33 @@ const file_stovepipe_proto_rawDesc = "" + "request_id\x18\x02 \x01(\tR\trequestId\"G\n" + "\x1dGetRequestHistoryByURIRequest\x12\x14\n" + "\x05queue\x18\x01 \x01(\tR\x05queue\x12\x10\n" + - "\x03uri\x18\x02 \x01(\tR\x03uri\"\xc0\x01\n" + + "\x03uri\x18\x02 \x01(\tR\x03uri\"\x82\x02\n" + "\fHistoryEvent\x12\x19\n" + "\bevent_id\x18\x01 \x01(\tR\aeventId\x12!\n" + "\ftimestamp_ms\x18\x02 \x01(\x03R\vtimestampMs\x12%\n" + "\rrequest_state\x18\x03 \x01(\tH\x00R\frequestState\x12\x16\n" + "\x05event\x18\x04 \x01(\tH\x00R\x05event\x12%\n" + - "\x0eoutcome_reason\x18\x05 \x01(\tR\routcomeReasonB\f\n" + + "\x0eoutcome_reason\x18\x05 \x01(\tR\routcomeReason\x12@\n" + + "\x04data\x18\x06 \x01(\v2,.uber.submitqueue.stovepipe.HistoryEventDataR\x04dataB\f\n" + "\n" + - "occurrence\"\xc6\x01\n" + + "occurrence\"\xf3\x04\n" + + "\x10HistoryEventData\x12Z\n" + + "\rrequest_state\x18\x01 \x01(\v23.uber.submitqueue.stovepipe.HistoryRequestStateDataH\x00R\frequestState\x12W\n" + + "\x0fbuild_triggered\x18\x02 \x01(\v2,.uber.submitqueue.stovepipe.HistoryBuildDataH\x00R\x0ebuildTriggered\x12U\n" + + "\x0ebuild_finished\x18\x03 \x01(\v2,.uber.submitqueue.stovepipe.HistoryBuildDataH\x00R\rbuildFinished\x12q\n" + + "\x18validation_fact_recorded\x18\x04 \x01(\v25.uber.submitqueue.stovepipe.HistoryValidationFactDataH\x00R\x16validationFactRecorded\x12k\n" + + "\x16project_facts_recorded\x18\x05 \x01(\v23.uber.submitqueue.stovepipe.HistoryProjectFactsDataH\x00R\x14projectFactsRecorded\x12h\n" + + "\x18build_analysis_abandoned\x18\x06 \x01(\v2,.uber.submitqueue.stovepipe.HistoryBuildDataH\x00R\x16buildAnalysisAbandonedB\t\n" + + "\apayload\"4\n" + + "\x17HistoryRequestStateData\x12\x19\n" + + "\bbuild_id\x18\x01 \x01(\tR\abuildId\"-\n" + + "\x10HistoryBuildData\x12\x19\n" + + "\bbuild_id\x18\x01 \x01(\tR\abuildId\"<\n" + + "\x19HistoryValidationFactData\x12\x1f\n" + + "\vfact_degree\x18\x01 \x01(\x01R\n" + + "factDegree\"G\n" + + "\x17HistoryProjectFactsData\x12,\n" + + "\x12project_fact_count\x18\x01 \x01(\x04R\x10projectFactCount\"\xc6\x01\n" + "\x0eRequestHistory\x12\x1d\n" + "\n" + "request_id\x18\x01 \x01(\tR\trequestId\x12@\n" + @@ -2146,7 +2512,7 @@ func file_stovepipe_proto_rawDescGZIP() []byte { } var file_stovepipe_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_stovepipe_proto_msgTypes = make([]protoimpl.MessageInfo, 24) +var file_stovepipe_proto_msgTypes = make([]protoimpl.MessageInfo, 29) var file_stovepipe_proto_goTypes = []any{ (QueueEnablement)(0), // 0: uber.submitqueue.stovepipe.QueueEnablement (*PingRequest)(nil), // 1: uber.submitqueue.stovepipe.PingRequest @@ -2156,61 +2522,73 @@ var file_stovepipe_proto_goTypes = []any{ (*GetRequestHistoryByIDRequest)(nil), // 5: uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest (*GetRequestHistoryByURIRequest)(nil), // 6: uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest (*HistoryEvent)(nil), // 7: uber.submitqueue.stovepipe.HistoryEvent - (*RequestHistory)(nil), // 8: uber.submitqueue.stovepipe.RequestHistory - (*GetRequestHistoryByIDResponse)(nil), // 9: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse - (*GetRequestHistoryByURIResponse)(nil), // 10: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse - (*GetProjectStatusByIDRequest)(nil), // 11: uber.submitqueue.stovepipe.GetProjectStatusByIDRequest - (*GetProjectStatusByURIRequest)(nil), // 12: uber.submitqueue.stovepipe.GetProjectStatusByURIRequest - (*ProjectValidation)(nil), // 13: uber.submitqueue.stovepipe.ProjectValidation - (*GetProjectStatusByIDResponse)(nil), // 14: uber.submitqueue.stovepipe.GetProjectStatusByIDResponse - (*GetProjectStatusByURIResponse)(nil), // 15: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse - (*RequestSummary)(nil), // 16: uber.submitqueue.stovepipe.RequestSummary - (*ListRequest)(nil), // 17: uber.submitqueue.stovepipe.ListRequest - (*ListResponse)(nil), // 18: uber.submitqueue.stovepipe.ListResponse - (*GetQueueStatusRequest)(nil), // 19: uber.submitqueue.stovepipe.GetQueueStatusRequest - (*QueueEnablementStatus)(nil), // 20: uber.submitqueue.stovepipe.QueueEnablementStatus - (*GetQueueStatusResponse)(nil), // 21: uber.submitqueue.stovepipe.GetQueueStatusResponse - (*IssueSummary)(nil), // 22: uber.submitqueue.stovepipe.IssueSummary - (*ListOpenIssuesRequest)(nil), // 23: uber.submitqueue.stovepipe.ListOpenIssuesRequest - (*ListOpenIssuesResponse)(nil), // 24: uber.submitqueue.stovepipe.ListOpenIssuesResponse + (*HistoryEventData)(nil), // 8: uber.submitqueue.stovepipe.HistoryEventData + (*HistoryRequestStateData)(nil), // 9: uber.submitqueue.stovepipe.HistoryRequestStateData + (*HistoryBuildData)(nil), // 10: uber.submitqueue.stovepipe.HistoryBuildData + (*HistoryValidationFactData)(nil), // 11: uber.submitqueue.stovepipe.HistoryValidationFactData + (*HistoryProjectFactsData)(nil), // 12: uber.submitqueue.stovepipe.HistoryProjectFactsData + (*RequestHistory)(nil), // 13: uber.submitqueue.stovepipe.RequestHistory + (*GetRequestHistoryByIDResponse)(nil), // 14: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse + (*GetRequestHistoryByURIResponse)(nil), // 15: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse + (*GetProjectStatusByIDRequest)(nil), // 16: uber.submitqueue.stovepipe.GetProjectStatusByIDRequest + (*GetProjectStatusByURIRequest)(nil), // 17: uber.submitqueue.stovepipe.GetProjectStatusByURIRequest + (*ProjectValidation)(nil), // 18: uber.submitqueue.stovepipe.ProjectValidation + (*GetProjectStatusByIDResponse)(nil), // 19: uber.submitqueue.stovepipe.GetProjectStatusByIDResponse + (*GetProjectStatusByURIResponse)(nil), // 20: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse + (*RequestSummary)(nil), // 21: uber.submitqueue.stovepipe.RequestSummary + (*ListRequest)(nil), // 22: uber.submitqueue.stovepipe.ListRequest + (*ListResponse)(nil), // 23: uber.submitqueue.stovepipe.ListResponse + (*GetQueueStatusRequest)(nil), // 24: uber.submitqueue.stovepipe.GetQueueStatusRequest + (*QueueEnablementStatus)(nil), // 25: uber.submitqueue.stovepipe.QueueEnablementStatus + (*GetQueueStatusResponse)(nil), // 26: uber.submitqueue.stovepipe.GetQueueStatusResponse + (*IssueSummary)(nil), // 27: uber.submitqueue.stovepipe.IssueSummary + (*ListOpenIssuesRequest)(nil), // 28: uber.submitqueue.stovepipe.ListOpenIssuesRequest + (*ListOpenIssuesResponse)(nil), // 29: uber.submitqueue.stovepipe.ListOpenIssuesResponse } var file_stovepipe_proto_depIdxs = []int32{ 0, // 0: uber.submitqueue.stovepipe.IngestRequest.enablement:type_name -> uber.submitqueue.stovepipe.QueueEnablement - 20, // 1: uber.submitqueue.stovepipe.IngestResponse.enablement:type_name -> uber.submitqueue.stovepipe.QueueEnablementStatus - 7, // 2: uber.submitqueue.stovepipe.RequestHistory.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent - 16, // 3: uber.submitqueue.stovepipe.RequestHistory.request_summary:type_name -> uber.submitqueue.stovepipe.RequestSummary - 7, // 4: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent - 16, // 5: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.request_summary:type_name -> uber.submitqueue.stovepipe.RequestSummary - 8, // 6: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse.histories:type_name -> uber.submitqueue.stovepipe.RequestHistory - 13, // 7: uber.submitqueue.stovepipe.GetProjectStatusByIDResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation - 13, // 8: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation - 16, // 9: uber.submitqueue.stovepipe.ListResponse.requests:type_name -> uber.submitqueue.stovepipe.RequestSummary - 0, // 10: uber.submitqueue.stovepipe.QueueEnablementStatus.state:type_name -> uber.submitqueue.stovepipe.QueueEnablement - 20, // 11: uber.submitqueue.stovepipe.GetQueueStatusResponse.enablement:type_name -> uber.submitqueue.stovepipe.QueueEnablementStatus - 22, // 12: uber.submitqueue.stovepipe.ListOpenIssuesResponse.issues:type_name -> uber.submitqueue.stovepipe.IssueSummary - 1, // 13: uber.submitqueue.stovepipe.Stovepipe.Ping:input_type -> uber.submitqueue.stovepipe.PingRequest - 3, // 14: uber.submitqueue.stovepipe.Stovepipe.Ingest:input_type -> uber.submitqueue.stovepipe.IngestRequest - 5, // 15: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest - 6, // 16: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest - 11, // 17: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDRequest - 12, // 18: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIRequest - 17, // 19: uber.submitqueue.stovepipe.Stovepipe.List:input_type -> uber.submitqueue.stovepipe.ListRequest - 19, // 20: uber.submitqueue.stovepipe.Stovepipe.GetQueueStatus:input_type -> uber.submitqueue.stovepipe.GetQueueStatusRequest - 23, // 21: uber.submitqueue.stovepipe.Stovepipe.ListOpenIssues:input_type -> uber.submitqueue.stovepipe.ListOpenIssuesRequest - 2, // 22: uber.submitqueue.stovepipe.Stovepipe.Ping:output_type -> uber.submitqueue.stovepipe.PingResponse - 4, // 23: uber.submitqueue.stovepipe.Stovepipe.Ingest:output_type -> uber.submitqueue.stovepipe.IngestResponse - 9, // 24: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse - 10, // 25: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse - 14, // 26: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDResponse - 15, // 27: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIResponse - 18, // 28: uber.submitqueue.stovepipe.Stovepipe.List:output_type -> uber.submitqueue.stovepipe.ListResponse - 21, // 29: uber.submitqueue.stovepipe.Stovepipe.GetQueueStatus:output_type -> uber.submitqueue.stovepipe.GetQueueStatusResponse - 24, // 30: uber.submitqueue.stovepipe.Stovepipe.ListOpenIssues:output_type -> uber.submitqueue.stovepipe.ListOpenIssuesResponse - 22, // [22:31] is the sub-list for method output_type - 13, // [13:22] is the sub-list for method input_type - 13, // [13:13] is the sub-list for extension type_name - 13, // [13:13] is the sub-list for extension extendee - 0, // [0:13] is the sub-list for field type_name + 25, // 1: uber.submitqueue.stovepipe.IngestResponse.enablement:type_name -> uber.submitqueue.stovepipe.QueueEnablementStatus + 8, // 2: uber.submitqueue.stovepipe.HistoryEvent.data:type_name -> uber.submitqueue.stovepipe.HistoryEventData + 9, // 3: uber.submitqueue.stovepipe.HistoryEventData.request_state:type_name -> uber.submitqueue.stovepipe.HistoryRequestStateData + 10, // 4: uber.submitqueue.stovepipe.HistoryEventData.build_triggered:type_name -> uber.submitqueue.stovepipe.HistoryBuildData + 10, // 5: uber.submitqueue.stovepipe.HistoryEventData.build_finished:type_name -> uber.submitqueue.stovepipe.HistoryBuildData + 11, // 6: uber.submitqueue.stovepipe.HistoryEventData.validation_fact_recorded:type_name -> uber.submitqueue.stovepipe.HistoryValidationFactData + 12, // 7: uber.submitqueue.stovepipe.HistoryEventData.project_facts_recorded:type_name -> uber.submitqueue.stovepipe.HistoryProjectFactsData + 10, // 8: uber.submitqueue.stovepipe.HistoryEventData.build_analysis_abandoned:type_name -> uber.submitqueue.stovepipe.HistoryBuildData + 7, // 9: uber.submitqueue.stovepipe.RequestHistory.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent + 21, // 10: uber.submitqueue.stovepipe.RequestHistory.request_summary:type_name -> uber.submitqueue.stovepipe.RequestSummary + 7, // 11: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent + 21, // 12: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.request_summary:type_name -> uber.submitqueue.stovepipe.RequestSummary + 13, // 13: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse.histories:type_name -> uber.submitqueue.stovepipe.RequestHistory + 18, // 14: uber.submitqueue.stovepipe.GetProjectStatusByIDResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation + 18, // 15: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation + 21, // 16: uber.submitqueue.stovepipe.ListResponse.requests:type_name -> uber.submitqueue.stovepipe.RequestSummary + 0, // 17: uber.submitqueue.stovepipe.QueueEnablementStatus.state:type_name -> uber.submitqueue.stovepipe.QueueEnablement + 25, // 18: uber.submitqueue.stovepipe.GetQueueStatusResponse.enablement:type_name -> uber.submitqueue.stovepipe.QueueEnablementStatus + 27, // 19: uber.submitqueue.stovepipe.ListOpenIssuesResponse.issues:type_name -> uber.submitqueue.stovepipe.IssueSummary + 1, // 20: uber.submitqueue.stovepipe.Stovepipe.Ping:input_type -> uber.submitqueue.stovepipe.PingRequest + 3, // 21: uber.submitqueue.stovepipe.Stovepipe.Ingest:input_type -> uber.submitqueue.stovepipe.IngestRequest + 5, // 22: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest + 6, // 23: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest + 16, // 24: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDRequest + 17, // 25: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIRequest + 22, // 26: uber.submitqueue.stovepipe.Stovepipe.List:input_type -> uber.submitqueue.stovepipe.ListRequest + 24, // 27: uber.submitqueue.stovepipe.Stovepipe.GetQueueStatus:input_type -> uber.submitqueue.stovepipe.GetQueueStatusRequest + 28, // 28: uber.submitqueue.stovepipe.Stovepipe.ListOpenIssues:input_type -> uber.submitqueue.stovepipe.ListOpenIssuesRequest + 2, // 29: uber.submitqueue.stovepipe.Stovepipe.Ping:output_type -> uber.submitqueue.stovepipe.PingResponse + 4, // 30: uber.submitqueue.stovepipe.Stovepipe.Ingest:output_type -> uber.submitqueue.stovepipe.IngestResponse + 14, // 31: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse + 15, // 32: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse + 19, // 33: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDResponse + 20, // 34: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIResponse + 23, // 35: uber.submitqueue.stovepipe.Stovepipe.List:output_type -> uber.submitqueue.stovepipe.ListResponse + 26, // 36: uber.submitqueue.stovepipe.Stovepipe.GetQueueStatus:output_type -> uber.submitqueue.stovepipe.GetQueueStatusResponse + 29, // 37: uber.submitqueue.stovepipe.Stovepipe.ListOpenIssues:output_type -> uber.submitqueue.stovepipe.ListOpenIssuesResponse + 29, // [29:38] is the sub-list for method output_type + 20, // [20:29] is the sub-list for method input_type + 20, // [20:20] is the sub-list for extension type_name + 20, // [20:20] is the sub-list for extension extendee + 0, // [0:20] is the sub-list for field type_name } func init() { file_stovepipe_proto_init() } @@ -2222,16 +2600,24 @@ func file_stovepipe_proto_init() { (*HistoryEvent_RequestState)(nil), (*HistoryEvent_Event)(nil), } - file_stovepipe_proto_msgTypes[12].OneofWrappers = []any{ + file_stovepipe_proto_msgTypes[7].OneofWrappers = []any{ + (*HistoryEventData_RequestState)(nil), + (*HistoryEventData_BuildTriggered)(nil), + (*HistoryEventData_BuildFinished)(nil), + (*HistoryEventData_ValidationFactRecorded)(nil), + (*HistoryEventData_ProjectFactsRecorded)(nil), + (*HistoryEventData_BuildAnalysisAbandoned)(nil), + } + file_stovepipe_proto_msgTypes[17].OneofWrappers = []any{ (*ProjectValidation_BreakageDegree)(nil), } - file_stovepipe_proto_msgTypes[13].OneofWrappers = []any{ + file_stovepipe_proto_msgTypes[18].OneofWrappers = []any{ (*GetProjectStatusByIDResponse_RepositoryBreakageDegree)(nil), } - file_stovepipe_proto_msgTypes[14].OneofWrappers = []any{ + file_stovepipe_proto_msgTypes[19].OneofWrappers = []any{ (*GetProjectStatusByURIResponse_RepositoryBreakageDegree)(nil), } - file_stovepipe_proto_msgTypes[16].OneofWrappers = []any{ + file_stovepipe_proto_msgTypes[21].OneofWrappers = []any{ (*ListRequest_AcceptedAtOrAfterMs)(nil), (*ListRequest_AcceptedBeforeMs)(nil), } @@ -2241,7 +2627,7 @@ func file_stovepipe_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_stovepipe_proto_rawDesc), len(file_stovepipe_proto_rawDesc)), NumEnums: 1, - NumMessages: 24, + NumMessages: 29, NumExtensions: 0, NumServices: 1, }, diff --git a/api/stovepipe/protopb/stovepipe.pb.yarpc.go b/api/stovepipe/protopb/stovepipe.pb.yarpc.go index ec4b0d795..e63086717 100644 --- a/api/stovepipe/protopb/stovepipe.pb.yarpc.go +++ b/api/stovepipe/protopb/stovepipe.pb.yarpc.go @@ -626,103 +626,120 @@ var ( var yarpcFileDescriptorClosurefabdb6b3c0b09022 = [][]byte{ // stovepipe.proto []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4b, 0x6f, 0x1c, 0xc5, - 0x13, 0xdf, 0xd9, 0xb5, 0xd7, 0xbb, 0xe5, 0xf5, 0xda, 0xe9, 0x38, 0xce, 0x7a, 0x13, 0x47, 0xfe, - 0xcf, 0x9f, 0x10, 0x27, 0x28, 0x36, 0x31, 0x12, 0x24, 0x1c, 0x10, 0xde, 0xd8, 0xb1, 0x57, 0x89, - 0x1d, 0x67, 0x36, 0x06, 0x89, 0x1c, 0x46, 0xb3, 0xbb, 0xe5, 0xf5, 0x24, 0x9e, 0x47, 0xa6, 0x7b, - 0x0c, 0xce, 0x01, 0x09, 0x24, 0x4e, 0x48, 0x48, 0x7c, 0x0d, 0xb8, 0x73, 0xe6, 0xc4, 0x17, 0xe0, - 0x02, 0x57, 0x24, 0x3e, 0x43, 0xae, 0xa8, 0x1f, 0x33, 0x3b, 0xfb, 0xf0, 0xf8, 0x45, 0x24, 0x90, - 0xb8, 0x4d, 0x57, 0x75, 0x55, 0x57, 0xff, 0xaa, 0xea, 0xd7, 0xdd, 0x03, 0x93, 0x94, 0x79, 0x07, - 0xe8, 0xdb, 0x3e, 0x2e, 0xfa, 0x81, 0xc7, 0x3c, 0x52, 0x0d, 0x9b, 0x18, 0x2c, 0xd2, 0xb0, 0xe9, - 0xd8, 0xec, 0x65, 0x88, 0x21, 0x2e, 0xc6, 0x33, 0xf4, 0x1b, 0x30, 0xbe, 0x6d, 0xbb, 0x1d, 0x03, - 0x5f, 0x86, 0x48, 0x19, 0xa9, 0xc0, 0x98, 0x83, 0x94, 0x5a, 0x1d, 0xac, 0x68, 0xf3, 0xda, 0x42, - 0xd1, 0x88, 0x86, 0xfa, 0x37, 0x1a, 0x94, 0xe4, 0x4c, 0xea, 0x7b, 0x2e, 0xc5, 0xa3, 0xa7, 0x92, - 0xff, 0x41, 0x89, 0x62, 0x70, 0x60, 0xb7, 0xd0, 0x74, 0x2d, 0x07, 0x2b, 0x59, 0xa1, 0x1e, 0x57, - 0xb2, 0x2d, 0xcb, 0x41, 0x72, 0x15, 0x8a, 0xcc, 0x76, 0x90, 0x32, 0xcb, 0xf1, 0x2b, 0xb9, 0x79, - 0x6d, 0x21, 0x67, 0x74, 0x05, 0xa4, 0x0a, 0x85, 0x3d, 0x8f, 0x32, 0x61, 0x3c, 0x22, 0x8c, 0xe3, - 0xb1, 0x1e, 0xc0, 0x44, 0xdd, 0xed, 0x20, 0x65, 0x51, 0xc8, 0xd3, 0x30, 0x2a, 0x36, 0xa5, 0xa2, - 0x90, 0x03, 0xf2, 0x10, 0x00, 0x5d, 0xab, 0xb9, 0x8f, 0x0e, 0xba, 0x4c, 0x44, 0x50, 0x5e, 0x7e, - 0x67, 0xf1, 0x68, 0x20, 0x16, 0x9f, 0xf0, 0xf1, 0x5a, 0x6c, 0x62, 0x24, 0xcc, 0x75, 0x0a, 0xe5, - 0x68, 0x4d, 0xb5, 0xf9, 0x32, 0x64, 0xed, 0xb6, 0x5a, 0x31, 0x6b, 0xb7, 0xc9, 0x93, 0x81, 0xe5, - 0xc6, 0x97, 0xef, 0x9c, 0x62, 0xb9, 0x06, 0xb3, 0x58, 0x48, 0x7b, 0x16, 0x6d, 0xc0, 0xd5, 0x75, - 0x8c, 0x76, 0xb9, 0x61, 0x53, 0xe6, 0x05, 0x87, 0xb5, 0xc3, 0xfa, 0x6a, 0xfa, 0xbe, 0xe7, 0x00, - 0x02, 0x39, 0xc1, 0xb4, 0xdb, 0x0a, 0xf9, 0xa2, 0x92, 0xd4, 0xdb, 0xfa, 0x3a, 0xcc, 0x0d, 0x71, - 0xba, 0x63, 0xd4, 0xd3, 0xbd, 0x4e, 0x41, 0x2e, 0x0c, 0x6c, 0xe5, 0x8e, 0x7f, 0xea, 0x3f, 0x6b, - 0x50, 0x52, 0xf6, 0x6b, 0x07, 0xe8, 0x32, 0x32, 0x0b, 0x05, 0xe4, 0x1f, 0x66, 0x8c, 0xcb, 0x98, - 0x18, 0xd7, 0xdb, 0xbc, 0x1e, 0xe2, 0xdc, 0x9a, 0x0e, 0x15, 0x6e, 0x72, 0xc6, 0x78, 0x2c, 0xdb, - 0xa4, 0xe4, 0x3a, 0x4c, 0x44, 0x61, 0x53, 0x66, 0x31, 0x14, 0x35, 0x51, 0xdc, 0xc8, 0x18, 0x25, - 0x25, 0xe6, 0x00, 0x21, 0x99, 0x81, 0x51, 0xe1, 0x54, 0x56, 0xc5, 0x46, 0xc6, 0x90, 0x43, 0x72, - 0x1d, 0xca, 0x5e, 0xc8, 0x5a, 0x9e, 0x83, 0x66, 0x80, 0x16, 0xf5, 0xdc, 0xca, 0xa8, 0x08, 0x61, - 0x42, 0x49, 0x0d, 0x21, 0xac, 0x95, 0x00, 0xbc, 0x56, 0x2b, 0x0c, 0x02, 0x74, 0x5b, 0xa8, 0xff, - 0xa2, 0x41, 0xb9, 0x17, 0x89, 0x3e, 0xf4, 0xb4, 0x3e, 0xf4, 0xc8, 0xc7, 0x90, 0x17, 0xeb, 0xf1, - 0x2d, 0xe4, 0x16, 0xc6, 0x97, 0x17, 0xd2, 0x32, 0x9c, 0x44, 0xc7, 0x50, 0x76, 0xa4, 0x01, 0x93, - 0xf1, 0x3e, 0x43, 0xc7, 0xb1, 0x82, 0x43, 0xb1, 0xd3, 0xf1, 0xe5, 0x5b, 0x69, 0xae, 0x54, 0x94, - 0x0d, 0x69, 0x61, 0x94, 0x83, 0x9e, 0xb1, 0xfe, 0x93, 0x36, 0x34, 0xab, 0xbc, 0x54, 0x54, 0xb9, - 0x76, 0x03, 0xd7, 0xfe, 0xbe, 0xc0, 0xb3, 0xe7, 0x0e, 0xfc, 0x39, 0x5c, 0x3b, 0xaa, 0x1a, 0x55, - 0xe0, 0x1b, 0x50, 0xdc, 0x13, 0x72, 0x1b, 0xa3, 0xd8, 0x4f, 0xb2, 0xa0, 0xf2, 0x65, 0x74, 0x8d, - 0xf5, 0x1f, 0x34, 0xb8, 0xb2, 0x8e, 0x6c, 0x3b, 0xf0, 0x9e, 0x63, 0x4b, 0xf5, 0xdb, 0x79, 0xdb, - 0x89, 0x13, 0x95, 0x2f, 0x1d, 0xd2, 0x4a, 0x6e, 0x3e, 0xc7, 0x89, 0x2a, 0x1a, 0x93, 0x2b, 0x50, - 0xf4, 0xad, 0x0e, 0x9a, 0xd4, 0x7e, 0x25, 0x59, 0x6c, 0xd4, 0x28, 0x70, 0x41, 0xc3, 0x7e, 0x25, - 0xfc, 0x0a, 0x25, 0xf3, 0x5e, 0x60, 0x54, 0xac, 0x62, 0xfa, 0x53, 0x2e, 0xd0, 0x7f, 0xd4, 0x44, - 0xf3, 0xf7, 0x05, 0x7b, 0x6c, 0x9b, 0xce, 0x01, 0xb4, 0xf6, 0x2c, 0xb7, 0x83, 0x66, 0xb7, 0x5b, - 0x8b, 0x52, 0xb2, 0x13, 0xd8, 0x6f, 0x2c, 0xda, 0x26, 0x5c, 0x50, 0x91, 0x7e, 0x62, 0xed, 0xdb, - 0x6d, 0x8b, 0xd9, 0x9e, 0xcb, 0x8f, 0x07, 0xe5, 0x3c, 0xa2, 0x03, 0x35, 0x24, 0x37, 0x61, 0xb2, - 0x19, 0xa0, 0xf5, 0x82, 0x7b, 0x6c, 0x63, 0x27, 0x40, 0x79, 0x42, 0x68, 0x1b, 0x19, 0xa3, 0x1c, - 0x29, 0x56, 0x85, 0xbc, 0x56, 0x80, 0x7c, 0x80, 0x34, 0xdc, 0x67, 0xfa, 0x6f, 0xb9, 0x61, 0x88, - 0x24, 0x4a, 0xfc, 0x98, 0xd6, 0x8d, 0x01, 0xcb, 0x1e, 0x0d, 0x58, 0xae, 0x1f, 0xb0, 0x59, 0x28, - 0x34, 0x2d, 0x2a, 0x95, 0xf2, 0x1c, 0x1a, 0xe3, 0x63, 0xae, 0xfa, 0x7f, 0x3f, 0x61, 0x49, 0x54, - 0x7a, 0xe9, 0x4a, 0x87, 0x89, 0xd0, 0x6f, 0x5b, 0x0c, 0xdb, 0xa6, 0xc5, 0x38, 0xf3, 0x81, 0x64, - 0x3e, 0x25, 0x5c, 0x61, 0x9b, 0x94, 0x7c, 0x04, 0xd5, 0x00, 0x7d, 0x8f, 0xda, 0xbc, 0x60, 0xcd, - 0x7e, 0x60, 0xf2, 0x0a, 0x98, 0x4a, 0x77, 0x4e, 0xad, 0x07, 0x22, 0x72, 0x17, 0x2a, 0x0a, 0x58, - 0x53, 0x42, 0x45, 0xcd, 0x96, 0xe7, 0xf8, 0xfb, 0xc8, 0xb0, 0x32, 0x36, 0xaf, 0x2d, 0x14, 0x8c, - 0x19, 0xa5, 0x37, 0xa4, 0xfa, 0xbe, 0xd2, 0x92, 0x7a, 0xa2, 0x1c, 0x0a, 0xa2, 0xb5, 0x6e, 0xa7, - 0xb5, 0xd6, 0x40, 0x8a, 0x13, 0xd5, 0xf3, 0x36, 0x4c, 0xba, 0xf8, 0x05, 0x33, 0x13, 0x55, 0x52, - 0x94, 0x04, 0xcc, 0xc5, 0xdb, 0x51, 0xa5, 0xd4, 0x2e, 0xc2, 0x85, 0xc4, 0x66, 0x55, 0x6a, 0x7f, - 0xcf, 0x09, 0xfa, 0x1a, 0x56, 0xec, 0xff, 0xe5, 0xf6, 0x5f, 0x9e, 0xdb, 0xd7, 0xd9, 0xf8, 0x8c, - 0x55, 0xa4, 0xff, 0x8f, 0x4c, 0xe6, 0x6d, 0xb8, 0x28, 0x94, 0x66, 0x6f, 0x4a, 0xf3, 0x22, 0xa5, - 0x53, 0x42, 0xb5, 0x93, 0xc8, 0xeb, 0x5b, 0x50, 0xb6, 0x5a, 0x2d, 0xf4, 0xbb, 0x33, 0xc7, 0xc4, - 0xcc, 0x52, 0x24, 0x15, 0xb3, 0x06, 0x2f, 0x25, 0x85, 0x21, 0x97, 0x12, 0x1e, 0x60, 0x94, 0xe4, - 0x96, 0x17, 0xba, 0x4c, 0xa0, 0x3b, 0x6a, 0x94, 0x94, 0xf0, 0x3e, 0x97, 0x91, 0x77, 0x61, 0xba, - 0x19, 0x70, 0x98, 0xcd, 0xde, 0xb9, 0x20, 0xe6, 0x12, 0xa9, 0xdb, 0x4e, 0x58, 0xe8, 0xaf, 0x35, - 0x18, 0x7f, 0x64, 0x1f, 0x77, 0x4d, 0x7e, 0x1f, 0x2e, 0x27, 0x77, 0xe2, 0x05, 0xa6, 0xb5, 0xcb, - 0x30, 0x88, 0x6f, 0x69, 0x1b, 0x19, 0xe3, 0x62, 0x77, 0x53, 0x8f, 0x83, 0x15, 0xae, 0xdd, 0xa4, - 0x64, 0x11, 0x48, 0x6c, 0xd7, 0xc4, 0x5d, 0x2f, 0x40, 0x6e, 0x22, 0x2e, 0xf2, 0x1b, 0x9a, 0x31, - 0x15, 0xe9, 0x6a, 0x42, 0xb5, 0x79, 0xae, 0xe3, 0xa5, 0x36, 0x03, 0xd3, 0xf1, 0x5a, 0xfb, 0xde, - 0xe7, 0x18, 0x98, 0x4d, 0x2f, 0x74, 0xdb, 0x3d, 0xf2, 0xd0, 0xf7, 0x23, 0xb9, 0xfe, 0x25, 0x94, - 0xe4, 0xc6, 0x15, 0x7b, 0x3c, 0x80, 0x82, 0x4a, 0xf6, 0x69, 0xae, 0x10, 0xd1, 0x9d, 0x25, 0xb6, - 0x1d, 0xd6, 0x08, 0xd9, 0x21, 0x8d, 0xa0, 0x3f, 0x82, 0x4b, 0xeb, 0xc8, 0xc4, 0x05, 0x5f, 0x5d, - 0xeb, 0xcf, 0x71, 0x68, 0xeb, 0xbf, 0x6a, 0x70, 0x69, 0xe8, 0x63, 0x81, 0x9f, 0xb0, 0x07, 0x18, - 0x50, 0xdb, 0x73, 0x85, 0xc3, 0x9c, 0x11, 0x0d, 0xc9, 0x0a, 0x8c, 0xca, 0x5a, 0x3f, 0xc3, 0xbb, - 0x47, 0x5a, 0x92, 0x7b, 0x30, 0x8b, 0xbb, 0xbb, 0xd8, 0x62, 0xf6, 0x01, 0x9a, 0xbb, 0x81, 0xe7, - 0x70, 0xe6, 0x71, 0x6c, 0x96, 0xe8, 0xbf, 0x99, 0x78, 0xc2, 0x83, 0xc0, 0x73, 0xee, 0x0b, 0x35, - 0xef, 0x38, 0x1d, 0x26, 0x64, 0xf8, 0x51, 0x73, 0x8c, 0x48, 0x66, 0x54, 0x42, 0xde, 0x1b, 0xfa, - 0x57, 0x1a, 0xcc, 0xf4, 0x83, 0xa4, 0xd2, 0x35, 0x1c, 0xa5, 0x37, 0xf0, 0xc0, 0xfa, 0x53, 0x83, - 0x52, 0x9d, 0xd2, 0x10, 0x23, 0x66, 0xba, 0x0c, 0x63, 0xcc, 0xa2, 0x2f, 0xba, 0xb4, 0x94, 0xe7, - 0xc3, 0x7a, 0x9b, 0x2b, 0x42, 0xd7, 0x4e, 0x5c, 0x01, 0xf3, 0x7c, 0x58, 0x6f, 0x93, 0x19, 0xc8, - 0x53, 0xe1, 0x58, 0x41, 0xa2, 0x46, 0x9c, 0x4f, 0x76, 0xed, 0x80, 0x53, 0x0e, 0xa2, 0x6b, 0x36, - 0x43, 0x7b, 0xbf, 0xcd, 0x8d, 0x25, 0x35, 0x4d, 0x09, 0x55, 0x03, 0xd1, 0xad, 0x71, 0x45, 0xbd, - 0xdd, 0x47, 0x89, 0xa3, 0xfd, 0x94, 0xc8, 0xd9, 0x2d, 0x72, 0x91, 0x57, 0xec, 0xa6, 0x2c, 0x07, - 0xb0, 0x1e, 0x1b, 0xc4, 0xda, 0x86, 0x4b, 0xbc, 0x1f, 0x1e, 0xfb, 0xe8, 0x8a, 0xed, 0x1e, 0x53, - 0x8f, 0x3d, 0xad, 0x9a, 0x4d, 0x6d, 0xd5, 0x5c, 0xff, 0x4d, 0xf0, 0x6b, 0x0d, 0x66, 0xfa, 0xd7, - 0xea, 0x3e, 0x41, 0x6c, 0x21, 0x39, 0xc9, 0x13, 0x24, 0x99, 0x16, 0x43, 0xd9, 0x9d, 0xb4, 0xff, - 0x6e, 0xed, 0xc3, 0x64, 0x5f, 0xf2, 0xc9, 0x55, 0xa8, 0x3c, 0xd9, 0x59, 0xdb, 0x59, 0x33, 0xd7, - 0xb6, 0x56, 0x6a, 0x8f, 0xd6, 0x36, 0xd7, 0xb6, 0x9e, 0x9a, 0x3b, 0x5b, 0x0f, 0xb7, 0x1e, 0x7f, - 0xba, 0x35, 0x95, 0x19, 0xaa, 0x95, 0x9f, 0xab, 0x53, 0x1a, 0x99, 0x83, 0xd9, 0x01, 0xed, 0x6a, - 0xbd, 0x21, 0xd5, 0xd9, 0xe5, 0x3f, 0x0a, 0x50, 0x6c, 0x44, 0x81, 0x93, 0x67, 0x30, 0xb2, 0x6d, - 0xbb, 0x1d, 0x72, 0x23, 0xf5, 0xb4, 0xed, 0xfe, 0x70, 0xa9, 0x2e, 0x1c, 0x3f, 0x51, 0x02, 0xa8, - 0x67, 0x88, 0x05, 0x79, 0xf9, 0x1b, 0x82, 0xdc, 0x4c, 0x05, 0x2f, 0xf9, 0x7b, 0xa4, 0x7a, 0xeb, - 0x24, 0x53, 0xe3, 0x25, 0xbe, 0xd3, 0x04, 0x79, 0x0d, 0x3e, 0x25, 0xc9, 0xdd, 0x34, 0x3f, 0x69, - 0x3f, 0x2a, 0xaa, 0xf7, 0xce, 0x60, 0x19, 0x07, 0xf4, 0xbd, 0x24, 0x8a, 0x21, 0x6f, 0x44, 0x72, - 0x5a, 0xbf, 0xdd, 0xe7, 0x53, 0xf5, 0xc3, 0xb3, 0x98, 0xc6, 0x31, 0x7d, 0xab, 0xc1, 0xf4, 0xb0, - 0xb7, 0x08, 0xf9, 0xe0, 0x18, 0xb7, 0x47, 0x3d, 0x3e, 0xab, 0x77, 0x4f, 0x6f, 0xd8, 0x9f, 0xb2, - 0xc1, 0xeb, 0x33, 0x39, 0xa5, 0xd7, 0x04, 0x3e, 0xf7, 0xce, 0x60, 0x19, 0x07, 0xf4, 0x0c, 0x46, - 0x38, 0x07, 0xa4, 0xf7, 0x40, 0xe2, 0x6a, 0x92, 0xde, 0x03, 0xc9, 0xa3, 0x5c, 0xcf, 0x90, 0x43, - 0x28, 0xf7, 0x9e, 0x1b, 0xe4, 0xce, 0x31, 0xb1, 0x0e, 0x1e, 0xc4, 0xd5, 0xe5, 0xd3, 0x98, 0x24, - 0x97, 0xee, 0xe5, 0xb6, 0xf4, 0xa5, 0x87, 0x72, 0x6e, 0xfa, 0xd2, 0xc3, 0xa9, 0x53, 0xcf, 0xd4, - 0x10, 0xae, 0xb5, 0x3c, 0x27, 0xc5, 0xb4, 0x56, 0x8e, 0x39, 0x68, 0x3b, 0xf0, 0x98, 0xb7, 0xad, - 0x7d, 0x76, 0xa7, 0x63, 0xb3, 0xbd, 0xb0, 0xb9, 0xd8, 0xf2, 0x9c, 0x25, 0x6e, 0xb8, 0x94, 0x30, - 0x5c, 0xb2, 0x7c, 0x7b, 0x29, 0x36, 0x5e, 0x12, 0xbf, 0x89, 0xfd, 0x66, 0x33, 0x2f, 0x3e, 0xde, - 0xfb, 0x2b, 0x00, 0x00, 0xff, 0xff, 0xb4, 0xd9, 0xcf, 0x0c, 0x42, 0x16, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x19, 0xcb, 0x6e, 0x1b, 0xd7, + 0x55, 0x43, 0x4a, 0x14, 0x79, 0x44, 0x51, 0xca, 0xb5, 0x4c, 0xd3, 0x8c, 0x9d, 0xba, 0x93, 0xa6, + 0x51, 0xdc, 0x58, 0xaa, 0x95, 0x3e, 0xec, 0xa2, 0x28, 0x22, 0x5a, 0xb2, 0x44, 0xc4, 0x92, 0xe5, + 0x91, 0xd5, 0x00, 0xc9, 0x62, 0x70, 0x39, 0x73, 0x44, 0x4d, 0xcc, 0x79, 0x78, 0xee, 0x1d, 0xb5, + 0xca, 0xa2, 0x40, 0x03, 0x74, 0x55, 0xa0, 0x40, 0x7f, 0xa3, 0xdd, 0xf7, 0x13, 0xfa, 0x03, 0xdd, + 0xb4, 0xdb, 0x02, 0xfd, 0x82, 0x2e, 0xb2, 0x2d, 0xee, 0x63, 0x86, 0xc3, 0x87, 0x28, 0xd2, 0x6a, + 0x80, 0x16, 0xc8, 0x8e, 0xf7, 0xbc, 0xef, 0x79, 0xde, 0x33, 0x84, 0x15, 0xc6, 0xc3, 0x73, 0x8c, + 0xbc, 0x08, 0x37, 0xa2, 0x38, 0xe4, 0x21, 0x69, 0x26, 0x1d, 0x8c, 0x37, 0x58, 0xd2, 0xf1, 0x3d, + 0xfe, 0x3a, 0xc1, 0x04, 0x37, 0x32, 0x0a, 0xf3, 0x7d, 0x58, 0x3a, 0xf2, 0x82, 0xae, 0x85, 0xaf, + 0x13, 0x64, 0x9c, 0x34, 0x60, 0xd1, 0x47, 0xc6, 0x68, 0x17, 0x1b, 0xc6, 0x3d, 0x63, 0xbd, 0x62, + 0xa5, 0x47, 0xf3, 0x77, 0x06, 0x54, 0x15, 0x25, 0x8b, 0xc2, 0x80, 0xe1, 0xe5, 0xa4, 0xe4, 0xbb, + 0x50, 0x65, 0x18, 0x9f, 0x7b, 0x0e, 0xda, 0x01, 0xf5, 0xb1, 0x51, 0x90, 0xe8, 0x25, 0x0d, 0x3b, + 0xa4, 0x3e, 0x92, 0x3b, 0x50, 0xe1, 0x9e, 0x8f, 0x8c, 0x53, 0x3f, 0x6a, 0x14, 0xef, 0x19, 0xeb, + 0x45, 0xab, 0x0f, 0x20, 0x4d, 0x28, 0x9f, 0x85, 0x8c, 0x4b, 0xe6, 0x79, 0xc9, 0x9c, 0x9d, 0xcd, + 0x18, 0x96, 0xdb, 0x41, 0x17, 0x19, 0x4f, 0x4d, 0x5e, 0x83, 0x05, 0x79, 0x29, 0x6d, 0x85, 0x3a, + 0x90, 0x4f, 0x00, 0x30, 0xa0, 0x9d, 0x1e, 0xfa, 0x18, 0x70, 0x69, 0x41, 0x6d, 0xeb, 0x07, 0x1b, + 0x97, 0x3b, 0x62, 0xe3, 0x85, 0x38, 0xef, 0x66, 0x2c, 0x56, 0x8e, 0xdd, 0x64, 0x50, 0x4b, 0x75, + 0xea, 0xcb, 0xd7, 0xa0, 0xe0, 0xb9, 0x5a, 0x63, 0xc1, 0x73, 0xc9, 0x8b, 0x11, 0x75, 0x4b, 0x5b, + 0x0f, 0x67, 0x50, 0x77, 0xcc, 0x29, 0x4f, 0xd8, 0x80, 0xd2, 0x63, 0xb8, 0xb3, 0x87, 0xe9, 0x2d, + 0xf7, 0x3d, 0xc6, 0xc3, 0xf8, 0xa2, 0x75, 0xd1, 0xde, 0x99, 0x7c, 0xef, 0xbb, 0x00, 0xb1, 0x22, + 0xb0, 0x3d, 0x57, 0x7b, 0xbe, 0xa2, 0x21, 0x6d, 0xd7, 0xdc, 0x83, 0xbb, 0x63, 0x84, 0x9e, 0x58, + 0xed, 0xc9, 0x52, 0x57, 0xa1, 0x98, 0xc4, 0x9e, 0x16, 0x27, 0x7e, 0x9a, 0x5f, 0x15, 0xa0, 0xaa, + 0xf9, 0x77, 0xcf, 0x31, 0xe0, 0xe4, 0x36, 0x94, 0x51, 0xfc, 0xb0, 0x33, 0xbf, 0x2c, 0xca, 0x73, + 0xdb, 0x15, 0xf9, 0x90, 0xc5, 0xd6, 0xf6, 0x99, 0x14, 0x53, 0xb4, 0x96, 0x32, 0xd8, 0x01, 0x23, + 0xef, 0xc1, 0x72, 0x6a, 0x36, 0xe3, 0x94, 0xa3, 0xcc, 0x89, 0xca, 0xfe, 0x9c, 0x55, 0xd5, 0x60, + 0xe1, 0x20, 0x24, 0x75, 0x58, 0x90, 0x42, 0x55, 0x56, 0xec, 0xcf, 0x59, 0xea, 0x48, 0xde, 0x83, + 0x5a, 0x98, 0x70, 0x27, 0xf4, 0xd1, 0x8e, 0x91, 0xb2, 0x30, 0x68, 0x2c, 0x48, 0x13, 0x96, 0x35, + 0xd4, 0x92, 0x40, 0xf2, 0x31, 0xcc, 0xbb, 0x94, 0xd3, 0x46, 0x49, 0xc6, 0xe7, 0xc3, 0x49, 0xf1, + 0xc9, 0xdf, 0x6d, 0x87, 0x72, 0x6a, 0x49, 0xce, 0x56, 0x15, 0x20, 0x74, 0x9c, 0x24, 0x8e, 0x31, + 0x70, 0xd0, 0xfc, 0xf7, 0x3c, 0xac, 0x0e, 0x13, 0x92, 0xcf, 0x86, 0xaf, 0x62, 0x48, 0x6d, 0x1f, + 0x4d, 0xa1, 0xcd, 0xca, 0xdd, 0x55, 0xc8, 0x1a, 0xb9, 0xff, 0xa7, 0xb0, 0xd2, 0x49, 0xbc, 0x9e, + 0x6b, 0xf3, 0xd8, 0xeb, 0x76, 0x31, 0x46, 0x57, 0xe7, 0xda, 0x34, 0x77, 0x69, 0x09, 0x4e, 0x2d, + 0xb6, 0x26, 0xc5, 0xbc, 0x4c, 0xa5, 0x90, 0x13, 0x50, 0x10, 0xfb, 0xd4, 0x0b, 0x3c, 0x76, 0x86, + 0xae, 0x0c, 0xc0, 0xec, 0x72, 0x97, 0xa5, 0x94, 0xa7, 0x5a, 0x08, 0x79, 0x0d, 0x8d, 0x73, 0xda, + 0xf3, 0x5c, 0xca, 0xbd, 0x30, 0xb0, 0x4f, 0xa9, 0xc3, 0xed, 0x18, 0x9d, 0x30, 0x76, 0xd1, 0x95, + 0x21, 0x5c, 0xda, 0xfa, 0xf1, 0x14, 0x0a, 0x7e, 0x99, 0x89, 0x78, 0x4a, 0x1d, 0xae, 0x35, 0xd5, + 0xcf, 0x07, 0xa0, 0x96, 0x16, 0x4b, 0x5e, 0x41, 0x3d, 0x8a, 0xc3, 0x2f, 0xd0, 0xe1, 0x52, 0x1f, + 0xeb, 0x2b, 0x5c, 0x98, 0x3a, 0x0e, 0x47, 0x4a, 0x80, 0x90, 0xcb, 0xb4, 0xba, 0xb5, 0x28, 0x07, + 0xcb, 0x94, 0x9d, 0x41, 0x43, 0xb9, 0x8d, 0x06, 0xb4, 0x77, 0xc1, 0x3c, 0x66, 0xd3, 0x0e, 0x0d, + 0xdc, 0x30, 0x40, 0x77, 0x86, 0x24, 0xcb, 0x3b, 0xb0, 0x2e, 0xe5, 0x6d, 0x6b, 0x71, 0xdb, 0xa9, + 0xb4, 0x56, 0x05, 0x16, 0x23, 0x7a, 0xd1, 0x0b, 0xa9, 0x6b, 0xfe, 0x08, 0x6e, 0x5d, 0x92, 0x2f, + 0xa2, 0x08, 0x95, 0x3d, 0xfd, 0x22, 0x94, 0xe7, 0xb6, 0x6b, 0x3e, 0xc8, 0x52, 0x35, 0x53, 0x37, + 0x89, 0xfc, 0xe7, 0x70, 0xfb, 0x52, 0xef, 0x93, 0xef, 0xc0, 0x92, 0x8c, 0xa5, 0x8b, 0xdd, 0x18, + 0x55, 0x82, 0x1b, 0x16, 0x08, 0xd0, 0x8e, 0x84, 0x98, 0x7b, 0x99, 0x89, 0xc3, 0xae, 0x24, 0x1f, + 0x02, 0xc9, 0xc7, 0xc7, 0x76, 0xc2, 0x24, 0xe0, 0x52, 0xc4, 0xbc, 0xb5, 0x9a, 0x73, 0xf2, 0x13, + 0x01, 0x37, 0xff, 0x6a, 0x40, 0x6d, 0xb0, 0x5b, 0x0d, 0x75, 0x38, 0x63, 0xa8, 0xc3, 0x91, 0x8f, + 0xa1, 0x24, 0x7b, 0x82, 0x68, 0x33, 0xc5, 0xf5, 0xa5, 0xad, 0xf5, 0x69, 0xab, 0xdc, 0xd2, 0x7c, + 0xe4, 0x18, 0x56, 0xb2, 0x02, 0x4e, 0x7c, 0x9f, 0xc6, 0x17, 0xba, 0x18, 0xee, 0x4f, 0x12, 0x95, + 0xc6, 0x42, 0x71, 0x58, 0xb5, 0x78, 0xe0, 0x6c, 0xfe, 0xc5, 0x18, 0xdb, 0x79, 0x45, 0x3b, 0xd7, + 0x23, 0xa5, 0x6f, 0xb8, 0xf1, 0xdf, 0x33, 0xbc, 0x70, 0x6d, 0xc3, 0xbf, 0x80, 0x77, 0x2e, 0x9b, + 0x18, 0xda, 0xf0, 0x7d, 0xa8, 0x9c, 0x49, 0xb8, 0x87, 0xa9, 0xed, 0xd3, 0x28, 0x4c, 0x73, 0xb8, + 0xcf, 0x6c, 0xfe, 0xc9, 0x80, 0xb7, 0xf7, 0x90, 0xeb, 0x9c, 0x51, 0x33, 0xf1, 0xba, 0x23, 0x4f, + 0x3c, 0x26, 0x74, 0x5a, 0xb1, 0x46, 0xf1, 0x5e, 0x51, 0x3c, 0x26, 0xd2, 0x33, 0x79, 0x1b, 0x2a, + 0x11, 0xed, 0xa2, 0xcd, 0xbc, 0x2f, 0xd5, 0x4b, 0x63, 0xc1, 0x2a, 0x0b, 0xc0, 0xb1, 0xf7, 0xa5, + 0x94, 0x2b, 0x91, 0x3c, 0x7c, 0x85, 0xe9, 0x40, 0x91, 0xe4, 0x2f, 0x05, 0xc0, 0xfc, 0xb3, 0x21, + 0x07, 0xf4, 0x90, 0xb1, 0x57, 0x8e, 0xd2, 0xbb, 0x00, 0xce, 0x19, 0x0d, 0xba, 0x68, 0xf7, 0x27, + 0x6a, 0x45, 0x41, 0x4e, 0x62, 0xef, 0x1b, 0xb3, 0xb6, 0x03, 0x6f, 0x69, 0x4b, 0xfb, 0xf5, 0x2c, + 0x9e, 0x70, 0x5a, 0x78, 0x5a, 0xfe, 0xfa, 0x48, 0x3e, 0x80, 0x95, 0x4e, 0x8c, 0xf4, 0x95, 0x90, + 0xa8, 0xab, 0x5c, 0x98, 0x6a, 0xc8, 0xd1, 0xa1, 0x11, 0xaa, 0xd6, 0x5b, 0x65, 0x28, 0xc5, 0xc8, + 0x92, 0x1e, 0x37, 0xff, 0x5e, 0x1c, 0xe7, 0x91, 0x5c, 0x8a, 0x5f, 0x51, 0xba, 0x99, 0xc3, 0x0a, + 0x97, 0x3b, 0xac, 0x38, 0xec, 0x30, 0xd1, 0xc3, 0x28, 0x53, 0xc8, 0x79, 0xdd, 0xc3, 0x28, 0x93, + 0xa8, 0x77, 0x87, 0x27, 0xb1, 0xf2, 0xca, 0xe0, 0x48, 0x35, 0x61, 0x39, 0x89, 0x5c, 0xca, 0xd1, + 0xb5, 0x29, 0x17, 0xaf, 0x13, 0x50, 0xaf, 0x13, 0x0d, 0xdc, 0xe6, 0x07, 0x8c, 0xfc, 0x02, 0x9a, + 0x31, 0x46, 0x21, 0xf3, 0x44, 0xc2, 0xda, 0xc3, 0x8e, 0x29, 0x69, 0xc7, 0x34, 0xfa, 0x34, 0xad, + 0x01, 0x17, 0x91, 0x47, 0xd0, 0x48, 0x7b, 0x9e, 0x72, 0x15, 0xb3, 0x9d, 0xd0, 0x8f, 0x7a, 0xc8, + 0xb1, 0xb1, 0x78, 0xcf, 0x58, 0x2f, 0x5b, 0xe9, 0xcc, 0xb2, 0x14, 0xfa, 0x89, 0xc6, 0x92, 0x76, + 0x2e, 0x1d, 0xca, 0xb2, 0xb4, 0x1e, 0x4c, 0x2a, 0xad, 0x91, 0x10, 0xe7, 0xb2, 0xe7, 0xfb, 0xb0, + 0x12, 0xe0, 0xaf, 0xb9, 0x9d, 0xcb, 0x92, 0x8a, 0x7a, 0x24, 0x09, 0xf0, 0x51, 0x9a, 0x29, 0xad, + 0x1b, 0xf0, 0x56, 0xee, 0xb2, 0x3a, 0xb4, 0xff, 0x28, 0xca, 0xf6, 0x35, 0x2e, 0xd9, 0xbf, 0x8d, + 0xed, 0xff, 0x79, 0x6c, 0xbf, 0x2e, 0x64, 0x33, 0x56, 0x37, 0xfd, 0xff, 0xc9, 0x60, 0x3e, 0x80, + 0x1b, 0x12, 0x69, 0x0f, 0x86, 0xb4, 0x24, 0x43, 0xba, 0x2a, 0x51, 0x27, 0xb9, 0xb8, 0x7e, 0x0f, + 0x6a, 0xd4, 0x71, 0x30, 0xea, 0x53, 0x2e, 0x4a, 0xca, 0x6a, 0x0a, 0x95, 0x54, 0xa3, 0x8b, 0x43, + 0x79, 0xdc, 0xe2, 0xf0, 0x2e, 0x2c, 0xa7, 0x41, 0x56, 0xef, 0x95, 0x8a, 0xec, 0xbe, 0x55, 0x0d, + 0x94, 0x6f, 0x15, 0xf2, 0x43, 0x58, 0xeb, 0xc4, 0xc2, 0xcd, 0xf6, 0x20, 0x2d, 0x48, 0x5a, 0xa2, + 0x70, 0x47, 0x39, 0x0e, 0xf3, 0x6b, 0x03, 0x96, 0x9e, 0x79, 0x57, 0xad, 0xb2, 0x3f, 0x81, 0x5b, + 0xf9, 0x9b, 0x84, 0xb1, 0x4d, 0x4f, 0x39, 0xc6, 0xd9, 0x26, 0xb5, 0x3f, 0x67, 0xdd, 0xe8, 0x5f, + 0xea, 0x79, 0xbc, 0x2d, 0xb0, 0x07, 0x8c, 0x6c, 0x00, 0xc9, 0xf8, 0x3a, 0x78, 0x1a, 0xc6, 0x28, + 0x58, 0xe4, 0xb2, 0xbd, 0x6f, 0x58, 0xab, 0x29, 0xae, 0x25, 0x51, 0x07, 0xd7, 0x1a, 0x2f, 0xad, + 0x3a, 0xac, 0x65, 0xba, 0x7a, 0xe1, 0xaf, 0x30, 0xb6, 0x3b, 0x61, 0x12, 0xb8, 0x03, 0xf0, 0x24, + 0x8a, 0x52, 0xb8, 0xf9, 0x1b, 0xa8, 0xaa, 0x8b, 0xeb, 0xee, 0xf1, 0x14, 0xca, 0x3a, 0xd8, 0xb3, + 0x3c, 0x21, 0xd2, 0x37, 0x4b, 0xc6, 0x3b, 0xae, 0x10, 0x0a, 0x63, 0x0a, 0xc1, 0x7c, 0x06, 0x37, + 0xf7, 0x90, 0xcb, 0x25, 0x5c, 0xaf, 0xde, 0xd7, 0x18, 0xda, 0xe6, 0xdf, 0x0c, 0xb8, 0x39, 0x76, + 0xa1, 0x17, 0x13, 0xf6, 0x1c, 0x63, 0xe6, 0x85, 0x81, 0x14, 0x58, 0xb4, 0xd2, 0x23, 0xd9, 0x86, + 0x05, 0x95, 0xeb, 0x6f, 0xf0, 0x6d, 0x42, 0x71, 0x92, 0xc7, 0x70, 0x1b, 0x4f, 0x4f, 0xd1, 0xe1, + 0xde, 0x39, 0xda, 0xa7, 0x71, 0xe8, 0x8b, 0xce, 0xe3, 0x7b, 0x3c, 0x57, 0x7f, 0xf5, 0x8c, 0xe0, + 0x69, 0x1c, 0xfa, 0x4f, 0x24, 0x5a, 0x54, 0x9c, 0x09, 0xcb, 0xca, 0xfc, 0xb4, 0x38, 0xe6, 0x55, + 0x67, 0xd4, 0x40, 0x51, 0x1b, 0xe6, 0x6f, 0x0d, 0xa8, 0x0f, 0x3b, 0x49, 0x87, 0x6b, 0xbc, 0x97, + 0xbe, 0x81, 0x8f, 0x20, 0xff, 0x32, 0xa0, 0xda, 0x66, 0x2c, 0xc1, 0xb4, 0x33, 0xdd, 0x82, 0x45, + 0x4e, 0xd9, 0xab, 0x7e, 0x5b, 0x2a, 0x89, 0x63, 0xdb, 0x15, 0x88, 0x24, 0xf0, 0x72, 0x4f, 0xc0, + 0x92, 0x38, 0xb6, 0x5d, 0x52, 0x87, 0x12, 0x93, 0x82, 0xb5, 0x4b, 0xf4, 0x49, 0xf4, 0x93, 0x53, + 0x2f, 0x16, 0x2d, 0x07, 0x31, 0xb0, 0xb3, 0x3d, 0x48, 0xb5, 0xa6, 0x55, 0x89, 0x3a, 0x46, 0x0c, + 0x5a, 0x6a, 0x21, 0x1a, 0x6a, 0x89, 0x0b, 0xc3, 0x2d, 0x31, 0xbf, 0x4a, 0x95, 0x06, 0x56, 0xa9, + 0x51, 0x5f, 0x2f, 0x8e, 0xfa, 0xda, 0x83, 0x9b, 0xa2, 0x1e, 0x9e, 0x47, 0x18, 0xc8, 0xeb, 0x5e, + 0x91, 0x8f, 0x03, 0xa5, 0x5a, 0x98, 0x58, 0xaa, 0xc5, 0xe1, 0x97, 0xe0, 0x57, 0x06, 0xd4, 0x87, + 0x75, 0xf5, 0x57, 0x10, 0x4f, 0x42, 0xa6, 0x59, 0x41, 0xf2, 0x61, 0xb1, 0x34, 0xdf, 0xb4, 0xf5, + 0x77, 0xbf, 0x07, 0x2b, 0x43, 0xc1, 0x27, 0x77, 0xa0, 0xf1, 0xe2, 0x64, 0xf7, 0x64, 0xd7, 0xde, + 0x3d, 0xdc, 0x6e, 0x3d, 0xdb, 0x3d, 0xd8, 0x3d, 0x7c, 0x69, 0x9f, 0x1c, 0x7e, 0x72, 0xf8, 0xfc, + 0xd3, 0xc3, 0xd5, 0xb9, 0xb1, 0x58, 0xf5, 0x73, 0x67, 0xd5, 0x20, 0x77, 0xe1, 0xf6, 0x08, 0x76, + 0xa7, 0x7d, 0xac, 0xd0, 0x85, 0xad, 0x7f, 0x96, 0xa1, 0x72, 0x9c, 0x1a, 0x4e, 0x3e, 0x87, 0xf9, + 0x23, 0x2f, 0xe8, 0x92, 0xf7, 0x27, 0x4e, 0xdb, 0xfe, 0x47, 0xd1, 0xe6, 0xfa, 0xd5, 0x84, 0xca, + 0x81, 0xe6, 0x1c, 0xa1, 0x50, 0x52, 0x9f, 0x0a, 0xc9, 0x07, 0x13, 0x9d, 0x97, 0xff, 0x84, 0xd9, + 0xbc, 0x3f, 0x0d, 0x69, 0xa6, 0xe2, 0x0f, 0x86, 0x6c, 0x5e, 0xa3, 0xab, 0x24, 0x79, 0x34, 0x49, + 0xce, 0xa4, 0x8f, 0x89, 0xcd, 0xc7, 0x6f, 0xc0, 0x99, 0x19, 0xf4, 0x47, 0xd5, 0x28, 0xc6, 0xec, + 0x88, 0x64, 0x56, 0xb9, 0xfd, 0xf5, 0xa9, 0xf9, 0xb3, 0x37, 0x61, 0xcd, 0x6c, 0xfa, 0xbd, 0x01, + 0x6b, 0xe3, 0x76, 0x11, 0xf2, 0xd3, 0x2b, 0xc4, 0x5e, 0xb6, 0x7c, 0x36, 0x1f, 0xcd, 0xce, 0x38, + 0x1c, 0xb2, 0xd1, 0xe7, 0x33, 0x99, 0x51, 0x6a, 0xce, 0x3f, 0x8f, 0xdf, 0x80, 0x33, 0x33, 0xe8, + 0x73, 0x98, 0x17, 0x3d, 0x60, 0x72, 0x0d, 0xe4, 0x9e, 0x26, 0x93, 0x6b, 0x20, 0x3f, 0xca, 0xcd, + 0x39, 0x72, 0x01, 0xb5, 0xc1, 0xb9, 0x41, 0x1e, 0x5e, 0x61, 0xeb, 0xe8, 0x20, 0x6e, 0x6e, 0xcd, + 0xc2, 0x92, 0x57, 0x3d, 0xd8, 0xdb, 0x26, 0xab, 0x1e, 0xdb, 0x73, 0x27, 0xab, 0x1e, 0xdf, 0x3a, + 0xcd, 0xb9, 0x16, 0xc2, 0x3b, 0x4e, 0xe8, 0x4f, 0x60, 0x6d, 0xd5, 0xb2, 0x1e, 0x74, 0x14, 0x87, + 0x3c, 0x3c, 0x32, 0x3e, 0x7b, 0xd8, 0xf5, 0xf8, 0x59, 0xd2, 0xd9, 0x70, 0x42, 0x7f, 0x53, 0x30, + 0x6e, 0xe6, 0x18, 0x37, 0x69, 0xe4, 0x6d, 0x66, 0xcc, 0x9b, 0xf2, 0xaf, 0x9c, 0xa8, 0xd3, 0x29, + 0xc9, 0x1f, 0x1f, 0xfd, 0x27, 0x00, 0x00, 0xff, 0xff, 0x9b, 0x2a, 0xb4, 0x32, 0xe6, 0x19, 0x00, + 0x00, }, } diff --git a/doc/rfc/stovepipe/request-history-api.md b/doc/rfc/stovepipe/request-history-api.md index 9d9632eaf..2ee31359d 100644 --- a/doc/rfc/stovepipe/request-history-api.md +++ b/doc/rfc/stovepipe/request-history-api.md @@ -26,6 +26,23 @@ The append-only history model is defined by [Stovepipe Request Log](request-log. Events are returned by `(timestamp_ms ASC, event_id ASC)`. URI histories are ordered by numeric request ID ascending. Timestamps determine display order; persisted request versions determine causal ordering internally and are not exposed as history-event fields. Later repair may insert an older occurrence into its chronological position. +### Retained Event Data + +`HistoryEvent.data` contains a typed `payload` oneof matching the containing request-state or event occurrence. It reads only metadata retained on that occurrence; it never fills historical context from the current Request, Build, or summary. The internal metadata map remains private. + +| Occurrence | Payload | Retained fields | +|---|---|---| +| Request-state transition with a retained build ID | `request_state` | `build_id` | +| `build_triggered` | `build_triggered` | `build_id` | +| `build_finished` | `build_finished` | `build_id` | +| `build_analysis_abandoned` | `build_analysis_abandoned` | `build_id` | +| `validation_fact_recorded` | `validation_fact_recorded` | `fact_degree`, a breakage degree in [0, 1] | +| `project_facts_recorded` | `project_facts_recorded` | `project_fact_count`, an unsigned count | + +Build IDs are ordinary strings, with empty meaning unavailable. Baseline metadata is not exposed in event data. Numeric payload presence distinguishes a recorded zero from unavailable metadata. The project-fact count uses protobuf `uint64` (a decimal string in JSON) to preserve precision across clients. + +Missing metadata, malformed or out-of-range numbers, empty build IDs, and unsupported event metadata omit the corresponding payload without failing the history lookup. Clients tolerate absent data and unknown future payload kinds. Existing event fields and field numbers remain unchanged. + ## Retention and Errors History, request-summary, and request-URI mapping retention must support the same advertised lookup period. Neither endpoint promises a lifetime longer than the records required by its selector. @@ -41,7 +58,7 @@ Authorization follows the same queue policy as other Stovepipe reads. Possession ## Testing -Tests cover matching events and summaries across selectors, required summaries and retryable materialization gaps, current summaries independent of retained event subsets, queue and URI consistency, storage-read failures, histories absent despite a stored summary, stable event ordering, and unknown future state and outcome-reason strings. +Tests cover matching events and summaries across selectors, required summaries and retryable materialization gaps, current summaries independent of retained event subsets, queue and URI consistency, storage-read failures, histories absent despite a stored summary, stable event ordering, and unknown future state and outcome-reason strings. Metadata tests cover typed payloads, absent or malformed values, known zeros, omitted baseline and private keys, and binary/JSON round trips. ## Alternatives Considered diff --git a/doc/rfc/stovepipe/request-log.md b/doc/rfc/stovepipe/request-log.md index 979cc17f6..18259cb39 100644 --- a/doc/rfc/stovepipe/request-log.md +++ b/doc/rfc/stovepipe/request-log.md @@ -102,9 +102,9 @@ Enums are strings with unknown sentinels, and the entity has no storage or trans The core column shape follows SubmitQueue's `RequestLog`, except Stovepipe omits SubmitQueue's redundant `Type` column. Context that is meaningful only for one occurrence kind remains in the JSON metadata map instead of adding sparse columns. -Metadata is never used for occurrence identity, filtering, or control flow. Nil and empty maps are equivalent. The initial entity and storage contract treats the map as opaque JSON; writer and projection work may later define and enforce keys such as `superseded_by_request_id`, `build_id`, and `fact_degree`. Producers must not store credentials, raw dependency errors, stack traces, or unbounded payloads. The initial public history API does not expose the raw map. +Metadata is never used for occurrence identity or filtering. Nil and empty maps are equivalent. Storage treats the map as opaque JSON; writers and projections define the bounded `base_uri`, `build_id`, `fact_degree`, and `project_fact_count` keys. Producers must not store credentials, raw dependency errors, stack traces, or unbounded payloads. The public history API exposes supported keys through typed occurrence payloads, never the raw map; the [API contract](request-history-api.md#retained-event-data) defines their presence semantics. -Immutable Request context such as URI, build strategy, base URI, and terminal build id remains on `Request` and is resolved there rather than copied into log records or history responses. Build status and version remain on `Build`; the triggered and finished event kinds plus the terminal Request state describe the lifecycle without duplicating Build snapshots. When a build established the terminal state, that state entry records its id as occurrence context. Diagnostic error codes remain in structured logs until a concrete public vocabulary is required. +State entries retain the selected baseline URI when known, including an empty URI for a full build; this metadata feeds the summary projection and is not exposed in event payloads. When a build established the terminal state, that state entry records its ID as occurrence context. Other Request context and Build status/version remain on their operational entities; history does not load them to enrich old occurrences. The triggered and finished event kinds plus the terminal Request state describe the lifecycle without duplicating Build snapshots. Diagnostic error codes remain in structured logs until a concrete public vocabulary is required. ## Vocabularies diff --git a/service/stovepipe/server/mapper/BUILD.bazel b/service/stovepipe/server/mapper/BUILD.bazel index 8a3a49632..9b2d7cb0b 100644 --- a/service/stovepipe/server/mapper/BUILD.bazel +++ b/service/stovepipe/server/mapper/BUILD.bazel @@ -14,6 +14,7 @@ go_library( visibility = ["//visibility:public"], deps = [ "//api/stovepipe/protopb:go_default_library", + "//stovepipe/core/requestlog:go_default_library", "//stovepipe/entity:go_default_library", ], ) @@ -34,5 +35,7 @@ go_test( "//stovepipe/entity:go_default_library", "@com_github_stretchr_testify//assert:go_default_library", "@com_github_stretchr_testify//require:go_default_library", + "@org_golang_google_protobuf//encoding/protojson:go_default_library", + "@org_golang_google_protobuf//proto:go_default_library", ], ) diff --git a/service/stovepipe/server/mapper/request_history.go b/service/stovepipe/server/mapper/request_history.go index 4e421b182..15115101a 100644 --- a/service/stovepipe/server/mapper/request_history.go +++ b/service/stovepipe/server/mapper/request_history.go @@ -15,7 +15,11 @@ package mapper import ( + "math" + "strconv" + pb "github.com/uber/submitqueue/api/stovepipe/protopb" + "github.com/uber/submitqueue/stovepipe/core/requestlog" "github.com/uber/submitqueue/stovepipe/entity" ) @@ -45,6 +49,7 @@ func HistoryEventsToProto(logs []entity.RequestLog) []*pb.HistoryEvent { EventId: log.ID, TimestampMs: log.TimestampMs, OutcomeReason: string(log.OutcomeReason), + Data: historyEventDataToProto(log), } if log.State != entity.RequestStateUnknown { event.Occurrence = &pb.HistoryEvent_RequestState{RequestState: string(log.State)} @@ -68,3 +73,52 @@ func RequestHistoriesToProto(histories []entity.RequestHistory) []*pb.RequestHis } return result } + +func historyEventDataToProto(log entity.RequestLog) *pb.HistoryEventData { + if log.State != entity.RequestStateUnknown { + buildID := log.Metadata[requestlog.MetadataKeyBuildID] + if buildID == "" { + return nil + } + return &pb.HistoryEventData{Payload: &pb.HistoryEventData_RequestState{ + RequestState: &pb.HistoryRequestStateData{BuildId: buildID}, + }} + } + + switch log.Event { + case entity.RequestEventBuildTriggered, entity.RequestEventBuildFinished, entity.RequestEventBuildAnalysisAbandoned: + buildID := log.Metadata[requestlog.MetadataKeyBuildID] + if buildID == "" { + return nil + } + build := &pb.HistoryBuildData{BuildId: buildID} + data := &pb.HistoryEventData{} + switch log.Event { + case entity.RequestEventBuildTriggered: + data.Payload = &pb.HistoryEventData_BuildTriggered{BuildTriggered: build} + case entity.RequestEventBuildFinished: + data.Payload = &pb.HistoryEventData_BuildFinished{BuildFinished: build} + case entity.RequestEventBuildAnalysisAbandoned: + data.Payload = &pb.HistoryEventData_BuildAnalysisAbandoned{BuildAnalysisAbandoned: build} + } + return data + case entity.RequestEventValidationFactRecorded: + degree, err := strconv.ParseFloat(log.Metadata[requestlog.MetadataKeyFactDegree], 64) + if err != nil || math.IsNaN(degree) || degree < entity.DegreeGreen || degree > entity.DegreeBroken { + return nil + } + return &pb.HistoryEventData{Payload: &pb.HistoryEventData_ValidationFactRecorded{ + ValidationFactRecorded: &pb.HistoryValidationFactData{FactDegree: degree}, + }} + case entity.RequestEventProjectFactsRecorded: + count, err := strconv.ParseUint(log.Metadata[requestlog.MetadataKeyProjectFactCount], 10, 64) + if err != nil { + return nil + } + return &pb.HistoryEventData{Payload: &pb.HistoryEventData_ProjectFactsRecorded{ + ProjectFactsRecorded: &pb.HistoryProjectFactsData{ProjectFactCount: count}, + }} + default: + return nil + } +} diff --git a/service/stovepipe/server/mapper/request_history_test.go b/service/stovepipe/server/mapper/request_history_test.go index d278d05b1..5016b97c1 100644 --- a/service/stovepipe/server/mapper/request_history_test.go +++ b/service/stovepipe/server/mapper/request_history_test.go @@ -15,9 +15,14 @@ package mapper import ( + "maps" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" + pb "github.com/uber/submitqueue/api/stovepipe/protopb" "github.com/uber/submitqueue/stovepipe/entity" ) @@ -174,6 +179,151 @@ func TestRequestHistoriesToProto(t *testing.T) { } } +func TestHistoryMetadataToProto(t *testing.T) { + tests := []struct { + name string + state entity.RequestState + event entity.RequestEvent + metadata map[string]string + wantData string + }{ + { + name: "state retains terminal build without other metadata", + state: entity.RequestStateSucceeded, + metadata: map[string]string{"base_uri": "git://repo/base", "build_id": "build/1", "private": "hidden"}, + wantData: `{"requestState":{"buildId":"build/1"}}`, + }, + { + name: "failed state retains terminal build", + state: entity.RequestStateFailed, + metadata: map[string]string{"build_id": "build/1"}, + wantData: `{"requestState":{"buildId":"build/1"}}`, + }, + { + name: "triggered build", + event: entity.RequestEventBuildTriggered, + metadata: map[string]string{"build_id": "build/1", "base_uri": "not state context"}, + wantData: `{"buildTriggered":{"buildId":"build/1"}}`, + }, + { + name: "finished build", + event: entity.RequestEventBuildFinished, + metadata: map[string]string{"build_id": "build/1"}, + wantData: `{"buildFinished":{"buildId":"build/1"}}`, + }, + { + name: "abandoned build analysis", + event: entity.RequestEventBuildAnalysisAbandoned, + metadata: map[string]string{"build_id": "build/1"}, + wantData: `{"buildAnalysisAbandoned":{"buildId":"build/1"}}`, + }, + { + name: "green validation degree is known zero", + event: entity.RequestEventValidationFactRecorded, + metadata: map[string]string{"fact_degree": "0"}, + wantData: `{"validationFactRecorded":{}}`, + }, + { + name: "partial validation degree", + event: entity.RequestEventValidationFactRecorded, + metadata: map[string]string{"fact_degree": "0.5"}, + wantData: `{"validationFactRecorded":{"factDegree":0.5}}`, + }, + { + name: "broken validation degree", + event: entity.RequestEventValidationFactRecorded, + metadata: map[string]string{"fact_degree": "1"}, + wantData: `{"validationFactRecorded":{"factDegree":1}}`, + }, + { + name: "empty project fact batch is known zero", + event: entity.RequestEventProjectFactsRecorded, + metadata: map[string]string{"project_fact_count": "0"}, + wantData: `{"projectFactsRecorded":{}}`, + }, + { + name: "project fact count", + event: entity.RequestEventProjectFactsRecorded, + metadata: map[string]string{"project_fact_count": "42"}, + wantData: `{"projectFactsRecorded":{"projectFactCount":"42"}}`, + }, + { + name: "large project fact count preserves precision", + event: entity.RequestEventProjectFactsRecorded, + metadata: map[string]string{"project_fact_count": "9007199254740993"}, + wantData: `{"projectFactsRecorded":{"projectFactCount":"9007199254740993"}}`, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + metadataBefore := maps.Clone(tt.metadata) + history := entity.RequestHistory{RequestID: "1", Events: []entity.RequestLog{{ + ID: "occurrence", State: tt.state, Event: tt.event, Metadata: tt.metadata, + }}} + byID := RequestHistoryByIDToProto(history).Events[0] + byURI := RequestHistoriesToProto([]entity.RequestHistory{history})[0].Events[0] + require.NotNil(t, byID.Data) + assert.True(t, proto.Equal(byID, byURI)) + assert.Equal(t, metadataBefore, tt.metadata) + + jsonData, err := protojson.Marshal(byID.Data) + require.NoError(t, err) + assert.JSONEq(t, tt.wantData, string(jsonData)) + + encoded, err := proto.Marshal(byID) + require.NoError(t, err) + var decoded pb.HistoryEvent + require.NoError(t, proto.Unmarshal(encoded, &decoded)) + assert.True(t, proto.Equal(byID, &decoded)) + + jsonEvent, err := protojson.Marshal(byID) + require.NoError(t, err) + var decodedJSON pb.HistoryEvent + require.NoError(t, protojson.Unmarshal(jsonEvent, &decodedJSON)) + assert.True(t, proto.Equal(byID, &decodedJSON)) + }) + } +} + +func TestHistoryMetadataUnavailable(t *testing.T) { + type testCase struct { + name string + log entity.RequestLog + } + tests := []testCase{ + {name: "state without metadata", log: entity.RequestLog{State: entity.RequestStateAccepted}}, + {name: "state without recognized metadata", log: entity.RequestLog{State: entity.RequestStateFailed, Metadata: map[string]string{"private": "hidden", "build_id": ""}}}, + {name: "state with only baseline", log: entity.RequestLog{State: entity.RequestStateProcessing, Metadata: map[string]string{"base_uri": "git://repo/base"}}}, + {name: "state with only full build baseline", log: entity.RequestLog{State: entity.RequestStateProcessing, Metadata: map[string]string{"base_uri": ""}}}, + {name: "triggered build without metadata", log: entity.RequestLog{Event: entity.RequestEventBuildTriggered}}, + {name: "finished build with empty ID", log: entity.RequestLog{Event: entity.RequestEventBuildFinished, Metadata: map[string]string{"build_id": ""}}}, + {name: "abandoned analysis without metadata", log: entity.RequestLog{Event: entity.RequestEventBuildAnalysisAbandoned}}, + {name: "validation without degree", log: entity.RequestLog{Event: entity.RequestEventValidationFactRecorded}}, + {name: "project facts without count", log: entity.RequestLog{Event: entity.RequestEventProjectFactsRecorded}}, + {name: "metadata for another event", log: entity.RequestLog{Event: entity.RequestEventRecordAbandoned, Metadata: map[string]string{"build_id": "build/1", "fact_degree": "1", "project_fact_count": "2"}}}, + {name: "unknown event metadata", log: entity.RequestLog{Event: entity.RequestEvent("future_event"), Metadata: map[string]string{"build_id": "build/1"}}}, + } + for _, degree := range []string{"invalid", "NaN", "+Inf", "-Inf", "-0.1", "1.1"} { + tests = append(tests, testCase{name: "invalid degree " + degree, log: entity.RequestLog{ + Event: entity.RequestEventValidationFactRecorded, Metadata: map[string]string{"fact_degree": degree}, + }}) + } + for _, count := range []string{"invalid", "-1", "1.5", "18446744073709551616"} { + tests = append(tests, testCase{name: "invalid count " + count, log: entity.RequestLog{ + Event: entity.RequestEventProjectFactsRecorded, Metadata: map[string]string{"project_fact_count": count}, + }}) + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + event := HistoryEventsToProto([]entity.RequestLog{tt.log})[0] + assert.Nil(t, event.Data) + assert.Equal(t, string(tt.log.State), event.GetRequestState()) + assert.Equal(t, string(tt.log.Event), event.GetEvent()) + }) + } +} + func TestRequestHistorySummaryMapping(t *testing.T) { history := entity.RequestHistory{ RequestID: "7", Events: []entity.RequestLog{{ID: "accepted", State: entity.RequestStateAccepted}}, diff --git a/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts b/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts index 67277b820..6e423cddd 100644 --- a/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts +++ b/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts @@ -24,7 +24,7 @@ import type { Message } from "@bufbuild/protobuf"; * Describes the file api/stovepipe/proto/stovepipe.proto. */ export const file_api_stovepipe_proto_stovepipe: GenFile = /*@__PURE__*/ - fileDesc("CiNhcGkvc3RvdmVwaXBlL3Byb3RvL3N0b3ZlcGlwZS5wcm90bxIadWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUiHgoLUGluZ1JlcXVlc3QSDwoHbWVzc2FnZRgBIAEoCSJaCgxQaW5nUmVzcG9uc2USDwoHbWVzc2FnZRgBIAEoCRIUCgxzZXJ2aWNlX25hbWUYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDEhAKCGhvc3RuYW1lGAQgASgJIl8KDUluZ2VzdFJlcXVlc3QSDQoFcXVldWUYASABKAkSPwoKZW5hYmxlbWVudBgCIAEoDjIrLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlF1ZXVlRW5hYmxlbWVudCJjCg5Jbmdlc3RSZXNwb25zZRIKCgJpZBgBIAEoCRJFCgplbmFibGVtZW50GAIgASgLMjEudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUXVldWVFbmFibGVtZW50U3RhdHVzIkEKHEdldFJlcXVlc3RIaXN0b3J5QnlJRFJlcXVlc3QSDQoFcXVldWUYASABKAkSEgoKcmVxdWVzdF9pZBgCIAEoCSI7Ch1HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRILCgN1cmkYAiABKAkihgEKDEhpc3RvcnlFdmVudBIQCghldmVudF9pZBgBIAEoCRIUCgx0aW1lc3RhbXBfbXMYAiABKAMSFwoNcmVxdWVzdF9zdGF0ZRgDIAEoCUgAEg8KBWV2ZW50GAQgASgJSAASFgoOb3V0Y29tZV9yZWFzb24YBSABKAlCDAoKb2NjdXJyZW5jZSKjAQoOUmVxdWVzdEhpc3RvcnkSEgoKcmVxdWVzdF9pZBgBIAEoCRI4CgZldmVudHMYAiADKAsyKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5RXZlbnQSQwoPcmVxdWVzdF9zdW1tYXJ5GAMgASgLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdFN1bW1hcnkingEKHUdldFJlcXVlc3RIaXN0b3J5QnlJRFJlc3BvbnNlEjgKBmV2ZW50cxgBIAMoCzIoLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlFdmVudBJDCg9yZXF1ZXN0X3N1bW1hcnkYAiABKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeSJfCh5HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVzcG9uc2USPQoJaGlzdG9yaWVzGAEgAygLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdEhpc3RvcnkieQobR2V0UHJvamVjdFN0YXR1c0J5SURSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCnJlcXVlc3RfaWQYAiABKAkSEAoIcHJvamVjdHMYAyADKAkSEQoJcGFnZV9zaXplGAQgASgFEhIKCnBhZ2VfdG9rZW4YBSABKAkiegocR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpjaGFuZ2VfdXJpGAIgASgJEhAKCHByb2plY3RzGAMgAygJEhEKCXBhZ2Vfc2l6ZRgEIAEoBRISCgpwYWdlX3Rva2VuGAUgASgJIkkKEVByb2plY3RWYWxpZGF0aW9uEg8KB3Byb2plY3QYASABKAkSGQoPYnJlYWthZ2VfZGVncmVlGAIgASgBSABCCAoGcmVzdWx0IswCChxHZXRQcm9qZWN0U3RhdHVzQnlJRFJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhUKDXVwZGF0ZWRfYXRfbXMYCiABKAMSJAoacmVwb3NpdG9yeV9icmVha2FnZV9kZWdyZWUYBiABKAFIABIgChhwcm9qZWN0X3Jlc3VsdHNfY29tcGxldGUYByABKAgSPwoIcHJvamVjdHMYCCADKAsyLS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Qcm9qZWN0VmFsaWRhdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YCSABKAlCEwoRcmVwb3NpdG9yeV9yZXN1bHQizQIKHUdldFByb2plY3RTdGF0dXNCeVVSSVJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhUKDXVwZGF0ZWRfYXRfbXMYCiABKAMSJAoacmVwb3NpdG9yeV9icmVha2FnZV9kZWdyZWUYBiABKAFIABIgChhwcm9qZWN0X3Jlc3VsdHNfY29tcGxldGUYByABKAgSPwoIcHJvamVjdHMYCCADKAsyLS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Qcm9qZWN0VmFsaWRhdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YCSABKAlCEwoRcmVwb3NpdG9yeV9yZXN1bHQi8gEKDlJlcXVlc3RTdW1tYXJ5EhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhsKE3N0YXRlX3VwZGF0ZWRfYXRfbXMYBiABKAMSFgoOYWNjZXB0ZWRfYXRfbXMYByABKAMSFgoOb3V0Y29tZV9yZWFzb24YCCABKAkSFQoNcHJvamVjdF9jb3VudBgJIAEoBRIcChRicm9rZW5fcHJvamVjdF9jb3VudBgKIAEoBSK0AQoLTGlzdFJlcXVlc3QSDQoFcXVldWUYASABKAkSIQoXYWNjZXB0ZWRfYXRfb3JfYWZ0ZXJfbXMYAiABKANIABIcChJhY2NlcHRlZF9iZWZvcmVfbXMYAyABKANIARIRCglwYWdlX3NpemUYBCABKAUSEgoKcGFnZV90b2tlbhgFIAEoCUIWChRhY2NlcHRlZF9sb3dlcl9ib3VuZEIWChRhY2NlcHRlZF91cHBlcl9ib3VuZCJlCgxMaXN0UmVzcG9uc2USPAoIcmVxdWVzdHMYASADKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkiOgoVR2V0UXVldWVTdGF0dXNSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCmNoYW5nZV91cmkYAiABKAkingEKFVF1ZXVlRW5hYmxlbWVudFN0YXR1cxIPCgd2ZXJzaW9uGAEgASgDEjoKBXN0YXRlGAIgASgOMisudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUXVldWVFbmFibGVtZW50EiEKGWVmZmVjdGl2ZV9mcm9tX2NvbW1pdF91cmkYAyABKAkSFQoNY2hhbmdlZF9hdF9tcxgEIAEoAyJuChZHZXRRdWV1ZVN0YXR1c1Jlc3BvbnNlEg0KBXF1ZXVlGAEgASgJEkUKCmVuYWJsZW1lbnQYAiABKAsyMS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5RdWV1ZUVuYWJsZW1lbnRTdGF0dXMimgEKDElzc3VlU3VtbWFyeRIPCgd0YXNrX2lkGAEgASgJEg8KB3VuaXRfaWQYAiABKAkSDgoGc3RhdHVzGAMgASgJEhsKE2ZpcnN0X3NlZW5fYnVpbGRfaWQYBCABKAkSEgoKcmVxdWVzdF9pZBgFIAEoCRIQCghidWlsZF9pZBgGIAEoCRIVCg1jaGFuZ2VkX2F0X21zGAcgASgDIk0KFUxpc3RPcGVuSXNzdWVzUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRIRCglwYWdlX3NpemUYAiABKAUSEgoKcGFnZV90b2tlbhgDIAEoCSJrChZMaXN0T3Blbklzc3Vlc1Jlc3BvbnNlEjgKBmlzc3VlcxgBIAMoCzIoLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLklzc3VlU3VtbWFyeRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkqbAoPUXVldWVFbmFibGVtZW50EhwKGFFVRVVFX0VOQUJMRU1FTlRfVU5LTk9XThAAEhwKGFFVRVVFX0VOQUJMRU1FTlRfRU5BQkxFRBABEh0KGVFVRVVFX0VOQUJMRU1FTlRfRElTQUJMRUQQAjLiCAoJU3RvdmVwaXBlElsKBFBpbmcSJy51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5QaW5nUmVxdWVzdBooLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlBpbmdSZXNwb25zZSIAEmEKBkluZ2VzdBIpLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkluZ2VzdFJlcXVlc3QaKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Jbmdlc3RSZXNwb25zZSIAEo4BChVHZXRSZXF1ZXN0SGlzdG9yeUJ5SUQSOC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRSZXF1ZXN0SGlzdG9yeUJ5SURSZXF1ZXN0GjkudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVzcG9uc2UiABKRAQoWR2V0UmVxdWVzdEhpc3RvcnlCeVVSSRI5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXF1ZXN0GjoudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeVVSSVJlc3BvbnNlIgASiwEKFEdldFByb2plY3RTdGF0dXNCeUlEEjcudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5SURSZXF1ZXN0GjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5SURSZXNwb25zZSIAEo4BChVHZXRQcm9qZWN0U3RhdHVzQnlVUkkSOC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRQcm9qZWN0U3RhdHVzQnlVUklSZXF1ZXN0GjkudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVzcG9uc2UiABJbCgRMaXN0EicudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuTGlzdFJlcXVlc3QaKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5MaXN0UmVzcG9uc2UiABJ5Cg5HZXRRdWV1ZVN0YXR1cxIxLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFF1ZXVlU3RhdHVzUmVxdWVzdBoyLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFF1ZXVlU3RhdHVzUmVzcG9uc2UiABJ5Cg5MaXN0T3Blbklzc3VlcxIxLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkxpc3RPcGVuSXNzdWVzUmVxdWVzdBoyLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkxpc3RPcGVuSXNzdWVzUmVzcG9uc2UiAEJlCh5jb20udWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGVCDlN0b3ZlcGlwZVByb3RvUAFaMWdpdGh1Yi5jb20vdWJlci9zdWJtaXRxdWV1ZS9hcGkvc3RvdmVwaXBlL3Byb3RvcGJiBnByb3RvMw"); + fileDesc("CiNhcGkvc3RvdmVwaXBlL3Byb3RvL3N0b3ZlcGlwZS5wcm90bxIadWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUiHgoLUGluZ1JlcXVlc3QSDwoHbWVzc2FnZRgBIAEoCSJaCgxQaW5nUmVzcG9uc2USDwoHbWVzc2FnZRgBIAEoCRIUCgxzZXJ2aWNlX25hbWUYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDEhAKCGhvc3RuYW1lGAQgASgJIl8KDUluZ2VzdFJlcXVlc3QSDQoFcXVldWUYASABKAkSPwoKZW5hYmxlbWVudBgCIAEoDjIrLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlF1ZXVlRW5hYmxlbWVudCJjCg5Jbmdlc3RSZXNwb25zZRIKCgJpZBgBIAEoCRJFCgplbmFibGVtZW50GAIgASgLMjEudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUXVldWVFbmFibGVtZW50U3RhdHVzIkEKHEdldFJlcXVlc3RIaXN0b3J5QnlJRFJlcXVlc3QSDQoFcXVldWUYASABKAkSEgoKcmVxdWVzdF9pZBgCIAEoCSI7Ch1HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRILCgN1cmkYAiABKAkiwgEKDEhpc3RvcnlFdmVudBIQCghldmVudF9pZBgBIAEoCRIUCgx0aW1lc3RhbXBfbXMYAiABKAMSFwoNcmVxdWVzdF9zdGF0ZRgDIAEoCUgAEg8KBWV2ZW50GAQgASgJSAASFgoOb3V0Y29tZV9yZWFzb24YBSABKAkSOgoEZGF0YRgGIAEoCzIsLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlFdmVudERhdGFCDAoKb2NjdXJyZW5jZSKABAoQSGlzdG9yeUV2ZW50RGF0YRJMCg1yZXF1ZXN0X3N0YXRlGAEgASgLMjMudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSGlzdG9yeVJlcXVlc3RTdGF0ZURhdGFIABJHCg9idWlsZF90cmlnZ2VyZWQYAiABKAsyLC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5QnVpbGREYXRhSAASRgoOYnVpbGRfZmluaXNoZWQYAyABKAsyLC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5QnVpbGREYXRhSAASWQoYdmFsaWRhdGlvbl9mYWN0X3JlY29yZGVkGAQgASgLMjUudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSGlzdG9yeVZhbGlkYXRpb25GYWN0RGF0YUgAElUKFnByb2plY3RfZmFjdHNfcmVjb3JkZWQYBSABKAsyMy51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5UHJvamVjdEZhY3RzRGF0YUgAElAKGGJ1aWxkX2FuYWx5c2lzX2FiYW5kb25lZBgGIAEoCzIsLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlCdWlsZERhdGFIAEIJCgdwYXlsb2FkIisKF0hpc3RvcnlSZXF1ZXN0U3RhdGVEYXRhEhAKCGJ1aWxkX2lkGAEgASgJIiQKEEhpc3RvcnlCdWlsZERhdGESEAoIYnVpbGRfaWQYASABKAkiMAoZSGlzdG9yeVZhbGlkYXRpb25GYWN0RGF0YRITCgtmYWN0X2RlZ3JlZRgBIAEoASI1ChdIaXN0b3J5UHJvamVjdEZhY3RzRGF0YRIaChJwcm9qZWN0X2ZhY3RfY291bnQYASABKAQiowEKDlJlcXVlc3RIaXN0b3J5EhIKCnJlcXVlc3RfaWQYASABKAkSOAoGZXZlbnRzGAIgAygLMigudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSGlzdG9yeUV2ZW50EkMKD3JlcXVlc3Rfc3VtbWFyeRgDIAEoCzIqLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlJlcXVlc3RTdW1tYXJ5Ip4BCh1HZXRSZXF1ZXN0SGlzdG9yeUJ5SURSZXNwb25zZRI4CgZldmVudHMYASADKAsyKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5RXZlbnQSQwoPcmVxdWVzdF9zdW1tYXJ5GAIgASgLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdFN1bW1hcnkiXwoeR2V0UmVxdWVzdEhpc3RvcnlCeVVSSVJlc3BvbnNlEj0KCWhpc3RvcmllcxgBIAMoCzIqLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlJlcXVlc3RIaXN0b3J5InkKG0dldFByb2plY3RTdGF0dXNCeUlEUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpyZXF1ZXN0X2lkGAIgASgJEhAKCHByb2plY3RzGAMgAygJEhEKCXBhZ2Vfc2l6ZRgEIAEoBRISCgpwYWdlX3Rva2VuGAUgASgJInoKHEdldFByb2plY3RTdGF0dXNCeVVSSVJlcXVlc3QSDQoFcXVldWUYASABKAkSEgoKY2hhbmdlX3VyaRgCIAEoCRIQCghwcm9qZWN0cxgDIAMoCRIRCglwYWdlX3NpemUYBCABKAUSEgoKcGFnZV90b2tlbhgFIAEoCSJJChFQcm9qZWN0VmFsaWRhdGlvbhIPCgdwcm9qZWN0GAEgASgJEhkKD2JyZWFrYWdlX2RlZ3JlZRgCIAEoAUgAQggKBnJlc3VsdCLMAgocR2V0UHJvamVjdFN0YXR1c0J5SURSZXNwb25zZRISCgpyZXF1ZXN0X2lkGAEgASgJEg0KBXF1ZXVlGAIgASgJEhIKCmNoYW5nZV91cmkYAyABKAkSEAoIYmFzZV91cmkYBCABKAkSFQoNcmVxdWVzdF9zdGF0ZRgFIAEoCRIVCg11cGRhdGVkX2F0X21zGAogASgDEiQKGnJlcG9zaXRvcnlfYnJlYWthZ2VfZGVncmVlGAYgASgBSAASIAoYcHJvamVjdF9yZXN1bHRzX2NvbXBsZXRlGAcgASgIEj8KCHByb2plY3RzGAggAygLMi0udWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUHJvamVjdFZhbGlkYXRpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAkgASgJQhMKEXJlcG9zaXRvcnlfcmVzdWx0Is0CCh1HZXRQcm9qZWN0U3RhdHVzQnlVUklSZXNwb25zZRISCgpyZXF1ZXN0X2lkGAEgASgJEg0KBXF1ZXVlGAIgASgJEhIKCmNoYW5nZV91cmkYAyABKAkSEAoIYmFzZV91cmkYBCABKAkSFQoNcmVxdWVzdF9zdGF0ZRgFIAEoCRIVCg11cGRhdGVkX2F0X21zGAogASgDEiQKGnJlcG9zaXRvcnlfYnJlYWthZ2VfZGVncmVlGAYgASgBSAASIAoYcHJvamVjdF9yZXN1bHRzX2NvbXBsZXRlGAcgASgIEj8KCHByb2plY3RzGAggAygLMi0udWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUHJvamVjdFZhbGlkYXRpb24SFwoPbmV4dF9wYWdlX3Rva2VuGAkgASgJQhMKEXJlcG9zaXRvcnlfcmVzdWx0IvIBCg5SZXF1ZXN0U3VtbWFyeRISCgpyZXF1ZXN0X2lkGAEgASgJEg0KBXF1ZXVlGAIgASgJEhIKCmNoYW5nZV91cmkYAyABKAkSEAoIYmFzZV91cmkYBCABKAkSFQoNcmVxdWVzdF9zdGF0ZRgFIAEoCRIbChNzdGF0ZV91cGRhdGVkX2F0X21zGAYgASgDEhYKDmFjY2VwdGVkX2F0X21zGAcgASgDEhYKDm91dGNvbWVfcmVhc29uGAggASgJEhUKDXByb2plY3RfY291bnQYCSABKAUSHAoUYnJva2VuX3Byb2plY3RfY291bnQYCiABKAUitAEKC0xpc3RSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEiEKF2FjY2VwdGVkX2F0X29yX2FmdGVyX21zGAIgASgDSAASHAoSYWNjZXB0ZWRfYmVmb3JlX21zGAMgASgDSAESEQoJcGFnZV9zaXplGAQgASgFEhIKCnBhZ2VfdG9rZW4YBSABKAlCFgoUYWNjZXB0ZWRfbG93ZXJfYm91bmRCFgoUYWNjZXB0ZWRfdXBwZXJfYm91bmQiZQoMTGlzdFJlc3BvbnNlEjwKCHJlcXVlc3RzGAEgAygLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdFN1bW1hcnkSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJIjoKFUdldFF1ZXVlU3RhdHVzUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpjaGFuZ2VfdXJpGAIgASgJIp4BChVRdWV1ZUVuYWJsZW1lbnRTdGF0dXMSDwoHdmVyc2lvbhgBIAEoAxI6CgVzdGF0ZRgCIAEoDjIrLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlF1ZXVlRW5hYmxlbWVudBIhChllZmZlY3RpdmVfZnJvbV9jb21taXRfdXJpGAMgASgJEhUKDWNoYW5nZWRfYXRfbXMYBCABKAMibgoWR2V0UXVldWVTdGF0dXNSZXNwb25zZRINCgVxdWV1ZRgBIAEoCRJFCgplbmFibGVtZW50GAIgASgLMjEudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUXVldWVFbmFibGVtZW50U3RhdHVzIpoBCgxJc3N1ZVN1bW1hcnkSDwoHdGFza19pZBgBIAEoCRIPCgd1bml0X2lkGAIgASgJEg4KBnN0YXR1cxgDIAEoCRIbChNmaXJzdF9zZWVuX2J1aWxkX2lkGAQgASgJEhIKCnJlcXVlc3RfaWQYBSABKAkSEAoIYnVpbGRfaWQYBiABKAkSFQoNY2hhbmdlZF9hdF9tcxgHIAEoAyJNChVMaXN0T3Blbklzc3Vlc1JlcXVlc3QSDQoFcXVldWUYASABKAkSEQoJcGFnZV9zaXplGAIgASgFEhIKCnBhZ2VfdG9rZW4YAyABKAkiawoWTGlzdE9wZW5Jc3N1ZXNSZXNwb25zZRI4CgZpc3N1ZXMYASADKAsyKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Jc3N1ZVN1bW1hcnkSFwoPbmV4dF9wYWdlX3Rva2VuGAIgASgJKmwKD1F1ZXVlRW5hYmxlbWVudBIcChhRVUVVRV9FTkFCTEVNRU5UX1VOS05PV04QABIcChhRVUVVRV9FTkFCTEVNRU5UX0VOQUJMRUQQARIdChlRVUVVRV9FTkFCTEVNRU5UX0RJU0FCTEVEEAIy4ggKCVN0b3ZlcGlwZRJbCgRQaW5nEicudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUGluZ1JlcXVlc3QaKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5QaW5nUmVzcG9uc2UiABJhCgZJbmdlc3QSKS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Jbmdlc3RSZXF1ZXN0GioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSW5nZXN0UmVzcG9uc2UiABKOAQoVR2V0UmVxdWVzdEhpc3RvcnlCeUlEEjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVxdWVzdBo5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlJRFJlc3BvbnNlIgASkQEKFkdldFJlcXVlc3RIaXN0b3J5QnlVUkkSOS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVxdWVzdBo6LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXNwb25zZSIAEosBChRHZXRQcm9qZWN0U3RhdHVzQnlJRBI3LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeUlEUmVxdWVzdBo4LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeUlEUmVzcG9uc2UiABKOAQoVR2V0UHJvamVjdFN0YXR1c0J5VVJJEjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVxdWVzdBo5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeVVSSVJlc3BvbnNlIgASWwoETGlzdBInLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkxpc3RSZXF1ZXN0GigudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuTGlzdFJlc3BvbnNlIgASeQoOR2V0UXVldWVTdGF0dXMSMS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRRdWV1ZVN0YXR1c1JlcXVlc3QaMi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRRdWV1ZVN0YXR1c1Jlc3BvbnNlIgASeQoOTGlzdE9wZW5Jc3N1ZXMSMS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5MaXN0T3Blbklzc3Vlc1JlcXVlc3QaMi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5MaXN0T3Blbklzc3Vlc1Jlc3BvbnNlIgBCZQoeY29tLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlQg5TdG92ZXBpcGVQcm90b1ABWjFnaXRodWIuY29tL3ViZXIvc3VibWl0cXVldWUvYXBpL3N0b3ZlcGlwZS9wcm90b3BiYgZwcm90bzM"); /** * PingRequest is the request for the Ping method @@ -253,6 +253,13 @@ export type HistoryEvent = Message<"uber.submitqueue.stovepipe.HistoryEvent"> & * @generated from field: string outcome_reason = 5; */ outcomeReason: string; + + /** + * Typed context retained with this occurrence. Absent when no supported metadata is available. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryEventData data = 6; + */ + data?: HistoryEventData | undefined; }; /** @@ -262,6 +269,159 @@ export type HistoryEvent = Message<"uber.submitqueue.stovepipe.HistoryEvent"> & export const HistoryEventSchema: GenMessage = /*@__PURE__*/ messageDesc(file_api_stovepipe_proto_stovepipe, 6); +/** + * HistoryEventData exposes known occurrence metadata without exposing the internal metadata map. + * + * @generated from message uber.submitqueue.stovepipe.HistoryEventData + */ +export type HistoryEventData = Message<"uber.submitqueue.stovepipe.HistoryEventData"> & { + /** + * The payload corresponds to request_state or the event string on the containing HistoryEvent. + * + * @generated from oneof uber.submitqueue.stovepipe.HistoryEventData.payload + */ + payload: { + /** + * Context recorded with a request-state transition. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryRequestStateData request_state = 1; + */ + value: HistoryRequestStateData; + case: "requestState"; + } | { + /** + * Context recorded when a build became durable. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryBuildData build_triggered = 2; + */ + value: HistoryBuildData; + case: "buildTriggered"; + } | { + /** + * Context recorded when a build reached a terminal status. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryBuildData build_finished = 3; + */ + value: HistoryBuildData; + case: "buildFinished"; + } | { + /** + * Context recorded when a repository validation fact became durable. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryValidationFactData validation_fact_recorded = 4; + */ + value: HistoryValidationFactData; + case: "validationFactRecorded"; + } | { + /** + * Context recorded when all project facts became durable. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryProjectFactsData project_facts_recorded = 5; + */ + value: HistoryProjectFactsData; + case: "projectFactsRecorded"; + } | { + /** + * Context recorded when build analysis was abandoned. + * + * @generated from field: uber.submitqueue.stovepipe.HistoryBuildData build_analysis_abandoned = 6; + */ + value: HistoryBuildData; + case: "buildAnalysisAbandoned"; + } | { case: undefined; value?: undefined }; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.HistoryEventData. + * Use `create(HistoryEventDataSchema)` to create a new message. + */ +export const HistoryEventDataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 7); + +/** + * HistoryRequestStateData is retained context for a request-state transition. + * + * @generated from message uber.submitqueue.stovepipe.HistoryRequestStateData + */ +export type HistoryRequestStateData = Message<"uber.submitqueue.stovepipe.HistoryRequestStateData"> & { + /** + * Build that established the terminal request state, when retained. + * + * @generated from field: string build_id = 1; + */ + buildId: string; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.HistoryRequestStateData. + * Use `create(HistoryRequestStateDataSchema)` to create a new message. + */ +export const HistoryRequestStateDataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 8); + +/** + * HistoryBuildData identifies the build associated with an occurrence. + * + * @generated from message uber.submitqueue.stovepipe.HistoryBuildData + */ +export type HistoryBuildData = Message<"uber.submitqueue.stovepipe.HistoryBuildData"> & { + /** + * Opaque runner-assigned build identifier. + * + * @generated from field: string build_id = 1; + */ + buildId: string; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.HistoryBuildData. + * Use `create(HistoryBuildDataSchema)` to create a new message. + */ +export const HistoryBuildDataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 9); + +/** + * HistoryValidationFactData describes a retained whole-repository validation fact. + * + * @generated from message uber.submitqueue.stovepipe.HistoryValidationFactData + */ +export type HistoryValidationFactData = Message<"uber.submitqueue.stovepipe.HistoryValidationFactData"> & { + /** + * Breakage degree on [0.0, 1.0]. Zero is a recorded green result. + * + * @generated from field: double fact_degree = 1; + */ + factDegree: number; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.HistoryValidationFactData. + * Use `create(HistoryValidationFactDataSchema)` to create a new message. + */ +export const HistoryValidationFactDataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 10); + +/** + * HistoryProjectFactsData describes a completed batch of project validation facts. + * + * @generated from message uber.submitqueue.stovepipe.HistoryProjectFactsData + */ +export type HistoryProjectFactsData = Message<"uber.submitqueue.stovepipe.HistoryProjectFactsData"> & { + /** + * Number of project facts recorded, including zero for an empty batch. + * + * @generated from field: uint64 project_fact_count = 1; + */ + projectFactCount: bigint; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.HistoryProjectFactsData. + * Use `create(HistoryProjectFactsDataSchema)` to create a new message. + */ +export const HistoryProjectFactsDataSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 11); + /** * RequestHistory identifies one request and contains its ordered events and current summary. * @@ -295,7 +455,7 @@ export type RequestHistory = Message<"uber.submitqueue.stovepipe.RequestHistory" * Use `create(RequestHistorySchema)` to create a new message. */ export const RequestHistorySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 7); + messageDesc(file_api_stovepipe_proto_stovepipe, 12); /** * GetRequestHistoryByIDResponse contains retained events and the current summary for one request. @@ -323,7 +483,7 @@ export type GetRequestHistoryByIDResponse = Message<"uber.submitqueue.stovepipe. * Use `create(GetRequestHistoryByIDResponseSchema)` to create a new message. */ export const GetRequestHistoryByIDResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 8); + messageDesc(file_api_stovepipe_proto_stovepipe, 13); /** * GetRequestHistoryByURIResponse contains all retained request histories for an exact URI. @@ -344,7 +504,7 @@ export type GetRequestHistoryByURIResponse = Message<"uber.submitqueue.stovepipe * Use `create(GetRequestHistoryByURIResponseSchema)` to create a new message. */ export const GetRequestHistoryByURIResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 9); + messageDesc(file_api_stovepipe_proto_stovepipe, 14); /** * GetProjectStatusByIDRequest selects the validation status for the ID returned from Ingest. @@ -393,7 +553,7 @@ export type GetProjectStatusByIDRequest = Message<"uber.submitqueue.stovepipe.Ge * Use `create(GetProjectStatusByIDRequestSchema)` to create a new message. */ export const GetProjectStatusByIDRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 10); + messageDesc(file_api_stovepipe_proto_stovepipe, 15); /** * GetProjectStatusByURIRequest selects the validation status for an exact commit URI. @@ -442,7 +602,7 @@ export type GetProjectStatusByURIRequest = Message<"uber.submitqueue.stovepipe.G * Use `create(GetProjectStatusByURIRequestSchema)` to create a new message. */ export const GetProjectStatusByURIRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 11); + messageDesc(file_api_stovepipe_proto_stovepipe, 16); /** * ProjectValidation contains one reported project and its recorded result, if any. @@ -476,7 +636,7 @@ export type ProjectValidation = Message<"uber.submitqueue.stovepipe.ProjectValid * Use `create(ProjectValidationSchema)` to create a new message. */ export const ProjectValidationSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 12); + messageDesc(file_api_stovepipe_proto_stovepipe, 17); /** * GetProjectStatusByIDResponse contains the selected validation's current projection. @@ -566,7 +726,7 @@ export type GetProjectStatusByIDResponse = Message<"uber.submitqueue.stovepipe.G * Use `create(GetProjectStatusByIDResponseSchema)` to create a new message. */ export const GetProjectStatusByIDResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 13); + messageDesc(file_api_stovepipe_proto_stovepipe, 18); /** * GetProjectStatusByURIResponse contains the selected validation's current projection. @@ -656,7 +816,7 @@ export type GetProjectStatusByURIResponse = Message<"uber.submitqueue.stovepipe. * Use `create(GetProjectStatusByURIResponseSchema)` to create a new message. */ export const GetProjectStatusByURIResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 14); + messageDesc(file_api_stovepipe_proto_stovepipe, 19); /** * RequestSummary contains one request's current materialized lifecycle state. @@ -740,7 +900,7 @@ export type RequestSummary = Message<"uber.submitqueue.stovepipe.RequestSummary" * Use `create(RequestSummarySchema)` to create a new message. */ export const RequestSummarySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 15); + messageDesc(file_api_stovepipe_proto_stovepipe, 20); /** * ListRequest selects a page of retained request summaries for one queue. @@ -801,7 +961,7 @@ export type ListRequest = Message<"uber.submitqueue.stovepipe.ListRequest"> & { * Use `create(ListRequestSchema)` to create a new message. */ export const ListRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 16); + messageDesc(file_api_stovepipe_proto_stovepipe, 21); /** * ListResponse contains a page in acceptance-time order, not a snapshot across pages. @@ -830,7 +990,7 @@ export type ListResponse = Message<"uber.submitqueue.stovepipe.ListResponse"> & * Use `create(ListResponseSchema)` to create a new message. */ export const ListResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 17); + messageDesc(file_api_stovepipe_proto_stovepipe, 22); /** * @generated from message uber.submitqueue.stovepipe.GetQueueStatusRequest @@ -856,7 +1016,7 @@ export type GetQueueStatusRequest = Message<"uber.submitqueue.stovepipe.GetQueue * Use `create(GetQueueStatusRequestSchema)` to create a new message. */ export const GetQueueStatusRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 18); + messageDesc(file_api_stovepipe_proto_stovepipe, 23); /** * QueueEnablementStatus describes applied enablement. @@ -898,7 +1058,7 @@ export type QueueEnablementStatus = Message<"uber.submitqueue.stovepipe.QueueEna * Use `create(QueueEnablementStatusSchema)` to create a new message. */ export const QueueEnablementStatusSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 19); + messageDesc(file_api_stovepipe_proto_stovepipe, 24); /** * @generated from message uber.submitqueue.stovepipe.GetQueueStatusResponse @@ -924,7 +1084,7 @@ export type GetQueueStatusResponse = Message<"uber.submitqueue.stovepipe.GetQueu * Use `create(GetQueueStatusResponseSchema)` to create a new message. */ export const GetQueueStatusResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 20); + messageDesc(file_api_stovepipe_proto_stovepipe, 25); /** * IssueSummary is the current materialized view of a validation issue. @@ -987,7 +1147,7 @@ export type IssueSummary = Message<"uber.submitqueue.stovepipe.IssueSummary"> & * Use `create(IssueSummarySchema)` to create a new message. */ export const IssueSummarySchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 21); + messageDesc(file_api_stovepipe_proto_stovepipe, 26); /** * ListOpenIssuesRequest selects current open issues within one queue. @@ -1022,7 +1182,7 @@ export type ListOpenIssuesRequest = Message<"uber.submitqueue.stovepipe.ListOpen * Use `create(ListOpenIssuesRequestSchema)` to create a new message. */ export const ListOpenIssuesRequestSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 22); + messageDesc(file_api_stovepipe_proto_stovepipe, 27); /** * ListOpenIssuesResponse is not a snapshot across calls. @@ -1052,7 +1212,7 @@ export type ListOpenIssuesResponse = Message<"uber.submitqueue.stovepipe.ListOpe * Use `create(ListOpenIssuesResponseSchema)` to create a new message. */ export const ListOpenIssuesResponseSchema: GenMessage = /*@__PURE__*/ - messageDesc(file_api_stovepipe_proto_stovepipe, 23); + messageDesc(file_api_stovepipe_proto_stovepipe, 28); /** * QueueEnablement is independent of validation results and execution controls.