diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index cbef6506a..5ae82c82f 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -290,6 +290,44 @@ message GetQueueStatusResponse { QueueEnablementStatus enablement = 2; } +// IssueSummary is the current materialized view of a validation issue. +message IssueSummary { + // Logical validation task. + string task_id = 1; + // Validation unit; empty identifies a task-wide issue. + string unit_id = 2; + // Materialized status. ListOpenIssues returns only "open". + string status = 3; + // Build where the current or most recent opening was first observed. + string first_seen_build_id = 4; + // Source request of the latest status transition. + string request_id = 5; + // Source build of the latest status transition. + string build_id = 6; + // Original transition timestamp in Unix milliseconds. + int64 changed_at_ms = 7; +} + +// ListOpenIssuesRequest selects current open issues within one queue. +message ListOpenIssuesRequest { + // Required configured queue. + string queue = 1; + // Maximum issues to return. Zero selects 50; otherwise 1 through 200. + int32 page_size = 2; + // Opaque continuation bound to the queue and task/unit ordering. + string page_token = 3; +} + +// ListOpenIssuesResponse is not a snapshot across calls. +message ListOpenIssuesResponse { + // Open summaries in ascending bytewise task/unit order. + // The inspection budget can leave this partial or empty even with a continuation. + repeated IssueSummary issues = 1; + // Continues after the last examined open-issue row, including skipped references. + // Empty means no further open-issue row was observed. + string next_page_token = 2; +} + // Stovepipe provides the Stovepipe API. service Stovepipe { // Ping returns a response indicating the service is alive @@ -309,4 +347,6 @@ service Stovepipe { rpc List(ListRequest) returns (ListResponse) {} // GetQueueStatus returns current enablement or enablement for a supplied commit. rpc GetQueueStatus(GetQueueStatusRequest) returns (GetQueueStatusResponse) {} + // ListOpenIssues returns current open issues validated against their summaries. + rpc ListOpenIssues(ListOpenIssuesRequest) returns (ListOpenIssuesResponse) {} } diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index f5782a57a..c4fce2348 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -1742,6 +1742,227 @@ func (x *GetQueueStatusResponse) GetEnablement() *QueueEnablementStatus { return nil } +// IssueSummary is the current materialized view of a validation issue. +type IssueSummary struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Logical validation task. + TaskId string `protobuf:"bytes,1,opt,name=task_id,json=taskId,proto3" json:"task_id,omitempty"` + // Validation unit; empty identifies a task-wide issue. + UnitId string `protobuf:"bytes,2,opt,name=unit_id,json=unitId,proto3" json:"unit_id,omitempty"` + // Materialized status. ListOpenIssues returns only "open". + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + // Build where the current or most recent opening was first observed. + FirstSeenBuildId string `protobuf:"bytes,4,opt,name=first_seen_build_id,json=firstSeenBuildId,proto3" json:"first_seen_build_id,omitempty"` + // Source request of the latest status transition. + RequestId string `protobuf:"bytes,5,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + // Source build of the latest status transition. + BuildId string `protobuf:"bytes,6,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"` + // Original transition timestamp in Unix milliseconds. + ChangedAtMs int64 `protobuf:"varint,7,opt,name=changed_at_ms,json=changedAtMs,proto3" json:"changed_at_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IssueSummary) Reset() { + *x = IssueSummary{} + mi := &file_stovepipe_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IssueSummary) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IssueSummary) ProtoMessage() {} + +func (x *IssueSummary) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[21] + 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 IssueSummary.ProtoReflect.Descriptor instead. +func (*IssueSummary) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{21} +} + +func (x *IssueSummary) GetTaskId() string { + if x != nil { + return x.TaskId + } + return "" +} + +func (x *IssueSummary) GetUnitId() string { + if x != nil { + return x.UnitId + } + return "" +} + +func (x *IssueSummary) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *IssueSummary) GetFirstSeenBuildId() string { + if x != nil { + return x.FirstSeenBuildId + } + return "" +} + +func (x *IssueSummary) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +func (x *IssueSummary) GetBuildId() string { + if x != nil { + return x.BuildId + } + return "" +} + +func (x *IssueSummary) GetChangedAtMs() int64 { + if x != nil { + return x.ChangedAtMs + } + return 0 +} + +// ListOpenIssuesRequest selects current open issues within one queue. +type ListOpenIssuesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required configured queue. + Queue string `protobuf:"bytes,1,opt,name=queue,proto3" json:"queue,omitempty"` + // Maximum issues to return. Zero selects 50; otherwise 1 through 200. + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + // Opaque continuation bound to the queue and task/unit ordering. + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOpenIssuesRequest) Reset() { + *x = ListOpenIssuesRequest{} + mi := &file_stovepipe_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOpenIssuesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOpenIssuesRequest) ProtoMessage() {} + +func (x *ListOpenIssuesRequest) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[22] + 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 ListOpenIssuesRequest.ProtoReflect.Descriptor instead. +func (*ListOpenIssuesRequest) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{22} +} + +func (x *ListOpenIssuesRequest) GetQueue() string { + if x != nil { + return x.Queue + } + return "" +} + +func (x *ListOpenIssuesRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListOpenIssuesRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +// ListOpenIssuesResponse is not a snapshot across calls. +type ListOpenIssuesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Open summaries in ascending bytewise task/unit order. + // The inspection budget can leave this partial or empty even with a continuation. + Issues []*IssueSummary `protobuf:"bytes,1,rep,name=issues,proto3" json:"issues,omitempty"` + // Continues after the last examined open-issue row, including skipped references. + // Empty means no further open-issue row was observed. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListOpenIssuesResponse) Reset() { + *x = ListOpenIssuesResponse{} + mi := &file_stovepipe_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListOpenIssuesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListOpenIssuesResponse) ProtoMessage() {} + +func (x *ListOpenIssuesResponse) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[23] + 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 ListOpenIssuesResponse.ProtoReflect.Descriptor instead. +func (*ListOpenIssuesResponse) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{23} +} + +func (x *ListOpenIssuesResponse) GetIssues() []*IssueSummary { + if x != nil { + return x.Issues + } + return nil +} + +func (x *ListOpenIssuesResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + var File_stovepipe_proto protoreflect.FileDescriptor const file_stovepipe_proto_rawDesc = "" + @@ -1878,11 +2099,28 @@ const file_stovepipe_proto_rawDesc = "" + "\x05queue\x18\x01 \x01(\tR\x05queue\x12Q\n" + "\n" + "enablement\x18\x02 \x01(\v21.uber.submitqueue.stovepipe.QueueEnablementStatusR\n" + - "enablement*l\n" + + "enablement\"\xe5\x01\n" + + "\fIssueSummary\x12\x17\n" + + "\atask_id\x18\x01 \x01(\tR\x06taskId\x12\x17\n" + + "\aunit_id\x18\x02 \x01(\tR\x06unitId\x12\x16\n" + + "\x06status\x18\x03 \x01(\tR\x06status\x12-\n" + + "\x13first_seen_build_id\x18\x04 \x01(\tR\x10firstSeenBuildId\x12\x1d\n" + + "\n" + + "request_id\x18\x05 \x01(\tR\trequestId\x12\x19\n" + + "\bbuild_id\x18\x06 \x01(\tR\abuildId\x12\"\n" + + "\rchanged_at_ms\x18\a \x01(\x03R\vchangedAtMs\"i\n" + + "\x15ListOpenIssuesRequest\x12\x14\n" + + "\x05queue\x18\x01 \x01(\tR\x05queue\x12\x1b\n" + + "\tpage_size\x18\x02 \x01(\x05R\bpageSize\x12\x1d\n" + + "\n" + + "page_token\x18\x03 \x01(\tR\tpageToken\"\x82\x01\n" + + "\x16ListOpenIssuesResponse\x12@\n" + + "\x06issues\x18\x01 \x03(\v2(.uber.submitqueue.stovepipe.IssueSummaryR\x06issues\x12&\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken*l\n" + "\x0fQueueEnablement\x12\x1c\n" + "\x18QUEUE_ENABLEMENT_UNKNOWN\x10\x00\x12\x1c\n" + "\x18QUEUE_ENABLEMENT_ENABLED\x10\x01\x12\x1d\n" + - "\x19QUEUE_ENABLEMENT_DISABLED\x10\x022\xe7\a\n" + + "\x19QUEUE_ENABLEMENT_DISABLED\x10\x022\xe2\b\n" + "\tStovepipe\x12[\n" + "\x04Ping\x12'.uber.submitqueue.stovepipe.PingRequest\x1a(.uber.submitqueue.stovepipe.PingResponse\"\x00\x12a\n" + "\x06Ingest\x12).uber.submitqueue.stovepipe.IngestRequest\x1a*.uber.submitqueue.stovepipe.IngestResponse\"\x00\x12\x8e\x01\n" + @@ -1891,7 +2129,8 @@ const file_stovepipe_proto_rawDesc = "" + "\x14GetProjectStatusByID\x127.uber.submitqueue.stovepipe.GetProjectStatusByIDRequest\x1a8.uber.submitqueue.stovepipe.GetProjectStatusByIDResponse\"\x00\x12\x8e\x01\n" + "\x15GetProjectStatusByURI\x128.uber.submitqueue.stovepipe.GetProjectStatusByURIRequest\x1a9.uber.submitqueue.stovepipe.GetProjectStatusByURIResponse\"\x00\x12[\n" + "\x04List\x12'.uber.submitqueue.stovepipe.ListRequest\x1a(.uber.submitqueue.stovepipe.ListResponse\"\x00\x12y\n" + - "\x0eGetQueueStatus\x121.uber.submitqueue.stovepipe.GetQueueStatusRequest\x1a2.uber.submitqueue.stovepipe.GetQueueStatusResponse\"\x00Be\n" + + "\x0eGetQueueStatus\x121.uber.submitqueue.stovepipe.GetQueueStatusRequest\x1a2.uber.submitqueue.stovepipe.GetQueueStatusResponse\"\x00\x12y\n" + + "\x0eListOpenIssues\x121.uber.submitqueue.stovepipe.ListOpenIssuesRequest\x1a2.uber.submitqueue.stovepipe.ListOpenIssuesResponse\"\x00Be\n" + "\x1ecom.uber.submitqueue.stovepipeB\x0eStovepipeProtoP\x01Z1github.com/uber/submitqueue/api/stovepipe/protopbb\x06proto3" var ( @@ -1907,7 +2146,7 @@ func file_stovepipe_proto_rawDescGZIP() []byte { } var file_stovepipe_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_stovepipe_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_stovepipe_proto_msgTypes = make([]protoimpl.MessageInfo, 24) var file_stovepipe_proto_goTypes = []any{ (QueueEnablement)(0), // 0: uber.submitqueue.stovepipe.QueueEnablement (*PingRequest)(nil), // 1: uber.submitqueue.stovepipe.PingRequest @@ -1931,6 +2170,9 @@ var file_stovepipe_proto_goTypes = []any{ (*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 } var file_stovepipe_proto_depIdxs = []int32{ 0, // 0: uber.submitqueue.stovepipe.IngestRequest.enablement:type_name -> uber.submitqueue.stovepipe.QueueEnablement @@ -1945,27 +2187,30 @@ var file_stovepipe_proto_depIdxs = []int32{ 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 - 1, // 12: uber.submitqueue.stovepipe.Stovepipe.Ping:input_type -> uber.submitqueue.stovepipe.PingRequest - 3, // 13: uber.submitqueue.stovepipe.Stovepipe.Ingest:input_type -> uber.submitqueue.stovepipe.IngestRequest - 5, // 14: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest - 6, // 15: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest - 11, // 16: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDRequest - 12, // 17: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIRequest - 17, // 18: uber.submitqueue.stovepipe.Stovepipe.List:input_type -> uber.submitqueue.stovepipe.ListRequest - 19, // 19: uber.submitqueue.stovepipe.Stovepipe.GetQueueStatus:input_type -> uber.submitqueue.stovepipe.GetQueueStatusRequest - 2, // 20: uber.submitqueue.stovepipe.Stovepipe.Ping:output_type -> uber.submitqueue.stovepipe.PingResponse - 4, // 21: uber.submitqueue.stovepipe.Stovepipe.Ingest:output_type -> uber.submitqueue.stovepipe.IngestResponse - 9, // 22: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse - 10, // 23: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse - 14, // 24: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDResponse - 15, // 25: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIResponse - 18, // 26: uber.submitqueue.stovepipe.Stovepipe.List:output_type -> uber.submitqueue.stovepipe.ListResponse - 21, // 27: uber.submitqueue.stovepipe.Stovepipe.GetQueueStatus:output_type -> uber.submitqueue.stovepipe.GetQueueStatusResponse - 20, // [20:28] is the sub-list for method output_type - 12, // [12:20] is the sub-list for method input_type - 12, // [12:12] is the sub-list for extension type_name - 12, // [12:12] is the sub-list for extension extendee - 0, // [0:12] is the sub-list for field type_name + 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 } func init() { file_stovepipe_proto_init() } @@ -1996,7 +2241,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: 21, + NumMessages: 24, NumExtensions: 0, NumServices: 1, }, diff --git a/api/stovepipe/protopb/stovepipe.pb.yarpc.go b/api/stovepipe/protopb/stovepipe.pb.yarpc.go index c63656e3d..ec4b0d795 100644 --- a/api/stovepipe/protopb/stovepipe.pb.yarpc.go +++ b/api/stovepipe/protopb/stovepipe.pb.yarpc.go @@ -29,6 +29,7 @@ type StovepipeYARPCClient interface { GetProjectStatusByURI(context.Context, *GetProjectStatusByURIRequest, ...yarpc.CallOption) (*GetProjectStatusByURIResponse, error) List(context.Context, *ListRequest, ...yarpc.CallOption) (*ListResponse, error) GetQueueStatus(context.Context, *GetQueueStatusRequest, ...yarpc.CallOption) (*GetQueueStatusResponse, error) + ListOpenIssues(context.Context, *ListOpenIssuesRequest, ...yarpc.CallOption) (*ListOpenIssuesResponse, error) } func newStovepipeYARPCClient(clientConfig transport.ClientConfig, anyResolver v2.AnyResolver, options ...v2.ClientOption) StovepipeYARPCClient { @@ -57,6 +58,7 @@ type StovepipeYARPCServer interface { GetProjectStatusByURI(context.Context, *GetProjectStatusByURIRequest) (*GetProjectStatusByURIResponse, error) List(context.Context, *ListRequest) (*ListResponse, error) GetQueueStatus(context.Context, *GetQueueStatusRequest) (*GetQueueStatusResponse, error) + ListOpenIssues(context.Context, *ListOpenIssuesRequest) (*ListOpenIssuesResponse, error) } type buildStovepipeYARPCProceduresParams struct { @@ -150,6 +152,16 @@ func buildStovepipeYARPCProcedures(params buildStovepipeYARPCProceduresParams) [ }, ), }, + { + MethodName: "ListOpenIssues", + Handler: v2.NewUnaryHandler( + v2.UnaryHandlerParams{ + Handle: handler.ListOpenIssues, + NewRequest: newStovepipeServiceListOpenIssuesYARPCRequest, + AnyResolver: params.AnyResolver, + }, + ), + }, }, OnewayHandlerParams: []v2.BuildProceduresOnewayHandlerParams{}, StreamHandlerParams: []v2.BuildProceduresStreamHandlerParams{}, @@ -358,6 +370,18 @@ func (c *_StovepipeYARPCCaller) GetQueueStatus(ctx context.Context, request *Get return response, err } +func (c *_StovepipeYARPCCaller) ListOpenIssues(ctx context.Context, request *ListOpenIssuesRequest, options ...yarpc.CallOption) (*ListOpenIssuesResponse, error) { + responseMessage, err := c.streamClient.Call(ctx, "ListOpenIssues", request, newStovepipeServiceListOpenIssuesYARPCResponse, options...) + if responseMessage == nil { + return nil, err + } + response, ok := responseMessage.(*ListOpenIssuesResponse) + if !ok { + return nil, v2.CastError(emptyStovepipeServiceListOpenIssuesYARPCResponse, responseMessage) + } + return response, err +} + type _StovepipeYARPCHandler struct { server StovepipeYARPCServer } @@ -490,6 +514,22 @@ func (h *_StovepipeYARPCHandler) GetQueueStatus(ctx context.Context, requestMess return response, err } +func (h *_StovepipeYARPCHandler) ListOpenIssues(ctx context.Context, requestMessage proto.Message) (proto.Message, error) { + var request *ListOpenIssuesRequest + var ok bool + if requestMessage != nil { + request, ok = requestMessage.(*ListOpenIssuesRequest) + if !ok { + return nil, v2.CastError(emptyStovepipeServiceListOpenIssuesYARPCRequest, requestMessage) + } + } + response, err := h.server.ListOpenIssues(ctx, request) + if response == nil { + return nil, err + } + return response, err +} + func newStovepipeServicePingYARPCRequest() proto.Message { return &PingRequest{} } @@ -554,6 +594,14 @@ func newStovepipeServiceGetQueueStatusYARPCResponse() proto.Message { return &GetQueueStatusResponse{} } +func newStovepipeServiceListOpenIssuesYARPCRequest() proto.Message { + return &ListOpenIssuesRequest{} +} + +func newStovepipeServiceListOpenIssuesYARPCResponse() proto.Message { + return &ListOpenIssuesResponse{} +} + var ( emptyStovepipeServicePingYARPCRequest = &PingRequest{} emptyStovepipeServicePingYARPCResponse = &PingResponse{} @@ -571,99 +619,110 @@ var ( emptyStovepipeServiceListYARPCResponse = &ListResponse{} emptyStovepipeServiceGetQueueStatusYARPCRequest = &GetQueueStatusRequest{} emptyStovepipeServiceGetQueueStatusYARPCResponse = &GetQueueStatusResponse{} + emptyStovepipeServiceListOpenIssuesYARPCRequest = &ListOpenIssuesRequest{} + emptyStovepipeServiceListOpenIssuesYARPCResponse = &ListOpenIssuesResponse{} ) var yarpcFileDescriptorClosurefabdb6b3c0b09022 = [][]byte{ // stovepipe.proto []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4b, 0x6f, 0x1b, 0x55, - 0x14, 0xce, 0xd8, 0x79, 0xd8, 0x27, 0x8e, 0x93, 0xde, 0xa6, 0xc1, 0x71, 0x9b, 0x2a, 0x0c, 0x94, - 0xa6, 0x45, 0x75, 0x68, 0x90, 0xa0, 0x65, 0x81, 0x88, 0x1b, 0x37, 0xb6, 0xda, 0xa4, 0xe9, 0xb8, - 0x01, 0x89, 0x2e, 0x46, 0xe3, 0xf1, 0x89, 0x33, 0x6d, 0xe6, 0xd1, 0x3b, 0x77, 0x02, 0xe9, 0x02, - 0x89, 0x05, 0x2b, 0x24, 0x24, 0xfe, 0x06, 0xec, 0x59, 0xb3, 0xe2, 0x0f, 0xb0, 0x81, 0x5f, 0xc0, - 0x4f, 0xe8, 0x16, 0xdd, 0xc7, 0x8c, 0xc7, 0x8f, 0x38, 0x4d, 0x52, 0x24, 0x90, 0xd8, 0xcd, 0x3d, - 0xaf, 0x7b, 0xee, 0x77, 0x1e, 0xf7, 0xdc, 0x81, 0xd9, 0x90, 0xf9, 0x87, 0x18, 0x38, 0x01, 0x56, - 0x02, 0xea, 0x33, 0x9f, 0x94, 0xa3, 0x16, 0xd2, 0x4a, 0x18, 0xb5, 0x5c, 0x87, 0xbd, 0x88, 0x30, - 0xc2, 0x4a, 0x22, 0xa1, 0x5f, 0x87, 0xe9, 0x1d, 0xc7, 0xeb, 0x18, 0xf8, 0x22, 0xc2, 0x90, 0x91, - 0x12, 0x4c, 0xb9, 0x18, 0x86, 0x56, 0x07, 0x4b, 0xda, 0xb2, 0xb6, 0x92, 0x37, 0xe2, 0xa5, 0xfe, - 0x9d, 0x06, 0x05, 0x29, 0x19, 0x06, 0xbe, 0x17, 0xe2, 0xf1, 0xa2, 0xe4, 0x6d, 0x28, 0x84, 0x48, - 0x0f, 0x1d, 0x1b, 0x4d, 0xcf, 0x72, 0xb1, 0x94, 0x11, 0xec, 0x69, 0x45, 0xdb, 0xb6, 0x5c, 0x24, - 0x57, 0x20, 0xcf, 0x1c, 0x17, 0x43, 0x66, 0xb9, 0x41, 0x29, 0xbb, 0xac, 0xad, 0x64, 0x8d, 0x2e, - 0x81, 0x94, 0x21, 0xb7, 0xef, 0x87, 0x4c, 0x28, 0x8f, 0x0b, 0xe5, 0x64, 0xad, 0x53, 0x98, 0x69, - 0x78, 0x1d, 0x0c, 0x59, 0xec, 0xf2, 0x3c, 0x4c, 0x88, 0x43, 0x29, 0x2f, 0xe4, 0x82, 0x3c, 0x00, - 0x40, 0xcf, 0x6a, 0x1d, 0xa0, 0x8b, 0x1e, 0x13, 0x1e, 0x14, 0xd7, 0xde, 0xaf, 0x1c, 0x0f, 0x44, - 0xe5, 0x31, 0x5f, 0xd7, 0x12, 0x15, 0x23, 0xa5, 0xae, 0x87, 0x50, 0x8c, 0xf7, 0x54, 0x87, 0x2f, - 0x42, 0xc6, 0x69, 0xab, 0x1d, 0x33, 0x4e, 0x9b, 0x3c, 0x1e, 0xd8, 0x6e, 0x7a, 0xed, 0xf6, 0x29, - 0xb6, 0x6b, 0x32, 0x8b, 0x45, 0x61, 0xcf, 0xa6, 0x4d, 0xb8, 0xb2, 0x89, 0xf1, 0x29, 0xeb, 0x4e, - 0xc8, 0x7c, 0x7a, 0x54, 0x3d, 0x6a, 0x6c, 0x8c, 0x3e, 0xf7, 0x12, 0x00, 0x95, 0x02, 0xa6, 0xd3, - 0x56, 0xc8, 0xe7, 0x15, 0xa5, 0xd1, 0xd6, 0x37, 0x61, 0x69, 0x88, 0xd1, 0x5d, 0xa3, 0x31, 0xda, - 0xea, 0x1c, 0x64, 0x23, 0xea, 0x28, 0x73, 0xfc, 0x53, 0xff, 0x55, 0x83, 0x82, 0xd2, 0xaf, 0x1d, - 0xa2, 0xc7, 0xc8, 0x22, 0xe4, 0x90, 0x7f, 0x98, 0x09, 0x2e, 0x53, 0x62, 0xdd, 0x68, 0xf3, 0x7c, - 0x48, 0x62, 0x6b, 0xba, 0xa1, 0x30, 0x93, 0x35, 0xa6, 0x13, 0xda, 0x56, 0x48, 0xae, 0xc1, 0x4c, - 0xec, 0x76, 0xc8, 0x2c, 0x86, 0x22, 0x27, 0xf2, 0xf5, 0x31, 0xa3, 0xa0, 0xc8, 0x1c, 0x20, 0x24, - 0x0b, 0x30, 0x21, 0x8c, 0xca, 0xac, 0xa8, 0x8f, 0x19, 0x72, 0x49, 0xae, 0x41, 0xd1, 0x8f, 0x98, - 0xed, 0xbb, 0x68, 0x52, 0xb4, 0x42, 0xdf, 0x2b, 0x4d, 0x08, 0x17, 0x66, 0x14, 0xd5, 0x10, 0xc4, - 0x6a, 0x01, 0xc0, 0xb7, 0xed, 0x88, 0x52, 0xf4, 0x6c, 0xd4, 0x7f, 0xd3, 0xa0, 0xd8, 0x8b, 0x44, - 0x1f, 0x7a, 0x5a, 0x1f, 0x7a, 0xe4, 0x33, 0x98, 0x14, 0xfb, 0xf1, 0x23, 0x64, 0x57, 0xa6, 0xd7, - 0x56, 0x46, 0x45, 0x38, 0x8d, 0x8e, 0xa1, 0xf4, 0x48, 0x13, 0x66, 0x93, 0x73, 0x46, 0xae, 0x6b, - 0xd1, 0x23, 0x71, 0xd2, 0xe9, 0xb5, 0x9b, 0xa3, 0x4c, 0x29, 0x2f, 0x9b, 0x52, 0xc3, 0x28, 0xd2, - 0x9e, 0xb5, 0xfe, 0x8b, 0x36, 0x34, 0xaa, 0x3c, 0x55, 0x54, 0xba, 0x76, 0x1d, 0xd7, 0xde, 0x9c, - 0xe3, 0x99, 0x73, 0x3b, 0xfe, 0x0c, 0xae, 0x1e, 0x97, 0x8d, 0xca, 0xf1, 0x3a, 0xe4, 0xf7, 0x05, - 0xdd, 0xc1, 0xd8, 0xf7, 0xd7, 0xd9, 0x50, 0xd9, 0x32, 0xba, 0xca, 0xfa, 0x4f, 0x1a, 0x5c, 0xde, - 0x44, 0xb6, 0x43, 0xfd, 0x67, 0x68, 0xab, 0x7a, 0x3b, 0x6f, 0x39, 0xf1, 0x46, 0x15, 0x48, 0x83, - 0x61, 0x29, 0xbb, 0x9c, 0xe5, 0x8d, 0x2a, 0x5e, 0x93, 0xcb, 0x90, 0x0f, 0xac, 0x0e, 0x9a, 0xa1, - 0xf3, 0x52, 0x76, 0xb1, 0x09, 0x23, 0xc7, 0x09, 0x4d, 0xe7, 0xa5, 0xb0, 0x2b, 0x98, 0xcc, 0x7f, - 0x8e, 0x71, 0xb2, 0x0a, 0xf1, 0x27, 0x9c, 0xa0, 0xff, 0xac, 0x89, 0xe2, 0xef, 0x73, 0xf6, 0xc4, - 0x32, 0x5d, 0x02, 0xb0, 0xf7, 0x2d, 0xaf, 0x83, 0x66, 0xb7, 0x5a, 0xf3, 0x92, 0xb2, 0x4b, 0x9d, - 0x7f, 0xcc, 0xdb, 0x16, 0x5c, 0x50, 0x9e, 0x7e, 0x6e, 0x1d, 0x38, 0x6d, 0x8b, 0x39, 0xbe, 0xc7, - 0xaf, 0x07, 0x65, 0x3c, 0x6e, 0x07, 0x6a, 0x49, 0x6e, 0xc0, 0x6c, 0x8b, 0xa2, 0xf5, 0x9c, 0x5b, - 0x6c, 0x63, 0x87, 0xa2, 0xbc, 0x21, 0xb4, 0xfa, 0x98, 0x51, 0x8c, 0x19, 0x1b, 0x82, 0x5e, 0xcd, - 0xc1, 0x24, 0xc5, 0x30, 0x3a, 0x60, 0xfa, 0x1f, 0xd9, 0x61, 0x88, 0xa4, 0x52, 0xfc, 0x84, 0xd2, - 0x4d, 0x00, 0xcb, 0x1c, 0x0f, 0x58, 0xb6, 0x1f, 0xb0, 0x45, 0xc8, 0xb5, 0xac, 0x50, 0x32, 0xe5, - 0x3d, 0x34, 0xc5, 0xd7, 0x9c, 0xf5, 0x4e, 0x7f, 0xc3, 0x92, 0xa8, 0xf4, 0xb6, 0x2b, 0x1d, 0x66, - 0xa2, 0xa0, 0x6d, 0x31, 0x6c, 0x9b, 0x16, 0xe3, 0x9d, 0x0f, 0x64, 0xe7, 0x53, 0xc4, 0x75, 0xb6, - 0x15, 0x92, 0x4f, 0xa1, 0x4c, 0x31, 0xf0, 0x43, 0x87, 0x27, 0xac, 0xd9, 0x0f, 0xcc, 0xa4, 0x02, - 0xa6, 0xd4, 0x95, 0xa9, 0xf6, 0x40, 0x44, 0xee, 0x40, 0x49, 0x01, 0x6b, 0x4a, 0xa8, 0x42, 0xd3, - 0xf6, 0xdd, 0xe0, 0x00, 0x19, 0x96, 0xa6, 0x96, 0xb5, 0x95, 0x9c, 0xb1, 0xa0, 0xf8, 0x86, 0x64, - 0xdf, 0x53, 0x5c, 0xd2, 0x48, 0xa5, 0x43, 0x4e, 0x94, 0xd6, 0xad, 0x51, 0xa5, 0x35, 0x10, 0xe2, - 0x54, 0xf6, 0xbc, 0x07, 0xb3, 0x1e, 0x7e, 0xcd, 0xcc, 0x54, 0x96, 0xe4, 0x65, 0x03, 0xe6, 0xe4, - 0x9d, 0x38, 0x53, 0xaa, 0x17, 0xe1, 0x42, 0xea, 0xb0, 0x2a, 0xb4, 0x7f, 0x66, 0x45, 0xfb, 0x1a, - 0x96, 0xec, 0xff, 0xc7, 0xf6, 0x3f, 0x1e, 0xdb, 0x57, 0x99, 0xe4, 0x8e, 0x55, 0x4d, 0xff, 0x5f, - 0x19, 0xcc, 0x5b, 0x70, 0x51, 0x30, 0xcd, 0xde, 0x90, 0x4e, 0x8a, 0x90, 0xce, 0x09, 0xd6, 0x6e, - 0x2a, 0xae, 0xef, 0x42, 0xd1, 0xb2, 0x6d, 0x0c, 0xba, 0x92, 0x53, 0x42, 0xb2, 0x10, 0x53, 0x85, - 0xd4, 0xe0, 0x50, 0x92, 0x1b, 0x32, 0x94, 0x70, 0x07, 0xe3, 0x20, 0xdb, 0x7e, 0xe4, 0x31, 0x81, - 0xee, 0x84, 0x51, 0x50, 0xc4, 0x7b, 0x9c, 0x46, 0x3e, 0x80, 0xf9, 0x16, 0xe5, 0x30, 0x9b, 0xbd, - 0xb2, 0x20, 0x64, 0x89, 0xe4, 0xed, 0xa4, 0x34, 0xf4, 0x57, 0x1a, 0x4c, 0x3f, 0x74, 0x4e, 0x1a, - 0x93, 0x3f, 0x82, 0xb7, 0xd2, 0x27, 0xf1, 0xa9, 0x69, 0xed, 0x31, 0xa4, 0xc9, 0x94, 0x56, 0x1f, - 0x33, 0x2e, 0x76, 0x0f, 0xf5, 0x88, 0xae, 0x73, 0xee, 0x56, 0x48, 0x2a, 0x40, 0x12, 0xbd, 0x16, - 0xee, 0xf9, 0x14, 0xb9, 0x8a, 0x18, 0xe4, 0xeb, 0x9a, 0x31, 0x17, 0xf3, 0xaa, 0x82, 0xb5, 0x75, - 0xae, 0xeb, 0xa5, 0xba, 0x00, 0xf3, 0xc9, 0x5e, 0x07, 0xfe, 0x57, 0x48, 0xcd, 0x96, 0x1f, 0x79, - 0xed, 0x1e, 0x7a, 0x14, 0x04, 0x31, 0x5d, 0xff, 0x06, 0x0a, 0xf2, 0xe0, 0xaa, 0x7b, 0xdc, 0x87, - 0x9c, 0x0a, 0xf6, 0x69, 0x46, 0x88, 0x78, 0x66, 0x49, 0x74, 0x87, 0x15, 0x42, 0x66, 0x48, 0x21, - 0xe8, 0x0f, 0xe1, 0xd2, 0x26, 0x32, 0x31, 0xe0, 0xab, 0xb1, 0xfe, 0x1c, 0x97, 0xb6, 0xfe, 0xbb, - 0x06, 0x97, 0x86, 0x3e, 0x16, 0xf8, 0x0d, 0x7b, 0x88, 0x34, 0x74, 0x7c, 0x4f, 0x18, 0xcc, 0x1a, - 0xf1, 0x92, 0xac, 0xc3, 0x84, 0xcc, 0xf5, 0x33, 0xbc, 0x7b, 0xa4, 0x26, 0xb9, 0x0b, 0x8b, 0xb8, - 0xb7, 0x87, 0x36, 0x73, 0x0e, 0xd1, 0xdc, 0xa3, 0xbe, 0xcb, 0x3b, 0x8f, 0xeb, 0xb0, 0x54, 0xfd, - 0x2d, 0x24, 0x02, 0xf7, 0xa9, 0xef, 0xde, 0x13, 0x6c, 0x5e, 0x71, 0x3a, 0xcc, 0x48, 0xf7, 0xe3, - 0xe2, 0x18, 0x97, 0x9d, 0x51, 0x11, 0x79, 0x6d, 0xe8, 0xdf, 0x6a, 0xb0, 0xd0, 0x0f, 0x92, 0x0a, - 0xd7, 0x70, 0x94, 0xde, 0xfc, 0x03, 0xeb, 0xe6, 0x01, 0xcc, 0xf6, 0x09, 0x91, 0x2b, 0x50, 0x7a, - 0xbc, 0x5b, 0xdb, 0xad, 0x99, 0xb5, 0xed, 0xf5, 0xea, 0xc3, 0xda, 0x56, 0x6d, 0xfb, 0x89, 0xb9, - 0xbb, 0xfd, 0x60, 0xfb, 0xd1, 0x17, 0xdb, 0x73, 0x63, 0x43, 0xb9, 0xf2, 0x73, 0x63, 0x4e, 0x23, - 0x4b, 0xb0, 0x38, 0xc0, 0xdd, 0x68, 0x34, 0x25, 0x3b, 0xb3, 0xf6, 0xd7, 0x14, 0xe4, 0x9b, 0xb1, - 0x77, 0xe4, 0x29, 0x8c, 0xf3, 0xc7, 0x34, 0xb9, 0x3e, 0xb2, 0x2b, 0x77, 0x1f, 0xe6, 0xe5, 0x95, - 0x93, 0x05, 0x25, 0x7e, 0xfa, 0x18, 0xb1, 0x60, 0x52, 0x3e, 0x57, 0xc9, 0x8d, 0x51, 0x5a, 0x3d, - 0xcf, 0xe8, 0xf2, 0xcd, 0xd7, 0x11, 0x4d, 0xb6, 0xf8, 0x41, 0x13, 0x49, 0x3e, 0xf8, 0xe4, 0x20, - 0x77, 0x46, 0xd9, 0x19, 0xf5, 0xa0, 0x2d, 0xdf, 0x3d, 0x83, 0x66, 0xe2, 0xd0, 0x8f, 0x32, 0xa1, - 0x86, 0xbc, 0x25, 0xc8, 0x69, 0xed, 0x76, 0xc7, 0xec, 0xf2, 0x27, 0x67, 0x51, 0x4d, 0x7c, 0xfa, - 0x5e, 0x83, 0xf9, 0x61, 0x33, 0x2b, 0xf9, 0xf8, 0x04, 0xb3, 0xc7, 0x3d, 0x52, 0xca, 0x77, 0x4e, - 0xaf, 0xd8, 0x1f, 0xb2, 0xc1, 0x31, 0x8b, 0x9c, 0xd2, 0x6a, 0x0a, 0x9f, 0xbb, 0x67, 0xd0, 0x4c, - 0x1c, 0x7a, 0x0a, 0xe3, 0xbc, 0x4f, 0x8f, 0xae, 0x81, 0xd4, 0x15, 0x36, 0xba, 0x06, 0xd2, 0x2d, - 0x5f, 0x1f, 0x23, 0x47, 0x50, 0xec, 0xed, 0x2f, 0xe4, 0xf6, 0x09, 0xbe, 0x0e, 0x36, 0xec, 0xf2, - 0xda, 0x69, 0x54, 0xe2, 0xad, 0xab, 0x08, 0x57, 0x6d, 0xdf, 0x1d, 0xa1, 0x5a, 0x2d, 0x26, 0x8d, - 0x60, 0x87, 0xfa, 0xcc, 0xdf, 0xd1, 0xbe, 0xbc, 0xdd, 0x71, 0xd8, 0x7e, 0xd4, 0xaa, 0xd8, 0xbe, - 0xbb, 0xca, 0x15, 0x57, 0x53, 0x8a, 0xab, 0x56, 0xe0, 0xac, 0x26, 0xca, 0xab, 0xe2, 0x9f, 0x5e, - 0xd0, 0x6a, 0x4d, 0x8a, 0x8f, 0x0f, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xc2, 0xb4, 0xde, 0xd9, - 0xef, 0x13, 0x00, 0x00, + 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, }, } diff --git a/api/stovepipe/protopb/stovepipe_grpc.pb.go b/api/stovepipe/protopb/stovepipe_grpc.pb.go index 64f1af82d..f56a15d6f 100644 --- a/api/stovepipe/protopb/stovepipe_grpc.pb.go +++ b/api/stovepipe/protopb/stovepipe_grpc.pb.go @@ -42,6 +42,7 @@ const ( Stovepipe_GetProjectStatusByURI_FullMethodName = "/uber.submitqueue.stovepipe.Stovepipe/GetProjectStatusByURI" Stovepipe_List_FullMethodName = "/uber.submitqueue.stovepipe.Stovepipe/List" Stovepipe_GetQueueStatus_FullMethodName = "/uber.submitqueue.stovepipe.Stovepipe/GetQueueStatus" + Stovepipe_ListOpenIssues_FullMethodName = "/uber.submitqueue.stovepipe.Stovepipe/ListOpenIssues" ) // StovepipeClient is the client API for Stovepipe service. @@ -67,6 +68,8 @@ type StovepipeClient interface { List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) // GetQueueStatus returns current enablement or enablement for a supplied commit. GetQueueStatus(ctx context.Context, in *GetQueueStatusRequest, opts ...grpc.CallOption) (*GetQueueStatusResponse, error) + // ListOpenIssues returns current open issues validated against their summaries. + ListOpenIssues(ctx context.Context, in *ListOpenIssuesRequest, opts ...grpc.CallOption) (*ListOpenIssuesResponse, error) } type stovepipeClient struct { @@ -157,6 +160,16 @@ func (c *stovepipeClient) GetQueueStatus(ctx context.Context, in *GetQueueStatus return out, nil } +func (c *stovepipeClient) ListOpenIssues(ctx context.Context, in *ListOpenIssuesRequest, opts ...grpc.CallOption) (*ListOpenIssuesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ListOpenIssuesResponse) + err := c.cc.Invoke(ctx, Stovepipe_ListOpenIssues_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // StovepipeServer is the server API for Stovepipe service. // All implementations must embed UnimplementedStovepipeServer // for forward compatibility. @@ -180,6 +193,8 @@ type StovepipeServer interface { List(context.Context, *ListRequest) (*ListResponse, error) // GetQueueStatus returns current enablement or enablement for a supplied commit. GetQueueStatus(context.Context, *GetQueueStatusRequest) (*GetQueueStatusResponse, error) + // ListOpenIssues returns current open issues validated against their summaries. + ListOpenIssues(context.Context, *ListOpenIssuesRequest) (*ListOpenIssuesResponse, error) mustEmbedUnimplementedStovepipeServer() } @@ -214,6 +229,9 @@ func (UnimplementedStovepipeServer) List(context.Context, *ListRequest) (*ListRe func (UnimplementedStovepipeServer) GetQueueStatus(context.Context, *GetQueueStatusRequest) (*GetQueueStatusResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetQueueStatus not implemented") } +func (UnimplementedStovepipeServer) ListOpenIssues(context.Context, *ListOpenIssuesRequest) (*ListOpenIssuesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListOpenIssues not implemented") +} func (UnimplementedStovepipeServer) mustEmbedUnimplementedStovepipeServer() {} func (UnimplementedStovepipeServer) testEmbeddedByValue() {} @@ -379,6 +397,24 @@ func _Stovepipe_GetQueueStatus_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } +func _Stovepipe_ListOpenIssues_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListOpenIssuesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StovepipeServer).ListOpenIssues(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Stovepipe_ListOpenIssues_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StovepipeServer).ListOpenIssues(ctx, req.(*ListOpenIssuesRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Stovepipe_ServiceDesc is the grpc.ServiceDesc for Stovepipe service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -418,6 +454,10 @@ var Stovepipe_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetQueueStatus", Handler: _Stovepipe_GetQueueStatus_Handler, }, + { + MethodName: "ListOpenIssues", + Handler: _Stovepipe_ListOpenIssues_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "stovepipe.proto", diff --git a/doc/rfc/stovepipe/open-issues-api.md b/doc/rfc/stovepipe/open-issues-api.md new file mode 100644 index 000000000..be53179f9 --- /dev/null +++ b/doc/rfc/stovepipe/open-issues-api.md @@ -0,0 +1,21 @@ +# Open issues API + +`ListOpenIssues` returns current open issue summaries for one configured queue in ascending bytewise task/unit order. An empty unit identifies a task-wide issue. The response exposes summary data without internal storage versions. + +## Bounded pagination + +The request selects a queue, page size, and opaque continuation token. Page size defaults to 50 and is limited to 200. It bounds the number of matching issues returned. The controller scans until the page fills, the lookup range is exhausted, or 500 lookup entries have been validated. Each storage batch reads one additional entry to detect whether the range continues; this lookahead entry is not validated or consumed by that batch. + +Continuations are bound to the selected queue and advance after the last examined task/unit key. Page size may change between calls. Malformed tokens, mismatched queues, unconfigured queues, and invalid page sizes are rejected. + +A page can contain fewer issues than requested, including zero, while still carrying a continuation when the inspection budget is reached. Clients must use the continuation token rather than response length to decide whether to keep reading. Pagination is not a snapshot: summaries and lookup membership can change during or between calls. + +## Summary validation + +The controller scans bounded ranges from the open-issue lookup and point-reads the corresponding summaries. It returns a summary only when its status is open and its opening matches the lookup reference. References to closed issues or previous openings are skipped. Skipped references still advance the cursor and count against the inspection budget. + +Summary-read failures fail the request rather than returning a partial page. A missing summary is also an error: summaries retain closed rows, and lookup writers persist the summary first. A lookup that returns a different task/unit identity from its summary is an infrastructure inconsistency. + +The API is read-only. It does not repair open-issue rows, scan operational issue state, perform database joins, or require secondary indexes. The issue-log materializer maintains the lookup during normal processing and recovery. + +An empty result does not establish build success or complete issue coverage. Historical rows without a materialized lookup are not backfilled by reads. Project-specific filtering, issue history, repair details, and the frontend are outside this API. diff --git a/service/stovepipe/server/handler/BUILD.bazel b/service/stovepipe/server/handler/BUILD.bazel index 7a449480d..8b4d0c0d1 100644 --- a/service/stovepipe/server/handler/BUILD.bazel +++ b/service/stovepipe/server/handler/BUILD.bazel @@ -19,6 +19,7 @@ go_library( go_test( name = "go_default_test", srcs = [ + "list_open_issues_test.go", "list_test.go", "queue_status_test.go", "server_test.go", diff --git a/service/stovepipe/server/handler/list_open_issues_test.go b/service/stovepipe/server/handler/list_open_issues_test.go new file mode 100644 index 000000000..570aec0bc --- /dev/null +++ b/service/stovepipe/server/handler/list_open_issues_test.go @@ -0,0 +1,64 @@ +// Copyright (c) 2026 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package handler + +import ( + "context" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + pb "github.com/uber/submitqueue/api/stovepipe/protopb" + "github.com/uber/submitqueue/stovepipe/controller" + controllermock "github.com/uber/submitqueue/stovepipe/controller/mock" + "github.com/uber/submitqueue/stovepipe/entity" + "go.uber.org/mock/gomock" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func TestListOpenIssues(t *testing.T) { + for _, tt := range []struct { + name string + err error + code codes.Code + }{ + {name: "success"}, + {name: "invalid input", err: controller.ErrInvalidRequest, code: codes.InvalidArgument}, + {name: "canceled", err: context.Canceled, code: codes.Canceled}, + {name: "deadline", err: context.DeadlineExceeded, code: codes.DeadlineExceeded}, + {name: "storage failure", err: assert.AnError, code: codes.Unknown}, + } { + t.Run(tt.name, func(t *testing.T) { + c := controllermock.NewMockListOpenIssuesController(gomock.NewController(t)) + result := entity.ListOpenIssuesResult{Issues: []entity.IssueSummary{{TaskID: "task", Status: entity.IssueStatusOpen, FirstSeenBuildID: "opening"}}, NextPageToken: "next"} + c.EXPECT().ListOpenIssues(gomock.Any(), entity.ListOpenIssuesRequest{Queue: "queue", PageSize: 10, PageToken: "token"}).Return(result, tt.err) + server := &StovepipeServer{openIssuesController: c} + got, err := server.ListOpenIssues(context.Background(), &pb.ListOpenIssuesRequest{Queue: "queue", PageSize: 10, PageToken: "token"}) + if tt.err != nil { + require.Equal(t, tt.code, status.Code(err)) + require.Nil(t, got) + if tt.err == assert.AnError { + require.ErrorIs(t, err, tt.err) + } + } else { + require.NoError(t, err) + require.Equal(t, "task", got.GetIssues()[0].GetTaskId()) + require.Equal(t, "open", got.GetIssues()[0].GetStatus()) + require.Equal(t, "next", got.GetNextPageToken()) + } + }) + } +} diff --git a/service/stovepipe/server/handler/list_test.go b/service/stovepipe/server/handler/list_test.go index 2b27b7001..1dbc24222 100644 --- a/service/stovepipe/server/handler/list_test.go +++ b/service/stovepipe/server/handler/list_test.go @@ -68,7 +68,7 @@ func TestList(t *testing.T) { }, req) return tt.result, tt.err }} - srv := NewStovepipeServer(nil, nil, nil, nil, fake, nil) + srv := NewStovepipeServer(nil, nil, nil, nil, fake, nil, nil) response, err := srv.List(ctx, &pb.ListRequest{ Queue: "queue", PageSize: 25, PageToken: "token", AcceptedLowerBound: &pb.ListRequest_AcceptedAtOrAfterMs{}, diff --git a/service/stovepipe/server/handler/queue_status_test.go b/service/stovepipe/server/handler/queue_status_test.go index 5efcd8d98..0f9b3e36a 100644 --- a/service/stovepipe/server/handler/queue_status_test.go +++ b/service/stovepipe/server/handler/queue_status_test.go @@ -53,7 +53,7 @@ func TestGetQueueStatus(t *testing.T) { require.Equal(t, entity.GetQueueStatusRequest{Queue: "repo/main", ChangeURI: "C"}, req) return entity.GetQueueStatusResult{Queue: "repo/main", Enablement: entity.QueueState{Version: 1, State: entity.QueueEnablementDisabled}}, wantErr }} - server := NewStovepipeServer(nil, nil, nil, nil, nil, fake) + server := NewStovepipeServer(nil, nil, nil, nil, nil, fake, nil) response, err := server.GetQueueStatus(context.Background(), &pb.GetQueueStatusRequest{Queue: "repo/main", ChangeUri: "C"}) if wantErr != nil { require.Equal(t, tt.code, status.Code(err)) diff --git a/service/stovepipe/server/handler/server.go b/service/stovepipe/server/handler/server.go index 5ca7d9db3..0f5883ada 100644 --- a/service/stovepipe/server/handler/server.go +++ b/service/stovepipe/server/handler/server.go @@ -37,6 +37,7 @@ type StovepipeServer struct { requestHistoryController controller.RequestHistoryController projectStatusController controller.ProjectStatusController listController controller.ListController + openIssuesController controller.ListOpenIssuesController queueStatusController controller.GetQueueStatusController } @@ -48,6 +49,7 @@ func NewStovepipeServer( projectStatusController controller.ProjectStatusController, listController controller.ListController, queueStatusController controller.GetQueueStatusController, + openIssuesController controller.ListOpenIssuesController, ) *StovepipeServer { return &StovepipeServer{ pingController: pingController, @@ -55,6 +57,7 @@ func NewStovepipeServer( requestHistoryController: requestHistoryController, projectStatusController: projectStatusController, listController: listController, + openIssuesController: openIssuesController, queueStatusController: queueStatusController, } } @@ -143,3 +146,18 @@ func (s *StovepipeServer) GetQueueStatus(ctx context.Context, req *pb.GetQueueSt } return mapper.GetQueueStatusResultToProto(result), nil } + +func (s *StovepipeServer) ListOpenIssues(ctx context.Context, req *pb.ListOpenIssuesRequest) (*pb.ListOpenIssuesResponse, error) { + result, err := s.openIssuesController.ListOpenIssues(ctx, mapper.ProtoToListOpenIssuesRequest(req)) + if err != nil { + switch { + case controller.IsInvalidRequest(err): + return nil, status.Error(codes.InvalidArgument, err.Error()) + case errors.Is(err, context.Canceled), errors.Is(err, context.DeadlineExceeded): + return nil, status.FromContextError(err).Err() + default: + return nil, err + } + } + return mapper.ListOpenIssuesResultToProto(result), nil +} diff --git a/service/stovepipe/server/main.go b/service/stovepipe/server/main.go index c8a78c545..c6e2009cb 100644 --- a/service/stovepipe/server/main.go +++ b/service/stovepipe/server/main.go @@ -303,7 +303,11 @@ func run() error { projectStatusController := controller.NewProjectStatusController(logger.Sugar(), scope, storageFty) listController := controller.NewListController(logger.Sugar(), scope, storageFty, tenants) queueStatusController := controller.NewGetQueueStatusController(scope, storageFty, sourceControl) - srv := handler.NewStovepipeServer(pingController, ingestController, requestHistoryController, projectStatusController, listController, queueStatusController) + openIssuesController := controller.NewListOpenIssuesController(logger.Sugar(), scope, storageFty, tenants) + srv := handler.NewStovepipeServer( + pingController, ingestController, requestHistoryController, projectStatusController, + listController, queueStatusController, openIssuesController, + ) pb.RegisterStovepipeServer(grpcServer, srv) // Register reflection service for debugging with grpcurl diff --git a/service/stovepipe/server/mapper/BUILD.bazel b/service/stovepipe/server/mapper/BUILD.bazel index 0f4c1b5a4..8a3a49632 100644 --- a/service/stovepipe/server/mapper/BUILD.bazel +++ b/service/stovepipe/server/mapper/BUILD.bazel @@ -5,6 +5,7 @@ go_library( srcs = [ "ingest.go", "list.go", + "list_open_issues.go", "project_status.go", "queue_status.go", "request_history.go", @@ -21,6 +22,7 @@ go_test( name = "go_default_test", srcs = [ "ingest_test.go", + "list_open_issues_test.go", "list_test.go", "project_status_test.go", "queue_status_test.go", diff --git a/service/stovepipe/server/mapper/list_open_issues.go b/service/stovepipe/server/mapper/list_open_issues.go new file mode 100644 index 000000000..d7ccdf3d2 --- /dev/null +++ b/service/stovepipe/server/mapper/list_open_issues.go @@ -0,0 +1,42 @@ +// Copyright (c) 2026 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mapper + +import ( + pb "github.com/uber/submitqueue/api/stovepipe/protopb" + "github.com/uber/submitqueue/stovepipe/entity" +) + +// ProtoToListOpenIssuesRequest leaves defaults and validation to the controller. +func ProtoToListOpenIssuesRequest(req *pb.ListOpenIssuesRequest) entity.ListOpenIssuesRequest { + return entity.ListOpenIssuesRequest{Queue: req.GetQueue(), PageSize: req.GetPageSize(), PageToken: req.GetPageToken()} +} + +// ListOpenIssuesResultToProto preserves summary order and the continuation token. +func ListOpenIssuesResultToProto(result entity.ListOpenIssuesResult) *pb.ListOpenIssuesResponse { + issues := make([]*pb.IssueSummary, len(result.Issues)) + for i, summary := range result.Issues { + issues[i] = &pb.IssueSummary{ + TaskId: summary.TaskID, + UnitId: summary.UnitID, + Status: string(summary.Status), + FirstSeenBuildId: summary.FirstSeenBuildID, + RequestId: summary.RequestID, + BuildId: summary.BuildID, + ChangedAtMs: summary.ChangedAtMs, + } + } + return &pb.ListOpenIssuesResponse{Issues: issues, NextPageToken: result.NextPageToken} +} diff --git a/service/stovepipe/server/mapper/list_open_issues_test.go b/service/stovepipe/server/mapper/list_open_issues_test.go new file mode 100644 index 000000000..752ed09d8 --- /dev/null +++ b/service/stovepipe/server/mapper/list_open_issues_test.go @@ -0,0 +1,43 @@ +// Copyright (c) 2026 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mapper + +import ( + "testing" + + "github.com/stretchr/testify/require" + pb "github.com/uber/submitqueue/api/stovepipe/protopb" + "github.com/uber/submitqueue/stovepipe/entity" +) + +func TestProtoToListOpenIssuesRequest(t *testing.T) { + require.Empty(t, ProtoToListOpenIssuesRequest(nil)) + req := &pb.ListOpenIssuesRequest{Queue: "queue", PageSize: 10, PageToken: "token"} + require.Equal(t, entity.ListOpenIssuesRequest{Queue: "queue", PageSize: 10, PageToken: "token"}, ProtoToListOpenIssuesRequest(req)) +} + +func TestListOpenIssuesResultToProto(t *testing.T) { + result := entity.ListOpenIssuesResult{Issues: []entity.IssueSummary{ + {TaskID: "task", UnitID: "unit", Status: entity.IssueStatusOpen, FirstSeenBuildID: "opening", RequestID: "100", BuildID: "source", ChangedAtMs: 1000, Version: 9}, + {TaskID: "task-wide", Status: entity.IssueStatusOpen, FirstSeenBuildID: "other", RequestID: "101", BuildID: "other", ChangedAtMs: 2000, Version: 1}, + }, NextPageToken: "next"} + require.Equal(t, &pb.ListOpenIssuesResponse{Issues: []*pb.IssueSummary{ + {TaskId: "task", UnitId: "unit", Status: "open", FirstSeenBuildId: "opening", RequestId: "100", BuildId: "source", ChangedAtMs: 1000}, + {TaskId: "task-wide", Status: "open", FirstSeenBuildId: "other", RequestId: "101", BuildId: "other", ChangedAtMs: 2000}, + }, NextPageToken: "next"}, ListOpenIssuesResultToProto(result)) + empty := ListOpenIssuesResultToProto(entity.ListOpenIssuesResult{}) + require.Empty(t, empty.GetIssues()) + require.Empty(t, empty.GetNextPageToken()) +} diff --git a/stovepipe/core/issuelog/README.md b/stovepipe/core/issuelog/README.md index c1df208f6..665e7f7aa 100644 --- a/stovepipe/core/issuelog/README.md +++ b/stovepipe/core/issuelog/README.md @@ -14,4 +14,4 @@ Each iteration reads the open-issue row before the summary. Otherwise, a worker The two projections are not updated atomically. A future list reader must still verify that each referenced summary is open and its opening matches. No status filtering, cross-record transaction, or queue-wide scan is required to maintain one open-issue row. -This materializer does not backfill existing history or expose a list API. Source builds must remain readable while their transitions can be replayed. +This materializer does not backfill existing history. The [open-issues API](../../../doc/rfc/stovepipe/open-issues-api.md) reads the lookup and validates referenced summaries. Source builds must remain readable while their transitions can be replayed. diff --git a/stovepipe/extension/storage/README.md b/stovepipe/extension/storage/README.md index 872108b9c..4a335c196 100644 --- a/stovepipe/extension/storage/README.md +++ b/stovepipe/extension/storage/README.md @@ -56,7 +56,7 @@ The MySQL backend uses `issue_state` for operational tracking. The separate `ope `RequestID` and `BuildID` identify the latest represented transition, while `FirstSeenBuildID` identifies its current or most recent opening. Source order follows request ingest order, not opaque build IDs or timestamps. Within the same request, a closing transition supersedes an opening. `Version` is only the summary's CAS guard, not the source order. The materializer must compare incoming transitions before replacing a summary; the store does not enforce lifecycle ordering. -The MySQL primary key is `(queue, task_id, unit_id)` with byte-exact identity and the same identifier limits as the issue-state store. Source request IDs follow the existing canonical positive decimal ID contract. The new `issue_summary` table must exist before deploying readers or writers. The [issue-log materializer](../../core/issuelog/README.md) updates summaries during normal issue tracking and recovery. No public open-issues list is exposed yet. +The MySQL primary key is `(queue, task_id, unit_id)` with byte-exact identity and the same identifier limits as the issue-state store. Source request IDs follow the existing canonical positive decimal ID contract. The new `issue_summary` table must exist before deploying readers or writers. The [issue-log materializer](../../core/issuelog/README.md) updates summaries during normal issue tracking and recovery. The [open-issues API](../../../doc/rfc/stovepipe/open-issues-api.md) lists summaries through the derived lookup. ## Open-issue lookups @@ -66,7 +66,7 @@ Create returns `ErrAlreadyExists` for any existing task/unit key. Replace compar Listing traverses a bounded queue-prefix primary-key range in ascending bytewise task/unit order. The zero cursor starts the range; otherwise the cursor excludes its key and all earlier keys, even if that open-issue row has been deleted. Empty units identify task-wide issues, while task IDs must be nonempty. Membership can change between reads. A consumer that skips stale references must still advance after the last returned open-issue row, not the last accepted issue. -Open-issue rows are not authoritative issue status. A delayed create can leave a reference to a closed issue, so readers must verify that the summary is open and its opening matches before returning a result. The store does not read summaries, enforce source ordering, backfill existing rows, or populate open-issue rows automatically. The [issue-log materializer](../../core/issuelog/README.md#open-issue-lookup) maintains open-issue rows after summary persistence during normal processing and recovery. No public list API uses this store yet. +Open-issue rows are not authoritative issue status. A delayed create can leave a reference to a closed issue, so readers must verify that the summary is open and its opening matches before returning a result. The store does not read summaries, enforce source ordering, backfill existing rows, or populate open-issue rows automatically. The [issue-log materializer](../../core/issuelog/README.md#open-issue-lookup) maintains open-issue rows after summary persistence during normal processing and recovery. The open-issues API validates summaries before returning results and advances its continuation after the last examined open-issue row, including skipped references. ## Issue lifecycle history diff --git a/test/e2e/stovepipe/BUILD.bazel b/test/e2e/stovepipe/BUILD.bazel index ccb790b2b..b02c3710a 100644 --- a/test/e2e/stovepipe/BUILD.bazel +++ b/test/e2e/stovepipe/BUILD.bazel @@ -7,6 +7,7 @@ go_test( "ingest_test.go", "issuetrack_test.go", "list_test.go", + "open_issues_test.go", "queue_status_test.go", "suite_test.go", ], diff --git a/test/e2e/stovepipe/open_issues_test.go b/test/e2e/stovepipe/open_issues_test.go new file mode 100644 index 000000000..ab1fd552a --- /dev/null +++ b/test/e2e/stovepipe/open_issues_test.go @@ -0,0 +1,81 @@ +// Copyright (c) 2026 Uber Technologies, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package e2e_test + +import ( + "github.com/stretchr/testify/require" + pb "github.com/uber/submitqueue/api/stovepipe/protopb" + "github.com/uber/submitqueue/stovepipe/entity" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" + "google.golang.org/protobuf/proto" +) + +const openIssuesQueue = "e2e-stovepipe/open-issues" + +func (s *StovepipeE2ESuite) TestListOpenIssues() { + t := s.T() + stores, err := s.appStorage.For(openIssuesQueue) + require.NoError(t, err) + for _, summary := range []entity.IssueSummary{ + {TaskID: "a", Status: entity.IssueStatusClosed, FirstSeenBuildID: "build/a", RequestID: "100", BuildID: "build/a-closed", ChangedAtMs: 1000, Version: 1}, + {TaskID: "b", Status: entity.IssueStatusOpen, FirstSeenBuildID: "build/b-new", RequestID: "100", BuildID: "build/b-new", ChangedAtMs: 1000, Version: 1}, + {TaskID: "c", Status: entity.IssueStatusOpen, FirstSeenBuildID: "build/c", RequestID: "100", BuildID: "build/c", ChangedAtMs: 1000, Version: 1}, + {TaskID: "d", UnitID: "unit", Status: entity.IssueStatusOpen, FirstSeenBuildID: "build/d", RequestID: "100", BuildID: "build/d", ChangedAtMs: 1000, Version: 1}, + {TaskID: "e", Status: entity.IssueStatusOpen, FirstSeenBuildID: "build/e", RequestID: "100", BuildID: "build/e", ChangedAtMs: 1000, Version: 1}, + {TaskID: "f", UnitID: "unit", Status: entity.IssueStatusOpen, FirstSeenBuildID: "build/f", RequestID: "100", BuildID: "build/f", ChangedAtMs: 1000, Version: 1}, + } { + require.NoError(t, stores.GetIssueSummaryStore().Create(s.ctx, summary)) + opening := summary.FirstSeenBuildID + if summary.TaskID == "b" { + opening = "build/b-old" + } + require.NoError(t, stores.GetOpenIssueStore().Create(s.ctx, entity.OpenIssue{TaskID: summary.TaskID, UnitID: summary.UnitID, FirstSeenBuildID: opening})) + } + + first, err := s.client.ListOpenIssues(s.ctx, &pb.ListOpenIssuesRequest{Queue: openIssuesQueue, PageSize: 2}) + require.NoError(t, err) + require.Len(t, first.GetIssues(), 2) + require.Equal(t, "c", first.GetIssues()[0].GetTaskId()) + require.Equal(t, "d", first.GetIssues()[1].GetTaskId()) + require.NotEmpty(t, first.GetNextPageToken()) + _, err = s.client.ListOpenIssues(s.ctx, &pb.ListOpenIssuesRequest{Queue: listOtherQueue, PageToken: first.GetNextPageToken()}) + require.Equal(t, codes.InvalidArgument, status.Code(err)) + + second, err := s.client.ListOpenIssues(s.ctx, &pb.ListOpenIssuesRequest{Queue: openIssuesQueue, PageSize: 1, PageToken: first.GetNextPageToken()}) + require.NoError(t, err) + require.Len(t, second.GetIssues(), 1) + require.Equal(t, "e", second.GetIssues()[0].GetTaskId()) + require.Empty(t, second.GetIssues()[0].GetUnitId()) + require.NotEmpty(t, second.GetNextPageToken()) + + third, err := s.client.ListOpenIssues(s.ctx, &pb.ListOpenIssuesRequest{Queue: openIssuesQueue, PageSize: 200, PageToken: second.GetNextPageToken()}) + require.NoError(t, err) + require.Len(t, third.GetIssues(), 1) + require.True(t, proto.Equal(&pb.IssueSummary{TaskId: "f", UnitId: "unit", Status: "open", FirstSeenBuildId: "build/f", RequestId: "100", BuildId: "build/f", ChangedAtMs: 1000}, third.GetIssues()[0])) + require.Empty(t, third.GetNextPageToken()) + + closed, err := stores.GetIssueSummaryStore().Get(s.ctx, "d", "unit") + require.NoError(t, err) + closed.Status, closed.BuildID, closed.RequestID, closed.ChangedAtMs = entity.IssueStatusClosed, "build/d-closed", "101", 2000 + require.NoError(t, stores.GetIssueSummaryStore().Update(s.ctx, closed, 1, 2)) + current, err := s.client.ListOpenIssues(s.ctx, &pb.ListOpenIssuesRequest{Queue: openIssuesQueue, PageSize: 200}) + require.NoError(t, err) + require.Len(t, current.GetIssues(), 3) + require.Equal(t, "c", current.GetIssues()[0].GetTaskId()) + require.Equal(t, "e", current.GetIssues()[1].GetTaskId()) + require.Equal(t, "f", current.GetIssues()[2].GetTaskId()) + require.Empty(t, current.GetNextPageToken()) +} diff --git a/test/e2e/stovepipe/suite_test.go b/test/e2e/stovepipe/suite_test.go index 4f09f0f58..db08c0693 100644 --- a/test/e2e/stovepipe/suite_test.go +++ b/test/e2e/stovepipe/suite_test.go @@ -65,7 +65,7 @@ func (s *StovepipeE2ESuite) SetupSuite() { t.Setenv("MQ_TENANTS", strings.Join([]string{ "monorepo/main", "monorepo/release", "monorepo/slow?buildrunner-fake=build-slow", listPaginationQueue, listTimeBoundsQueue, listPrimaryQueue, listOtherQueue, listValidationQueue, queueStateTestQueue, - issueTrackingQueue, issueTrackingDLQQueue, + issueTrackingQueue, issueTrackingDLQQueue, openIssuesQueue, }, ",")) s.log.Logf("Starting Stovepipe e2e test suite using docker-compose") 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 9114a64b9..67277b820 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("CiNhcGkvc3RvdmVwaXBlL3Byb3RvL3N0b3ZlcGlwZS5wcm90bxIadWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUiHgoLUGluZ1JlcXVlc3QSDwoHbWVzc2FnZRgBIAEoCSJaCgxQaW5nUmVzcG9uc2USDwoHbWVzc2FnZRgBIAEoCRIUCgxzZXJ2aWNlX25hbWUYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDEhAKCGhvc3RuYW1lGAQgASgJIl8KDUluZ2VzdFJlcXVlc3QSDQoFcXVldWUYASABKAkSPwoKZW5hYmxlbWVudBgCIAEoDjIrLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlF1ZXVlRW5hYmxlbWVudCJjCg5Jbmdlc3RSZXNwb25zZRIKCgJpZBgBIAEoCRJFCgplbmFibGVtZW50GAIgASgLMjEudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUXVldWVFbmFibGVtZW50U3RhdHVzIkEKHEdldFJlcXVlc3RIaXN0b3J5QnlJRFJlcXVlc3QSDQoFcXVldWUYASABKAkSEgoKcmVxdWVzdF9pZBgCIAEoCSI7Ch1HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRILCgN1cmkYAiABKAkihgEKDEhpc3RvcnlFdmVudBIQCghldmVudF9pZBgBIAEoCRIUCgx0aW1lc3RhbXBfbXMYAiABKAMSFwoNcmVxdWVzdF9zdGF0ZRgDIAEoCUgAEg8KBWV2ZW50GAQgASgJSAASFgoOb3V0Y29tZV9yZWFzb24YBSABKAlCDAoKb2NjdXJyZW5jZSKjAQoOUmVxdWVzdEhpc3RvcnkSEgoKcmVxdWVzdF9pZBgBIAEoCRI4CgZldmVudHMYAiADKAsyKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5RXZlbnQSQwoPcmVxdWVzdF9zdW1tYXJ5GAMgASgLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdFN1bW1hcnkingEKHUdldFJlcXVlc3RIaXN0b3J5QnlJRFJlc3BvbnNlEjgKBmV2ZW50cxgBIAMoCzIoLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlFdmVudBJDCg9yZXF1ZXN0X3N1bW1hcnkYAiABKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeSJfCh5HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVzcG9uc2USPQoJaGlzdG9yaWVzGAEgAygLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdEhpc3RvcnkieQobR2V0UHJvamVjdFN0YXR1c0J5SURSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCnJlcXVlc3RfaWQYAiABKAkSEAoIcHJvamVjdHMYAyADKAkSEQoJcGFnZV9zaXplGAQgASgFEhIKCnBhZ2VfdG9rZW4YBSABKAkiegocR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpjaGFuZ2VfdXJpGAIgASgJEhAKCHByb2plY3RzGAMgAygJEhEKCXBhZ2Vfc2l6ZRgEIAEoBRISCgpwYWdlX3Rva2VuGAUgASgJIkkKEVByb2plY3RWYWxpZGF0aW9uEg8KB3Byb2plY3QYASABKAkSGQoPYnJlYWthZ2VfZGVncmVlGAIgASgBSABCCAoGcmVzdWx0IswCChxHZXRQcm9qZWN0U3RhdHVzQnlJRFJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhUKDXVwZGF0ZWRfYXRfbXMYCiABKAMSJAoacmVwb3NpdG9yeV9icmVha2FnZV9kZWdyZWUYBiABKAFIABIgChhwcm9qZWN0X3Jlc3VsdHNfY29tcGxldGUYByABKAgSPwoIcHJvamVjdHMYCCADKAsyLS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Qcm9qZWN0VmFsaWRhdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YCSABKAlCEwoRcmVwb3NpdG9yeV9yZXN1bHQizQIKHUdldFByb2plY3RTdGF0dXNCeVVSSVJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhUKDXVwZGF0ZWRfYXRfbXMYCiABKAMSJAoacmVwb3NpdG9yeV9icmVha2FnZV9kZWdyZWUYBiABKAFIABIgChhwcm9qZWN0X3Jlc3VsdHNfY29tcGxldGUYByABKAgSPwoIcHJvamVjdHMYCCADKAsyLS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Qcm9qZWN0VmFsaWRhdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YCSABKAlCEwoRcmVwb3NpdG9yeV9yZXN1bHQi8gEKDlJlcXVlc3RTdW1tYXJ5EhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhsKE3N0YXRlX3VwZGF0ZWRfYXRfbXMYBiABKAMSFgoOYWNjZXB0ZWRfYXRfbXMYByABKAMSFgoOb3V0Y29tZV9yZWFzb24YCCABKAkSFQoNcHJvamVjdF9jb3VudBgJIAEoBRIcChRicm9rZW5fcHJvamVjdF9jb3VudBgKIAEoBSK0AQoLTGlzdFJlcXVlc3QSDQoFcXVldWUYASABKAkSIQoXYWNjZXB0ZWRfYXRfb3JfYWZ0ZXJfbXMYAiABKANIABIcChJhY2NlcHRlZF9iZWZvcmVfbXMYAyABKANIARIRCglwYWdlX3NpemUYBCABKAUSEgoKcGFnZV90b2tlbhgFIAEoCUIWChRhY2NlcHRlZF9sb3dlcl9ib3VuZEIWChRhY2NlcHRlZF91cHBlcl9ib3VuZCJlCgxMaXN0UmVzcG9uc2USPAoIcmVxdWVzdHMYASADKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkiOgoVR2V0UXVldWVTdGF0dXNSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCmNoYW5nZV91cmkYAiABKAkingEKFVF1ZXVlRW5hYmxlbWVudFN0YXR1cxIPCgd2ZXJzaW9uGAEgASgDEjoKBXN0YXRlGAIgASgOMisudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUXVldWVFbmFibGVtZW50EiEKGWVmZmVjdGl2ZV9mcm9tX2NvbW1pdF91cmkYAyABKAkSFQoNY2hhbmdlZF9hdF9tcxgEIAEoAyJuChZHZXRRdWV1ZVN0YXR1c1Jlc3BvbnNlEg0KBXF1ZXVlGAEgASgJEkUKCmVuYWJsZW1lbnQYAiABKAsyMS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5RdWV1ZUVuYWJsZW1lbnRTdGF0dXMqbAoPUXVldWVFbmFibGVtZW50EhwKGFFVRVVFX0VOQUJMRU1FTlRfVU5LTk9XThAAEhwKGFFVRVVFX0VOQUJMRU1FTlRfRU5BQkxFRBABEh0KGVFVRVVFX0VOQUJMRU1FTlRfRElTQUJMRUQQAjLnBwoJU3RvdmVwaXBlElsKBFBpbmcSJy51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5QaW5nUmVxdWVzdBooLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlBpbmdSZXNwb25zZSIAEmEKBkluZ2VzdBIpLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkluZ2VzdFJlcXVlc3QaKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Jbmdlc3RSZXNwb25zZSIAEo4BChVHZXRSZXF1ZXN0SGlzdG9yeUJ5SUQSOC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRSZXF1ZXN0SGlzdG9yeUJ5SURSZXF1ZXN0GjkudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVzcG9uc2UiABKRAQoWR2V0UmVxdWVzdEhpc3RvcnlCeVVSSRI5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXF1ZXN0GjoudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeVVSSVJlc3BvbnNlIgASiwEKFEdldFByb2plY3RTdGF0dXNCeUlEEjcudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5SURSZXF1ZXN0GjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5SURSZXNwb25zZSIAEo4BChVHZXRQcm9qZWN0U3RhdHVzQnlVUkkSOC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRQcm9qZWN0U3RhdHVzQnlVUklSZXF1ZXN0GjkudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVzcG9uc2UiABJbCgRMaXN0EicudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuTGlzdFJlcXVlc3QaKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5MaXN0UmVzcG9uc2UiABJ5Cg5HZXRRdWV1ZVN0YXR1cxIxLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFF1ZXVlU3RhdHVzUmVxdWVzdBoyLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFF1ZXVlU3RhdHVzUmVzcG9uc2UiAEJlCh5jb20udWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGVCDlN0b3ZlcGlwZVByb3RvUAFaMWdpdGh1Yi5jb20vdWJlci9zdWJtaXRxdWV1ZS9hcGkvc3RvdmVwaXBlL3Byb3RvcGJiBnByb3RvMw"); + fileDesc("CiNhcGkvc3RvdmVwaXBlL3Byb3RvL3N0b3ZlcGlwZS5wcm90bxIadWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUiHgoLUGluZ1JlcXVlc3QSDwoHbWVzc2FnZRgBIAEoCSJaCgxQaW5nUmVzcG9uc2USDwoHbWVzc2FnZRgBIAEoCRIUCgxzZXJ2aWNlX25hbWUYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDEhAKCGhvc3RuYW1lGAQgASgJIl8KDUluZ2VzdFJlcXVlc3QSDQoFcXVldWUYASABKAkSPwoKZW5hYmxlbWVudBgCIAEoDjIrLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlF1ZXVlRW5hYmxlbWVudCJjCg5Jbmdlc3RSZXNwb25zZRIKCgJpZBgBIAEoCRJFCgplbmFibGVtZW50GAIgASgLMjEudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUXVldWVFbmFibGVtZW50U3RhdHVzIkEKHEdldFJlcXVlc3RIaXN0b3J5QnlJRFJlcXVlc3QSDQoFcXVldWUYASABKAkSEgoKcmVxdWVzdF9pZBgCIAEoCSI7Ch1HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRILCgN1cmkYAiABKAkihgEKDEhpc3RvcnlFdmVudBIQCghldmVudF9pZBgBIAEoCRIUCgx0aW1lc3RhbXBfbXMYAiABKAMSFwoNcmVxdWVzdF9zdGF0ZRgDIAEoCUgAEg8KBWV2ZW50GAQgASgJSAASFgoOb3V0Y29tZV9yZWFzb24YBSABKAlCDAoKb2NjdXJyZW5jZSKjAQoOUmVxdWVzdEhpc3RvcnkSEgoKcmVxdWVzdF9pZBgBIAEoCRI4CgZldmVudHMYAiADKAsyKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5IaXN0b3J5RXZlbnQSQwoPcmVxdWVzdF9zdW1tYXJ5GAMgASgLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdFN1bW1hcnkingEKHUdldFJlcXVlc3RIaXN0b3J5QnlJRFJlc3BvbnNlEjgKBmV2ZW50cxgBIAMoCzIoLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlFdmVudBJDCg9yZXF1ZXN0X3N1bW1hcnkYAiABKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeSJfCh5HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVzcG9uc2USPQoJaGlzdG9yaWVzGAEgAygLMioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUmVxdWVzdEhpc3RvcnkieQobR2V0UHJvamVjdFN0YXR1c0J5SURSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCnJlcXVlc3RfaWQYAiABKAkSEAoIcHJvamVjdHMYAyADKAkSEQoJcGFnZV9zaXplGAQgASgFEhIKCnBhZ2VfdG9rZW4YBSABKAkiegocR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpjaGFuZ2VfdXJpGAIgASgJEhAKCHByb2plY3RzGAMgAygJEhEKCXBhZ2Vfc2l6ZRgEIAEoBRISCgpwYWdlX3Rva2VuGAUgASgJIkkKEVByb2plY3RWYWxpZGF0aW9uEg8KB3Byb2plY3QYASABKAkSGQoPYnJlYWthZ2VfZGVncmVlGAIgASgBSABCCAoGcmVzdWx0IswCChxHZXRQcm9qZWN0U3RhdHVzQnlJRFJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhUKDXVwZGF0ZWRfYXRfbXMYCiABKAMSJAoacmVwb3NpdG9yeV9icmVha2FnZV9kZWdyZWUYBiABKAFIABIgChhwcm9qZWN0X3Jlc3VsdHNfY29tcGxldGUYByABKAgSPwoIcHJvamVjdHMYCCADKAsyLS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Qcm9qZWN0VmFsaWRhdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YCSABKAlCEwoRcmVwb3NpdG9yeV9yZXN1bHQizQIKHUdldFByb2plY3RTdGF0dXNCeVVSSVJlc3BvbnNlEhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhUKDXVwZGF0ZWRfYXRfbXMYCiABKAMSJAoacmVwb3NpdG9yeV9icmVha2FnZV9kZWdyZWUYBiABKAFIABIgChhwcm9qZWN0X3Jlc3VsdHNfY29tcGxldGUYByABKAgSPwoIcHJvamVjdHMYCCADKAsyLS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Qcm9qZWN0VmFsaWRhdGlvbhIXCg9uZXh0X3BhZ2VfdG9rZW4YCSABKAlCEwoRcmVwb3NpdG9yeV9yZXN1bHQi8gEKDlJlcXVlc3RTdW1tYXJ5EhIKCnJlcXVlc3RfaWQYASABKAkSDQoFcXVldWUYAiABKAkSEgoKY2hhbmdlX3VyaRgDIAEoCRIQCghiYXNlX3VyaRgEIAEoCRIVCg1yZXF1ZXN0X3N0YXRlGAUgASgJEhsKE3N0YXRlX3VwZGF0ZWRfYXRfbXMYBiABKAMSFgoOYWNjZXB0ZWRfYXRfbXMYByABKAMSFgoOb3V0Y29tZV9yZWFzb24YCCABKAkSFQoNcHJvamVjdF9jb3VudBgJIAEoBRIcChRicm9rZW5fcHJvamVjdF9jb3VudBgKIAEoBSK0AQoLTGlzdFJlcXVlc3QSDQoFcXVldWUYASABKAkSIQoXYWNjZXB0ZWRfYXRfb3JfYWZ0ZXJfbXMYAiABKANIABIcChJhY2NlcHRlZF9iZWZvcmVfbXMYAyABKANIARIRCglwYWdlX3NpemUYBCABKAUSEgoKcGFnZV90b2tlbhgFIAEoCUIWChRhY2NlcHRlZF9sb3dlcl9ib3VuZEIWChRhY2NlcHRlZF91cHBlcl9ib3VuZCJlCgxMaXN0UmVzcG9uc2USPAoIcmVxdWVzdHMYASADKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkiOgoVR2V0UXVldWVTdGF0dXNSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCmNoYW5nZV91cmkYAiABKAkingEKFVF1ZXVlRW5hYmxlbWVudFN0YXR1cxIPCgd2ZXJzaW9uGAEgASgDEjoKBXN0YXRlGAIgASgOMisudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUXVldWVFbmFibGVtZW50EiEKGWVmZmVjdGl2ZV9mcm9tX2NvbW1pdF91cmkYAyABKAkSFQoNY2hhbmdlZF9hdF9tcxgEIAEoAyJuChZHZXRRdWV1ZVN0YXR1c1Jlc3BvbnNlEg0KBXF1ZXVlGAEgASgJEkUKCmVuYWJsZW1lbnQYAiABKAsyMS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5RdWV1ZUVuYWJsZW1lbnRTdGF0dXMimgEKDElzc3VlU3VtbWFyeRIPCgd0YXNrX2lkGAEgASgJEg8KB3VuaXRfaWQYAiABKAkSDgoGc3RhdHVzGAMgASgJEhsKE2ZpcnN0X3NlZW5fYnVpbGRfaWQYBCABKAkSEgoKcmVxdWVzdF9pZBgFIAEoCRIQCghidWlsZF9pZBgGIAEoCRIVCg1jaGFuZ2VkX2F0X21zGAcgASgDIk0KFUxpc3RPcGVuSXNzdWVzUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRIRCglwYWdlX3NpemUYAiABKAUSEgoKcGFnZV90b2tlbhgDIAEoCSJrChZMaXN0T3Blbklzc3Vlc1Jlc3BvbnNlEjgKBmlzc3VlcxgBIAMoCzIoLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLklzc3VlU3VtbWFyeRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkqbAoPUXVldWVFbmFibGVtZW50EhwKGFFVRVVFX0VOQUJMRU1FTlRfVU5LTk9XThAAEhwKGFFVRVVFX0VOQUJMRU1FTlRfRU5BQkxFRBABEh0KGVFVRVVFX0VOQUJMRU1FTlRfRElTQUJMRUQQAjLiCAoJU3RvdmVwaXBlElsKBFBpbmcSJy51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5QaW5nUmVxdWVzdBooLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlBpbmdSZXNwb25zZSIAEmEKBkluZ2VzdBIpLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkluZ2VzdFJlcXVlc3QaKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Jbmdlc3RSZXNwb25zZSIAEo4BChVHZXRSZXF1ZXN0SGlzdG9yeUJ5SUQSOC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRSZXF1ZXN0SGlzdG9yeUJ5SURSZXF1ZXN0GjkudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVzcG9uc2UiABKRAQoWR2V0UmVxdWVzdEhpc3RvcnlCeVVSSRI5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXF1ZXN0GjoudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeVVSSVJlc3BvbnNlIgASiwEKFEdldFByb2plY3RTdGF0dXNCeUlEEjcudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5SURSZXF1ZXN0GjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5SURSZXNwb25zZSIAEo4BChVHZXRQcm9qZWN0U3RhdHVzQnlVUkkSOC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRQcm9qZWN0U3RhdHVzQnlVUklSZXF1ZXN0GjkudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVzcG9uc2UiABJbCgRMaXN0EicudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuTGlzdFJlcXVlc3QaKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5MaXN0UmVzcG9uc2UiABJ5Cg5HZXRRdWV1ZVN0YXR1cxIxLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFF1ZXVlU3RhdHVzUmVxdWVzdBoyLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFF1ZXVlU3RhdHVzUmVzcG9uc2UiABJ5Cg5MaXN0T3Blbklzc3VlcxIxLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkxpc3RPcGVuSXNzdWVzUmVxdWVzdBoyLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkxpc3RPcGVuSXNzdWVzUmVzcG9uc2UiAEJlCh5jb20udWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGVCDlN0b3ZlcGlwZVByb3RvUAFaMWdpdGh1Yi5jb20vdWJlci9zdWJtaXRxdWV1ZS9hcGkvc3RvdmVwaXBlL3Byb3RvcGJiBnByb3RvMw"); /** * PingRequest is the request for the Ping method @@ -926,6 +926,134 @@ export type GetQueueStatusResponse = Message<"uber.submitqueue.stovepipe.GetQueu export const GetQueueStatusResponseSchema: GenMessage = /*@__PURE__*/ messageDesc(file_api_stovepipe_proto_stovepipe, 20); +/** + * IssueSummary is the current materialized view of a validation issue. + * + * @generated from message uber.submitqueue.stovepipe.IssueSummary + */ +export type IssueSummary = Message<"uber.submitqueue.stovepipe.IssueSummary"> & { + /** + * Logical validation task. + * + * @generated from field: string task_id = 1; + */ + taskId: string; + + /** + * Validation unit; empty identifies a task-wide issue. + * + * @generated from field: string unit_id = 2; + */ + unitId: string; + + /** + * Materialized status. ListOpenIssues returns only "open". + * + * @generated from field: string status = 3; + */ + status: string; + + /** + * Build where the current or most recent opening was first observed. + * + * @generated from field: string first_seen_build_id = 4; + */ + firstSeenBuildId: string; + + /** + * Source request of the latest status transition. + * + * @generated from field: string request_id = 5; + */ + requestId: string; + + /** + * Source build of the latest status transition. + * + * @generated from field: string build_id = 6; + */ + buildId: string; + + /** + * Original transition timestamp in Unix milliseconds. + * + * @generated from field: int64 changed_at_ms = 7; + */ + changedAtMs: bigint; +}; + +/** + * Describes the 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); + +/** + * ListOpenIssuesRequest selects current open issues within one queue. + * + * @generated from message uber.submitqueue.stovepipe.ListOpenIssuesRequest + */ +export type ListOpenIssuesRequest = Message<"uber.submitqueue.stovepipe.ListOpenIssuesRequest"> & { + /** + * Required configured queue. + * + * @generated from field: string queue = 1; + */ + queue: string; + + /** + * Maximum issues to return. Zero selects 50; otherwise 1 through 200. + * + * @generated from field: int32 page_size = 2; + */ + pageSize: number; + + /** + * Opaque continuation bound to the queue and task/unit ordering. + * + * @generated from field: string page_token = 3; + */ + pageToken: string; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.ListOpenIssuesRequest. + * Use `create(ListOpenIssuesRequestSchema)` to create a new message. + */ +export const ListOpenIssuesRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 22); + +/** + * ListOpenIssuesResponse is not a snapshot across calls. + * + * @generated from message uber.submitqueue.stovepipe.ListOpenIssuesResponse + */ +export type ListOpenIssuesResponse = Message<"uber.submitqueue.stovepipe.ListOpenIssuesResponse"> & { + /** + * Open summaries in ascending bytewise task/unit order. + * The inspection budget can leave this partial or empty even with a continuation. + * + * @generated from field: repeated uber.submitqueue.stovepipe.IssueSummary issues = 1; + */ + issues: IssueSummary[]; + + /** + * Continues after the last examined open-issue row, including skipped references. + * Empty means no further open-issue row was observed. + * + * @generated from field: string next_page_token = 2; + */ + nextPageToken: string; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.ListOpenIssuesResponse. + * Use `create(ListOpenIssuesResponseSchema)` to create a new message. + */ +export const ListOpenIssuesResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 23); + /** * QueueEnablement is independent of validation results and execution controls. * @@ -1043,6 +1171,16 @@ export const Stovepipe: GenService<{ input: typeof GetQueueStatusRequestSchema; output: typeof GetQueueStatusResponseSchema; }, + /** + * ListOpenIssues returns current open issues validated against their summaries. + * + * @generated from rpc uber.submitqueue.stovepipe.Stovepipe.ListOpenIssues + */ + listOpenIssues: { + methodKind: "unary"; + input: typeof ListOpenIssuesRequestSchema; + output: typeof ListOpenIssuesResponseSchema; + }, }> = /*@__PURE__*/ serviceDesc(file_api_stovepipe_proto_stovepipe, 0);