From a9f680a67aec159cb743466571d91442e6b52dd4 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Tue, 13 Oct 2026 16:38:53 +0000 Subject: [PATCH 1/7] feat(stovepipe): [DRAFT] define queue status API and RFC MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Summary: Queue enablement needs a dedicated lookup: validation results and the current queue row do not identify the state covering an arbitrary commit. Define GetQueueStatus with an optional change URI and one selected state, commit generated bindings, and document inclusive boundaries, intermediate commits and error semantics in the indexed RFC. The RPC remains unimplemented until the final layer. Part 1 of 4: API and RFC → storage → transitions and materialization → lookup. Test Plan: Build the published bindings and run the Stovepipe server tests. The final stack also passes all 27 Stovepipe unit, MySQL integration, service integration and end-to-end targets. --- api/stovepipe/proto/stovepipe.proto | 41 ++ api/stovepipe/protopb/stovepipe.pb.go | 365 +++++++++++++++--- api/stovepipe/protopb/stovepipe.pb.yarpc.go | 207 ++++++---- api/stovepipe/protopb/stovepipe_grpc.pb.go | 40 ++ doc/rfc/index.md | 1 + doc/rfc/stovepipe/queue-state.md | 22 ++ service/stovepipe/server/handler/BUILD.bazel | 3 + .../server/handler/queue_status_test.go | 32 ++ 8 files changed, 589 insertions(+), 122 deletions(-) create mode 100644 doc/rfc/stovepipe/queue-state.md create mode 100644 service/stovepipe/server/handler/queue_status_test.go diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index 294bbc8f7..ccd9aa752 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -247,6 +247,45 @@ message ListResponse { string next_page_token = 2; } +// GetQueueStatusRequest selects applied enablement for a queue and optional commit. +message GetQueueStatusRequest { + // Required stable repo-and-ref queue name. + string queue = 1; + // Optional immutable commit URI. Empty selects the latest materialized state. + // Intermediate commits need no validation request of their own. + string change_uri = 2; +} + +// QueueEnablement is independent of validation results and execution controls. +enum QueueEnablement { + // Unspecified is never an explicit disablement. + QUEUE_ENABLEMENT_UNKNOWN = 0; + QUEUE_ENABLEMENT_ENABLED = 1; + QUEUE_ENABLEMENT_DISABLED = 2; +} + +// QueueState is one durably applied enablement occurrence. +message QueueState { + // Internally assigned positive queue-state version; orders applied changes. + int64 version = 1; + // Applied enablement. Successful lookups never return UNKNOWN. + QueueEnablement state = 2; + // Inclusive first covered commit. Empty only for initial DISABLED version 1. + string effective_from_commit_uri = 3; + // Application timestamp in Unix milliseconds, not source-control commit time. + int64 changed_at_ms = 4; +} + +// GetQueueStatusResponse contains the enablement selected by the request. +message GetQueueStatusResponse { + // Queue selected by the request. + string queue = 1; + // Latest materialized state when change_uri is empty; otherwise the state covering that commit. + // Resolution uses one pinned summary, which may lag internal state until persistence is repaired. + // Unresolved commits fail the call and never imply DISABLED. + QueueState state = 2; +} + // Stovepipe provides the Stovepipe API. service Stovepipe { // Ping returns a response indicating the service is alive @@ -264,4 +303,6 @@ service Stovepipe { rpc GetProjectStatusByURI(GetProjectStatusByURIRequest) returns (GetProjectStatusByURIResponse) {} // List returns a queue-scoped page of current request summaries. rpc List(ListRequest) returns (ListResponse) {} + // GetQueueStatus returns current and optional commit-specific enablement. + rpc GetQueueStatus(GetQueueStatusRequest) returns (GetQueueStatusResponse) {} } diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index f7faff731..7c15d6a8e 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -36,6 +36,57 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// QueueEnablement is independent of validation results and execution controls. +type QueueEnablement int32 + +const ( + // Unspecified is never an explicit disablement. + QueueEnablement_QUEUE_ENABLEMENT_UNKNOWN QueueEnablement = 0 + QueueEnablement_QUEUE_ENABLEMENT_ENABLED QueueEnablement = 1 + QueueEnablement_QUEUE_ENABLEMENT_DISABLED QueueEnablement = 2 +) + +// Enum value maps for QueueEnablement. +var ( + QueueEnablement_name = map[int32]string{ + 0: "QUEUE_ENABLEMENT_UNKNOWN", + 1: "QUEUE_ENABLEMENT_ENABLED", + 2: "QUEUE_ENABLEMENT_DISABLED", + } + QueueEnablement_value = map[string]int32{ + "QUEUE_ENABLEMENT_UNKNOWN": 0, + "QUEUE_ENABLEMENT_ENABLED": 1, + "QUEUE_ENABLEMENT_DISABLED": 2, + } +) + +func (x QueueEnablement) Enum() *QueueEnablement { + p := new(QueueEnablement) + *p = x + return p +} + +func (x QueueEnablement) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (QueueEnablement) Descriptor() protoreflect.EnumDescriptor { + return file_stovepipe_proto_enumTypes[0].Descriptor() +} + +func (QueueEnablement) Type() protoreflect.EnumType { + return &file_stovepipe_proto_enumTypes[0] +} + +func (x QueueEnablement) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use QueueEnablement.Descriptor instead. +func (QueueEnablement) EnumDescriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{0} +} + // PingRequest is the request for the Ping method type PingRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -1473,6 +1524,192 @@ func (x *ListResponse) GetNextPageToken() string { return "" } +// GetQueueStatusRequest selects applied enablement for a queue and optional commit. +type GetQueueStatusRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Required stable repo-and-ref queue name. + Queue string `protobuf:"bytes,1,opt,name=queue,proto3" json:"queue,omitempty"` + // Optional immutable commit URI. Empty selects the latest materialized state. + // Intermediate commits need no validation request of their own. + ChangeUri string `protobuf:"bytes,2,opt,name=change_uri,json=changeUri,proto3" json:"change_uri,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetQueueStatusRequest) Reset() { + *x = GetQueueStatusRequest{} + mi := &file_stovepipe_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetQueueStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetQueueStatusRequest) ProtoMessage() {} + +func (x *GetQueueStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[18] + 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 GetQueueStatusRequest.ProtoReflect.Descriptor instead. +func (*GetQueueStatusRequest) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{18} +} + +func (x *GetQueueStatusRequest) GetQueue() string { + if x != nil { + return x.Queue + } + return "" +} + +func (x *GetQueueStatusRequest) GetChangeUri() string { + if x != nil { + return x.ChangeUri + } + return "" +} + +// QueueState is one durably applied enablement occurrence. +type QueueState struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Internally assigned positive queue-state version; orders applied changes. + Version int64 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` + // Applied enablement. Successful lookups never return UNKNOWN. + State QueueEnablement `protobuf:"varint,2,opt,name=state,proto3,enum=uber.submitqueue.stovepipe.QueueEnablement" json:"state,omitempty"` + // Inclusive first covered commit. Empty only for initial DISABLED version 1. + EffectiveFromCommitUri string `protobuf:"bytes,3,opt,name=effective_from_commit_uri,json=effectiveFromCommitUri,proto3" json:"effective_from_commit_uri,omitempty"` + // Application timestamp in Unix milliseconds, not source-control commit time. + ChangedAtMs int64 `protobuf:"varint,4,opt,name=changed_at_ms,json=changedAtMs,proto3" json:"changed_at_ms,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *QueueState) Reset() { + *x = QueueState{} + mi := &file_stovepipe_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *QueueState) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueueState) ProtoMessage() {} + +func (x *QueueState) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[19] + 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 QueueState.ProtoReflect.Descriptor instead. +func (*QueueState) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{19} +} + +func (x *QueueState) GetVersion() int64 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *QueueState) GetState() QueueEnablement { + if x != nil { + return x.State + } + return QueueEnablement_QUEUE_ENABLEMENT_UNKNOWN +} + +func (x *QueueState) GetEffectiveFromCommitUri() string { + if x != nil { + return x.EffectiveFromCommitUri + } + return "" +} + +func (x *QueueState) GetChangedAtMs() int64 { + if x != nil { + return x.ChangedAtMs + } + return 0 +} + +// GetQueueStatusResponse contains the enablement selected by the request. +type GetQueueStatusResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Queue selected by the request. + Queue string `protobuf:"bytes,1,opt,name=queue,proto3" json:"queue,omitempty"` + // Latest materialized state when change_uri is empty; otherwise the state covering that commit. + // Resolution uses one pinned summary, which may lag internal state until persistence is repaired. + // Unresolved commits fail the call and never imply DISABLED. + State *QueueState `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetQueueStatusResponse) Reset() { + *x = GetQueueStatusResponse{} + mi := &file_stovepipe_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetQueueStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetQueueStatusResponse) ProtoMessage() {} + +func (x *GetQueueStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_stovepipe_proto_msgTypes[20] + 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 GetQueueStatusResponse.ProtoReflect.Descriptor instead. +func (*GetQueueStatusResponse) Descriptor() ([]byte, []int) { + return file_stovepipe_proto_rawDescGZIP(), []int{20} +} + +func (x *GetQueueStatusResponse) GetQueue() string { + if x != nil { + return x.Queue + } + return "" +} + +func (x *GetQueueStatusResponse) GetState() *QueueState { + if x != nil { + return x.State + } + return nil +} + var File_stovepipe_proto protoreflect.FileDescriptor const file_stovepipe_proto_rawDesc = "" + @@ -1586,7 +1823,24 @@ const file_stovepipe_proto_rawDesc = "" + "\x14accepted_upper_bound\"~\n" + "\fListResponse\x12F\n" + "\brequests\x18\x01 \x03(\v2*.uber.submitqueue.stovepipe.RequestSummaryR\brequests\x12&\n" + - "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken2\xec\x06\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"L\n" + + "\x15GetQueueStatusRequest\x12\x14\n" + + "\x05queue\x18\x01 \x01(\tR\x05queue\x12\x1d\n" + + "\n" + + "change_uri\x18\x02 \x01(\tR\tchangeUri\"\xc8\x01\n" + + "\n" + + "QueueState\x12\x18\n" + + "\aversion\x18\x01 \x01(\x03R\aversion\x12A\n" + + "\x05state\x18\x02 \x01(\x0e2+.uber.submitqueue.stovepipe.QueueEnablementR\x05state\x129\n" + + "\x19effective_from_commit_uri\x18\x03 \x01(\tR\x16effectiveFromCommitUri\x12\"\n" + + "\rchanged_at_ms\x18\x04 \x01(\x03R\vchangedAtMs\"l\n" + + "\x16GetQueueStatusResponse\x12\x14\n" + + "\x05queue\x18\x01 \x01(\tR\x05queue\x12<\n" + + "\x05state\x18\x02 \x01(\v2&.uber.submitqueue.stovepipe.QueueStateR\x05state*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" + "\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" + @@ -1594,7 +1848,8 @@ const file_stovepipe_proto_rawDesc = "" + "\x16GetRequestHistoryByURI\x129.uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest\x1a:.uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse\"\x00\x12\x8b\x01\n" + "\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\"\x00Be\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" + "\x1ecom.uber.submitqueue.stovepipeB\x0eStovepipeProtoP\x01Z1github.com/uber/submitqueue/api/stovepipe/protopbb\x06proto3" var ( @@ -1609,55 +1864,64 @@ func file_stovepipe_proto_rawDescGZIP() []byte { return file_stovepipe_proto_rawDescData } -var file_stovepipe_proto_msgTypes = make([]protoimpl.MessageInfo, 18) +var file_stovepipe_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_stovepipe_proto_msgTypes = make([]protoimpl.MessageInfo, 21) var file_stovepipe_proto_goTypes = []any{ - (*PingRequest)(nil), // 0: uber.submitqueue.stovepipe.PingRequest - (*PingResponse)(nil), // 1: uber.submitqueue.stovepipe.PingResponse - (*IngestRequest)(nil), // 2: uber.submitqueue.stovepipe.IngestRequest - (*IngestResponse)(nil), // 3: uber.submitqueue.stovepipe.IngestResponse - (*GetRequestHistoryByIDRequest)(nil), // 4: uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest - (*GetRequestHistoryByURIRequest)(nil), // 5: uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest - (*HistoryEvent)(nil), // 6: uber.submitqueue.stovepipe.HistoryEvent - (*RequestHistory)(nil), // 7: uber.submitqueue.stovepipe.RequestHistory - (*GetRequestHistoryByIDResponse)(nil), // 8: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse - (*GetRequestHistoryByURIResponse)(nil), // 9: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse - (*GetProjectStatusByIDRequest)(nil), // 10: uber.submitqueue.stovepipe.GetProjectStatusByIDRequest - (*GetProjectStatusByURIRequest)(nil), // 11: uber.submitqueue.stovepipe.GetProjectStatusByURIRequest - (*ProjectValidation)(nil), // 12: uber.submitqueue.stovepipe.ProjectValidation - (*GetProjectStatusByIDResponse)(nil), // 13: uber.submitqueue.stovepipe.GetProjectStatusByIDResponse - (*GetProjectStatusByURIResponse)(nil), // 14: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse - (*RequestSummary)(nil), // 15: uber.submitqueue.stovepipe.RequestSummary - (*ListRequest)(nil), // 16: uber.submitqueue.stovepipe.ListRequest - (*ListResponse)(nil), // 17: uber.submitqueue.stovepipe.ListResponse + (QueueEnablement)(0), // 0: uber.submitqueue.stovepipe.QueueEnablement + (*PingRequest)(nil), // 1: uber.submitqueue.stovepipe.PingRequest + (*PingResponse)(nil), // 2: uber.submitqueue.stovepipe.PingResponse + (*IngestRequest)(nil), // 3: uber.submitqueue.stovepipe.IngestRequest + (*IngestResponse)(nil), // 4: uber.submitqueue.stovepipe.IngestResponse + (*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 + (*QueueState)(nil), // 20: uber.submitqueue.stovepipe.QueueState + (*GetQueueStatusResponse)(nil), // 21: uber.submitqueue.stovepipe.GetQueueStatusResponse } var file_stovepipe_proto_depIdxs = []int32{ - 6, // 0: uber.submitqueue.stovepipe.RequestHistory.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent - 15, // 1: uber.submitqueue.stovepipe.RequestHistory.request_summary:type_name -> uber.submitqueue.stovepipe.RequestSummary - 6, // 2: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent - 15, // 3: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.request_summary:type_name -> uber.submitqueue.stovepipe.RequestSummary - 7, // 4: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse.histories:type_name -> uber.submitqueue.stovepipe.RequestHistory - 12, // 5: uber.submitqueue.stovepipe.GetProjectStatusByIDResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation - 12, // 6: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation - 15, // 7: uber.submitqueue.stovepipe.ListResponse.requests:type_name -> uber.submitqueue.stovepipe.RequestSummary - 0, // 8: uber.submitqueue.stovepipe.Stovepipe.Ping:input_type -> uber.submitqueue.stovepipe.PingRequest - 2, // 9: uber.submitqueue.stovepipe.Stovepipe.Ingest:input_type -> uber.submitqueue.stovepipe.IngestRequest - 4, // 10: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest - 5, // 11: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest - 10, // 12: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDRequest - 11, // 13: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIRequest - 16, // 14: uber.submitqueue.stovepipe.Stovepipe.List:input_type -> uber.submitqueue.stovepipe.ListRequest - 1, // 15: uber.submitqueue.stovepipe.Stovepipe.Ping:output_type -> uber.submitqueue.stovepipe.PingResponse - 3, // 16: uber.submitqueue.stovepipe.Stovepipe.Ingest:output_type -> uber.submitqueue.stovepipe.IngestResponse - 8, // 17: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse - 9, // 18: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse - 13, // 19: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDResponse - 14, // 20: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIResponse - 17, // 21: uber.submitqueue.stovepipe.Stovepipe.List:output_type -> uber.submitqueue.stovepipe.ListResponse - 15, // [15:22] is the sub-list for method output_type - 8, // [8:15] is the sub-list for method input_type - 8, // [8:8] is the sub-list for extension type_name - 8, // [8:8] is the sub-list for extension extendee - 0, // [0:8] is the sub-list for field type_name + 7, // 0: uber.submitqueue.stovepipe.RequestHistory.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent + 16, // 1: uber.submitqueue.stovepipe.RequestHistory.request_summary:type_name -> uber.submitqueue.stovepipe.RequestSummary + 7, // 2: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.events:type_name -> uber.submitqueue.stovepipe.HistoryEvent + 16, // 3: uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse.request_summary:type_name -> uber.submitqueue.stovepipe.RequestSummary + 8, // 4: uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse.histories:type_name -> uber.submitqueue.stovepipe.RequestHistory + 13, // 5: uber.submitqueue.stovepipe.GetProjectStatusByIDResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation + 13, // 6: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation + 16, // 7: uber.submitqueue.stovepipe.ListResponse.requests:type_name -> uber.submitqueue.stovepipe.RequestSummary + 0, // 8: uber.submitqueue.stovepipe.QueueState.state:type_name -> uber.submitqueue.stovepipe.QueueEnablement + 20, // 9: uber.submitqueue.stovepipe.GetQueueStatusResponse.state:type_name -> uber.submitqueue.stovepipe.QueueState + 1, // 10: uber.submitqueue.stovepipe.Stovepipe.Ping:input_type -> uber.submitqueue.stovepipe.PingRequest + 3, // 11: uber.submitqueue.stovepipe.Stovepipe.Ingest:input_type -> uber.submitqueue.stovepipe.IngestRequest + 5, // 12: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest + 6, // 13: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIRequest + 11, // 14: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDRequest + 12, // 15: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:input_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIRequest + 17, // 16: uber.submitqueue.stovepipe.Stovepipe.List:input_type -> uber.submitqueue.stovepipe.ListRequest + 19, // 17: uber.submitqueue.stovepipe.Stovepipe.GetQueueStatus:input_type -> uber.submitqueue.stovepipe.GetQueueStatusRequest + 2, // 18: uber.submitqueue.stovepipe.Stovepipe.Ping:output_type -> uber.submitqueue.stovepipe.PingResponse + 4, // 19: uber.submitqueue.stovepipe.Stovepipe.Ingest:output_type -> uber.submitqueue.stovepipe.IngestResponse + 9, // 20: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDResponse + 10, // 21: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByURI:output_type -> uber.submitqueue.stovepipe.GetRequestHistoryByURIResponse + 14, // 22: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByID:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByIDResponse + 15, // 23: uber.submitqueue.stovepipe.Stovepipe.GetProjectStatusByURI:output_type -> uber.submitqueue.stovepipe.GetProjectStatusByURIResponse + 18, // 24: uber.submitqueue.stovepipe.Stovepipe.List:output_type -> uber.submitqueue.stovepipe.ListResponse + 21, // 25: uber.submitqueue.stovepipe.Stovepipe.GetQueueStatus:output_type -> uber.submitqueue.stovepipe.GetQueueStatusResponse + 18, // [18:26] is the sub-list for method output_type + 10, // [10:18] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_stovepipe_proto_init() } @@ -1687,13 +1951,14 @@ func file_stovepipe_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_stovepipe_proto_rawDesc), len(file_stovepipe_proto_rawDesc)), - NumEnums: 0, - NumMessages: 18, + NumEnums: 1, + NumMessages: 21, NumExtensions: 0, NumServices: 1, }, GoTypes: file_stovepipe_proto_goTypes, DependencyIndexes: file_stovepipe_proto_depIdxs, + EnumInfos: file_stovepipe_proto_enumTypes, MessageInfos: file_stovepipe_proto_msgTypes, }.Build() File_stovepipe_proto = out.File diff --git a/api/stovepipe/protopb/stovepipe.pb.yarpc.go b/api/stovepipe/protopb/stovepipe.pb.yarpc.go index 103237c36..7610d1fc7 100644 --- a/api/stovepipe/protopb/stovepipe.pb.yarpc.go +++ b/api/stovepipe/protopb/stovepipe.pb.yarpc.go @@ -28,6 +28,7 @@ type StovepipeYARPCClient interface { GetProjectStatusByID(context.Context, *GetProjectStatusByIDRequest, ...yarpc.CallOption) (*GetProjectStatusByIDResponse, error) GetProjectStatusByURI(context.Context, *GetProjectStatusByURIRequest, ...yarpc.CallOption) (*GetProjectStatusByURIResponse, error) List(context.Context, *ListRequest, ...yarpc.CallOption) (*ListResponse, error) + GetQueueStatus(context.Context, *GetQueueStatusRequest, ...yarpc.CallOption) (*GetQueueStatusResponse, error) } func newStovepipeYARPCClient(clientConfig transport.ClientConfig, anyResolver v2.AnyResolver, options ...v2.ClientOption) StovepipeYARPCClient { @@ -55,6 +56,7 @@ type StovepipeYARPCServer interface { GetProjectStatusByID(context.Context, *GetProjectStatusByIDRequest) (*GetProjectStatusByIDResponse, error) GetProjectStatusByURI(context.Context, *GetProjectStatusByURIRequest) (*GetProjectStatusByURIResponse, error) List(context.Context, *ListRequest) (*ListResponse, error) + GetQueueStatus(context.Context, *GetQueueStatusRequest) (*GetQueueStatusResponse, error) } type buildStovepipeYARPCProceduresParams struct { @@ -138,6 +140,16 @@ func buildStovepipeYARPCProcedures(params buildStovepipeYARPCProceduresParams) [ }, ), }, + { + MethodName: "GetQueueStatus", + Handler: v2.NewUnaryHandler( + v2.UnaryHandlerParams{ + Handle: handler.GetQueueStatus, + NewRequest: newStovepipeServiceGetQueueStatusYARPCRequest, + AnyResolver: params.AnyResolver, + }, + ), + }, }, OnewayHandlerParams: []v2.BuildProceduresOnewayHandlerParams{}, StreamHandlerParams: []v2.BuildProceduresStreamHandlerParams{}, @@ -334,6 +346,18 @@ func (c *_StovepipeYARPCCaller) List(ctx context.Context, request *ListRequest, return response, err } +func (c *_StovepipeYARPCCaller) GetQueueStatus(ctx context.Context, request *GetQueueStatusRequest, options ...yarpc.CallOption) (*GetQueueStatusResponse, error) { + responseMessage, err := c.streamClient.Call(ctx, "GetQueueStatus", request, newStovepipeServiceGetQueueStatusYARPCResponse, options...) + if responseMessage == nil { + return nil, err + } + response, ok := responseMessage.(*GetQueueStatusResponse) + if !ok { + return nil, v2.CastError(emptyStovepipeServiceGetQueueStatusYARPCResponse, responseMessage) + } + return response, err +} + type _StovepipeYARPCHandler struct { server StovepipeYARPCServer } @@ -450,6 +474,22 @@ func (h *_StovepipeYARPCHandler) List(ctx context.Context, requestMessage proto. return response, err } +func (h *_StovepipeYARPCHandler) GetQueueStatus(ctx context.Context, requestMessage proto.Message) (proto.Message, error) { + var request *GetQueueStatusRequest + var ok bool + if requestMessage != nil { + request, ok = requestMessage.(*GetQueueStatusRequest) + if !ok { + return nil, v2.CastError(emptyStovepipeServiceGetQueueStatusYARPCRequest, requestMessage) + } + } + response, err := h.server.GetQueueStatus(ctx, request) + if response == nil { + return nil, err + } + return response, err +} + func newStovepipeServicePingYARPCRequest() proto.Message { return &PingRequest{} } @@ -506,6 +546,14 @@ func newStovepipeServiceListYARPCResponse() proto.Message { return &ListResponse{} } +func newStovepipeServiceGetQueueStatusYARPCRequest() proto.Message { + return &GetQueueStatusRequest{} +} + +func newStovepipeServiceGetQueueStatusYARPCResponse() proto.Message { + return &GetQueueStatusResponse{} +} + var ( emptyStovepipeServicePingYARPCRequest = &PingRequest{} emptyStovepipeServicePingYARPCResponse = &PingResponse{} @@ -521,83 +569,98 @@ var ( emptyStovepipeServiceGetProjectStatusByURIYARPCResponse = &GetProjectStatusByURIResponse{} emptyStovepipeServiceListYARPCRequest = &ListRequest{} emptyStovepipeServiceListYARPCResponse = &ListResponse{} + emptyStovepipeServiceGetQueueStatusYARPCRequest = &GetQueueStatusRequest{} + emptyStovepipeServiceGetQueueStatusYARPCResponse = &GetQueueStatusResponse{} ) var yarpcFileDescriptorClosurefabdb6b3c0b09022 = [][]byte{ // stovepipe.proto []byte{ - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4f, 0x6f, 0x1b, 0x45, - 0x14, 0xf7, 0xda, 0x89, 0x63, 0x3f, 0x3b, 0x4e, 0x3a, 0x09, 0xc1, 0x75, 0x9b, 0x2a, 0x2c, 0x84, - 0xba, 0x95, 0xea, 0x88, 0x20, 0x41, 0xca, 0x01, 0x51, 0x53, 0x88, 0x2d, 0x11, 0x88, 0xd6, 0x84, - 0x03, 0x3d, 0xac, 0xd6, 0xeb, 0x57, 0x67, 0xdb, 0xac, 0x67, 0x3b, 0x33, 0x1b, 0x48, 0x0f, 0xdc, - 0x38, 0x21, 0x21, 0xf1, 0x0d, 0x38, 0xc3, 0x9d, 0x33, 0x27, 0x3e, 0x03, 0x7c, 0x07, 0xee, 0x5c, - 0xd1, 0xcc, 0xce, 0xae, 0xd7, 0x8e, 0xb3, 0x69, 0x12, 0x90, 0x40, 0xea, 0xcd, 0xf3, 0xfe, 0xcd, - 0x7b, 0xbf, 0xf7, 0x67, 0xdf, 0x18, 0x96, 0xb8, 0xa0, 0xc7, 0x18, 0x78, 0x01, 0xb6, 0x02, 0x46, - 0x05, 0x25, 0x8d, 0xb0, 0x8f, 0xac, 0xc5, 0xc3, 0xbe, 0xef, 0x89, 0x67, 0x21, 0x86, 0xd8, 0x4a, - 0x24, 0xcc, 0xdb, 0x50, 0xd9, 0xf7, 0x46, 0x43, 0x0b, 0x9f, 0x85, 0xc8, 0x05, 0xa9, 0xc3, 0x82, - 0x8f, 0x9c, 0x3b, 0x43, 0xac, 0x1b, 0x1b, 0x46, 0xb3, 0x6c, 0xc5, 0x47, 0xf3, 0x5b, 0x03, 0xaa, - 0x91, 0x24, 0x0f, 0xe8, 0x88, 0xe3, 0xd9, 0xa2, 0xe4, 0x35, 0xa8, 0x72, 0x64, 0xc7, 0x9e, 0x8b, - 0xf6, 0xc8, 0xf1, 0xb1, 0x9e, 0x57, 0xec, 0x8a, 0xa6, 0x7d, 0xea, 0xf8, 0x48, 0x6e, 0x42, 0x59, - 0x78, 0x3e, 0x72, 0xe1, 0xf8, 0x41, 0xbd, 0xb0, 0x61, 0x34, 0x0b, 0xd6, 0x98, 0x40, 0x1a, 0x50, - 0x3a, 0xa4, 0x5c, 0x28, 0xe5, 0x39, 0xa5, 0x9c, 0x9c, 0xcd, 0x4d, 0x58, 0xec, 0x8e, 0x86, 0xc8, - 0x45, 0xec, 0xf2, 0x2a, 0xcc, 0xab, 0xa0, 0xb4, 0x17, 0xd1, 0xc1, 0xdc, 0x80, 0x5a, 0x2c, 0xa6, - 0xfd, 0xad, 0x41, 0xde, 0x1b, 0x68, 0xa1, 0xbc, 0x37, 0x30, 0x7b, 0x70, 0x73, 0x17, 0x63, 0x2b, - 0x1d, 0x8f, 0x0b, 0xca, 0x4e, 0xda, 0x27, 0xdd, 0x87, 0x99, 0x76, 0xc9, 0x3a, 0x00, 0x8b, 0x04, - 0x6c, 0x6f, 0xa0, 0x23, 0x2b, 0x6b, 0x4a, 0x77, 0x60, 0xee, 0xc2, 0xfa, 0x0c, 0xa3, 0x07, 0x56, - 0x37, 0xdb, 0xea, 0x32, 0x14, 0x42, 0xe6, 0x69, 0x73, 0xf2, 0xa7, 0xf9, 0xab, 0x01, 0x55, 0xad, - 0xff, 0xd1, 0x31, 0x8e, 0x04, 0xb9, 0x0e, 0x25, 0x94, 0x3f, 0xec, 0x24, 0x88, 0x05, 0x75, 0xee, - 0x0e, 0x24, 0xde, 0x09, 0x76, 0xb6, 0xcf, 0x95, 0x99, 0x82, 0x55, 0x49, 0x68, 0x7b, 0x9c, 0x6c, - 0xc2, 0x62, 0xec, 0x36, 0x17, 0x8e, 0x40, 0x85, 0x79, 0xb9, 0x93, 0xb3, 0xaa, 0x9a, 0xdc, 0x93, - 0x54, 0xb2, 0x06, 0xf3, 0xca, 0x68, 0x84, 0x7a, 0x27, 0x67, 0x45, 0x47, 0xb2, 0x09, 0x35, 0x1a, - 0x0a, 0x97, 0xfa, 0x68, 0x33, 0x74, 0x38, 0x1d, 0xd5, 0xe7, 0x95, 0x0b, 0x8b, 0x9a, 0x6a, 0x29, - 0x62, 0xbb, 0x0a, 0x40, 0x5d, 0x37, 0x64, 0x0c, 0x47, 0x2e, 0x9a, 0xbf, 0x19, 0x50, 0x9b, 0x44, - 0x62, 0x0a, 0x3d, 0x63, 0x0a, 0x3d, 0xf2, 0x01, 0x14, 0xd5, 0x7d, 0x32, 0x84, 0x42, 0xb3, 0xb2, - 0xdd, 0x6c, 0x9d, 0x5d, 0xb9, 0xad, 0x34, 0x3a, 0x96, 0xd6, 0x23, 0x3d, 0x58, 0x4a, 0xe2, 0x0c, - 0x7d, 0xdf, 0x61, 0x27, 0x2a, 0xd2, 0xca, 0xf6, 0xdd, 0x2c, 0x53, 0xda, 0xcb, 0x5e, 0xa4, 0x61, - 0xd5, 0xd8, 0xc4, 0xd9, 0xfc, 0xc5, 0x98, 0x99, 0x55, 0x59, 0x2a, 0xba, 0xb6, 0xc6, 0x8e, 0x1b, - 0xff, 0x9c, 0xe3, 0xf9, 0x2b, 0x3b, 0xfe, 0x04, 0x6e, 0x9d, 0x55, 0x8d, 0xda, 0xf1, 0x0e, 0x94, - 0x0f, 0x15, 0xdd, 0xc3, 0xd8, 0xf7, 0x17, 0xb9, 0x50, 0xdb, 0xb2, 0xc6, 0xca, 0xe6, 0x4f, 0x06, - 0xdc, 0xd8, 0x45, 0xb1, 0xcf, 0xe8, 0x13, 0x74, 0x55, 0x39, 0x85, 0xfc, 0xaa, 0xed, 0x24, 0x07, - 0x41, 0x10, 0x19, 0xe4, 0xf5, 0xc2, 0x46, 0x41, 0x0e, 0x82, 0xf8, 0x4c, 0x6e, 0x40, 0x39, 0x70, - 0x86, 0x68, 0x73, 0xef, 0x79, 0x34, 0x25, 0xe6, 0xad, 0x92, 0x24, 0xf4, 0xbc, 0xe7, 0xca, 0xae, - 0x62, 0x0a, 0xfa, 0x14, 0xe3, 0x62, 0x55, 0xe2, 0x9f, 0x4b, 0x82, 0xf9, 0xb3, 0xa1, 0x9a, 0x7f, - 0xca, 0xd9, 0x73, 0xdb, 0x74, 0x1d, 0xc0, 0x3d, 0x74, 0x46, 0x43, 0xb4, 0xc7, 0xdd, 0x5a, 0x8e, - 0x28, 0x07, 0xcc, 0xfb, 0xd7, 0xbc, 0xed, 0xc3, 0x35, 0xed, 0xe9, 0x17, 0xce, 0x91, 0x37, 0x70, - 0x84, 0x47, 0x47, 0x72, 0xfc, 0x6a, 0xe3, 0xf1, 0x38, 0xd0, 0x47, 0x72, 0x07, 0x96, 0xfa, 0x0c, - 0x9d, 0xa7, 0xd2, 0xe2, 0x00, 0x87, 0x0c, 0xa3, 0x09, 0x6c, 0x74, 0x72, 0x56, 0x2d, 0x66, 0x3c, - 0x54, 0xf4, 0x76, 0x09, 0x8a, 0x0c, 0x79, 0x78, 0x24, 0xcc, 0xdf, 0x0b, 0xb3, 0x10, 0x49, 0x95, - 0xf8, 0x39, 0xad, 0x9b, 0x00, 0x96, 0x3f, 0x1b, 0xb0, 0xc2, 0x34, 0x60, 0xd7, 0xa1, 0xd4, 0x77, - 0x78, 0xc4, 0x8c, 0xe6, 0xfc, 0x82, 0x3c, 0x4b, 0xd6, 0xeb, 0xd3, 0x03, 0x2b, 0x42, 0x65, 0x72, - 0x5c, 0x99, 0xb0, 0x18, 0x06, 0x03, 0x47, 0xe0, 0xc0, 0x76, 0x84, 0x9c, 0x7c, 0x10, 0x4d, 0x3e, - 0x4d, 0x7c, 0x20, 0xf6, 0x38, 0x79, 0x1f, 0x1a, 0x0c, 0x03, 0xca, 0x3d, 0x59, 0xb0, 0xf6, 0x34, - 0x30, 0x45, 0x0d, 0x4c, 0x7d, 0x2c, 0xd3, 0x9e, 0x80, 0x88, 0xec, 0x40, 0x5d, 0x03, 0x6b, 0x47, - 0x50, 0x71, 0xdb, 0xa5, 0x7e, 0x70, 0x84, 0x02, 0xeb, 0x0b, 0x1b, 0x46, 0xb3, 0x64, 0xad, 0x69, - 0xbe, 0x15, 0xb1, 0x3f, 0xd4, 0x5c, 0xd2, 0x4d, 0x95, 0x43, 0x49, 0xb5, 0xd6, 0xbd, 0xac, 0xd6, - 0x3a, 0x95, 0xe2, 0x54, 0xf5, 0xbc, 0x09, 0x4b, 0x23, 0xfc, 0x5a, 0xd8, 0xa9, 0x2a, 0x29, 0x47, - 0x03, 0x58, 0x92, 0xf7, 0xe3, 0x4a, 0x69, 0xaf, 0xc0, 0xb5, 0x54, 0xb0, 0x3a, 0xb5, 0x7f, 0x14, - 0xd4, 0xf8, 0x9a, 0x55, 0xec, 0x2f, 0x73, 0xfb, 0x3f, 0xcf, 0xed, 0x8f, 0xf9, 0xe4, 0x1b, 0xab, - 0x87, 0xfe, 0x7f, 0x32, 0x99, 0xf7, 0x60, 0x45, 0x31, 0xed, 0xc9, 0x94, 0x16, 0x55, 0x4a, 0x97, - 0x15, 0xeb, 0x20, 0x95, 0xd7, 0x37, 0xa0, 0xe6, 0xb8, 0x2e, 0x06, 0x63, 0xc9, 0x05, 0x25, 0x59, - 0x8d, 0xa9, 0x4a, 0xea, 0xf4, 0x52, 0x52, 0x9a, 0xb1, 0x94, 0x98, 0x7f, 0x19, 0x50, 0xf9, 0xc4, - 0x3b, 0x67, 0x5f, 0x24, 0xef, 0xc0, 0xab, 0xe9, 0x2b, 0x29, 0xb3, 0x9d, 0xc7, 0x02, 0x59, 0xb2, - 0x4e, 0x75, 0x72, 0xd6, 0xca, 0xf8, 0xf6, 0xcf, 0xd8, 0x03, 0xc9, 0xdd, 0xe3, 0xa4, 0x05, 0x24, - 0xd1, 0xeb, 0xe3, 0x63, 0xca, 0x50, 0xaa, 0xa8, 0x8d, 0xb6, 0x63, 0x58, 0xcb, 0x31, 0xaf, 0xad, - 0x58, 0x7b, 0x57, 0xfa, 0x0e, 0xb4, 0xd7, 0x60, 0x35, 0xb9, 0xeb, 0x88, 0x7e, 0x85, 0xcc, 0xee, - 0xd3, 0x70, 0x34, 0x98, 0xa0, 0x87, 0x41, 0x10, 0xd3, 0xcd, 0x6f, 0xa0, 0x1a, 0x05, 0xae, 0xdb, - 0xfc, 0x63, 0x28, 0xe9, 0xac, 0x5c, 0xe4, 0x5b, 0x1f, 0x2f, 0x17, 0x89, 0xee, 0xac, 0x8a, 0xcd, - 0xcf, 0xa8, 0xd8, 0xed, 0x3f, 0x8b, 0x50, 0xee, 0xc5, 0xe6, 0xc8, 0x23, 0x98, 0x93, 0xef, 0x07, - 0x72, 0x3b, 0xb3, 0x51, 0xc6, 0x6f, 0x91, 0x46, 0xf3, 0x7c, 0xc1, 0x28, 0x30, 0x33, 0x47, 0x1c, - 0x28, 0x46, 0xeb, 0x3e, 0xb9, 0x93, 0xa5, 0x35, 0xf1, 0x72, 0x68, 0xdc, 0x7d, 0x11, 0xd1, 0xe4, - 0x8a, 0xef, 0x0d, 0x78, 0x65, 0xe6, 0x16, 0x48, 0x76, 0xb2, 0xec, 0x64, 0xbd, 0x31, 0x1a, 0xf7, - 0x2f, 0xa1, 0x99, 0x38, 0xf4, 0x83, 0x01, 0x6b, 0xb3, 0xd7, 0x3b, 0x72, 0x51, 0xbb, 0xe3, 0xcd, - 0xa7, 0xf1, 0xde, 0x65, 0x54, 0x13, 0x9f, 0xbe, 0x33, 0x60, 0x75, 0xd6, 0x1a, 0x41, 0xde, 0x3d, - 0xc7, 0xec, 0x59, 0x7b, 0x63, 0x63, 0xe7, 0xe2, 0x8a, 0xd3, 0x29, 0x3b, 0xfd, 0xe5, 0x23, 0x17, - 0xb4, 0x9a, 0xc2, 0xe7, 0xfe, 0x25, 0x34, 0x13, 0x87, 0x1e, 0xc1, 0x9c, 0xec, 0xc8, 0xec, 0x1e, - 0x48, 0x0d, 0xab, 0xec, 0x1e, 0x48, 0x37, 0xb7, 0x99, 0x6b, 0x23, 0xdc, 0x72, 0xa9, 0x9f, 0xa1, - 0xd0, 0xae, 0x25, 0xdd, 0xb8, 0xcf, 0xa8, 0xa0, 0xfb, 0xc6, 0x97, 0x6f, 0x0d, 0x3d, 0x71, 0x18, - 0xf6, 0x5b, 0x2e, 0xf5, 0xb7, 0xa4, 0xe2, 0x56, 0x4a, 0x71, 0xcb, 0x09, 0xbc, 0xad, 0x44, 0x79, - 0x4b, 0xfd, 0x97, 0x10, 0xf4, 0xfb, 0x45, 0xf5, 0xe3, 0xed, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, - 0x93, 0x6a, 0x04, 0x1b, 0x67, 0x10, 0x00, 0x00, + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6f, 0x1b, 0xc5, + 0x1b, 0xcf, 0xda, 0x79, 0xb1, 0x1f, 0x3b, 0x4e, 0x3a, 0xed, 0x3f, 0x7f, 0xc7, 0x6d, 0xaa, 0xb0, + 0xd0, 0x36, 0x2d, 0xaa, 0xa3, 0x06, 0x09, 0x5a, 0x84, 0x10, 0x71, 0xe3, 0xc6, 0x16, 0x4d, 0x9a, + 0xae, 0x1b, 0x90, 0xe8, 0x61, 0xb5, 0x5e, 0x4f, 0x9c, 0x6d, 0xbd, 0x3b, 0xdb, 0x99, 0xd9, 0x40, + 0x7a, 0xe0, 0xc6, 0x09, 0x09, 0x89, 0x6f, 0xc0, 0x19, 0xee, 0x9c, 0x39, 0x21, 0x3e, 0x02, 0x7c, + 0x02, 0x3e, 0x02, 0x57, 0x34, 0x2f, 0xbb, 0x5e, 0x3b, 0x8e, 0xdd, 0x34, 0x20, 0x81, 0xc4, 0xcd, + 0xf3, 0xbc, 0xcd, 0xf3, 0xfa, 0xdb, 0x67, 0x0c, 0x0b, 0x8c, 0x93, 0x23, 0x1c, 0x7a, 0x21, 0xae, + 0x86, 0x94, 0x70, 0x82, 0x2a, 0x51, 0x1b, 0xd3, 0x2a, 0x8b, 0xda, 0xbe, 0xc7, 0x5f, 0x44, 0x38, + 0xc2, 0xd5, 0x44, 0xc2, 0xbc, 0x01, 0x85, 0x3d, 0x2f, 0xe8, 0x5a, 0xf8, 0x45, 0x84, 0x19, 0x47, + 0x65, 0x98, 0xf3, 0x31, 0x63, 0x4e, 0x17, 0x97, 0x8d, 0x55, 0x63, 0x2d, 0x6f, 0xc5, 0x47, 0xf3, + 0x2b, 0x03, 0x8a, 0x4a, 0x92, 0x85, 0x24, 0x60, 0xf8, 0x74, 0x51, 0xf4, 0x06, 0x14, 0x19, 0xa6, + 0x47, 0x9e, 0x8b, 0xed, 0xc0, 0xf1, 0x71, 0x39, 0x23, 0xd9, 0x05, 0x4d, 0xdb, 0x75, 0x7c, 0x8c, + 0xae, 0x40, 0x9e, 0x7b, 0x3e, 0x66, 0xdc, 0xf1, 0xc3, 0x72, 0x76, 0xd5, 0x58, 0xcb, 0x5a, 0x7d, + 0x02, 0xaa, 0x40, 0xee, 0x90, 0x30, 0x2e, 0x95, 0xa7, 0xa5, 0x72, 0x72, 0x36, 0xaf, 0xc1, 0x7c, + 0x33, 0xe8, 0x62, 0xc6, 0x63, 0x97, 0x2f, 0xc1, 0x8c, 0x0c, 0x4a, 0x7b, 0xa1, 0x0e, 0xe6, 0x2a, + 0x94, 0x62, 0x31, 0xed, 0x6f, 0x09, 0x32, 0x5e, 0x47, 0x0b, 0x65, 0xbc, 0x8e, 0xd9, 0x82, 0x2b, + 0xdb, 0x38, 0xb6, 0xd2, 0xf0, 0x18, 0x27, 0xf4, 0xb8, 0x76, 0xdc, 0xdc, 0x1a, 0x6b, 0x17, 0xad, + 0x00, 0x50, 0x25, 0x60, 0x7b, 0x1d, 0x1d, 0x59, 0x5e, 0x53, 0x9a, 0x1d, 0x73, 0x1b, 0x56, 0x46, + 0x18, 0xdd, 0xb7, 0x9a, 0xe3, 0xad, 0x2e, 0x42, 0x36, 0xa2, 0x9e, 0x36, 0x27, 0x7e, 0x9a, 0x3f, + 0x19, 0x50, 0xd4, 0xfa, 0xf5, 0x23, 0x1c, 0x70, 0xb4, 0x0c, 0x39, 0x2c, 0x7e, 0xd8, 0x49, 0x10, + 0x73, 0xf2, 0xdc, 0xec, 0x88, 0x7c, 0x27, 0xb9, 0xb3, 0x7d, 0x26, 0xcd, 0x64, 0xad, 0x42, 0x42, + 0xdb, 0x61, 0xe8, 0x1a, 0xcc, 0xc7, 0x6e, 0x33, 0xee, 0x70, 0x2c, 0x73, 0x9e, 0x6f, 0x4c, 0x59, + 0x45, 0x4d, 0x6e, 0x09, 0x2a, 0x5a, 0x82, 0x19, 0x69, 0x54, 0x65, 0xbd, 0x31, 0x65, 0xa9, 0x23, + 0xba, 0x06, 0x25, 0x12, 0x71, 0x97, 0xf8, 0xd8, 0xa6, 0xd8, 0x61, 0x24, 0x28, 0xcf, 0x48, 0x17, + 0xe6, 0x35, 0xd5, 0x92, 0xc4, 0x5a, 0x11, 0x80, 0xb8, 0x6e, 0x44, 0x29, 0x0e, 0x5c, 0x6c, 0xfe, + 0x6c, 0x40, 0x69, 0x30, 0x13, 0x43, 0xd9, 0x33, 0x86, 0xb2, 0x87, 0x3e, 0x82, 0x59, 0x79, 0x9f, + 0x08, 0x21, 0xbb, 0x56, 0xd8, 0x58, 0xab, 0x9e, 0xde, 0xb9, 0xd5, 0x74, 0x76, 0x2c, 0xad, 0x87, + 0x5a, 0xb0, 0x90, 0xc4, 0x19, 0xf9, 0xbe, 0x43, 0x8f, 0x65, 0xa4, 0x85, 0x8d, 0x5b, 0xe3, 0x4c, + 0x69, 0x2f, 0x5b, 0x4a, 0xc3, 0x2a, 0xd1, 0x81, 0xb3, 0xf9, 0xa3, 0x31, 0xb2, 0xaa, 0xa2, 0x55, + 0x74, 0x6f, 0xf5, 0x1d, 0x37, 0xfe, 0x3a, 0xc7, 0x33, 0xe7, 0x76, 0xfc, 0x19, 0x5c, 0x3d, 0xad, + 0x1b, 0xb5, 0xe3, 0x0d, 0xc8, 0x1f, 0x4a, 0xba, 0x87, 0x63, 0xdf, 0x5f, 0xe5, 0x42, 0x6d, 0xcb, + 0xea, 0x2b, 0x9b, 0xdf, 0x1b, 0x70, 0x79, 0x1b, 0xf3, 0x3d, 0x4a, 0x9e, 0x61, 0x57, 0xb6, 0x53, + 0xc4, 0xce, 0x3b, 0x4e, 0x02, 0x08, 0x42, 0x65, 0x90, 0x95, 0xb3, 0xab, 0x59, 0x01, 0x04, 0xf1, + 0x19, 0x5d, 0x86, 0x7c, 0xe8, 0x74, 0xb1, 0xcd, 0xbc, 0x97, 0x0a, 0x25, 0x66, 0xac, 0x9c, 0x20, + 0xb4, 0xbc, 0x97, 0xd2, 0xae, 0x64, 0x72, 0xf2, 0x1c, 0xc7, 0xcd, 0x2a, 0xc5, 0x9f, 0x08, 0x82, + 0xf9, 0x83, 0x21, 0x87, 0x7f, 0xc8, 0xd9, 0x89, 0x63, 0xba, 0x02, 0xe0, 0x1e, 0x3a, 0x41, 0x17, + 0xdb, 0xfd, 0x69, 0xcd, 0x2b, 0xca, 0x3e, 0xf5, 0xfe, 0x36, 0x6f, 0xdb, 0x70, 0x41, 0x7b, 0xfa, + 0x89, 0xd3, 0xf3, 0x3a, 0x0e, 0xf7, 0x48, 0x20, 0xe0, 0x57, 0x1b, 0x8f, 0xe1, 0x40, 0x1f, 0xd1, + 0x4d, 0x58, 0x68, 0x53, 0xec, 0x3c, 0x17, 0x16, 0x3b, 0xb8, 0x4b, 0xb1, 0x42, 0x60, 0xa3, 0x31, + 0x65, 0x95, 0x62, 0xc6, 0x96, 0xa4, 0xd7, 0x72, 0x30, 0x4b, 0x31, 0x8b, 0x7a, 0xdc, 0xfc, 0x35, + 0x3b, 0x2a, 0x23, 0xa9, 0x16, 0x9f, 0x30, 0xba, 0x49, 0xc2, 0x32, 0xa7, 0x27, 0x2c, 0x3b, 0x9c, + 0xb0, 0x65, 0xc8, 0xb5, 0x1d, 0xa6, 0x98, 0x0a, 0xe7, 0xe7, 0xc4, 0x59, 0xb0, 0xde, 0x1c, 0x06, + 0x2c, 0x95, 0x95, 0x41, 0xb8, 0x32, 0x61, 0x3e, 0x0a, 0x3b, 0x0e, 0xc7, 0x1d, 0xdb, 0xe1, 0x02, + 0xf9, 0x40, 0x21, 0x9f, 0x26, 0x6e, 0xf2, 0x1d, 0x86, 0x3e, 0x84, 0x0a, 0xc5, 0x21, 0x61, 0x9e, + 0x68, 0x58, 0x7b, 0x38, 0x31, 0xb3, 0x3a, 0x31, 0xe5, 0xbe, 0x4c, 0x6d, 0x20, 0x45, 0xe8, 0x2e, + 0x94, 0x75, 0x62, 0x6d, 0x95, 0x2a, 0x66, 0xbb, 0xc4, 0x0f, 0x7b, 0x98, 0xe3, 0xf2, 0xdc, 0xaa, + 0xb1, 0x96, 0xb3, 0x96, 0x34, 0xdf, 0x52, 0xec, 0xfb, 0x9a, 0x8b, 0x9a, 0xa9, 0x76, 0xc8, 0xc9, + 0xd1, 0xba, 0x3d, 0x6e, 0xb4, 0x4e, 0x94, 0x38, 0xd5, 0x3d, 0xd7, 0x61, 0x21, 0xc0, 0x5f, 0x70, + 0x3b, 0xd5, 0x25, 0x79, 0x05, 0xc0, 0x82, 0xbc, 0x17, 0x77, 0x4a, 0xed, 0x22, 0x5c, 0x48, 0x05, + 0xab, 0x4b, 0xfb, 0x5b, 0x56, 0xc2, 0xd7, 0xa8, 0x66, 0xff, 0xaf, 0xb6, 0xff, 0xf2, 0xda, 0x7e, + 0x97, 0x49, 0xbe, 0xb1, 0x1a, 0xf4, 0xff, 0x91, 0xc5, 0xbc, 0x0d, 0x17, 0x25, 0xd3, 0x1e, 0x2c, + 0xe9, 0xac, 0x2c, 0xe9, 0xa2, 0x64, 0xed, 0xa7, 0xea, 0xfa, 0x16, 0x94, 0x1c, 0xd7, 0xc5, 0x61, + 0x5f, 0x72, 0x4e, 0x4a, 0x16, 0x63, 0xaa, 0x94, 0x3a, 0xb9, 0x94, 0xe4, 0x46, 0x2c, 0x25, 0xe6, + 0x1f, 0x06, 0x14, 0x1e, 0x7a, 0x13, 0xf6, 0x45, 0xf4, 0x2e, 0xfc, 0x3f, 0x7d, 0x25, 0xa1, 0xb6, + 0x73, 0xc0, 0x31, 0x4d, 0xd6, 0xa9, 0xc6, 0x94, 0x75, 0xb1, 0x7f, 0xfb, 0x23, 0xba, 0x29, 0xb8, + 0x3b, 0x0c, 0x55, 0x01, 0x25, 0x7a, 0x6d, 0x7c, 0x40, 0x28, 0x16, 0x2a, 0x72, 0xa3, 0x6d, 0x18, + 0xd6, 0x62, 0xcc, 0xab, 0x49, 0xd6, 0xce, 0xb9, 0xbe, 0x03, 0xb5, 0x25, 0xb8, 0x94, 0xdc, 0xd5, + 0x23, 0x9f, 0x63, 0x6a, 0xb7, 0x49, 0x14, 0x74, 0x06, 0xe8, 0x51, 0x18, 0xc6, 0x74, 0xf3, 0x4b, + 0x28, 0xaa, 0xc0, 0xf5, 0x98, 0x3f, 0x80, 0x9c, 0xae, 0xca, 0x59, 0xbe, 0xf5, 0xf1, 0x72, 0x91, + 0xe8, 0x8e, 0xea, 0xd8, 0xcc, 0x88, 0x8e, 0x35, 0x1f, 0xc2, 0xff, 0xb6, 0x31, 0x7f, 0x2c, 0xcc, + 0x2a, 0xd4, 0x39, 0xcf, 0xd7, 0xd5, 0xfc, 0xc5, 0x00, 0x48, 0x6c, 0xc9, 0xe7, 0xc7, 0x11, 0xa6, + 0xcc, 0x23, 0x81, 0xb4, 0x92, 0xb5, 0xe2, 0x23, 0xda, 0x84, 0x19, 0xd5, 0x89, 0xc2, 0x44, 0x69, + 0xe3, 0xed, 0x71, 0x31, 0x4a, 0x83, 0xf5, 0xc0, 0x69, 0xf7, 0xb0, 0x2f, 0xd6, 0x31, 0xa5, 0x89, + 0xee, 0xc1, 0x32, 0x3e, 0x38, 0xc0, 0x2e, 0xf7, 0x8e, 0xb0, 0x7d, 0x40, 0x89, 0x2f, 0x70, 0xc1, + 0xf7, 0x78, 0x6a, 0x3a, 0x96, 0x12, 0x81, 0x07, 0x94, 0xf8, 0xf7, 0x25, 0x5b, 0xcc, 0x83, 0x09, + 0xf3, 0xca, 0xe7, 0xb8, 0x75, 0xa7, 0x15, 0x6e, 0x69, 0xa2, 0xe8, 0x5c, 0xb3, 0x07, 0x4b, 0xc3, + 0x89, 0xd1, 0x25, 0x1a, 0x9d, 0x99, 0x0f, 0xd2, 0x11, 0x15, 0x36, 0xae, 0x4f, 0x8c, 0x48, 0xa6, + 0x48, 0x07, 0x73, 0xab, 0x07, 0x0b, 0x43, 0x61, 0xa2, 0x2b, 0x50, 0x7e, 0xbc, 0x5f, 0xdf, 0xaf, + 0xdb, 0xf5, 0xdd, 0xcd, 0xda, 0xc3, 0xfa, 0x4e, 0x7d, 0xf7, 0x89, 0xbd, 0xbf, 0xfb, 0xf1, 0xee, + 0xa3, 0x4f, 0x77, 0x17, 0xa7, 0x46, 0x72, 0xd5, 0xcf, 0xad, 0x45, 0x03, 0xad, 0xc0, 0xf2, 0x09, + 0xee, 0x56, 0xb3, 0xa5, 0xd8, 0x99, 0x8d, 0xdf, 0xe7, 0x20, 0xdf, 0x8a, 0xbd, 0x41, 0x4f, 0x61, + 0x5a, 0x3c, 0x1a, 0xd1, 0x8d, 0xb1, 0xe8, 0xd8, 0x7f, 0x80, 0x56, 0xd6, 0x26, 0x0b, 0xaa, 0x54, + 0x99, 0x53, 0xc8, 0x81, 0x59, 0xf5, 0xc6, 0x43, 0x37, 0xc7, 0x69, 0x0d, 0x3c, 0x17, 0x2b, 0xb7, + 0x5e, 0x45, 0x34, 0xb9, 0xe2, 0x1b, 0x43, 0xf6, 0xf0, 0xc9, 0xd5, 0x1f, 0xdd, 0x1d, 0x67, 0x67, + 0xdc, 0xc3, 0xb2, 0x72, 0xef, 0x35, 0x34, 0x13, 0x87, 0xbe, 0x35, 0x64, 0xef, 0x8c, 0xd8, 0xe9, + 0xd1, 0x59, 0xed, 0xf6, 0xd7, 0xdd, 0xca, 0xfb, 0xaf, 0xa3, 0x9a, 0xf8, 0xf4, 0xb5, 0x01, 0x97, + 0x46, 0xed, 0x8e, 0xe8, 0xbd, 0x09, 0x66, 0x4f, 0x7b, 0x2c, 0x54, 0xee, 0x9e, 0x5d, 0x71, 0xb8, + 0x64, 0x27, 0xd7, 0x1d, 0x74, 0x46, 0xab, 0xa9, 0xfc, 0xdc, 0x7b, 0x0d, 0xcd, 0xc4, 0xa1, 0xa7, + 0x30, 0x2d, 0x60, 0x78, 0xfc, 0x0c, 0xa4, 0xbe, 0x50, 0xe3, 0x67, 0x20, 0x8d, 0xe8, 0xe6, 0x14, + 0x3a, 0x86, 0xd2, 0x20, 0x94, 0xa0, 0x3b, 0x13, 0x7c, 0x3d, 0x89, 0xc7, 0x95, 0x8d, 0xb3, 0xa8, + 0xc4, 0x57, 0xd7, 0x30, 0x5c, 0x75, 0x89, 0x3f, 0x46, 0xb5, 0x56, 0x4a, 0x80, 0x60, 0x8f, 0x12, + 0x4e, 0xf6, 0x8c, 0xcf, 0xee, 0x74, 0x3d, 0x7e, 0x18, 0xb5, 0xab, 0x2e, 0xf1, 0xd7, 0x85, 0xe2, + 0x7a, 0x4a, 0x71, 0xdd, 0x09, 0xbd, 0xf5, 0x44, 0x79, 0x5d, 0xfe, 0x77, 0x15, 0xb6, 0xdb, 0xb3, + 0xf2, 0xc7, 0x3b, 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x2f, 0xb3, 0x03, 0xbe, 0xd7, 0x12, 0x00, + 0x00, }, } diff --git a/api/stovepipe/protopb/stovepipe_grpc.pb.go b/api/stovepipe/protopb/stovepipe_grpc.pb.go index 4bd5c6601..0c0c98af7 100644 --- a/api/stovepipe/protopb/stovepipe_grpc.pb.go +++ b/api/stovepipe/protopb/stovepipe_grpc.pb.go @@ -41,6 +41,7 @@ const ( Stovepipe_GetProjectStatusByID_FullMethodName = "/uber.submitqueue.stovepipe.Stovepipe/GetProjectStatusByID" Stovepipe_GetProjectStatusByURI_FullMethodName = "/uber.submitqueue.stovepipe.Stovepipe/GetProjectStatusByURI" Stovepipe_List_FullMethodName = "/uber.submitqueue.stovepipe.Stovepipe/List" + Stovepipe_GetQueueStatus_FullMethodName = "/uber.submitqueue.stovepipe.Stovepipe/GetQueueStatus" ) // StovepipeClient is the client API for Stovepipe service. @@ -64,6 +65,8 @@ type StovepipeClient interface { GetProjectStatusByURI(ctx context.Context, in *GetProjectStatusByURIRequest, opts ...grpc.CallOption) (*GetProjectStatusByURIResponse, error) // List returns a queue-scoped page of current request summaries. List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) + // GetQueueStatus returns current and optional commit-specific enablement. + GetQueueStatus(ctx context.Context, in *GetQueueStatusRequest, opts ...grpc.CallOption) (*GetQueueStatusResponse, error) } type stovepipeClient struct { @@ -144,6 +147,16 @@ func (c *stovepipeClient) List(ctx context.Context, in *ListRequest, opts ...grp return out, nil } +func (c *stovepipeClient) GetQueueStatus(ctx context.Context, in *GetQueueStatusRequest, opts ...grpc.CallOption) (*GetQueueStatusResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetQueueStatusResponse) + err := c.cc.Invoke(ctx, Stovepipe_GetQueueStatus_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. @@ -165,6 +178,8 @@ type StovepipeServer interface { GetProjectStatusByURI(context.Context, *GetProjectStatusByURIRequest) (*GetProjectStatusByURIResponse, error) // List returns a queue-scoped page of current request summaries. List(context.Context, *ListRequest) (*ListResponse, error) + // GetQueueStatus returns current and optional commit-specific enablement. + GetQueueStatus(context.Context, *GetQueueStatusRequest) (*GetQueueStatusResponse, error) mustEmbedUnimplementedStovepipeServer() } @@ -196,6 +211,9 @@ func (UnimplementedStovepipeServer) GetProjectStatusByURI(context.Context, *GetP func (UnimplementedStovepipeServer) List(context.Context, *ListRequest) (*ListResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method List not implemented") } +func (UnimplementedStovepipeServer) GetQueueStatus(context.Context, *GetQueueStatusRequest) (*GetQueueStatusResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetQueueStatus not implemented") +} func (UnimplementedStovepipeServer) mustEmbedUnimplementedStovepipeServer() {} func (UnimplementedStovepipeServer) testEmbeddedByValue() {} @@ -343,6 +361,24 @@ func _Stovepipe_List_Handler(srv interface{}, ctx context.Context, dec func(inte return interceptor(ctx, in, info, handler) } +func _Stovepipe_GetQueueStatus_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetQueueStatusRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(StovepipeServer).GetQueueStatus(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Stovepipe_GetQueueStatus_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(StovepipeServer).GetQueueStatus(ctx, req.(*GetQueueStatusRequest)) + } + 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) @@ -378,6 +414,10 @@ var Stovepipe_ServiceDesc = grpc.ServiceDesc{ MethodName: "List", Handler: _Stovepipe_List_Handler, }, + { + MethodName: "GetQueueStatus", + Handler: _Stovepipe_GetQueueStatus_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "stovepipe.proto", diff --git a/doc/rfc/index.md b/doc/rfc/index.md index 24f07fbc4..667a556d1 100644 --- a/doc/rfc/index.md +++ b/doc/rfc/index.md @@ -39,6 +39,7 @@ Design documents and technical proposals, grouped by scope. Shared/cross-cutting - [Request History API](stovepipe/request-history-api.md) - Queue-scoped request-ID and URI lookup, public projection, materialization decision, ordering, and retention - [List API](stovepipe/list-api.md) - Queue-scoped request listing by acceptance time, immutable acceptance time in summaries, cursor pagination, and a portable time-to-request mapping - [Project Status APIs](stovepipe/project-status-api.md) - Queue-scoped current validation lookup by request ID or commit URI, with repository and future project-level results +- [Queue State](stovepipe/queue-state.md) - Internal queue enablement, materialized summary and history, and current or commit-specific status lookup ## Runway diff --git a/doc/rfc/stovepipe/queue-state.md b/doc/rfc/stovepipe/queue-state.md new file mode 100644 index 000000000..55a037cc9 --- /dev/null +++ b/doc/rfc/stovepipe/queue-state.md @@ -0,0 +1,22 @@ +# Queue enablement and status lookup + +Callers need the enablement covering a commit, including commits inside a validation batch that have no request of their own. A current flag loses earlier enable/disable intervals, request history describes validation work, and last-green describes validation outcomes. Queue status returns the materialized applied enablement and the commit boundary at which it changed. + +## Contract + +`GetQueueStatus(queue, change_uri)` returns one `state`: the latest materialized enablement when the commit is omitted, or the enablement covering the supplied immutable commit URI. The state contains enabled/disabled enablement, its internally assigned sequence, an inclusive effective commit boundary and an application timestamp in Unix milliseconds. Its version identifies the selected enablement occurrence, not the summary's projection version. See the [proto](../../../api/stovepipe/proto/stovepipe.proto). + +Explicit registration establishes disabled version 1 without a boundary. Missing or unknown state is not disabled. Boundaries move forward along the queue lineage; at equal boundaries, the newest enablement version wins. Timestamps do not order state. A later transition at the same boundary can change the answer relative to a newer returned version. + +The lookup reads queue summaries and history only. It never updates internal queues or repairs projections. The summary can lag an internal commit when history or projection persistence fails, so “current” means the latest materialized applied state. A retained event newer than the pinned summary does not change that call's answer. + +The RPC uses generated `UNIMPLEMENTED` behavior until its lookup controller is wired. + +## Error semantics + +The endpoint returns `INVALID_ARGUMENT` for malformed selectors, `NOT_FOUND` when no queue summary exists, `FAILED_PRECONDITION` for unresolved commits or unsupported lineage, and `INTERNAL` for inconsistent history or projections. Dependency and cancellation failures preserve their identity for transport classification. A supplied but unresolved commit fails the entire call. + + +## Scope + +Enablement remains separate from validation outcomes, admission and execution controls. Configuration integration, mutation administration, public history/replay and pause are deferred. The contract contains neither pause nor last-green. A future pause control requires its own execution semantics and must not become an enablement enum value. No runtime execution or admission behavior changes when enablement is recorded. diff --git a/service/stovepipe/server/handler/BUILD.bazel b/service/stovepipe/server/handler/BUILD.bazel index d25dbfbdd..fd1b8a053 100644 --- a/service/stovepipe/server/handler/BUILD.bazel +++ b/service/stovepipe/server/handler/BUILD.bazel @@ -16,6 +16,7 @@ go_test( name = "go_default_test", srcs = [ "list_test.go", + "queue_status_test.go", "server_test.go", ], embed = [":go_default_library"], @@ -27,6 +28,8 @@ go_test( "//stovepipe/extension/storage:go_default_library", "@com_github_stretchr_testify//assert:go_default_library", "@com_github_stretchr_testify//require:go_default_library", + "@org_golang_google_grpc//codes:go_default_library", + "@org_golang_google_grpc//status:go_default_library", "@org_uber_go_mock//gomock:go_default_library", ], ) diff --git a/service/stovepipe/server/handler/queue_status_test.go b/service/stovepipe/server/handler/queue_status_test.go new file mode 100644 index 000000000..48bb10398 --- /dev/null +++ b/service/stovepipe/server/handler/queue_status_test.go @@ -0,0 +1,32 @@ +// 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/require" + pb "github.com/uber/submitqueue/api/stovepipe/protopb" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func TestQueueStatusContractIsUnimplemented(t *testing.T) { + server := &StovepipeServer{} + response, err := server.GetQueueStatus(context.Background(), &pb.GetQueueStatusRequest{Queue: "repo/main"}) + require.Nil(t, response) + require.Equal(t, codes.Unimplemented, status.Code(err)) +} From 0f1739541ca9311b015ab43ea6ace93bc61a68a9 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Wed, 14 Oct 2026 15:52:29 +0000 Subject: [PATCH 2/7] docs(stovepipe): explain queue status and commit boundaries --- doc/rfc/stovepipe/queue-state.md | 98 ++++++++++++++++++++++++++++---- 1 file changed, 88 insertions(+), 10 deletions(-) diff --git a/doc/rfc/stovepipe/queue-state.md b/doc/rfc/stovepipe/queue-state.md index 55a037cc9..f17509d24 100644 --- a/doc/rfc/stovepipe/queue-state.md +++ b/doc/rfc/stovepipe/queue-state.md @@ -1,22 +1,100 @@ -# Queue enablement and status lookup +# Queue status -Callers need the enablement covering a commit, including commits inside a validation batch that have no request of their own. A current flag loses earlier enable/disable intervals, request history describes validation work, and last-green describes validation outcomes. Queue status returns the materialized applied enablement and the commit boundary at which it changed. +Stovepipe needs to answer two questions: is a queue enabled now, and was it enabled for a particular commit? In both cases, the answer should include the commit at which that state took effect. -## Contract +## Why we need this -`GetQueueStatus(queue, change_uri)` returns one `state`: the latest materialized enablement when the commit is omitted, or the enablement covering the supplied immutable commit URI. The state contains enabled/disabled enablement, its internally assigned sequence, an inclusive effective commit boundary and an application timestamp in Unix milliseconds. Its version identifies the selected enablement occurrence, not the summary's projection version. See the [proto](../../../api/stovepipe/proto/stovepipe.proto). +A client deciding whether to expect Stovepipe validation for a commit needs to know whether the queue was enabled for that commit. The queue could be disabled today even though the commit arrived while it was enabled. It could also have just been enabled, before any validation result is available. We need to record enablement changes independently of validation work so clients can distinguish these cases. -Explicit registration establishes disabled version 1 without a boundary. Missing or unknown state is not disabled. Boundaries move forward along the queue lineage; at equal boundaries, the newest enablement version wins. Timestamps do not order state. A later transition at the same boundary can change the answer relative to a newer returned version. +The existing information cannot answer this reliably: -The lookup reads queue summaries and history only. It never updates internal queues or repairs projections. The summary can lag an internal commit when history or projection persistence fails, so “current” means the latest materialized applied state. A retained event newer than the pinned summary does not change that call's answer. +- A configuration flag gives the desired setting. It does not retain when Stovepipe applied each change, or which commits an earlier setting covered. +- The current queue row gives the latest internal state. Once it changes, it cannot answer questions about earlier commits on its own. +- Request history describes validation attempts. Stovepipe batches commits, so an intermediate commit may have no request of its own. A missing request does not mean the queue was disabled. +- Last-green and validation results describe outcomes. They do not tell us whether validation was expected in the first place. -The RPC uses generated `UNIMPLEMENTED` behavior until its lookup controller is wired. +The solution is a queue-status endpoint backed by a durable record of enabled/disabled changes and their commit boundaries. -## Error semantics +## What the endpoint returns -The endpoint returns `INVALID_ARGUMENT` for malformed selectors, `NOT_FOUND` when no queue summary exists, `FAILED_PRECONDITION` for unresolved commits or unsupported lineage, and `INTERNAL` for inconsistent history or projections. Dependency and cancellation failures preserve their identity for transport classification. A supplied but unresolved commit fails the entire call. +`GetQueueStatus` takes a queue name and an optional `change_uri`. Without a commit, it returns the latest state available in the queue summary. With a commit, it returns the state that covers that commit. The response contains one selected state, with these fields: +| Field | Meaning | +|---|---| +| `state` | `ENABLED` or `DISABLED`. | +| `effective_from_commit_uri` | The first commit covered by this state, inclusive. | +| `version` | A sequence number that increases for each enablement change. | +| `changed_at_ms` | When the change was recorded, in Unix milliseconds. This is not the commit's timestamp. | + +The [proto](../../../api/stovepipe/proto/stovepipe.proto) defines the wire contract. + +For example, suppose commits arrive in the order A, B, C, D, E, F, G. The queue is enabled at A, disabled at D, and enabled again at G: + +| Lookup | Returned state | Effective from | +|---|---|---| +| No commit supplied | Enabled | G | +| C | Enabled | A | +| D or F | Disabled | D | +| G | Enabled | G | + +C and F do not need validation requests. Their position relative to the state-change boundaries is enough to answer the lookup. + +When a queue is first registered, it starts as disabled version 1, with no commit boundary. That initial state covers commits before the first enablement. An unregistered queue or missing data is an error; it does not imply disabled. If multiple changes use the same boundary, the highest version wins. Versions order changes; timestamps do not. + +## How we store it + +Keep internal state separate from the views used by the API, following the summary and history model used for requests: + +| Record | Purpose | +|---|---| +| Existing `queue` row | Authoritative current enablement, alongside the queue's pipeline coordination fields. | +| `queue_log` | Immutable history of applied enablement changes, keyed by queue and enablement version. | +| `queue_summary` | The latest enablement change recorded in history, used for status reads. | + +The queue's existing row version still protects its complete snapshot from concurrent writes. A separate enablement version increases only when enabled/disabled changes, so routine pipeline updates do not create history entries or gaps. The summary has its own storage version for concurrent projection updates; the API exposes only the enablement version. + +## Applying a change + +The internal transition controller prepares a change by capturing the current enablement version, resolving the queue's tip through the existing source-control integration, and recording a timestamp. That tip becomes the effective commit boundary. Retrying the prepared change keeps the same boundary and timestamp, even if new commits arrive. Asking for the existing state is a no-op. + +Application follows this order: + +1. Finish recording the previous state in history and its summary. +2. Conditionally replace the internal queue snapshot with the new enablement, preserving its latest pipeline coordination fields. +3. Append the committed change to history. +4. Advance the queue summary to that change. + +`queuelog.Materializer.PersistLog` owns the history and summary writes. Repeating an identical change is safe, and an older change cannot move the summary backward. Conflicting content for the same version is an error. + +These writes do not require a transaction across records. If the process stops after updating the queue but before recording history, the queue still contains the missing change. Initialization and transition retries finish recording it before allowing another enablement change. A write error can therefore occur after internal state has changed; retrying the same prepared change completes the work without choosing a new boundary. + +Optimistic locking lets routine pipeline updates race with enablement safely. A competing enablement decision makes a prepared change stale and is rejected. The controller does not silently apply it on top of the winner. Startup registers new queues as disabled and preserves already registered state. + +## Looking up a commit + +The endpoint reads the summary and its matching history entry once. It uses that summary version throughout the lookup, even if a newer change is recorded during the call. Lookup never writes internal state or repairs history. If history or summary writes were interrupted, “current” means the latest state recorded in the read models; it can lag the internal queue until a writer retries. + +For a commit lookup, the existing source-control integration checks that the requested commit and the latest recorded boundary belong to the queue's current lineage. The controller then walks state changes from newest to oldest and selects the first boundary that is an ancestor of, or equal to, the requested commit. A lookup without a commit needs no source-control call. + +Before moving to an earlier state, the controller verifies that the requested commit actually precedes the boundary being examined. If neither is an ancestor of the other, it cannot assign a state reliably and fails the lookup. This also prevents rewritten history or a merged side branch from being mistaken for an earlier disabled interval. Supporting those cases requires an explicit ordering policy. + +This approach uses commit ancestry rather than validation-batch membership. It needs no intermediate-commit index or local checkout; the amount of history examined depends on the number of enablement changes. + +## Failure behavior + +Missing or inconsistent data must never produce a successful disabled answer. + +| Condition | RPC error | +|---|---| +| Malformed queue or commit selector | `INVALID_ARGUMENT` | +| No queue summary | `NOT_FOUND` | +| Unresolved commit or unsupported lineage | `FAILED_PRECONDITION` | +| Missing history or disagreement between history and summary | `INTERNAL` | + +Dependency and cancellation errors retain their normal transport classification. If a supplied commit cannot be resolved, the whole lookup fails. ## Scope -Enablement remains separate from validation outcomes, admission and execution controls. Configuration integration, mutation administration, public history/replay and pause are deferred. The contract contains neither pause nor last-green. A future pause control requires its own execution semantics and must not become an enablement enum value. No runtime execution or admission behavior changes when enablement is recorded. +This change records queue enablement and exposes status lookup. Recording enablement does not yet change ingestion, admission, or execution behavior. Choosing the configuration source and defining how to administer enabled/disabled transitions remain separate work, including how to reject stale configuration observations. There is no mutation RPC, CLI, or public history endpoint in this stack. + +Pause is also deferred. A future pause control should describe execution behavior separately from enablement, so a paused queue can still be identified as enabled. Validation outcomes and last-green remain in their existing APIs. From 850fc6bdf8f99b6ca409fcd74cd383c59cc3eb48 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Wed, 14 Oct 2026 17:26:15 +0000 Subject: [PATCH 3/7] docs(stovepipe): distinguish enablement from future pause controls --- doc/rfc/stovepipe/queue-state.md | 98 ++++++++++++++------------------ 1 file changed, 42 insertions(+), 56 deletions(-) diff --git a/doc/rfc/stovepipe/queue-state.md b/doc/rfc/stovepipe/queue-state.md index f17509d24..fe77bb733 100644 --- a/doc/rfc/stovepipe/queue-state.md +++ b/doc/rfc/stovepipe/queue-state.md @@ -1,100 +1,86 @@ -# Queue status +# Queue enablement and status -Stovepipe needs to answer two questions: is a queue enabled now, and was it enabled for a particular commit? In both cases, the answer should include the commit at which that state took effect. +Stovepipe needs to answer two questions: is a queue enabled now, and was it enabled for a particular commit? Each answer includes the commit at which that state took effect. ## Why we need this -A client deciding whether to expect Stovepipe validation for a commit needs to know whether the queue was enabled for that commit. The queue could be disabled today even though the commit arrived while it was enabled. It could also have just been enabled, before any validation result is available. We need to record enablement changes independently of validation work so clients can distinguish these cases. +A client needs to know whether Stovepipe validation is expected for a commit. Today's setting is not enough: a queue can be disabled now even though an earlier commit was covered, or enabled before its first validation finishes. The existing information cannot answer this reliably: -- A configuration flag gives the desired setting. It does not retain when Stovepipe applied each change, or which commits an earlier setting covered. -- The current queue row gives the latest internal state. Once it changes, it cannot answer questions about earlier commits on its own. -- Request history describes validation attempts. Stovepipe batches commits, so an intermediate commit may have no request of its own. A missing request does not mean the queue was disabled. -- Last-green and validation results describe outcomes. They do not tell us whether validation was expected in the first place. +- A configuration flag describes the desired setting, and the current queue row holds the latest applied state. Neither alone retains earlier commit intervals. +- Request history describes validation attempts. Batching leaves intermediate commits without their own requests, so a missing request does not imply disabled. +- Last-green and validation results describe outcomes, rather than whether validation was expected. -The solution is a queue-status endpoint backed by a durable record of enabled/disabled changes and their commit boundaries. +A dedicated lookup needs durable enablement history with commit boundaries, independent of validation work. + +## Enablement and pause + +Enablement defines which commits are covered by Stovepipe. Pause is a temporary operational control over whether a queue accepts or advances work. An enabled queue can be paused and still owe validation results for its covered commits; enabled does not promise that work is progressing or that results are green. + +For example, if a queue is enabled at A and later paused while validating C, the status for C remains enabled from A. Unpausing resumes work without creating a new enablement boundary. Disabling at D instead changes coverage from D onward, while preserving the answers for earlier commits. + +Future pause management should follow the [queue pause RFC](../submitqueue/queue-pause-and-unpause.md), which distinguishes refusing new requests from freezing accepted work. That RFC covers SubmitQueue; Stovepipe's ingestion and processing behavior still needs its own design. + +Pause can use the same internal-state, summary and history pattern described below, with separate operational fields and history events. Pause and unpause must not advance the enablement version or change commit boundaries. Keep pause out of the enablement enum, and expose it as current operational status rather than mixing it into a commit-specific enablement answer. A future administration API can manage both controls independently; this lookup remains read-only. ## What the endpoint returns -`GetQueueStatus` takes a queue name and an optional `change_uri`. Without a commit, it returns the latest state available in the queue summary. With a commit, it returns the state that covers that commit. The response contains one selected state, with these fields: +`GetQueueStatus` takes a queue name and an optional `change_uri`. Omitting the commit selects the latest queue summary; supplying it selects the state covering that commit. The response contains one state: | Field | Meaning | |---|---| | `state` | `ENABLED` or `DISABLED`. | -| `effective_from_commit_uri` | The first commit covered by this state, inclusive. | -| `version` | A sequence number that increases for each enablement change. | -| `changed_at_ms` | When the change was recorded, in Unix milliseconds. This is not the commit's timestamp. | +| `effective_from_commit_uri` | First covered commit, inclusive. | +| `version` | Sequence number that increases for each enablement change. | +| `changed_at_ms` | Recorded change timestamp in Unix milliseconds, distinct from commit time. | -The [proto](../../../api/stovepipe/proto/stovepipe.proto) defines the wire contract. +See the [proto](../../../api/stovepipe/proto/stovepipe.proto) for the wire contract. -For example, suppose commits arrive in the order A, B, C, D, E, F, G. The queue is enabled at A, disabled at D, and enabled again at G: +Suppose commits arrive in order A through G, with enablement changes at A, D and G: -| Lookup | Returned state | Effective from | +| Lookup | State | Effective from | |---|---|---| | No commit supplied | Enabled | G | | C | Enabled | A | | D or F | Disabled | D | | G | Enabled | G | -C and F do not need validation requests. Their position relative to the state-change boundaries is enough to answer the lookup. +C and F need no validation requests. Their ancestry relative to the boundaries determines the answer. -When a queue is first registered, it starts as disabled version 1, with no commit boundary. That initial state covers commits before the first enablement. An unregistered queue or missing data is an error; it does not imply disabled. If multiple changes use the same boundary, the highest version wins. Versions order changes; timestamps do not. +Registration starts a queue as disabled version 1, with no boundary; this covers commits before its first enablement. Missing state is an error, not disabled. If changes share a boundary, the highest version wins. Versions order changes; timestamps do not. -## How we store it +## Internal state, summary and history -Keep internal state separate from the views used by the API, following the summary and history model used for requests: +Follow the model used for request summaries and history, while keeping the internal queue authoritative: | Record | Purpose | |---|---| -| Existing `queue` row | Authoritative current enablement, alongside the queue's pipeline coordination fields. | -| `queue_log` | Immutable history of applied enablement changes, keyed by queue and enablement version. | -| `queue_summary` | The latest enablement change recorded in history, used for status reads. | - -The queue's existing row version still protects its complete snapshot from concurrent writes. A separate enablement version increases only when enabled/disabled changes, so routine pipeline updates do not create history entries or gaps. The summary has its own storage version for concurrent projection updates; the API exposes only the enablement version. - -## Applying a change - -The internal transition controller prepares a change by capturing the current enablement version, resolving the queue's tip through the existing source-control integration, and recording a timestamp. That tip becomes the effective commit boundary. Retrying the prepared change keeps the same boundary and timestamp, even if new commits arrive. Asking for the existing state is a no-op. +| Existing `queue` row | Current enablement alongside pipeline coordination fields. | +| `queue_log` | Immutable applied changes, keyed by queue and enablement version. | +| `queue_summary` | Current read view derived from those changes. | -Application follows this order: +The queue row and summary each have a storage version for optimistic locking. The API exposes a separate enablement version, which advances only for enabled/disabled changes. Routine pipeline updates create no enablement history entries or gaps. -1. Finish recording the previous state in history and its summary. -2. Conditionally replace the internal queue snapshot with the new enablement, preserving its latest pipeline coordination fields. -3. Append the committed change to history. -4. Advance the queue summary to that change. +The transition controller captures the queue's tip and a timestamp once when preparing a change. Retries keep those values; requesting the existing state is a no-op. Application first finishes recording the previous state, then conditionally updates the queue and records the new state through `queuelog.Materializer.PersistLog`. -`queuelog.Materializer.PersistLog` owns the history and summary writes. Repeating an identical change is safe, and an older change cannot move the summary backward. Conflicting content for the same version is an error. +History is written before its summary. If either write fails after the queue update, the queue retains the missing change. Initialization and transition retries repair the read models before another enablement change can replace it. Repeating an identical change is safe, and older changes cannot move the summary backward. Concurrent pipeline updates preserve their coordination fields; competing enablement decisions are rejected as stale. -These writes do not require a transaction across records. If the process stops after updating the queue but before recording history, the queue still contains the missing change. Initialization and transition retries finish recording it before allowing another enablement change. A write error can therefore occur after internal state has changed; retrying the same prepared change completes the work without choosing a new boundary. +## Commit lookup and consistency -Optimistic locking lets routine pipeline updates race with enablement safely. A competing enablement decision makes a prepared change stale and is rejected. The controller does not silently apply it on top of the winner. Startup registers new queues as disabled and preserves already registered state. +Lookup reads one summary and its matching history entry, and uses that version throughout the call. It never writes or repairs state. “Current” therefore means the latest state in the read models, which may lag the internal queue until a writer retries. -## Looking up a commit +For a supplied commit, the existing source-control integration verifies that the commit and latest boundary belong to the queue's current lineage. The controller walks changes newest-first and selects the first boundary that is an ancestor of, or equal to, the commit. Before walking backward, it verifies that the commit precedes the boundary; incomparable commits and unsupported history rewrites fail instead of becoming disabled. This resolves intermediate commits without a commit index or local checkout. Current-only lookup needs no source-control call. -The endpoint reads the summary and its matching history entry once. It uses that summary version throughout the lookup, even if a newer change is recorded during the call. Lookup never writes internal state or repairs history. If history or summary writes were interrupted, “current” means the latest state recorded in the read models; it can lag the internal queue until a writer retries. - -For a commit lookup, the existing source-control integration checks that the requested commit and the latest recorded boundary belong to the queue's current lineage. The controller then walks state changes from newest to oldest and selects the first boundary that is an ancestor of, or equal to, the requested commit. A lookup without a commit needs no source-control call. - -Before moving to an earlier state, the controller verifies that the requested commit actually precedes the boundary being examined. If neither is an ancestor of the other, it cannot assign a state reliably and fails the lookup. This also prevents rewritten history or a merged side branch from being mistaken for an earlier disabled interval. Supporting those cases requires an explicit ordering policy. - -This approach uses commit ancestry rather than validation-batch membership. It needs no intermediate-commit index or local checkout; the amount of history examined depends on the number of enablement changes. - -## Failure behavior - -Missing or inconsistent data must never produce a successful disabled answer. - -| Condition | RPC error | +| Failure | RPC error | |---|---| -| Malformed queue or commit selector | `INVALID_ARGUMENT` | +| Malformed selector | `INVALID_ARGUMENT` | | No queue summary | `NOT_FOUND` | | Unresolved commit or unsupported lineage | `FAILED_PRECONDITION` | -| Missing history or disagreement between history and summary | `INTERNAL` | +| Missing or inconsistent history | `INTERNAL` | -Dependency and cancellation errors retain their normal transport classification. If a supplied commit cannot be resolved, the whole lookup fails. +Dependency and cancellation errors retain their transport classification. An unresolved commit fails the whole call. ## Scope -This change records queue enablement and exposes status lookup. Recording enablement does not yet change ingestion, admission, or execution behavior. Choosing the configuration source and defining how to administer enabled/disabled transitions remain separate work, including how to reject stale configuration observations. There is no mutation RPC, CLI, or public history endpoint in this stack. - -Pause is also deferred. A future pause control should describe execution behavior separately from enablement, so a paused queue can still be identified as enabled. Validation outcomes and last-green remain in their existing APIs. +This stack records enablement and exposes status lookup. It does not enforce ingestion or execution controls. Configuration freshness, administration, pause enforcement and public history access remain separate work. Validation results and last-green stay in their existing APIs. From 723b25609509919a2d2cab001e263ab92c60c478 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Wed, 14 Oct 2026 17:39:57 +0000 Subject: [PATCH 4/7] docs(stovepipe): simplify queue status contract comments --- api/stovepipe/proto/stovepipe.proto | 13 ++++--------- api/stovepipe/protopb/stovepipe.pb.go | 11 +++-------- api/stovepipe/protopb/stovepipe_grpc.pb.go | 4 ++-- 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index ccd9aa752..475be6b3b 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -247,12 +247,10 @@ message ListResponse { string next_page_token = 2; } -// GetQueueStatusRequest selects applied enablement for a queue and optional commit. message GetQueueStatusRequest { // Required stable repo-and-ref queue name. string queue = 1; // Optional immutable commit URI. Empty selects the latest materialized state. - // Intermediate commits need no validation request of their own. string change_uri = 2; } @@ -264,9 +262,9 @@ enum QueueEnablement { QUEUE_ENABLEMENT_DISABLED = 2; } -// QueueState is one durably applied enablement occurrence. +// QueueState describes applied enablement. message QueueState { - // Internally assigned positive queue-state version; orders applied changes. + // Positive enablement sequence, increasing with each state change. int64 version = 1; // Applied enablement. Successful lookups never return UNKNOWN. QueueEnablement state = 2; @@ -276,13 +274,10 @@ message QueueState { int64 changed_at_ms = 4; } -// GetQueueStatusResponse contains the enablement selected by the request. message GetQueueStatusResponse { // Queue selected by the request. string queue = 1; - // Latest materialized state when change_uri is empty; otherwise the state covering that commit. - // Resolution uses one pinned summary, which may lag internal state until persistence is repaired. - // Unresolved commits fail the call and never imply DISABLED. + // Current enablement when change_uri is empty; otherwise enablement covering that commit. QueueState state = 2; } @@ -303,6 +298,6 @@ service Stovepipe { rpc GetProjectStatusByURI(GetProjectStatusByURIRequest) returns (GetProjectStatusByURIResponse) {} // List returns a queue-scoped page of current request summaries. rpc List(ListRequest) returns (ListResponse) {} - // GetQueueStatus returns current and optional commit-specific enablement. + // GetQueueStatus returns current enablement or enablement for a supplied commit. rpc GetQueueStatus(GetQueueStatusRequest) returns (GetQueueStatusResponse) {} } diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index 7c15d6a8e..082714c38 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -1524,13 +1524,11 @@ func (x *ListResponse) GetNextPageToken() string { return "" } -// GetQueueStatusRequest selects applied enablement for a queue and optional commit. type GetQueueStatusRequest struct { state protoimpl.MessageState `protogen:"open.v1"` // Required stable repo-and-ref queue name. Queue string `protobuf:"bytes,1,opt,name=queue,proto3" json:"queue,omitempty"` // Optional immutable commit URI. Empty selects the latest materialized state. - // Intermediate commits need no validation request of their own. ChangeUri string `protobuf:"bytes,2,opt,name=change_uri,json=changeUri,proto3" json:"change_uri,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -1580,10 +1578,10 @@ func (x *GetQueueStatusRequest) GetChangeUri() string { return "" } -// QueueState is one durably applied enablement occurrence. +// QueueState describes applied enablement. type QueueState struct { state protoimpl.MessageState `protogen:"open.v1"` - // Internally assigned positive queue-state version; orders applied changes. + // Positive enablement sequence, increasing with each state change. Version int64 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` // Applied enablement. Successful lookups never return UNKNOWN. State QueueEnablement `protobuf:"varint,2,opt,name=state,proto3,enum=uber.submitqueue.stovepipe.QueueEnablement" json:"state,omitempty"` @@ -1653,14 +1651,11 @@ func (x *QueueState) GetChangedAtMs() int64 { return 0 } -// GetQueueStatusResponse contains the enablement selected by the request. type GetQueueStatusResponse struct { state protoimpl.MessageState `protogen:"open.v1"` // Queue selected by the request. Queue string `protobuf:"bytes,1,opt,name=queue,proto3" json:"queue,omitempty"` - // Latest materialized state when change_uri is empty; otherwise the state covering that commit. - // Resolution uses one pinned summary, which may lag internal state until persistence is repaired. - // Unresolved commits fail the call and never imply DISABLED. + // Current enablement when change_uri is empty; otherwise enablement covering that commit. State *QueueState `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache diff --git a/api/stovepipe/protopb/stovepipe_grpc.pb.go b/api/stovepipe/protopb/stovepipe_grpc.pb.go index 0c0c98af7..64f1af82d 100644 --- a/api/stovepipe/protopb/stovepipe_grpc.pb.go +++ b/api/stovepipe/protopb/stovepipe_grpc.pb.go @@ -65,7 +65,7 @@ type StovepipeClient interface { GetProjectStatusByURI(ctx context.Context, in *GetProjectStatusByURIRequest, opts ...grpc.CallOption) (*GetProjectStatusByURIResponse, error) // List returns a queue-scoped page of current request summaries. List(ctx context.Context, in *ListRequest, opts ...grpc.CallOption) (*ListResponse, error) - // GetQueueStatus returns current and optional commit-specific enablement. + // GetQueueStatus returns current enablement or enablement for a supplied commit. GetQueueStatus(ctx context.Context, in *GetQueueStatusRequest, opts ...grpc.CallOption) (*GetQueueStatusResponse, error) } @@ -178,7 +178,7 @@ type StovepipeServer interface { GetProjectStatusByURI(context.Context, *GetProjectStatusByURIRequest) (*GetProjectStatusByURIResponse, error) // List returns a queue-scoped page of current request summaries. List(context.Context, *ListRequest) (*ListResponse, error) - // GetQueueStatus returns current and optional commit-specific enablement. + // GetQueueStatus returns current enablement or enablement for a supplied commit. GetQueueStatus(context.Context, *GetQueueStatusRequest) (*GetQueueStatusResponse, error) mustEmbedUnimplementedStovepipeServer() } From 133e3d7ed9902145cf71bd0d5a033e9ba5047869 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Wed, 14 Oct 2026 17:48:23 +0000 Subject: [PATCH 5/7] refactor(stovepipe): name queue enablement status explicitly --- api/stovepipe/proto/stovepipe.proto | 8 +- api/stovepipe/protopb/stovepipe.pb.go | 53 +++--- api/stovepipe/protopb/stovepipe.pb.yarpc.go | 168 ++++++++++---------- doc/rfc/stovepipe/queue-state.md | 4 +- 4 files changed, 118 insertions(+), 115 deletions(-) diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index 475be6b3b..5e689f0af 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -262,8 +262,8 @@ enum QueueEnablement { QUEUE_ENABLEMENT_DISABLED = 2; } -// QueueState describes applied enablement. -message QueueState { +// QueueEnablementStatus describes applied enablement. +message QueueEnablementStatus { // Positive enablement sequence, increasing with each state change. int64 version = 1; // Applied enablement. Successful lookups never return UNKNOWN. @@ -277,8 +277,8 @@ message QueueState { message GetQueueStatusResponse { // Queue selected by the request. string queue = 1; - // Current enablement when change_uri is empty; otherwise enablement covering that commit. - QueueState state = 2; + // Current enablement, or enablement covering change_uri. Always present on success. + QueueEnablementStatus enablement = 2; } // Stovepipe provides the Stovepipe API. diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index 082714c38..abbd87ee3 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -1578,8 +1578,8 @@ func (x *GetQueueStatusRequest) GetChangeUri() string { return "" } -// QueueState describes applied enablement. -type QueueState struct { +// QueueEnablementStatus describes applied enablement. +type QueueEnablementStatus struct { state protoimpl.MessageState `protogen:"open.v1"` // Positive enablement sequence, increasing with each state change. Version int64 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` @@ -1593,20 +1593,20 @@ type QueueState struct { sizeCache protoimpl.SizeCache } -func (x *QueueState) Reset() { - *x = QueueState{} +func (x *QueueEnablementStatus) Reset() { + *x = QueueEnablementStatus{} mi := &file_stovepipe_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } -func (x *QueueState) String() string { +func (x *QueueEnablementStatus) String() string { return protoimpl.X.MessageStringOf(x) } -func (*QueueState) ProtoMessage() {} +func (*QueueEnablementStatus) ProtoMessage() {} -func (x *QueueState) ProtoReflect() protoreflect.Message { +func (x *QueueEnablementStatus) ProtoReflect() protoreflect.Message { mi := &file_stovepipe_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1618,33 +1618,33 @@ func (x *QueueState) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use QueueState.ProtoReflect.Descriptor instead. -func (*QueueState) Descriptor() ([]byte, []int) { +// Deprecated: Use QueueEnablementStatus.ProtoReflect.Descriptor instead. +func (*QueueEnablementStatus) Descriptor() ([]byte, []int) { return file_stovepipe_proto_rawDescGZIP(), []int{19} } -func (x *QueueState) GetVersion() int64 { +func (x *QueueEnablementStatus) GetVersion() int64 { if x != nil { return x.Version } return 0 } -func (x *QueueState) GetState() QueueEnablement { +func (x *QueueEnablementStatus) GetState() QueueEnablement { if x != nil { return x.State } return QueueEnablement_QUEUE_ENABLEMENT_UNKNOWN } -func (x *QueueState) GetEffectiveFromCommitUri() string { +func (x *QueueEnablementStatus) GetEffectiveFromCommitUri() string { if x != nil { return x.EffectiveFromCommitUri } return "" } -func (x *QueueState) GetChangedAtMs() int64 { +func (x *QueueEnablementStatus) GetChangedAtMs() int64 { if x != nil { return x.ChangedAtMs } @@ -1655,8 +1655,8 @@ type GetQueueStatusResponse struct { state protoimpl.MessageState `protogen:"open.v1"` // Queue selected by the request. Queue string `protobuf:"bytes,1,opt,name=queue,proto3" json:"queue,omitempty"` - // Current enablement when change_uri is empty; otherwise enablement covering that commit. - State *QueueState `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + // Current enablement, or enablement covering change_uri. Always present on success. + Enablement *QueueEnablementStatus `protobuf:"bytes,2,opt,name=enablement,proto3" json:"enablement,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1698,9 +1698,9 @@ func (x *GetQueueStatusResponse) GetQueue() string { return "" } -func (x *GetQueueStatusResponse) GetState() *QueueState { +func (x *GetQueueStatusResponse) GetEnablement() *QueueEnablementStatus { if x != nil { - return x.State + return x.Enablement } return nil } @@ -1822,16 +1822,17 @@ const file_stovepipe_proto_rawDesc = "" + "\x15GetQueueStatusRequest\x12\x14\n" + "\x05queue\x18\x01 \x01(\tR\x05queue\x12\x1d\n" + "\n" + - "change_uri\x18\x02 \x01(\tR\tchangeUri\"\xc8\x01\n" + - "\n" + - "QueueState\x12\x18\n" + + "change_uri\x18\x02 \x01(\tR\tchangeUri\"\xd3\x01\n" + + "\x15QueueEnablementStatus\x12\x18\n" + "\aversion\x18\x01 \x01(\x03R\aversion\x12A\n" + "\x05state\x18\x02 \x01(\x0e2+.uber.submitqueue.stovepipe.QueueEnablementR\x05state\x129\n" + "\x19effective_from_commit_uri\x18\x03 \x01(\tR\x16effectiveFromCommitUri\x12\"\n" + - "\rchanged_at_ms\x18\x04 \x01(\x03R\vchangedAtMs\"l\n" + + "\rchanged_at_ms\x18\x04 \x01(\x03R\vchangedAtMs\"\x81\x01\n" + "\x16GetQueueStatusResponse\x12\x14\n" + - "\x05queue\x18\x01 \x01(\tR\x05queue\x12<\n" + - "\x05state\x18\x02 \x01(\v2&.uber.submitqueue.stovepipe.QueueStateR\x05state*l\n" + + "\x05queue\x18\x01 \x01(\tR\x05queue\x12Q\n" + + "\n" + + "enablement\x18\x02 \x01(\v21.uber.submitqueue.stovepipe.QueueEnablementStatusR\n" + + "enablement*l\n" + "\x0fQueueEnablement\x12\x1c\n" + "\x18QUEUE_ENABLEMENT_UNKNOWN\x10\x00\x12\x1c\n" + "\x18QUEUE_ENABLEMENT_ENABLED\x10\x01\x12\x1d\n" + @@ -1882,7 +1883,7 @@ var file_stovepipe_proto_goTypes = []any{ (*ListRequest)(nil), // 17: uber.submitqueue.stovepipe.ListRequest (*ListResponse)(nil), // 18: uber.submitqueue.stovepipe.ListResponse (*GetQueueStatusRequest)(nil), // 19: uber.submitqueue.stovepipe.GetQueueStatusRequest - (*QueueState)(nil), // 20: uber.submitqueue.stovepipe.QueueState + (*QueueEnablementStatus)(nil), // 20: uber.submitqueue.stovepipe.QueueEnablementStatus (*GetQueueStatusResponse)(nil), // 21: uber.submitqueue.stovepipe.GetQueueStatusResponse } var file_stovepipe_proto_depIdxs = []int32{ @@ -1894,8 +1895,8 @@ var file_stovepipe_proto_depIdxs = []int32{ 13, // 5: uber.submitqueue.stovepipe.GetProjectStatusByIDResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation 13, // 6: uber.submitqueue.stovepipe.GetProjectStatusByURIResponse.projects:type_name -> uber.submitqueue.stovepipe.ProjectValidation 16, // 7: uber.submitqueue.stovepipe.ListResponse.requests:type_name -> uber.submitqueue.stovepipe.RequestSummary - 0, // 8: uber.submitqueue.stovepipe.QueueState.state:type_name -> uber.submitqueue.stovepipe.QueueEnablement - 20, // 9: uber.submitqueue.stovepipe.GetQueueStatusResponse.state:type_name -> uber.submitqueue.stovepipe.QueueState + 0, // 8: uber.submitqueue.stovepipe.QueueEnablementStatus.state:type_name -> uber.submitqueue.stovepipe.QueueEnablement + 20, // 9: uber.submitqueue.stovepipe.GetQueueStatusResponse.enablement:type_name -> uber.submitqueue.stovepipe.QueueEnablementStatus 1, // 10: uber.submitqueue.stovepipe.Stovepipe.Ping:input_type -> uber.submitqueue.stovepipe.PingRequest 3, // 11: uber.submitqueue.stovepipe.Stovepipe.Ingest:input_type -> uber.submitqueue.stovepipe.IngestRequest 5, // 12: uber.submitqueue.stovepipe.Stovepipe.GetRequestHistoryByID:input_type -> uber.submitqueue.stovepipe.GetRequestHistoryByIDRequest diff --git a/api/stovepipe/protopb/stovepipe.pb.yarpc.go b/api/stovepipe/protopb/stovepipe.pb.yarpc.go index 7610d1fc7..b2283430a 100644 --- a/api/stovepipe/protopb/stovepipe.pb.yarpc.go +++ b/api/stovepipe/protopb/stovepipe.pb.yarpc.go @@ -577,90 +577,90 @@ var yarpcFileDescriptorClosurefabdb6b3c0b09022 = [][]byte{ // stovepipe.proto []byte{ 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0x58, 0x4d, 0x6f, 0x1b, 0xc5, - 0x1b, 0xcf, 0xda, 0x79, 0xb1, 0x1f, 0x3b, 0x4e, 0x3a, 0xed, 0x3f, 0x7f, 0xc7, 0x6d, 0xaa, 0xb0, - 0xd0, 0x36, 0x2d, 0xaa, 0xa3, 0x06, 0x09, 0x5a, 0x84, 0x10, 0x71, 0xe3, 0xc6, 0x16, 0x4d, 0x9a, - 0xae, 0x1b, 0x90, 0xe8, 0x61, 0xb5, 0x5e, 0x4f, 0x9c, 0x6d, 0xbd, 0x3b, 0xdb, 0x99, 0xd9, 0x40, - 0x7a, 0xe0, 0xc6, 0x09, 0x09, 0x89, 0x6f, 0xc0, 0x19, 0xee, 0x9c, 0x39, 0x21, 0x3e, 0x02, 0x7c, - 0x02, 0x3e, 0x02, 0x57, 0x34, 0x2f, 0xbb, 0x5e, 0x3b, 0x8e, 0xdd, 0x34, 0x20, 0x81, 0xc4, 0xcd, - 0xf3, 0xbc, 0xcd, 0xf3, 0xfa, 0xdb, 0x67, 0x0c, 0x0b, 0x8c, 0x93, 0x23, 0x1c, 0x7a, 0x21, 0xae, - 0x86, 0x94, 0x70, 0x82, 0x2a, 0x51, 0x1b, 0xd3, 0x2a, 0x8b, 0xda, 0xbe, 0xc7, 0x5f, 0x44, 0x38, - 0xc2, 0xd5, 0x44, 0xc2, 0xbc, 0x01, 0x85, 0x3d, 0x2f, 0xe8, 0x5a, 0xf8, 0x45, 0x84, 0x19, 0x47, - 0x65, 0x98, 0xf3, 0x31, 0x63, 0x4e, 0x17, 0x97, 0x8d, 0x55, 0x63, 0x2d, 0x6f, 0xc5, 0x47, 0xf3, - 0x2b, 0x03, 0x8a, 0x4a, 0x92, 0x85, 0x24, 0x60, 0xf8, 0x74, 0x51, 0xf4, 0x06, 0x14, 0x19, 0xa6, - 0x47, 0x9e, 0x8b, 0xed, 0xc0, 0xf1, 0x71, 0x39, 0x23, 0xd9, 0x05, 0x4d, 0xdb, 0x75, 0x7c, 0x8c, - 0xae, 0x40, 0x9e, 0x7b, 0x3e, 0x66, 0xdc, 0xf1, 0xc3, 0x72, 0x76, 0xd5, 0x58, 0xcb, 0x5a, 0x7d, - 0x02, 0xaa, 0x40, 0xee, 0x90, 0x30, 0x2e, 0x95, 0xa7, 0xa5, 0x72, 0x72, 0x36, 0xaf, 0xc1, 0x7c, - 0x33, 0xe8, 0x62, 0xc6, 0x63, 0x97, 0x2f, 0xc1, 0x8c, 0x0c, 0x4a, 0x7b, 0xa1, 0x0e, 0xe6, 0x2a, - 0x94, 0x62, 0x31, 0xed, 0x6f, 0x09, 0x32, 0x5e, 0x47, 0x0b, 0x65, 0xbc, 0x8e, 0xd9, 0x82, 0x2b, - 0xdb, 0x38, 0xb6, 0xd2, 0xf0, 0x18, 0x27, 0xf4, 0xb8, 0x76, 0xdc, 0xdc, 0x1a, 0x6b, 0x17, 0xad, - 0x00, 0x50, 0x25, 0x60, 0x7b, 0x1d, 0x1d, 0x59, 0x5e, 0x53, 0x9a, 0x1d, 0x73, 0x1b, 0x56, 0x46, - 0x18, 0xdd, 0xb7, 0x9a, 0xe3, 0xad, 0x2e, 0x42, 0x36, 0xa2, 0x9e, 0x36, 0x27, 0x7e, 0x9a, 0x3f, - 0x19, 0x50, 0xd4, 0xfa, 0xf5, 0x23, 0x1c, 0x70, 0xb4, 0x0c, 0x39, 0x2c, 0x7e, 0xd8, 0x49, 0x10, - 0x73, 0xf2, 0xdc, 0xec, 0x88, 0x7c, 0x27, 0xb9, 0xb3, 0x7d, 0x26, 0xcd, 0x64, 0xad, 0x42, 0x42, - 0xdb, 0x61, 0xe8, 0x1a, 0xcc, 0xc7, 0x6e, 0x33, 0xee, 0x70, 0x2c, 0x73, 0x9e, 0x6f, 0x4c, 0x59, - 0x45, 0x4d, 0x6e, 0x09, 0x2a, 0x5a, 0x82, 0x19, 0x69, 0x54, 0x65, 0xbd, 0x31, 0x65, 0xa9, 0x23, - 0xba, 0x06, 0x25, 0x12, 0x71, 0x97, 0xf8, 0xd8, 0xa6, 0xd8, 0x61, 0x24, 0x28, 0xcf, 0x48, 0x17, - 0xe6, 0x35, 0xd5, 0x92, 0xc4, 0x5a, 0x11, 0x80, 0xb8, 0x6e, 0x44, 0x29, 0x0e, 0x5c, 0x6c, 0xfe, - 0x6c, 0x40, 0x69, 0x30, 0x13, 0x43, 0xd9, 0x33, 0x86, 0xb2, 0x87, 0x3e, 0x82, 0x59, 0x79, 0x9f, - 0x08, 0x21, 0xbb, 0x56, 0xd8, 0x58, 0xab, 0x9e, 0xde, 0xb9, 0xd5, 0x74, 0x76, 0x2c, 0xad, 0x87, - 0x5a, 0xb0, 0x90, 0xc4, 0x19, 0xf9, 0xbe, 0x43, 0x8f, 0x65, 0xa4, 0x85, 0x8d, 0x5b, 0xe3, 0x4c, - 0x69, 0x2f, 0x5b, 0x4a, 0xc3, 0x2a, 0xd1, 0x81, 0xb3, 0xf9, 0xa3, 0x31, 0xb2, 0xaa, 0xa2, 0x55, - 0x74, 0x6f, 0xf5, 0x1d, 0x37, 0xfe, 0x3a, 0xc7, 0x33, 0xe7, 0x76, 0xfc, 0x19, 0x5c, 0x3d, 0xad, - 0x1b, 0xb5, 0xe3, 0x0d, 0xc8, 0x1f, 0x4a, 0xba, 0x87, 0x63, 0xdf, 0x5f, 0xe5, 0x42, 0x6d, 0xcb, - 0xea, 0x2b, 0x9b, 0xdf, 0x1b, 0x70, 0x79, 0x1b, 0xf3, 0x3d, 0x4a, 0x9e, 0x61, 0x57, 0xb6, 0x53, - 0xc4, 0xce, 0x3b, 0x4e, 0x02, 0x08, 0x42, 0x65, 0x90, 0x95, 0xb3, 0xab, 0x59, 0x01, 0x04, 0xf1, - 0x19, 0x5d, 0x86, 0x7c, 0xe8, 0x74, 0xb1, 0xcd, 0xbc, 0x97, 0x0a, 0x25, 0x66, 0xac, 0x9c, 0x20, - 0xb4, 0xbc, 0x97, 0xd2, 0xae, 0x64, 0x72, 0xf2, 0x1c, 0xc7, 0xcd, 0x2a, 0xc5, 0x9f, 0x08, 0x82, - 0xf9, 0x83, 0x21, 0x87, 0x7f, 0xc8, 0xd9, 0x89, 0x63, 0xba, 0x02, 0xe0, 0x1e, 0x3a, 0x41, 0x17, - 0xdb, 0xfd, 0x69, 0xcd, 0x2b, 0xca, 0x3e, 0xf5, 0xfe, 0x36, 0x6f, 0xdb, 0x70, 0x41, 0x7b, 0xfa, - 0x89, 0xd3, 0xf3, 0x3a, 0x0e, 0xf7, 0x48, 0x20, 0xe0, 0x57, 0x1b, 0x8f, 0xe1, 0x40, 0x1f, 0xd1, - 0x4d, 0x58, 0x68, 0x53, 0xec, 0x3c, 0x17, 0x16, 0x3b, 0xb8, 0x4b, 0xb1, 0x42, 0x60, 0xa3, 0x31, - 0x65, 0x95, 0x62, 0xc6, 0x96, 0xa4, 0xd7, 0x72, 0x30, 0x4b, 0x31, 0x8b, 0x7a, 0xdc, 0xfc, 0x35, - 0x3b, 0x2a, 0x23, 0xa9, 0x16, 0x9f, 0x30, 0xba, 0x49, 0xc2, 0x32, 0xa7, 0x27, 0x2c, 0x3b, 0x9c, - 0xb0, 0x65, 0xc8, 0xb5, 0x1d, 0xa6, 0x98, 0x0a, 0xe7, 0xe7, 0xc4, 0x59, 0xb0, 0xde, 0x1c, 0x06, - 0x2c, 0x95, 0x95, 0x41, 0xb8, 0x32, 0x61, 0x3e, 0x0a, 0x3b, 0x0e, 0xc7, 0x1d, 0xdb, 0xe1, 0x02, - 0xf9, 0x40, 0x21, 0x9f, 0x26, 0x6e, 0xf2, 0x1d, 0x86, 0x3e, 0x84, 0x0a, 0xc5, 0x21, 0x61, 0x9e, - 0x68, 0x58, 0x7b, 0x38, 0x31, 0xb3, 0x3a, 0x31, 0xe5, 0xbe, 0x4c, 0x6d, 0x20, 0x45, 0xe8, 0x2e, - 0x94, 0x75, 0x62, 0x6d, 0x95, 0x2a, 0x66, 0xbb, 0xc4, 0x0f, 0x7b, 0x98, 0xe3, 0xf2, 0xdc, 0xaa, - 0xb1, 0x96, 0xb3, 0x96, 0x34, 0xdf, 0x52, 0xec, 0xfb, 0x9a, 0x8b, 0x9a, 0xa9, 0x76, 0xc8, 0xc9, - 0xd1, 0xba, 0x3d, 0x6e, 0xb4, 0x4e, 0x94, 0x38, 0xd5, 0x3d, 0xd7, 0x61, 0x21, 0xc0, 0x5f, 0x70, - 0x3b, 0xd5, 0x25, 0x79, 0x05, 0xc0, 0x82, 0xbc, 0x17, 0x77, 0x4a, 0xed, 0x22, 0x5c, 0x48, 0x05, - 0xab, 0x4b, 0xfb, 0x5b, 0x56, 0xc2, 0xd7, 0xa8, 0x66, 0xff, 0xaf, 0xb6, 0xff, 0xf2, 0xda, 0x7e, - 0x97, 0x49, 0xbe, 0xb1, 0x1a, 0xf4, 0xff, 0x91, 0xc5, 0xbc, 0x0d, 0x17, 0x25, 0xd3, 0x1e, 0x2c, - 0xe9, 0xac, 0x2c, 0xe9, 0xa2, 0x64, 0xed, 0xa7, 0xea, 0xfa, 0x16, 0x94, 0x1c, 0xd7, 0xc5, 0x61, - 0x5f, 0x72, 0x4e, 0x4a, 0x16, 0x63, 0xaa, 0x94, 0x3a, 0xb9, 0x94, 0xe4, 0x46, 0x2c, 0x25, 0xe6, - 0x1f, 0x06, 0x14, 0x1e, 0x7a, 0x13, 0xf6, 0x45, 0xf4, 0x2e, 0xfc, 0x3f, 0x7d, 0x25, 0xa1, 0xb6, - 0x73, 0xc0, 0x31, 0x4d, 0xd6, 0xa9, 0xc6, 0x94, 0x75, 0xb1, 0x7f, 0xfb, 0x23, 0xba, 0x29, 0xb8, - 0x3b, 0x0c, 0x55, 0x01, 0x25, 0x7a, 0x6d, 0x7c, 0x40, 0x28, 0x16, 0x2a, 0x72, 0xa3, 0x6d, 0x18, - 0xd6, 0x62, 0xcc, 0xab, 0x49, 0xd6, 0xce, 0xb9, 0xbe, 0x03, 0xb5, 0x25, 0xb8, 0x94, 0xdc, 0xd5, - 0x23, 0x9f, 0x63, 0x6a, 0xb7, 0x49, 0x14, 0x74, 0x06, 0xe8, 0x51, 0x18, 0xc6, 0x74, 0xf3, 0x4b, - 0x28, 0xaa, 0xc0, 0xf5, 0x98, 0x3f, 0x80, 0x9c, 0xae, 0xca, 0x59, 0xbe, 0xf5, 0xf1, 0x72, 0x91, - 0xe8, 0x8e, 0xea, 0xd8, 0xcc, 0x88, 0x8e, 0x35, 0x1f, 0xc2, 0xff, 0xb6, 0x31, 0x7f, 0x2c, 0xcc, - 0x2a, 0xd4, 0x39, 0xcf, 0xd7, 0xd5, 0xfc, 0xc5, 0x00, 0x48, 0x6c, 0xc9, 0xe7, 0xc7, 0x11, 0xa6, - 0xcc, 0x23, 0x81, 0xb4, 0x92, 0xb5, 0xe2, 0x23, 0xda, 0x84, 0x19, 0xd5, 0x89, 0xc2, 0x44, 0x69, - 0xe3, 0xed, 0x71, 0x31, 0x4a, 0x83, 0xf5, 0xc0, 0x69, 0xf7, 0xb0, 0x2f, 0xd6, 0x31, 0xa5, 0x89, - 0xee, 0xc1, 0x32, 0x3e, 0x38, 0xc0, 0x2e, 0xf7, 0x8e, 0xb0, 0x7d, 0x40, 0x89, 0x2f, 0x70, 0xc1, - 0xf7, 0x78, 0x6a, 0x3a, 0x96, 0x12, 0x81, 0x07, 0x94, 0xf8, 0xf7, 0x25, 0x5b, 0xcc, 0x83, 0x09, - 0xf3, 0xca, 0xe7, 0xb8, 0x75, 0xa7, 0x15, 0x6e, 0x69, 0xa2, 0xe8, 0x5c, 0xb3, 0x07, 0x4b, 0xc3, - 0x89, 0xd1, 0x25, 0x1a, 0x9d, 0x99, 0x0f, 0xd2, 0x11, 0x15, 0x36, 0xae, 0x4f, 0x8c, 0x48, 0xa6, - 0x48, 0x07, 0x73, 0xab, 0x07, 0x0b, 0x43, 0x61, 0xa2, 0x2b, 0x50, 0x7e, 0xbc, 0x5f, 0xdf, 0xaf, - 0xdb, 0xf5, 0xdd, 0xcd, 0xda, 0xc3, 0xfa, 0x4e, 0x7d, 0xf7, 0x89, 0xbd, 0xbf, 0xfb, 0xf1, 0xee, - 0xa3, 0x4f, 0x77, 0x17, 0xa7, 0x46, 0x72, 0xd5, 0xcf, 0xad, 0x45, 0x03, 0xad, 0xc0, 0xf2, 0x09, - 0xee, 0x56, 0xb3, 0xa5, 0xd8, 0x99, 0x8d, 0xdf, 0xe7, 0x20, 0xdf, 0x8a, 0xbd, 0x41, 0x4f, 0x61, - 0x5a, 0x3c, 0x1a, 0xd1, 0x8d, 0xb1, 0xe8, 0xd8, 0x7f, 0x80, 0x56, 0xd6, 0x26, 0x0b, 0xaa, 0x54, - 0x99, 0x53, 0xc8, 0x81, 0x59, 0xf5, 0xc6, 0x43, 0x37, 0xc7, 0x69, 0x0d, 0x3c, 0x17, 0x2b, 0xb7, - 0x5e, 0x45, 0x34, 0xb9, 0xe2, 0x1b, 0x43, 0xf6, 0xf0, 0xc9, 0xd5, 0x1f, 0xdd, 0x1d, 0x67, 0x67, - 0xdc, 0xc3, 0xb2, 0x72, 0xef, 0x35, 0x34, 0x13, 0x87, 0xbe, 0x35, 0x64, 0xef, 0x8c, 0xd8, 0xe9, - 0xd1, 0x59, 0xed, 0xf6, 0xd7, 0xdd, 0xca, 0xfb, 0xaf, 0xa3, 0x9a, 0xf8, 0xf4, 0xb5, 0x01, 0x97, - 0x46, 0xed, 0x8e, 0xe8, 0xbd, 0x09, 0x66, 0x4f, 0x7b, 0x2c, 0x54, 0xee, 0x9e, 0x5d, 0x71, 0xb8, - 0x64, 0x27, 0xd7, 0x1d, 0x74, 0x46, 0xab, 0xa9, 0xfc, 0xdc, 0x7b, 0x0d, 0xcd, 0xc4, 0xa1, 0xa7, - 0x30, 0x2d, 0x60, 0x78, 0xfc, 0x0c, 0xa4, 0xbe, 0x50, 0xe3, 0x67, 0x20, 0x8d, 0xe8, 0xe6, 0x14, - 0x3a, 0x86, 0xd2, 0x20, 0x94, 0xa0, 0x3b, 0x13, 0x7c, 0x3d, 0x89, 0xc7, 0x95, 0x8d, 0xb3, 0xa8, - 0xc4, 0x57, 0xd7, 0x30, 0x5c, 0x75, 0x89, 0x3f, 0x46, 0xb5, 0x56, 0x4a, 0x80, 0x60, 0x8f, 0x12, - 0x4e, 0xf6, 0x8c, 0xcf, 0xee, 0x74, 0x3d, 0x7e, 0x18, 0xb5, 0xab, 0x2e, 0xf1, 0xd7, 0x85, 0xe2, - 0x7a, 0x4a, 0x71, 0xdd, 0x09, 0xbd, 0xf5, 0x44, 0x79, 0x5d, 0xfe, 0x77, 0x15, 0xb6, 0xdb, 0xb3, - 0xf2, 0xc7, 0x3b, 0x7f, 0x06, 0x00, 0x00, 0xff, 0xff, 0x2f, 0xb3, 0x03, 0xbe, 0xd7, 0x12, 0x00, - 0x00, + 0x1b, 0xf7, 0xda, 0x79, 0xb1, 0x9f, 0x38, 0x4e, 0x3a, 0x6d, 0xf3, 0x77, 0xdc, 0xa6, 0xca, 0x7f, + 0xa1, 0x34, 0x2d, 0xaa, 0xa3, 0x06, 0x09, 0x5a, 0x0e, 0x88, 0xb8, 0x71, 0x63, 0x8b, 0x26, 0x4d, + 0xd7, 0x0d, 0x48, 0xf4, 0xb0, 0x5a, 0xdb, 0x4f, 0x9c, 0x6d, 0xb3, 0x2f, 0x9d, 0x99, 0x0d, 0xa4, + 0x07, 0x24, 0x0e, 0x9c, 0x90, 0x90, 0xf8, 0x06, 0x9c, 0xe1, 0xce, 0x99, 0x13, 0x5f, 0x80, 0x0b, + 0x7c, 0x02, 0x3e, 0x02, 0x57, 0x34, 0x2f, 0xbb, 0x5e, 0x3b, 0x8e, 0xd3, 0x34, 0x20, 0x81, 0xc4, + 0xcd, 0xf3, 0xbc, 0xfc, 0xe6, 0x99, 0xe7, 0xe5, 0xb7, 0x33, 0x86, 0x39, 0xc6, 0x83, 0x43, 0x0c, + 0xdd, 0x10, 0xab, 0x21, 0x0d, 0x78, 0x40, 0x2a, 0x51, 0x1b, 0x69, 0x95, 0x45, 0x6d, 0xcf, 0xe5, + 0x2f, 0x22, 0x8c, 0xb0, 0x9a, 0x58, 0x98, 0x37, 0x60, 0x66, 0xc7, 0xf5, 0x7b, 0x16, 0xbe, 0x88, + 0x90, 0x71, 0x52, 0x86, 0x69, 0x0f, 0x19, 0x73, 0x7a, 0x58, 0x36, 0x96, 0x8d, 0x95, 0x82, 0x15, + 0x2f, 0xcd, 0xaf, 0x0c, 0x28, 0x2a, 0x4b, 0x16, 0x06, 0x3e, 0xc3, 0x93, 0x4d, 0xc9, 0xff, 0xa1, + 0xc8, 0x90, 0x1e, 0xba, 0x1d, 0xb4, 0x7d, 0xc7, 0xc3, 0x72, 0x56, 0xaa, 0x67, 0xb4, 0x6c, 0xdb, + 0xf1, 0x90, 0x5c, 0x85, 0x02, 0x77, 0x3d, 0x64, 0xdc, 0xf1, 0xc2, 0x72, 0x6e, 0xd9, 0x58, 0xc9, + 0x59, 0x7d, 0x01, 0xa9, 0x40, 0x7e, 0x3f, 0x60, 0x5c, 0x3a, 0x4f, 0x48, 0xe7, 0x64, 0x6d, 0x5e, + 0x87, 0xd9, 0xa6, 0xdf, 0x43, 0xc6, 0xe3, 0x90, 0x2f, 0xc1, 0xa4, 0x3c, 0x94, 0x8e, 0x42, 0x2d, + 0xcc, 0x65, 0x28, 0xc5, 0x66, 0x3a, 0xde, 0x12, 0x64, 0xdd, 0xae, 0x36, 0xca, 0xba, 0x5d, 0xb3, + 0x05, 0x57, 0x37, 0x31, 0x46, 0x69, 0xb8, 0x8c, 0x07, 0xf4, 0xa8, 0x76, 0xd4, 0xdc, 0x18, 0x8b, + 0x4b, 0x96, 0x00, 0xa8, 0x32, 0xb0, 0xdd, 0xae, 0x3e, 0x59, 0x41, 0x4b, 0x9a, 0x5d, 0x73, 0x13, + 0x96, 0x46, 0x80, 0xee, 0x5a, 0xcd, 0xf1, 0xa8, 0xf3, 0x90, 0x8b, 0xa8, 0xab, 0xe1, 0xc4, 0x4f, + 0xf3, 0x27, 0x03, 0x8a, 0xda, 0xbf, 0x7e, 0x88, 0x3e, 0x27, 0x8b, 0x90, 0x47, 0xf1, 0xc3, 0x4e, + 0x0e, 0x31, 0x2d, 0xd7, 0xcd, 0xae, 0xc8, 0x77, 0x92, 0x3b, 0xdb, 0x63, 0x12, 0x26, 0x67, 0xcd, + 0x24, 0xb2, 0x2d, 0x46, 0xae, 0xc3, 0x6c, 0x1c, 0x36, 0xe3, 0x0e, 0x47, 0x99, 0xf3, 0x42, 0x23, + 0x63, 0x15, 0xb5, 0xb8, 0x25, 0xa4, 0x64, 0x01, 0x26, 0x25, 0xa8, 0xca, 0x7a, 0x23, 0x63, 0xa9, + 0x25, 0xb9, 0x0e, 0xa5, 0x20, 0xe2, 0x9d, 0xc0, 0x43, 0x9b, 0xa2, 0xc3, 0x02, 0xbf, 0x3c, 0x29, + 0x43, 0x98, 0xd5, 0x52, 0x4b, 0x0a, 0x6b, 0x45, 0x80, 0xa0, 0xd3, 0x89, 0x28, 0x45, 0xbf, 0x83, + 0xe6, 0xcf, 0x06, 0x94, 0x06, 0x33, 0x31, 0x94, 0x3d, 0x63, 0x28, 0x7b, 0xe4, 0x43, 0x98, 0x92, + 0xfb, 0x89, 0x23, 0xe4, 0x56, 0x66, 0xd6, 0x56, 0xaa, 0x27, 0x77, 0x6e, 0x35, 0x9d, 0x1d, 0x4b, + 0xfb, 0x91, 0x16, 0xcc, 0x25, 0xe7, 0x8c, 0x3c, 0xcf, 0xa1, 0x47, 0xf2, 0xa4, 0x33, 0x6b, 0xb7, + 0xc6, 0x41, 0xe9, 0x28, 0x5b, 0xca, 0xc3, 0x2a, 0xd1, 0x81, 0xb5, 0xf9, 0xa3, 0x31, 0xb2, 0xaa, + 0xa2, 0x55, 0x74, 0x6f, 0xf5, 0x03, 0x37, 0xfe, 0xba, 0xc0, 0xb3, 0xe7, 0x0e, 0xfc, 0x19, 0x5c, + 0x3b, 0xa9, 0x1b, 0x75, 0xe0, 0x0d, 0x28, 0xec, 0x4b, 0xb9, 0x8b, 0x71, 0xec, 0xaf, 0xb2, 0xa1, + 0xc6, 0xb2, 0xfa, 0xce, 0xe6, 0xf7, 0x06, 0x5c, 0xd9, 0x44, 0xbe, 0x43, 0x83, 0x67, 0xd8, 0x91, + 0xed, 0x14, 0xb1, 0xf3, 0x8e, 0x93, 0x20, 0x82, 0x50, 0x01, 0xb2, 0x72, 0x6e, 0x39, 0x27, 0x88, + 0x20, 0x5e, 0x93, 0x2b, 0x50, 0x08, 0x9d, 0x1e, 0xda, 0xcc, 0x7d, 0xa9, 0x58, 0x62, 0xd2, 0xca, + 0x0b, 0x41, 0xcb, 0x7d, 0x29, 0x71, 0xa5, 0x92, 0x07, 0xcf, 0x31, 0x6e, 0x56, 0x69, 0xfe, 0x44, + 0x08, 0xcc, 0x1f, 0x0c, 0x39, 0xfc, 0x43, 0xc1, 0x9e, 0x3a, 0xa6, 0x4b, 0x00, 0x9d, 0x7d, 0xc7, + 0xef, 0xa1, 0xdd, 0x9f, 0xd6, 0x82, 0x92, 0xec, 0x52, 0xf7, 0x6f, 0x8b, 0xb6, 0x0d, 0x17, 0x74, + 0xa4, 0x1f, 0x3b, 0x07, 0x6e, 0xd7, 0xe1, 0x6e, 0xe0, 0x0b, 0xfa, 0xd5, 0xe0, 0x31, 0x1d, 0xe8, + 0x25, 0xb9, 0x09, 0x73, 0x6d, 0x8a, 0xce, 0x73, 0x81, 0xd8, 0xc5, 0x1e, 0x45, 0xc5, 0xc0, 0x46, + 0x23, 0x63, 0x95, 0x62, 0xc5, 0x86, 0x94, 0xd7, 0xf2, 0x30, 0x45, 0x91, 0x45, 0x07, 0xdc, 0xfc, + 0x35, 0x37, 0x2a, 0x23, 0xa9, 0x16, 0x3f, 0x65, 0x74, 0x93, 0x84, 0x65, 0x4f, 0x4e, 0x58, 0x6e, + 0x38, 0x61, 0x8b, 0x90, 0x6f, 0x3b, 0x4c, 0x29, 0x15, 0xcf, 0x4f, 0x8b, 0xb5, 0x50, 0xbd, 0x31, + 0x4c, 0x58, 0x2a, 0x2b, 0x83, 0x74, 0x65, 0xc2, 0x6c, 0x14, 0x76, 0x1d, 0x8e, 0x5d, 0xdb, 0xe1, + 0x82, 0xf9, 0x40, 0x31, 0x9f, 0x16, 0xae, 0xf3, 0x2d, 0x46, 0x3e, 0x80, 0x0a, 0xc5, 0x30, 0x60, + 0xae, 0x68, 0x58, 0x7b, 0x38, 0x31, 0x53, 0x3a, 0x31, 0xe5, 0xbe, 0x4d, 0x6d, 0x20, 0x45, 0xe4, + 0x2e, 0x94, 0x75, 0x62, 0x6d, 0x95, 0x2a, 0x66, 0x77, 0x02, 0x2f, 0x3c, 0x40, 0x8e, 0xe5, 0xe9, + 0x65, 0x63, 0x25, 0x6f, 0x2d, 0x68, 0xbd, 0xa5, 0xd4, 0xf7, 0xb5, 0x96, 0x34, 0x53, 0xed, 0x90, + 0x97, 0xa3, 0x75, 0x7b, 0xdc, 0x68, 0x1d, 0x2b, 0x71, 0xaa, 0x7b, 0xde, 0x82, 0x39, 0x1f, 0x3f, + 0xe7, 0x76, 0xaa, 0x4b, 0x0a, 0x8a, 0x80, 0x85, 0x78, 0x27, 0xee, 0x94, 0xda, 0x45, 0xb8, 0x90, + 0x3a, 0xac, 0x2e, 0xed, 0x6f, 0x39, 0x49, 0x5f, 0xa3, 0x9a, 0xfd, 0xbf, 0xda, 0xfe, 0xcb, 0x6b, + 0xfb, 0x5d, 0x36, 0xf9, 0xc6, 0x6a, 0xd2, 0xff, 0x47, 0x16, 0xf3, 0x36, 0x5c, 0x94, 0x4a, 0x7b, + 0xb0, 0xa4, 0x53, 0xb2, 0xa4, 0xf3, 0x52, 0xb5, 0x9b, 0xaa, 0xeb, 0x9b, 0x50, 0x72, 0x3a, 0x1d, + 0x0c, 0xfb, 0x96, 0xd3, 0xd2, 0xb2, 0x18, 0x4b, 0xa5, 0xd5, 0xf1, 0x4b, 0x49, 0x7e, 0xc4, 0xa5, + 0xc4, 0xfc, 0xc3, 0x80, 0x99, 0x87, 0xee, 0x29, 0xf7, 0x45, 0xf2, 0x2e, 0xfc, 0x2f, 0xbd, 0x65, + 0x40, 0x6d, 0x67, 0x8f, 0x23, 0x4d, 0xae, 0x53, 0x8d, 0x8c, 0x75, 0xb1, 0xbf, 0xfb, 0x23, 0xba, + 0x2e, 0xb4, 0x5b, 0x8c, 0x54, 0x81, 0x24, 0x7e, 0x6d, 0xdc, 0x0b, 0x28, 0x0a, 0x17, 0x79, 0xa3, + 0x6d, 0x18, 0xd6, 0x7c, 0xac, 0xab, 0x49, 0xd5, 0xd6, 0xb9, 0xbe, 0x03, 0xb5, 0x05, 0xb8, 0x94, + 0xec, 0x75, 0x10, 0x7c, 0x86, 0xd4, 0x6e, 0x07, 0x91, 0xdf, 0x1d, 0x90, 0x47, 0x61, 0x18, 0xcb, + 0xcd, 0x2f, 0xa0, 0xa8, 0x0e, 0xae, 0xc7, 0xfc, 0x01, 0xe4, 0x75, 0x55, 0xce, 0xf2, 0xad, 0x8f, + 0x2f, 0x17, 0x89, 0xef, 0xa8, 0x8e, 0xcd, 0x8e, 0xe8, 0x58, 0xf3, 0x21, 0x5c, 0xde, 0x44, 0xfe, + 0x58, 0xc0, 0x2a, 0xd6, 0x39, 0xcf, 0xd7, 0xd5, 0xfc, 0xc5, 0x80, 0xcb, 0x12, 0xab, 0xee, 0x3b, + 0xed, 0x03, 0xf4, 0xd0, 0xd7, 0x5c, 0x26, 0x3e, 0x85, 0x87, 0x48, 0x99, 0x1b, 0xf8, 0x12, 0x30, + 0x67, 0xc5, 0x4b, 0xb2, 0x0e, 0x93, 0xaa, 0x29, 0x05, 0x5a, 0x69, 0xed, 0xed, 0x71, 0xc7, 0x1d, + 0xc2, 0xb6, 0x94, 0x27, 0xb9, 0x07, 0x8b, 0xb8, 0xb7, 0x87, 0x1d, 0xee, 0x1e, 0xa2, 0xbd, 0x47, + 0x03, 0x4f, 0x50, 0x84, 0xe7, 0xf2, 0xd4, 0xa0, 0x2c, 0x24, 0x06, 0x0f, 0x68, 0xe0, 0xdd, 0x97, + 0x6a, 0x31, 0x1a, 0x26, 0xcc, 0xaa, 0xf0, 0xe3, 0x2e, 0x9e, 0x50, 0x14, 0xa6, 0x85, 0xa2, 0x89, + 0xcd, 0x2f, 0x0d, 0x58, 0x18, 0x4e, 0x92, 0x2e, 0xd7, 0xe8, 0x2c, 0x3d, 0x06, 0xc0, 0x24, 0x48, + 0x7d, 0x47, 0xbc, 0x73, 0x86, 0x73, 0xe9, 0x4d, 0x52, 0x20, 0xb7, 0x0e, 0x60, 0x6e, 0xc8, 0x88, + 0x5c, 0x85, 0xf2, 0xe3, 0xdd, 0xfa, 0x6e, 0xdd, 0xae, 0x6f, 0xaf, 0xd7, 0x1e, 0xd6, 0xb7, 0xea, + 0xdb, 0x4f, 0xec, 0xdd, 0xed, 0x8f, 0xb6, 0x1f, 0x7d, 0xb2, 0x3d, 0x9f, 0x19, 0xa9, 0x55, 0x3f, + 0x37, 0xe6, 0x0d, 0xb2, 0x04, 0x8b, 0xc7, 0xb4, 0x1b, 0xcd, 0x96, 0x52, 0x67, 0xd7, 0x7e, 0x9f, + 0x86, 0x42, 0x2b, 0x8e, 0x8e, 0x3c, 0x85, 0x09, 0xf1, 0xaa, 0x24, 0x37, 0xc6, 0xd2, 0x67, 0xff, + 0x85, 0x5a, 0x59, 0x39, 0xdd, 0x50, 0xe5, 0xcf, 0xcc, 0x10, 0x07, 0xa6, 0xd4, 0x23, 0x90, 0xdc, + 0x1c, 0xe7, 0x35, 0xf0, 0x9e, 0xac, 0xdc, 0x7a, 0x15, 0xd3, 0x64, 0x8b, 0x6f, 0x0c, 0xd9, 0xe4, + 0xc7, 0xdf, 0x06, 0xe4, 0xee, 0x38, 0x9c, 0x71, 0x2f, 0xcf, 0xca, 0xbd, 0xd7, 0xf0, 0x4c, 0x02, + 0xfa, 0x56, 0x35, 0xd4, 0x88, 0x4b, 0x3f, 0x39, 0x2b, 0x6e, 0xff, 0x3e, 0x5c, 0x79, 0xff, 0x75, + 0x5c, 0x93, 0x98, 0xbe, 0x36, 0xe0, 0xd2, 0xa8, 0xcb, 0x25, 0x79, 0xef, 0x14, 0xd8, 0x93, 0x5e, + 0x13, 0x95, 0xbb, 0x67, 0x77, 0x1c, 0x2e, 0xd9, 0xf1, 0xfb, 0x10, 0x39, 0x23, 0x6a, 0x2a, 0x3f, + 0xf7, 0x5e, 0xc3, 0x33, 0x09, 0xe8, 0x29, 0x4c, 0x08, 0x9e, 0x1e, 0x3f, 0x03, 0xa9, 0x4f, 0xd8, + 0xf8, 0x19, 0x48, 0x53, 0xbe, 0x99, 0x21, 0x47, 0x50, 0x1a, 0xe4, 0x17, 0x72, 0xe7, 0x94, 0x58, + 0x8f, 0x13, 0x76, 0x65, 0xed, 0x2c, 0x2e, 0xf1, 0xd6, 0x35, 0x84, 0x6b, 0x9d, 0xc0, 0x1b, 0xe3, + 0x5a, 0x2b, 0x25, 0x44, 0xb0, 0x43, 0x03, 0x1e, 0xec, 0x18, 0x9f, 0xde, 0xe9, 0xb9, 0x7c, 0x3f, + 0x6a, 0x57, 0x3b, 0x81, 0xb7, 0x2a, 0x1c, 0x57, 0x53, 0x8e, 0xab, 0x4e, 0xe8, 0xae, 0x26, 0xce, + 0xab, 0xf2, 0xcf, 0xad, 0xb0, 0xdd, 0x9e, 0x92, 0x3f, 0xde, 0xf9, 0x33, 0x00, 0x00, 0xff, 0xff, + 0xd1, 0x24, 0x65, 0xea, 0xf8, 0x12, 0x00, 0x00, }, } diff --git a/doc/rfc/stovepipe/queue-state.md b/doc/rfc/stovepipe/queue-state.md index fe77bb733..3dcf68b08 100644 --- a/doc/rfc/stovepipe/queue-state.md +++ b/doc/rfc/stovepipe/queue-state.md @@ -26,7 +26,7 @@ Pause can use the same internal-state, summary and history pattern described bel ## What the endpoint returns -`GetQueueStatus` takes a queue name and an optional `change_uri`. Omitting the commit selects the latest queue summary; supplying it selects the state covering that commit. The response contains one state: +`GetQueueStatus` takes a queue name and an optional `change_uri`. Omitting the commit selects the latest queue summary; supplying it selects the enablement covering that commit. The response contains an `enablement` object of type `QueueEnablementStatus`: | Field | Meaning | |---|---| @@ -35,6 +35,8 @@ Pause can use the same internal-state, summary and history pattern described bel | `version` | Sequence number that increases for each enablement change. | | `changed_at_ms` | Recorded change timestamp in Unix milliseconds, distinct from commit time. | +The boundary, version and timestamp describe enablement only. Future operational fields, such as pause status, belong beside this object and can change independently. + See the [proto](../../../api/stovepipe/proto/stovepipe.proto) for the wire contract. Suppose commits arrive in order A through G, with enablement changes at A, D and G: From 42fbc4e19c676faaf547ae37f89ecfced8d8d694 Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Wed, 14 Oct 2026 21:56:09 +0000 Subject: [PATCH 6/7] docs(stovepipe): match unknown enablement enum comment --- api/stovepipe/proto/stovepipe.proto | 2 +- api/stovepipe/protopb/stovepipe.pb.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/api/stovepipe/proto/stovepipe.proto b/api/stovepipe/proto/stovepipe.proto index 5e689f0af..4bd02acad 100644 --- a/api/stovepipe/proto/stovepipe.proto +++ b/api/stovepipe/proto/stovepipe.proto @@ -256,7 +256,7 @@ message GetQueueStatusRequest { // QueueEnablement is independent of validation results and execution controls. enum QueueEnablement { - // Unspecified is never an explicit disablement. + // Unknown is never an explicit disablement. QUEUE_ENABLEMENT_UNKNOWN = 0; QUEUE_ENABLEMENT_ENABLED = 1; QUEUE_ENABLEMENT_DISABLED = 2; diff --git a/api/stovepipe/protopb/stovepipe.pb.go b/api/stovepipe/protopb/stovepipe.pb.go index abbd87ee3..a4777db93 100644 --- a/api/stovepipe/protopb/stovepipe.pb.go +++ b/api/stovepipe/protopb/stovepipe.pb.go @@ -40,7 +40,7 @@ const ( type QueueEnablement int32 const ( - // Unspecified is never an explicit disablement. + // Unknown is never an explicit disablement. QueueEnablement_QUEUE_ENABLEMENT_UNKNOWN QueueEnablement = 0 QueueEnablement_QUEUE_ENABLEMENT_ENABLED QueueEnablement = 1 QueueEnablement_QUEUE_ENABLEMENT_DISABLED QueueEnablement = 2 From 3eb60169cfc6563e98efe608c2680946b45bfbfc Mon Sep 17 00:00:00 2001 From: mnoah1 Date: Wed, 14 Oct 2026 22:45:19 +0000 Subject: [PATCH 7/7] fix(stovepipe): regenerate TypeScript queue status bindings --- .../gen/api/stovepipe/proto/stovepipe_pb.ts | 140 +++++++++++++++++- 1 file changed, 137 insertions(+), 3 deletions(-) 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 ccb02a335..d67c881e7 100644 --- a/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts +++ b/web/api/src/gen/api/stovepipe/proto/stovepipe_pb.ts @@ -16,15 +16,15 @@ // @generated from file api/stovepipe/proto/stovepipe.proto (package uber.submitqueue.stovepipe, syntax proto3) /* eslint-disable */ -import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; -import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; +import type { GenEnum, GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2"; +import { enumDesc, fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2"; import type { Message } from "@bufbuild/protobuf"; /** * Describes the file api/stovepipe/proto/stovepipe.proto. */ export const file_api_stovepipe_proto_stovepipe: GenFile = /*@__PURE__*/ - fileDesc("CiNhcGkvc3RvdmVwaXBlL3Byb3RvL3N0b3ZlcGlwZS5wcm90bxIadWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUiHgoLUGluZ1JlcXVlc3QSDwoHbWVzc2FnZRgBIAEoCSJaCgxQaW5nUmVzcG9uc2USDwoHbWVzc2FnZRgBIAEoCRIUCgxzZXJ2aWNlX25hbWUYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDEhAKCGhvc3RuYW1lGAQgASgJIh4KDUluZ2VzdFJlcXVlc3QSDQoFcXVldWUYASABKAkiHAoOSW5nZXN0UmVzcG9uc2USCgoCaWQYASABKAkiQQocR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpyZXF1ZXN0X2lkGAIgASgJIjsKHUdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEgsKA3VyaRgCIAEoCSKGAQoMSGlzdG9yeUV2ZW50EhAKCGV2ZW50X2lkGAEgASgJEhQKDHRpbWVzdGFtcF9tcxgCIAEoAxIXCg1yZXF1ZXN0X3N0YXRlGAMgASgJSAASDwoFZXZlbnQYBCABKAlIABIWCg5vdXRjb21lX3JlYXNvbhgFIAEoCUIMCgpvY2N1cnJlbmNlIqMBCg5SZXF1ZXN0SGlzdG9yeRISCgpyZXF1ZXN0X2lkGAEgASgJEjgKBmV2ZW50cxgCIAMoCzIoLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlFdmVudBJDCg9yZXF1ZXN0X3N1bW1hcnkYAyABKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeSKeAQodR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVzcG9uc2USOAoGZXZlbnRzGAEgAygLMigudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSGlzdG9yeUV2ZW50EkMKD3JlcXVlc3Rfc3VtbWFyeRgCIAEoCzIqLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlJlcXVlc3RTdW1tYXJ5Il8KHkdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXNwb25zZRI9CgloaXN0b3JpZXMYASADKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0SGlzdG9yeSJ5ChtHZXRQcm9qZWN0U3RhdHVzQnlJRFJlcXVlc3QSDQoFcXVldWUYASABKAkSEgoKcmVxdWVzdF9pZBgCIAEoCRIQCghwcm9qZWN0cxgDIAMoCRIRCglwYWdlX3NpemUYBCABKAUSEgoKcGFnZV90b2tlbhgFIAEoCSJ6ChxHZXRQcm9qZWN0U3RhdHVzQnlVUklSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCmNoYW5nZV91cmkYAiABKAkSEAoIcHJvamVjdHMYAyADKAkSEQoJcGFnZV9zaXplGAQgASgFEhIKCnBhZ2VfdG9rZW4YBSABKAkiSQoRUHJvamVjdFZhbGlkYXRpb24SDwoHcHJvamVjdBgBIAEoCRIZCg9icmVha2FnZV9kZWdyZWUYAiABKAFIAEIICgZyZXN1bHQizAIKHEdldFByb2plY3RTdGF0dXNCeUlEUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVxdWV1ZRgCIAEoCRISCgpjaGFuZ2VfdXJpGAMgASgJEhAKCGJhc2VfdXJpGAQgASgJEhUKDXJlcXVlc3Rfc3RhdGUYBSABKAkSFQoNdXBkYXRlZF9hdF9tcxgKIAEoAxIkChpyZXBvc2l0b3J5X2JyZWFrYWdlX2RlZ3JlZRgGIAEoAUgAEiAKGHByb2plY3RfcmVzdWx0c19jb21wbGV0ZRgHIAEoCBI/Cghwcm9qZWN0cxgIIAMoCzItLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlByb2plY3RWYWxpZGF0aW9uEhcKD25leHRfcGFnZV90b2tlbhgJIAEoCUITChFyZXBvc2l0b3J5X3Jlc3VsdCLNAgodR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVxdWV1ZRgCIAEoCRISCgpjaGFuZ2VfdXJpGAMgASgJEhAKCGJhc2VfdXJpGAQgASgJEhUKDXJlcXVlc3Rfc3RhdGUYBSABKAkSFQoNdXBkYXRlZF9hdF9tcxgKIAEoAxIkChpyZXBvc2l0b3J5X2JyZWFrYWdlX2RlZ3JlZRgGIAEoAUgAEiAKGHByb2plY3RfcmVzdWx0c19jb21wbGV0ZRgHIAEoCBI/Cghwcm9qZWN0cxgIIAMoCzItLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlByb2plY3RWYWxpZGF0aW9uEhcKD25leHRfcGFnZV90b2tlbhgJIAEoCUITChFyZXBvc2l0b3J5X3Jlc3VsdCK9AQoOUmVxdWVzdFN1bW1hcnkSEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVxdWV1ZRgCIAEoCRISCgpjaGFuZ2VfdXJpGAMgASgJEhAKCGJhc2VfdXJpGAQgASgJEhUKDXJlcXVlc3Rfc3RhdGUYBSABKAkSGwoTc3RhdGVfdXBkYXRlZF9hdF9tcxgGIAEoAxIWCg5hY2NlcHRlZF9hdF9tcxgHIAEoAxIWCg5vdXRjb21lX3JlYXNvbhgIIAEoCSK0AQoLTGlzdFJlcXVlc3QSDQoFcXVldWUYASABKAkSIQoXYWNjZXB0ZWRfYXRfb3JfYWZ0ZXJfbXMYAiABKANIABIcChJhY2NlcHRlZF9iZWZvcmVfbXMYAyABKANIARIRCglwYWdlX3NpemUYBCABKAUSEgoKcGFnZV90b2tlbhgFIAEoCUIWChRhY2NlcHRlZF9sb3dlcl9ib3VuZEIWChRhY2NlcHRlZF91cHBlcl9ib3VuZCJlCgxMaXN0UmVzcG9uc2USPAoIcmVxdWVzdHMYASADKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAky7AYKCVN0b3ZlcGlwZRJbCgRQaW5nEicudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUGluZ1JlcXVlc3QaKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5QaW5nUmVzcG9uc2UiABJhCgZJbmdlc3QSKS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Jbmdlc3RSZXF1ZXN0GioudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSW5nZXN0UmVzcG9uc2UiABKOAQoVR2V0UmVxdWVzdEhpc3RvcnlCeUlEEjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVxdWVzdBo5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlJRFJlc3BvbnNlIgASkQEKFkdldFJlcXVlc3RIaXN0b3J5QnlVUkkSOS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRSZXF1ZXN0SGlzdG9yeUJ5VVJJUmVxdWVzdBo6LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXNwb25zZSIAEosBChRHZXRQcm9qZWN0U3RhdHVzQnlJRBI3LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeUlEUmVxdWVzdBo4LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeUlEUmVzcG9uc2UiABKOAQoVR2V0UHJvamVjdFN0YXR1c0J5VVJJEjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVxdWVzdBo5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFByb2plY3RTdGF0dXNCeVVSSVJlc3BvbnNlIgASWwoETGlzdBInLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkxpc3RSZXF1ZXN0GigudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuTGlzdFJlc3BvbnNlIgBCZQoeY29tLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlQg5TdG92ZXBpcGVQcm90b1ABWjFnaXRodWIuY29tL3ViZXIvc3VibWl0cXVldWUvYXBpL3N0b3ZlcGlwZS9wcm90b3BiYgZwcm90bzM"); + fileDesc("CiNhcGkvc3RvdmVwaXBlL3Byb3RvL3N0b3ZlcGlwZS5wcm90bxIadWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUiHgoLUGluZ1JlcXVlc3QSDwoHbWVzc2FnZRgBIAEoCSJaCgxQaW5nUmVzcG9uc2USDwoHbWVzc2FnZRgBIAEoCRIUCgxzZXJ2aWNlX25hbWUYAiABKAkSEQoJdGltZXN0YW1wGAMgASgDEhAKCGhvc3RuYW1lGAQgASgJIh4KDUluZ2VzdFJlcXVlc3QSDQoFcXVldWUYASABKAkiHAoOSW5nZXN0UmVzcG9uc2USCgoCaWQYASABKAkiQQocR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVxdWVzdBINCgVxdWV1ZRgBIAEoCRISCgpyZXF1ZXN0X2lkGAIgASgJIjsKHUdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEgsKA3VyaRgCIAEoCSKGAQoMSGlzdG9yeUV2ZW50EhAKCGV2ZW50X2lkGAEgASgJEhQKDHRpbWVzdGFtcF9tcxgCIAEoAxIXCg1yZXF1ZXN0X3N0YXRlGAMgASgJSAASDwoFZXZlbnQYBCABKAlIABIWCg5vdXRjb21lX3JlYXNvbhgFIAEoCUIMCgpvY2N1cnJlbmNlIqMBCg5SZXF1ZXN0SGlzdG9yeRISCgpyZXF1ZXN0X2lkGAEgASgJEjgKBmV2ZW50cxgCIAMoCzIoLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkhpc3RvcnlFdmVudBJDCg9yZXF1ZXN0X3N1bW1hcnkYAyABKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeSKeAQodR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVzcG9uc2USOAoGZXZlbnRzGAEgAygLMigudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuSGlzdG9yeUV2ZW50EkMKD3JlcXVlc3Rfc3VtbWFyeRgCIAEoCzIqLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlJlcXVlc3RTdW1tYXJ5Il8KHkdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXNwb25zZRI9CgloaXN0b3JpZXMYASADKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0SGlzdG9yeSJ5ChtHZXRQcm9qZWN0U3RhdHVzQnlJRFJlcXVlc3QSDQoFcXVldWUYASABKAkSEgoKcmVxdWVzdF9pZBgCIAEoCRIQCghwcm9qZWN0cxgDIAMoCRIRCglwYWdlX3NpemUYBCABKAUSEgoKcGFnZV90b2tlbhgFIAEoCSJ6ChxHZXRQcm9qZWN0U3RhdHVzQnlVUklSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCmNoYW5nZV91cmkYAiABKAkSEAoIcHJvamVjdHMYAyADKAkSEQoJcGFnZV9zaXplGAQgASgFEhIKCnBhZ2VfdG9rZW4YBSABKAkiSQoRUHJvamVjdFZhbGlkYXRpb24SDwoHcHJvamVjdBgBIAEoCRIZCg9icmVha2FnZV9kZWdyZWUYAiABKAFIAEIICgZyZXN1bHQizAIKHEdldFByb2plY3RTdGF0dXNCeUlEUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVxdWV1ZRgCIAEoCRISCgpjaGFuZ2VfdXJpGAMgASgJEhAKCGJhc2VfdXJpGAQgASgJEhUKDXJlcXVlc3Rfc3RhdGUYBSABKAkSFQoNdXBkYXRlZF9hdF9tcxgKIAEoAxIkChpyZXBvc2l0b3J5X2JyZWFrYWdlX2RlZ3JlZRgGIAEoAUgAEiAKGHByb2plY3RfcmVzdWx0c19jb21wbGV0ZRgHIAEoCBI/Cghwcm9qZWN0cxgIIAMoCzItLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlByb2plY3RWYWxpZGF0aW9uEhcKD25leHRfcGFnZV90b2tlbhgJIAEoCUITChFyZXBvc2l0b3J5X3Jlc3VsdCLNAgodR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVzcG9uc2USEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVxdWV1ZRgCIAEoCRISCgpjaGFuZ2VfdXJpGAMgASgJEhAKCGJhc2VfdXJpGAQgASgJEhUKDXJlcXVlc3Rfc3RhdGUYBSABKAkSFQoNdXBkYXRlZF9hdF9tcxgKIAEoAxIkChpyZXBvc2l0b3J5X2JyZWFrYWdlX2RlZ3JlZRgGIAEoAUgAEiAKGHByb2plY3RfcmVzdWx0c19jb21wbGV0ZRgHIAEoCBI/Cghwcm9qZWN0cxgIIAMoCzItLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlByb2plY3RWYWxpZGF0aW9uEhcKD25leHRfcGFnZV90b2tlbhgJIAEoCUITChFyZXBvc2l0b3J5X3Jlc3VsdCK9AQoOUmVxdWVzdFN1bW1hcnkSEgoKcmVxdWVzdF9pZBgBIAEoCRINCgVxdWV1ZRgCIAEoCRISCgpjaGFuZ2VfdXJpGAMgASgJEhAKCGJhc2VfdXJpGAQgASgJEhUKDXJlcXVlc3Rfc3RhdGUYBSABKAkSGwoTc3RhdGVfdXBkYXRlZF9hdF9tcxgGIAEoAxIWCg5hY2NlcHRlZF9hdF9tcxgHIAEoAxIWCg5vdXRjb21lX3JlYXNvbhgIIAEoCSK0AQoLTGlzdFJlcXVlc3QSDQoFcXVldWUYASABKAkSIQoXYWNjZXB0ZWRfYXRfb3JfYWZ0ZXJfbXMYAiABKANIABIcChJhY2NlcHRlZF9iZWZvcmVfbXMYAyABKANIARIRCglwYWdlX3NpemUYBCABKAUSEgoKcGFnZV90b2tlbhgFIAEoCUIWChRhY2NlcHRlZF9sb3dlcl9ib3VuZEIWChRhY2NlcHRlZF91cHBlcl9ib3VuZCJlCgxMaXN0UmVzcG9uc2USPAoIcmVxdWVzdHMYASADKAsyKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5SZXF1ZXN0U3VtbWFyeRIXCg9uZXh0X3BhZ2VfdG9rZW4YAiABKAkiOgoVR2V0UXVldWVTdGF0dXNSZXF1ZXN0Eg0KBXF1ZXVlGAEgASgJEhIKCmNoYW5nZV91cmkYAiABKAkingEKFVF1ZXVlRW5hYmxlbWVudFN0YXR1cxIPCgd2ZXJzaW9uGAEgASgDEjoKBXN0YXRlGAIgASgOMisudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuUXVldWVFbmFibGVtZW50EiEKGWVmZmVjdGl2ZV9mcm9tX2NvbW1pdF91cmkYAyABKAkSFQoNY2hhbmdlZF9hdF9tcxgEIAEoAyJuChZHZXRRdWV1ZVN0YXR1c1Jlc3BvbnNlEg0KBXF1ZXVlGAEgASgJEkUKCmVuYWJsZW1lbnQYAiABKAsyMS51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5RdWV1ZUVuYWJsZW1lbnRTdGF0dXMqbAoPUXVldWVFbmFibGVtZW50EhwKGFFVRVVFX0VOQUJMRU1FTlRfVU5LTk9XThAAEhwKGFFVRVVFX0VOQUJMRU1FTlRfRU5BQkxFRBABEh0KGVFVRVVFX0VOQUJMRU1FTlRfRElTQUJMRUQQAjLnBwoJU3RvdmVwaXBlElsKBFBpbmcSJy51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5QaW5nUmVxdWVzdBooLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLlBpbmdSZXNwb25zZSIAEmEKBkluZ2VzdBIpLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkluZ2VzdFJlcXVlc3QaKi51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5Jbmdlc3RSZXNwb25zZSIAEo4BChVHZXRSZXF1ZXN0SGlzdG9yeUJ5SUQSOC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRSZXF1ZXN0SGlzdG9yeUJ5SURSZXF1ZXN0GjkudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeUlEUmVzcG9uc2UiABKRAQoWR2V0UmVxdWVzdEhpc3RvcnlCeVVSSRI5LnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFJlcXVlc3RIaXN0b3J5QnlVUklSZXF1ZXN0GjoudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UmVxdWVzdEhpc3RvcnlCeVVSSVJlc3BvbnNlIgASiwEKFEdldFByb2plY3RTdGF0dXNCeUlEEjcudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5SURSZXF1ZXN0GjgudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5SURSZXNwb25zZSIAEo4BChVHZXRQcm9qZWN0U3RhdHVzQnlVUkkSOC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5HZXRQcm9qZWN0U3RhdHVzQnlVUklSZXF1ZXN0GjkudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuR2V0UHJvamVjdFN0YXR1c0J5VVJJUmVzcG9uc2UiABJbCgRMaXN0EicudWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGUuTGlzdFJlcXVlc3QaKC51YmVyLnN1Ym1pdHF1ZXVlLnN0b3ZlcGlwZS5MaXN0UmVzcG9uc2UiABJ5Cg5HZXRRdWV1ZVN0YXR1cxIxLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFF1ZXVlU3RhdHVzUmVxdWVzdBoyLnViZXIuc3VibWl0cXVldWUuc3RvdmVwaXBlLkdldFF1ZXVlU3RhdHVzUmVzcG9uc2UiAEJlCh5jb20udWJlci5zdWJtaXRxdWV1ZS5zdG92ZXBpcGVCDlN0b3ZlcGlwZVByb3RvUAFaMWdpdGh1Yi5jb20vdWJlci9zdWJtaXRxdWV1ZS9hcGkvc3RvdmVwaXBlL3Byb3RvcGJiBnByb3RvMw"); /** * PingRequest is the request for the Ping method @@ -803,6 +803,130 @@ export type ListResponse = Message<"uber.submitqueue.stovepipe.ListResponse"> & export const ListResponseSchema: GenMessage = /*@__PURE__*/ messageDesc(file_api_stovepipe_proto_stovepipe, 17); +/** + * @generated from message uber.submitqueue.stovepipe.GetQueueStatusRequest + */ +export type GetQueueStatusRequest = Message<"uber.submitqueue.stovepipe.GetQueueStatusRequest"> & { + /** + * Required stable repo-and-ref queue name. + * + * @generated from field: string queue = 1; + */ + queue: string; + + /** + * Optional immutable commit URI. Empty selects the latest materialized state. + * + * @generated from field: string change_uri = 2; + */ + changeUri: string; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.GetQueueStatusRequest. + * Use `create(GetQueueStatusRequestSchema)` to create a new message. + */ +export const GetQueueStatusRequestSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 18); + +/** + * QueueEnablementStatus describes applied enablement. + * + * @generated from message uber.submitqueue.stovepipe.QueueEnablementStatus + */ +export type QueueEnablementStatus = Message<"uber.submitqueue.stovepipe.QueueEnablementStatus"> & { + /** + * Positive enablement sequence, increasing with each state change. + * + * @generated from field: int64 version = 1; + */ + version: bigint; + + /** + * Applied enablement. Successful lookups never return UNKNOWN. + * + * @generated from field: uber.submitqueue.stovepipe.QueueEnablement state = 2; + */ + state: QueueEnablement; + + /** + * Inclusive first covered commit. Empty only for initial DISABLED version 1. + * + * @generated from field: string effective_from_commit_uri = 3; + */ + effectiveFromCommitUri: string; + + /** + * Application timestamp in Unix milliseconds, not source-control commit time. + * + * @generated from field: int64 changed_at_ms = 4; + */ + changedAtMs: bigint; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.QueueEnablementStatus. + * Use `create(QueueEnablementStatusSchema)` to create a new message. + */ +export const QueueEnablementStatusSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 19); + +/** + * @generated from message uber.submitqueue.stovepipe.GetQueueStatusResponse + */ +export type GetQueueStatusResponse = Message<"uber.submitqueue.stovepipe.GetQueueStatusResponse"> & { + /** + * Queue selected by the request. + * + * @generated from field: string queue = 1; + */ + queue: string; + + /** + * Current enablement, or enablement covering change_uri. Always present on success. + * + * @generated from field: uber.submitqueue.stovepipe.QueueEnablementStatus enablement = 2; + */ + enablement?: QueueEnablementStatus | undefined; +}; + +/** + * Describes the message uber.submitqueue.stovepipe.GetQueueStatusResponse. + * Use `create(GetQueueStatusResponseSchema)` to create a new message. + */ +export const GetQueueStatusResponseSchema: GenMessage = /*@__PURE__*/ + messageDesc(file_api_stovepipe_proto_stovepipe, 20); + +/** + * QueueEnablement is independent of validation results and execution controls. + * + * @generated from enum uber.submitqueue.stovepipe.QueueEnablement + */ +export enum QueueEnablement { + /** + * Unknown is never an explicit disablement. + * + * @generated from enum value: QUEUE_ENABLEMENT_UNKNOWN = 0; + */ + UNKNOWN = 0, + + /** + * @generated from enum value: QUEUE_ENABLEMENT_ENABLED = 1; + */ + ENABLED = 1, + + /** + * @generated from enum value: QUEUE_ENABLEMENT_DISABLED = 2; + */ + DISABLED = 2, +} + +/** + * Describes the enum uber.submitqueue.stovepipe.QueueEnablement. + */ +export const QueueEnablementSchema: GenEnum = /*@__PURE__*/ + enumDesc(file_api_stovepipe_proto_stovepipe, 0); + /** * Stovepipe provides the Stovepipe API. * @@ -880,6 +1004,16 @@ export const Stovepipe: GenService<{ input: typeof ListRequestSchema; output: typeof ListResponseSchema; }, + /** + * GetQueueStatus returns current enablement or enablement for a supplied commit. + * + * @generated from rpc uber.submitqueue.stovepipe.Stovepipe.GetQueueStatus + */ + getQueueStatus: { + methodKind: "unary"; + input: typeof GetQueueStatusRequestSchema; + output: typeof GetQueueStatusResponseSchema; + }, }> = /*@__PURE__*/ serviceDesc(file_api_stovepipe_proto_stovepipe, 0);