go.chromium.org/luci@v0.0.0-20240309015107-7cdc2e660f33/analysis/proto/v1/clusters.pb.go (about) 1 // Copyright 2022 The LUCI Authors. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 // Code generated by protoc-gen-go. DO NOT EDIT. 16 // versions: 17 // protoc-gen-go v1.32.0 18 // protoc v3.21.7 19 // source: go.chromium.org/luci/analysis/proto/v1/clusters.proto 20 21 package analysispb 22 23 import prpc "go.chromium.org/luci/grpc/prpc" 24 25 import ( 26 context "context" 27 grpc "google.golang.org/grpc" 28 codes "google.golang.org/grpc/codes" 29 status "google.golang.org/grpc/status" 30 protoreflect "google.golang.org/protobuf/reflect/protoreflect" 31 protoimpl "google.golang.org/protobuf/runtime/protoimpl" 32 timestamppb "google.golang.org/protobuf/types/known/timestamppb" 33 reflect "reflect" 34 sync "sync" 35 ) 36 37 const ( 38 // Verify that this generated code is sufficiently up-to-date. 39 _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) 40 // Verify that runtime/protoimpl is sufficiently up-to-date. 41 _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) 42 ) 43 44 type ClusterSummaryView int32 45 46 const ( 47 // The default / unset value. 48 // The API will default to the BASIC view. 49 ClusterSummaryView_CLUSTER_SUMMARY_VIEW_UNSPECIFIED ClusterSummaryView = 0 50 // Include most fields in the cluster summary, EXCLUDING 51 // daily breakdowns of the cluster's impact metrics. 52 ClusterSummaryView_BASIC ClusterSummaryView = 1 53 // Include everything in the cluster summary. 54 ClusterSummaryView_FULL ClusterSummaryView = 2 55 ) 56 57 // Enum value maps for ClusterSummaryView. 58 var ( 59 ClusterSummaryView_name = map[int32]string{ 60 0: "CLUSTER_SUMMARY_VIEW_UNSPECIFIED", 61 1: "BASIC", 62 2: "FULL", 63 } 64 ClusterSummaryView_value = map[string]int32{ 65 "CLUSTER_SUMMARY_VIEW_UNSPECIFIED": 0, 66 "BASIC": 1, 67 "FULL": 2, 68 } 69 ) 70 71 func (x ClusterSummaryView) Enum() *ClusterSummaryView { 72 p := new(ClusterSummaryView) 73 *p = x 74 return p 75 } 76 77 func (x ClusterSummaryView) String() string { 78 return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) 79 } 80 81 func (ClusterSummaryView) Descriptor() protoreflect.EnumDescriptor { 82 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_enumTypes[0].Descriptor() 83 } 84 85 func (ClusterSummaryView) Type() protoreflect.EnumType { 86 return &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_enumTypes[0] 87 } 88 89 func (x ClusterSummaryView) Number() protoreflect.EnumNumber { 90 return protoreflect.EnumNumber(x) 91 } 92 93 // Deprecated: Use ClusterSummaryView.Descriptor instead. 94 func (ClusterSummaryView) EnumDescriptor() ([]byte, []int) { 95 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{0} 96 } 97 98 type ClusterRequest struct { 99 state protoimpl.MessageState 100 sizeCache protoimpl.SizeCache 101 unknownFields protoimpl.UnknownFields 102 103 // The LUCI Project for which the test result should be clustered. 104 Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` 105 // The test results to cluster. At most 1000 test results may be 106 // clustered in one request. 107 TestResults []*ClusterRequest_TestResult `protobuf:"bytes,2,rep,name=test_results,json=testResults,proto3" json:"test_results,omitempty"` 108 } 109 110 func (x *ClusterRequest) Reset() { 111 *x = ClusterRequest{} 112 if protoimpl.UnsafeEnabled { 113 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[0] 114 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 115 ms.StoreMessageInfo(mi) 116 } 117 } 118 119 func (x *ClusterRequest) String() string { 120 return protoimpl.X.MessageStringOf(x) 121 } 122 123 func (*ClusterRequest) ProtoMessage() {} 124 125 func (x *ClusterRequest) ProtoReflect() protoreflect.Message { 126 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[0] 127 if protoimpl.UnsafeEnabled && x != nil { 128 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 129 if ms.LoadMessageInfo() == nil { 130 ms.StoreMessageInfo(mi) 131 } 132 return ms 133 } 134 return mi.MessageOf(x) 135 } 136 137 // Deprecated: Use ClusterRequest.ProtoReflect.Descriptor instead. 138 func (*ClusterRequest) Descriptor() ([]byte, []int) { 139 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{0} 140 } 141 142 func (x *ClusterRequest) GetProject() string { 143 if x != nil { 144 return x.Project 145 } 146 return "" 147 } 148 149 func (x *ClusterRequest) GetTestResults() []*ClusterRequest_TestResult { 150 if x != nil { 151 return x.TestResults 152 } 153 return nil 154 } 155 156 type ClusterResponse struct { 157 state protoimpl.MessageState 158 sizeCache protoimpl.SizeCache 159 unknownFields protoimpl.UnknownFields 160 161 // The clusters each test result is in. 162 // Contains one result for each test result specified in the request. 163 // Results are provided in the same order as the request, so 164 // the i-th ClusteredTestResult corresponds to the i-th 165 // TestResult in the request. 166 ClusteredTestResults []*ClusterResponse_ClusteredTestResult `protobuf:"bytes,1,rep,name=clustered_test_results,json=clusteredTestResults,proto3" json:"clustered_test_results,omitempty"` 167 // The versions of clustering algorithms, rules and project configuration 168 // used to service this request. For debugging purposes only. 169 ClusteringVersion *ClusteringVersion `protobuf:"bytes,2,opt,name=clustering_version,json=clusteringVersion,proto3" json:"clustering_version,omitempty"` 170 } 171 172 func (x *ClusterResponse) Reset() { 173 *x = ClusterResponse{} 174 if protoimpl.UnsafeEnabled { 175 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[1] 176 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 177 ms.StoreMessageInfo(mi) 178 } 179 } 180 181 func (x *ClusterResponse) String() string { 182 return protoimpl.X.MessageStringOf(x) 183 } 184 185 func (*ClusterResponse) ProtoMessage() {} 186 187 func (x *ClusterResponse) ProtoReflect() protoreflect.Message { 188 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[1] 189 if protoimpl.UnsafeEnabled && x != nil { 190 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 191 if ms.LoadMessageInfo() == nil { 192 ms.StoreMessageInfo(mi) 193 } 194 return ms 195 } 196 return mi.MessageOf(x) 197 } 198 199 // Deprecated: Use ClusterResponse.ProtoReflect.Descriptor instead. 200 func (*ClusterResponse) Descriptor() ([]byte, []int) { 201 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{1} 202 } 203 204 func (x *ClusterResponse) GetClusteredTestResults() []*ClusterResponse_ClusteredTestResult { 205 if x != nil { 206 return x.ClusteredTestResults 207 } 208 return nil 209 } 210 211 func (x *ClusterResponse) GetClusteringVersion() *ClusteringVersion { 212 if x != nil { 213 return x.ClusteringVersion 214 } 215 return nil 216 } 217 218 // The versions of algorithms, rules and configuration used by LUCI Analysis 219 // to cluster test results. For a given test result and ClusteringVersion, 220 // the set of returned clusters should always be the same. 221 type ClusteringVersion struct { 222 state protoimpl.MessageState 223 sizeCache protoimpl.SizeCache 224 unknownFields protoimpl.UnknownFields 225 226 // The version of clustering algorithms used. 227 AlgorithmsVersion int32 `protobuf:"varint,1,opt,name=algorithms_version,json=algorithmsVersion,proto3" json:"algorithms_version,omitempty"` 228 // The version of failure association rules used. This is the Spanner 229 // commit timestamp of the last rule modification incorporated in the 230 // set of rules used to cluster the results. 231 RulesVersion *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=rules_version,json=rulesVersion,proto3" json:"rules_version,omitempty"` 232 // The version of project configuration used. This is the timestamp 233 // the project configuration was ingested by LUCI Analysis. 234 ConfigVersion *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=config_version,json=configVersion,proto3" json:"config_version,omitempty"` 235 } 236 237 func (x *ClusteringVersion) Reset() { 238 *x = ClusteringVersion{} 239 if protoimpl.UnsafeEnabled { 240 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[2] 241 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 242 ms.StoreMessageInfo(mi) 243 } 244 } 245 246 func (x *ClusteringVersion) String() string { 247 return protoimpl.X.MessageStringOf(x) 248 } 249 250 func (*ClusteringVersion) ProtoMessage() {} 251 252 func (x *ClusteringVersion) ProtoReflect() protoreflect.Message { 253 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[2] 254 if protoimpl.UnsafeEnabled && x != nil { 255 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 256 if ms.LoadMessageInfo() == nil { 257 ms.StoreMessageInfo(mi) 258 } 259 return ms 260 } 261 return mi.MessageOf(x) 262 } 263 264 // Deprecated: Use ClusteringVersion.ProtoReflect.Descriptor instead. 265 func (*ClusteringVersion) Descriptor() ([]byte, []int) { 266 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{2} 267 } 268 269 func (x *ClusteringVersion) GetAlgorithmsVersion() int32 { 270 if x != nil { 271 return x.AlgorithmsVersion 272 } 273 return 0 274 } 275 276 func (x *ClusteringVersion) GetRulesVersion() *timestamppb.Timestamp { 277 if x != nil { 278 return x.RulesVersion 279 } 280 return nil 281 } 282 283 func (x *ClusteringVersion) GetConfigVersion() *timestamppb.Timestamp { 284 if x != nil { 285 return x.ConfigVersion 286 } 287 return nil 288 } 289 290 type GetClusterRequest struct { 291 state protoimpl.MessageState 292 sizeCache protoimpl.SizeCache 293 unknownFields protoimpl.UnknownFields 294 295 // The resource name of the cluster to retrieve. 296 // Format: projects/{project}/clusters/{cluster_algorithm}/{cluster_id}. 297 // Designed to conform to aip.dev/131. 298 Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` 299 } 300 301 func (x *GetClusterRequest) Reset() { 302 *x = GetClusterRequest{} 303 if protoimpl.UnsafeEnabled { 304 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[3] 305 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 306 ms.StoreMessageInfo(mi) 307 } 308 } 309 310 func (x *GetClusterRequest) String() string { 311 return protoimpl.X.MessageStringOf(x) 312 } 313 314 func (*GetClusterRequest) ProtoMessage() {} 315 316 func (x *GetClusterRequest) ProtoReflect() protoreflect.Message { 317 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[3] 318 if protoimpl.UnsafeEnabled && x != nil { 319 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 320 if ms.LoadMessageInfo() == nil { 321 ms.StoreMessageInfo(mi) 322 } 323 return ms 324 } 325 return mi.MessageOf(x) 326 } 327 328 // Deprecated: Use GetClusterRequest.ProtoReflect.Descriptor instead. 329 func (*GetClusterRequest) Descriptor() ([]byte, []int) { 330 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{3} 331 } 332 333 func (x *GetClusterRequest) GetName() string { 334 if x != nil { 335 return x.Name 336 } 337 return "" 338 } 339 340 type Cluster struct { 341 state protoimpl.MessageState 342 sizeCache protoimpl.SizeCache 343 unknownFields protoimpl.UnknownFields 344 345 // The resource name of the cluster. 346 // Format: projects/{project}/clusters/{cluster_algorithm}/{cluster_id}. 347 Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` 348 // Whether there is a recent example in the cluster. 349 HasExample bool `protobuf:"varint,2,opt,name=has_example,json=hasExample,proto3" json:"has_example,omitempty"` 350 // A human-readable name for the cluster. 351 // Only populated for suggested clusters where has_example = true. 352 // Not populated for rule-based clusters. 353 Title string `protobuf:"bytes,3,opt,name=title,proto3" json:"title,omitempty"` 354 // The values of metrics associated with the cluster. The map key is the ID 355 // of the metric (e.g. "human-cls-failed-presubmit"). 356 // 357 // The following metrics are currently defined: 358 // - "human-cls-failed-presubmit": 359 // The number of distinct developer changelists that failed at least one 360 // presubmit (CQ) run because of failure(s) in this cluster. Excludes 361 // changelists authored by automation. 362 // - "critical-failures-exonerated": 363 // The number of failures on test variants which were configured to be 364 // presubmit-blocking, which were exonerated (i.e. did not actually block 365 // presubmit) because infrastructure determined the test variant to be 366 // failing or too flaky at tip-of-tree. If this number is non-zero, it 367 // means a test variant which was configured to be presubmit-blocking is 368 // not stable enough to do so, and should be fixed or made non-blocking. 369 // - "failures": 370 // The total number of test results in this cluster. LUCI Analysis only 371 // clusters test results which are unexpected and have a status of crash, 372 // abort or fail, so by definition the only test results counted here 373 // will be an unexpected fail/crash/abort. 374 Metrics map[string]*Cluster_TimewiseCounts `protobuf:"bytes,10,rep,name=metrics,proto3" json:"metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` 375 // The failure association rule equivalent to the cluster. Populated only 376 // for suggested clusters where has_example = true. 377 // Not populated for rule-based clusters. If you need the failure 378 // association rule for a rule-based cluster, use 379 // luci.analysis.v1.Rules/Get to retrieve the rule with ID matching the 380 // cluster ID. 381 // Used to facilitate creating a new rule based on a suggested cluster. 382 EquivalentFailureAssociationRule string `protobuf:"bytes,7,opt,name=equivalent_failure_association_rule,json=equivalentFailureAssociationRule,proto3" json:"equivalent_failure_association_rule,omitempty"` 383 } 384 385 func (x *Cluster) Reset() { 386 *x = Cluster{} 387 if protoimpl.UnsafeEnabled { 388 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[4] 389 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 390 ms.StoreMessageInfo(mi) 391 } 392 } 393 394 func (x *Cluster) String() string { 395 return protoimpl.X.MessageStringOf(x) 396 } 397 398 func (*Cluster) ProtoMessage() {} 399 400 func (x *Cluster) ProtoReflect() protoreflect.Message { 401 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[4] 402 if protoimpl.UnsafeEnabled && x != nil { 403 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 404 if ms.LoadMessageInfo() == nil { 405 ms.StoreMessageInfo(mi) 406 } 407 return ms 408 } 409 return mi.MessageOf(x) 410 } 411 412 // Deprecated: Use Cluster.ProtoReflect.Descriptor instead. 413 func (*Cluster) Descriptor() ([]byte, []int) { 414 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{4} 415 } 416 417 func (x *Cluster) GetName() string { 418 if x != nil { 419 return x.Name 420 } 421 return "" 422 } 423 424 func (x *Cluster) GetHasExample() bool { 425 if x != nil { 426 return x.HasExample 427 } 428 return false 429 } 430 431 func (x *Cluster) GetTitle() string { 432 if x != nil { 433 return x.Title 434 } 435 return "" 436 } 437 438 func (x *Cluster) GetMetrics() map[string]*Cluster_TimewiseCounts { 439 if x != nil { 440 return x.Metrics 441 } 442 return nil 443 } 444 445 func (x *Cluster) GetEquivalentFailureAssociationRule() string { 446 if x != nil { 447 return x.EquivalentFailureAssociationRule 448 } 449 return "" 450 } 451 452 // Designed to conform with aip.dev/131. 453 type GetReclusteringProgressRequest struct { 454 state protoimpl.MessageState 455 sizeCache protoimpl.SizeCache 456 unknownFields protoimpl.UnknownFields 457 458 // The name of the reclustering progress resource to retrieve. 459 // Format: projects/{project}/reclusteringProgress. 460 Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` 461 } 462 463 func (x *GetReclusteringProgressRequest) Reset() { 464 *x = GetReclusteringProgressRequest{} 465 if protoimpl.UnsafeEnabled { 466 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[5] 467 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 468 ms.StoreMessageInfo(mi) 469 } 470 } 471 472 func (x *GetReclusteringProgressRequest) String() string { 473 return protoimpl.X.MessageStringOf(x) 474 } 475 476 func (*GetReclusteringProgressRequest) ProtoMessage() {} 477 478 func (x *GetReclusteringProgressRequest) ProtoReflect() protoreflect.Message { 479 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[5] 480 if protoimpl.UnsafeEnabled && x != nil { 481 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 482 if ms.LoadMessageInfo() == nil { 483 ms.StoreMessageInfo(mi) 484 } 485 return ms 486 } 487 return mi.MessageOf(x) 488 } 489 490 // Deprecated: Use GetReclusteringProgressRequest.ProtoReflect.Descriptor instead. 491 func (*GetReclusteringProgressRequest) Descriptor() ([]byte, []int) { 492 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{5} 493 } 494 495 func (x *GetReclusteringProgressRequest) GetName() string { 496 if x != nil { 497 return x.Name 498 } 499 return "" 500 } 501 502 // ReclusteringProgress captures the progress re-clustering a 503 // given LUCI project's test results using specific rules 504 // versions or algorithms versions. 505 type ReclusteringProgress struct { 506 state protoimpl.MessageState 507 sizeCache protoimpl.SizeCache 508 unknownFields protoimpl.UnknownFields 509 510 // The name of the reclustering progress resource. 511 // Format: projects/{project}/reclusteringProgress. 512 Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` 513 // ProgressPerMille is the progress of the current re-clustering run, 514 // measured in thousandths (per mille). As such, this value ranges 515 // from 0 (0% complete) to 1000 (100% complete). 516 ProgressPerMille int32 `protobuf:"varint,2,opt,name=progress_per_mille,json=progressPerMille,proto3" json:"progress_per_mille,omitempty"` 517 // The goal of the last completed re-clustering run. 518 Last *ClusteringVersion `protobuf:"bytes,5,opt,name=last,proto3" json:"last,omitempty"` 519 // The goal of the current re-clustering run. (For which 520 // ProgressPerMille is specified.) This may be the same as the 521 // last completed re-clustering run the available algorithm versions, 522 // rules and configuration is unchanged. 523 Next *ClusteringVersion `protobuf:"bytes,6,opt,name=next,proto3" json:"next,omitempty"` 524 } 525 526 func (x *ReclusteringProgress) Reset() { 527 *x = ReclusteringProgress{} 528 if protoimpl.UnsafeEnabled { 529 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[6] 530 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 531 ms.StoreMessageInfo(mi) 532 } 533 } 534 535 func (x *ReclusteringProgress) String() string { 536 return protoimpl.X.MessageStringOf(x) 537 } 538 539 func (*ReclusteringProgress) ProtoMessage() {} 540 541 func (x *ReclusteringProgress) ProtoReflect() protoreflect.Message { 542 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[6] 543 if protoimpl.UnsafeEnabled && x != nil { 544 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 545 if ms.LoadMessageInfo() == nil { 546 ms.StoreMessageInfo(mi) 547 } 548 return ms 549 } 550 return mi.MessageOf(x) 551 } 552 553 // Deprecated: Use ReclusteringProgress.ProtoReflect.Descriptor instead. 554 func (*ReclusteringProgress) Descriptor() ([]byte, []int) { 555 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{6} 556 } 557 558 func (x *ReclusteringProgress) GetName() string { 559 if x != nil { 560 return x.Name 561 } 562 return "" 563 } 564 565 func (x *ReclusteringProgress) GetProgressPerMille() int32 { 566 if x != nil { 567 return x.ProgressPerMille 568 } 569 return 0 570 } 571 572 func (x *ReclusteringProgress) GetLast() *ClusteringVersion { 573 if x != nil { 574 return x.Last 575 } 576 return nil 577 } 578 579 func (x *ReclusteringProgress) GetNext() *ClusteringVersion { 580 if x != nil { 581 return x.Next 582 } 583 return nil 584 } 585 586 type QueryClusterSummariesRequest struct { 587 state protoimpl.MessageState 588 sizeCache protoimpl.SizeCache 589 unknownFields protoimpl.UnknownFields 590 591 // The LUCI Project. 592 Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` 593 // An AIP-160 style filter to select test failures in the project 594 // to cluster and calculate metrics for. 595 // 596 // Filtering supports a subset of [AIP-160 filtering](https://google.aip.dev/160). 597 // 598 // All values are case-sensitive. 599 // 600 // A bare value is searched for in the columns test_id and 601 // failure_reason. E.g. ninja or "test failed". 602 // 603 // You can use AND, OR and NOT (case sensitive) logical operators, along 604 // with grouping. '-' is equivalent to NOT. Multiple bare values are 605 // considered to be AND separated. E.g. These are equivalent: 606 // hello world 607 // and: 608 // hello AND world 609 // 610 // More examples: 611 // a OR b 612 // a AND NOT(b or -c) 613 // 614 // You can filter particular columns with '=', '!=' and ':' (has) operators. 615 // The right hand side of the operator must be a simple value. E.g: 616 // test_id:telemetry 617 // -failure_reason:Timeout 618 // ingested_invocation_id="build-8822963500388678513" 619 // 620 // Supported columns to search on: 621 // - test_id 622 // - failure_reason 623 // - realm 624 // - ingested_invocation_id 625 // - cluster_algorithm 626 // - cluster_id 627 // - variant_hash 628 // - test_run_id 629 // - tags 630 // 631 // Note that cost is greatly reduced (more than 90%) if exact matches for the 632 // cluster_algorithm and cluster_id field are both provided in the filter string. 633 FailureFilter string `protobuf:"bytes,2,opt,name=failure_filter,json=failureFilter,proto3" json:"failure_filter,omitempty"` 634 // A comma-separated list of fields to order the response by. 635 // 636 // The default sorting order is ascending; to specify descending order 637 // for a field append a " desc" suffix. The dot syntax can be used 638 // to navigate fields and map keys, and the backtick character (“) used 639 // to escape field names that do not match `[a-zA-Z_][a-zA-Z0-9_]`. 640 // 641 // The only sortable columns that are supported currently are metric 642 // fields. 643 // 644 // For example, to sort by human CLs failed presubmit descending, use: 645 // "metrics.`human-cls-failed-presubmit`.value desc". 646 // To sort by human CLs failed presubmit followed by failures, use: 647 // "metrics.`human-cls-failed-presubmit`.value desc, metrics.`failures`.value desc" 648 // 649 // For more details, see aip.dev/132 for ordering syntax, and 650 // aip.dev/161#map-fields for navigating map fields. 651 OrderBy string `protobuf:"bytes,3,opt,name=order_by,json=orderBy,proto3" json:"order_by,omitempty"` 652 // The resource name(s) of the metrics to include in the cluster summaries. 653 // Format: projects/{project}/metrics/{metric_id}. 654 // See the metrics field on the luci.analysis.v1.Cluster message for details 655 // about valid metric identifiers. 656 Metrics []string `protobuf:"bytes,4,rep,name=metrics,proto3" json:"metrics,omitempty"` 657 // The time range over which to get the cluster summaries. 658 // Note: the response will include only data for the portion of the 659 // time range that is within the data retention period of 90 days. 660 TimeRange *TimeRange `protobuf:"bytes,5,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"` 661 // The level of detail that the returned cluster summaries should have. See 662 // luci.analysis.v1.ClusterSummaryView. 663 View ClusterSummaryView `protobuf:"varint,6,opt,name=view,proto3,enum=luci.analysis.v1.ClusterSummaryView" json:"view,omitempty"` 664 } 665 666 func (x *QueryClusterSummariesRequest) Reset() { 667 *x = QueryClusterSummariesRequest{} 668 if protoimpl.UnsafeEnabled { 669 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[7] 670 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 671 ms.StoreMessageInfo(mi) 672 } 673 } 674 675 func (x *QueryClusterSummariesRequest) String() string { 676 return protoimpl.X.MessageStringOf(x) 677 } 678 679 func (*QueryClusterSummariesRequest) ProtoMessage() {} 680 681 func (x *QueryClusterSummariesRequest) ProtoReflect() protoreflect.Message { 682 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[7] 683 if protoimpl.UnsafeEnabled && x != nil { 684 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 685 if ms.LoadMessageInfo() == nil { 686 ms.StoreMessageInfo(mi) 687 } 688 return ms 689 } 690 return mi.MessageOf(x) 691 } 692 693 // Deprecated: Use QueryClusterSummariesRequest.ProtoReflect.Descriptor instead. 694 func (*QueryClusterSummariesRequest) Descriptor() ([]byte, []int) { 695 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{7} 696 } 697 698 func (x *QueryClusterSummariesRequest) GetProject() string { 699 if x != nil { 700 return x.Project 701 } 702 return "" 703 } 704 705 func (x *QueryClusterSummariesRequest) GetFailureFilter() string { 706 if x != nil { 707 return x.FailureFilter 708 } 709 return "" 710 } 711 712 func (x *QueryClusterSummariesRequest) GetOrderBy() string { 713 if x != nil { 714 return x.OrderBy 715 } 716 return "" 717 } 718 719 func (x *QueryClusterSummariesRequest) GetMetrics() []string { 720 if x != nil { 721 return x.Metrics 722 } 723 return nil 724 } 725 726 func (x *QueryClusterSummariesRequest) GetTimeRange() *TimeRange { 727 if x != nil { 728 return x.TimeRange 729 } 730 return nil 731 } 732 733 func (x *QueryClusterSummariesRequest) GetView() ClusterSummaryView { 734 if x != nil { 735 return x.View 736 } 737 return ClusterSummaryView_CLUSTER_SUMMARY_VIEW_UNSPECIFIED 738 } 739 740 type QueryClusterSummariesResponse struct { 741 state protoimpl.MessageState 742 sizeCache protoimpl.SizeCache 743 unknownFields protoimpl.UnknownFields 744 745 // The clusters and impact metrics from the filtered failures. 746 ClusterSummaries []*ClusterSummary `protobuf:"bytes,1,rep,name=cluster_summaries,json=clusterSummaries,proto3" json:"cluster_summaries,omitempty"` 747 } 748 749 func (x *QueryClusterSummariesResponse) Reset() { 750 *x = QueryClusterSummariesResponse{} 751 if protoimpl.UnsafeEnabled { 752 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[8] 753 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 754 ms.StoreMessageInfo(mi) 755 } 756 } 757 758 func (x *QueryClusterSummariesResponse) String() string { 759 return protoimpl.X.MessageStringOf(x) 760 } 761 762 func (*QueryClusterSummariesResponse) ProtoMessage() {} 763 764 func (x *QueryClusterSummariesResponse) ProtoReflect() protoreflect.Message { 765 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[8] 766 if protoimpl.UnsafeEnabled && x != nil { 767 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 768 if ms.LoadMessageInfo() == nil { 769 ms.StoreMessageInfo(mi) 770 } 771 return ms 772 } 773 return mi.MessageOf(x) 774 } 775 776 // Deprecated: Use QueryClusterSummariesResponse.ProtoReflect.Descriptor instead. 777 func (*QueryClusterSummariesResponse) Descriptor() ([]byte, []int) { 778 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{8} 779 } 780 781 func (x *QueryClusterSummariesResponse) GetClusterSummaries() []*ClusterSummary { 782 if x != nil { 783 return x.ClusterSummaries 784 } 785 return nil 786 } 787 788 type ClusterSummary struct { 789 state protoimpl.MessageState 790 sizeCache protoimpl.SizeCache 791 unknownFields protoimpl.UnknownFields 792 793 // The cluster ID of this cluster. 794 ClusterId *ClusterId `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` 795 // Title is a one-line description of the cluster. 796 Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"` 797 // The bug associated with the cluster. This will only be present for 798 // rules algorithm clusters. 799 Bug *AssociatedBug `protobuf:"bytes,3,opt,name=bug,proto3" json:"bug,omitempty"` 800 // The values of cluster metrics. The key of the map is the identifier 801 // of the metric (e.g. "human-cls-failed-presubmit"). 802 // See the metrics field on the luci.analysis.v1.Cluster message for details 803 // about valid metric identifiers. 804 Metrics map[string]*ClusterSummary_MetricValue `protobuf:"bytes,7,rep,name=metrics,proto3" json:"metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` 805 } 806 807 func (x *ClusterSummary) Reset() { 808 *x = ClusterSummary{} 809 if protoimpl.UnsafeEnabled { 810 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[9] 811 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 812 ms.StoreMessageInfo(mi) 813 } 814 } 815 816 func (x *ClusterSummary) String() string { 817 return protoimpl.X.MessageStringOf(x) 818 } 819 820 func (*ClusterSummary) ProtoMessage() {} 821 822 func (x *ClusterSummary) ProtoReflect() protoreflect.Message { 823 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[9] 824 if protoimpl.UnsafeEnabled && x != nil { 825 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 826 if ms.LoadMessageInfo() == nil { 827 ms.StoreMessageInfo(mi) 828 } 829 return ms 830 } 831 return mi.MessageOf(x) 832 } 833 834 // Deprecated: Use ClusterSummary.ProtoReflect.Descriptor instead. 835 func (*ClusterSummary) Descriptor() ([]byte, []int) { 836 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{9} 837 } 838 839 func (x *ClusterSummary) GetClusterId() *ClusterId { 840 if x != nil { 841 return x.ClusterId 842 } 843 return nil 844 } 845 846 func (x *ClusterSummary) GetTitle() string { 847 if x != nil { 848 return x.Title 849 } 850 return "" 851 } 852 853 func (x *ClusterSummary) GetBug() *AssociatedBug { 854 if x != nil { 855 return x.Bug 856 } 857 return nil 858 } 859 860 func (x *ClusterSummary) GetMetrics() map[string]*ClusterSummary_MetricValue { 861 if x != nil { 862 return x.Metrics 863 } 864 return nil 865 } 866 867 type QueryClusterFailuresRequest struct { 868 state protoimpl.MessageState 869 sizeCache protoimpl.SizeCache 870 unknownFields protoimpl.UnknownFields 871 872 // The resource name of the cluster failures to retrieve. 873 // Format: projects/{project}/clusters/{cluster_algorithm}/{cluster_id}/failures. 874 Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` 875 // Optional. The resource name of the metric for which failures should 876 // be displayed. 877 // Format: projects/{project}/metrics/{metric_id}. 878 // 879 // If no metrics is specified here, then no filtering is performed 880 // and all failures are eligible to be returned. Over time, we may wish 881 // to migrate this to an AIP-160 filter clause, e.g. "in_metric(`metric-id`)" 882 // where in_metric is a function. 883 MetricFilter string `protobuf:"bytes,2,opt,name=metric_filter,json=metricFilter,proto3" json:"metric_filter,omitempty"` 884 } 885 886 func (x *QueryClusterFailuresRequest) Reset() { 887 *x = QueryClusterFailuresRequest{} 888 if protoimpl.UnsafeEnabled { 889 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[10] 890 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 891 ms.StoreMessageInfo(mi) 892 } 893 } 894 895 func (x *QueryClusterFailuresRequest) String() string { 896 return protoimpl.X.MessageStringOf(x) 897 } 898 899 func (*QueryClusterFailuresRequest) ProtoMessage() {} 900 901 func (x *QueryClusterFailuresRequest) ProtoReflect() protoreflect.Message { 902 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[10] 903 if protoimpl.UnsafeEnabled && x != nil { 904 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 905 if ms.LoadMessageInfo() == nil { 906 ms.StoreMessageInfo(mi) 907 } 908 return ms 909 } 910 return mi.MessageOf(x) 911 } 912 913 // Deprecated: Use QueryClusterFailuresRequest.ProtoReflect.Descriptor instead. 914 func (*QueryClusterFailuresRequest) Descriptor() ([]byte, []int) { 915 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{10} 916 } 917 918 func (x *QueryClusterFailuresRequest) GetParent() string { 919 if x != nil { 920 return x.Parent 921 } 922 return "" 923 } 924 925 func (x *QueryClusterFailuresRequest) GetMetricFilter() string { 926 if x != nil { 927 return x.MetricFilter 928 } 929 return "" 930 } 931 932 type QueryClusterFailuresResponse struct { 933 state protoimpl.MessageState 934 sizeCache protoimpl.SizeCache 935 unknownFields protoimpl.UnknownFields 936 937 // Example failures in the cluster. 938 // Limited to the most recent 2000 examples. 939 Failures []*DistinctClusterFailure `protobuf:"bytes,1,rep,name=failures,proto3" json:"failures,omitempty"` 940 } 941 942 func (x *QueryClusterFailuresResponse) Reset() { 943 *x = QueryClusterFailuresResponse{} 944 if protoimpl.UnsafeEnabled { 945 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[11] 946 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 947 ms.StoreMessageInfo(mi) 948 } 949 } 950 951 func (x *QueryClusterFailuresResponse) String() string { 952 return protoimpl.X.MessageStringOf(x) 953 } 954 955 func (*QueryClusterFailuresResponse) ProtoMessage() {} 956 957 func (x *QueryClusterFailuresResponse) ProtoReflect() protoreflect.Message { 958 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[11] 959 if protoimpl.UnsafeEnabled && x != nil { 960 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 961 if ms.LoadMessageInfo() == nil { 962 ms.StoreMessageInfo(mi) 963 } 964 return ms 965 } 966 return mi.MessageOf(x) 967 } 968 969 // Deprecated: Use QueryClusterFailuresResponse.ProtoReflect.Descriptor instead. 970 func (*QueryClusterFailuresResponse) Descriptor() ([]byte, []int) { 971 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{11} 972 } 973 974 func (x *QueryClusterFailuresResponse) GetFailures() []*DistinctClusterFailure { 975 if x != nil { 976 return x.Failures 977 } 978 return nil 979 } 980 981 // DistinctClusterFailure represents a number of failures which have identical 982 // properties. This provides slightly compressed transfer of examples. 983 type DistinctClusterFailure struct { 984 state protoimpl.MessageState 985 sizeCache protoimpl.SizeCache 986 unknownFields protoimpl.UnknownFields 987 988 // The identity of the test. 989 TestId string `protobuf:"bytes,1,opt,name=test_id,json=testId,proto3" json:"test_id,omitempty"` 990 // Description of one specific way of running the test, 991 // e.g. a specific bucket, builder and a test suite. 992 Variant *Variant `protobuf:"bytes,2,opt,name=variant,proto3" json:"variant,omitempty"` 993 // Timestamp representing the start of the data retention period for the 994 // test results in this group. 995 // The partition time is usually the presubmit run start time (if any) or 996 // build start time. 997 PartitionTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=partition_time,json=partitionTime,proto3" json:"partition_time,omitempty"` 998 // Details if the presubmit run associated with these results (if any). 999 PresubmitRun *DistinctClusterFailure_PresubmitRun `protobuf:"bytes,4,opt,name=presubmit_run,json=presubmitRun,proto3" json:"presubmit_run,omitempty"` 1000 // Whether the build was critical to a presubmit run succeeding. 1001 // If the build was not part of a presubmit run, this field should 1002 // be ignored. 1003 IsBuildCritical bool `protobuf:"varint,5,opt,name=is_build_critical,json=isBuildCritical,proto3" json:"is_build_critical,omitempty"` 1004 // The exonerations applied to the test variant verdict. 1005 Exonerations []*DistinctClusterFailure_Exoneration `protobuf:"bytes,6,rep,name=exonerations,proto3" json:"exonerations,omitempty"` 1006 // The status of the build that contained this test result. Can be used 1007 // to filter incomplete results (e.g. where build was cancelled or had 1008 // an infra failure). Can also be used to filter builds with incomplete 1009 // exonerations (e.g. build succeeded but some tests not exonerated). 1010 // This is the build corresponding to ingested_invocation_id. 1011 BuildStatus BuildStatus `protobuf:"varint,7,opt,name=build_status,json=buildStatus,proto3,enum=luci.analysis.v1.BuildStatus" json:"build_status,omitempty"` 1012 // The invocation from which this test result was ingested. This is 1013 // the top-level invocation that was ingested, an "invocation" being 1014 // a container of test results as identified by the source test result 1015 // system. 1016 // 1017 // For ResultDB, LUCI Analysis ingests invocations corresponding to 1018 // buildbucket builds. 1019 IngestedInvocationId string `protobuf:"bytes,8,opt,name=ingested_invocation_id,json=ingestedInvocationId,proto3" json:"ingested_invocation_id,omitempty"` 1020 // Is the ingested invocation blocked by this test variant? This is 1021 // only true if all (non-skipped) test results for this test variant 1022 // (in the ingested invocation) are unexpected failures. 1023 // 1024 // Exoneration does not factor into this value; check exonerations 1025 // to see if the impact of this ingested invocation being blocked was 1026 // mitigated by exoneration. 1027 IsIngestedInvocationBlocked bool `protobuf:"varint,9,opt,name=is_ingested_invocation_blocked,json=isIngestedInvocationBlocked,proto3" json:"is_ingested_invocation_blocked,omitempty"` 1028 // The unsubmitted changelists that were tested (if any). 1029 // Up to 10 changelists are captured. 1030 Changelists []*Changelist `protobuf:"bytes,10,rep,name=changelists,proto3" json:"changelists,omitempty"` 1031 // The number of test results which have these properties. 1032 Count int32 `protobuf:"varint,11,opt,name=count,proto3" json:"count,omitempty"` 1033 } 1034 1035 func (x *DistinctClusterFailure) Reset() { 1036 *x = DistinctClusterFailure{} 1037 if protoimpl.UnsafeEnabled { 1038 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[12] 1039 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1040 ms.StoreMessageInfo(mi) 1041 } 1042 } 1043 1044 func (x *DistinctClusterFailure) String() string { 1045 return protoimpl.X.MessageStringOf(x) 1046 } 1047 1048 func (*DistinctClusterFailure) ProtoMessage() {} 1049 1050 func (x *DistinctClusterFailure) ProtoReflect() protoreflect.Message { 1051 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[12] 1052 if protoimpl.UnsafeEnabled && x != nil { 1053 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1054 if ms.LoadMessageInfo() == nil { 1055 ms.StoreMessageInfo(mi) 1056 } 1057 return ms 1058 } 1059 return mi.MessageOf(x) 1060 } 1061 1062 // Deprecated: Use DistinctClusterFailure.ProtoReflect.Descriptor instead. 1063 func (*DistinctClusterFailure) Descriptor() ([]byte, []int) { 1064 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{12} 1065 } 1066 1067 func (x *DistinctClusterFailure) GetTestId() string { 1068 if x != nil { 1069 return x.TestId 1070 } 1071 return "" 1072 } 1073 1074 func (x *DistinctClusterFailure) GetVariant() *Variant { 1075 if x != nil { 1076 return x.Variant 1077 } 1078 return nil 1079 } 1080 1081 func (x *DistinctClusterFailure) GetPartitionTime() *timestamppb.Timestamp { 1082 if x != nil { 1083 return x.PartitionTime 1084 } 1085 return nil 1086 } 1087 1088 func (x *DistinctClusterFailure) GetPresubmitRun() *DistinctClusterFailure_PresubmitRun { 1089 if x != nil { 1090 return x.PresubmitRun 1091 } 1092 return nil 1093 } 1094 1095 func (x *DistinctClusterFailure) GetIsBuildCritical() bool { 1096 if x != nil { 1097 return x.IsBuildCritical 1098 } 1099 return false 1100 } 1101 1102 func (x *DistinctClusterFailure) GetExonerations() []*DistinctClusterFailure_Exoneration { 1103 if x != nil { 1104 return x.Exonerations 1105 } 1106 return nil 1107 } 1108 1109 func (x *DistinctClusterFailure) GetBuildStatus() BuildStatus { 1110 if x != nil { 1111 return x.BuildStatus 1112 } 1113 return BuildStatus_BUILD_STATUS_UNSPECIFIED 1114 } 1115 1116 func (x *DistinctClusterFailure) GetIngestedInvocationId() string { 1117 if x != nil { 1118 return x.IngestedInvocationId 1119 } 1120 return "" 1121 } 1122 1123 func (x *DistinctClusterFailure) GetIsIngestedInvocationBlocked() bool { 1124 if x != nil { 1125 return x.IsIngestedInvocationBlocked 1126 } 1127 return false 1128 } 1129 1130 func (x *DistinctClusterFailure) GetChangelists() []*Changelist { 1131 if x != nil { 1132 return x.Changelists 1133 } 1134 return nil 1135 } 1136 1137 func (x *DistinctClusterFailure) GetCount() int32 { 1138 if x != nil { 1139 return x.Count 1140 } 1141 return 0 1142 } 1143 1144 type QueryClusterExoneratedTestVariantsRequest struct { 1145 state protoimpl.MessageState 1146 sizeCache protoimpl.SizeCache 1147 unknownFields protoimpl.UnknownFields 1148 1149 // The resource name of the cluster exonerated test variants to retrieve. 1150 // Format: projects/{project}/clusters/{cluster_algorithm}/{cluster_id}/exoneratedTestVariants. 1151 Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` 1152 } 1153 1154 func (x *QueryClusterExoneratedTestVariantsRequest) Reset() { 1155 *x = QueryClusterExoneratedTestVariantsRequest{} 1156 if protoimpl.UnsafeEnabled { 1157 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[13] 1158 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1159 ms.StoreMessageInfo(mi) 1160 } 1161 } 1162 1163 func (x *QueryClusterExoneratedTestVariantsRequest) String() string { 1164 return protoimpl.X.MessageStringOf(x) 1165 } 1166 1167 func (*QueryClusterExoneratedTestVariantsRequest) ProtoMessage() {} 1168 1169 func (x *QueryClusterExoneratedTestVariantsRequest) ProtoReflect() protoreflect.Message { 1170 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[13] 1171 if protoimpl.UnsafeEnabled && x != nil { 1172 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1173 if ms.LoadMessageInfo() == nil { 1174 ms.StoreMessageInfo(mi) 1175 } 1176 return ms 1177 } 1178 return mi.MessageOf(x) 1179 } 1180 1181 // Deprecated: Use QueryClusterExoneratedTestVariantsRequest.ProtoReflect.Descriptor instead. 1182 func (*QueryClusterExoneratedTestVariantsRequest) Descriptor() ([]byte, []int) { 1183 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{13} 1184 } 1185 1186 func (x *QueryClusterExoneratedTestVariantsRequest) GetParent() string { 1187 if x != nil { 1188 return x.Parent 1189 } 1190 return "" 1191 } 1192 1193 type QueryClusterExoneratedTestVariantsResponse struct { 1194 state protoimpl.MessageState 1195 sizeCache protoimpl.SizeCache 1196 unknownFields protoimpl.UnknownFields 1197 1198 // A list of test variants in the cluster which have exonerated critical 1199 // failures. Ordered by recency of the exoneration (most recent exonerations 1200 // first) and limited to at most 100 test variants. 1201 TestVariants []*ClusterExoneratedTestVariant `protobuf:"bytes,1,rep,name=test_variants,json=testVariants,proto3" json:"test_variants,omitempty"` 1202 } 1203 1204 func (x *QueryClusterExoneratedTestVariantsResponse) Reset() { 1205 *x = QueryClusterExoneratedTestVariantsResponse{} 1206 if protoimpl.UnsafeEnabled { 1207 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[14] 1208 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1209 ms.StoreMessageInfo(mi) 1210 } 1211 } 1212 1213 func (x *QueryClusterExoneratedTestVariantsResponse) String() string { 1214 return protoimpl.X.MessageStringOf(x) 1215 } 1216 1217 func (*QueryClusterExoneratedTestVariantsResponse) ProtoMessage() {} 1218 1219 func (x *QueryClusterExoneratedTestVariantsResponse) ProtoReflect() protoreflect.Message { 1220 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[14] 1221 if protoimpl.UnsafeEnabled && x != nil { 1222 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1223 if ms.LoadMessageInfo() == nil { 1224 ms.StoreMessageInfo(mi) 1225 } 1226 return ms 1227 } 1228 return mi.MessageOf(x) 1229 } 1230 1231 // Deprecated: Use QueryClusterExoneratedTestVariantsResponse.ProtoReflect.Descriptor instead. 1232 func (*QueryClusterExoneratedTestVariantsResponse) Descriptor() ([]byte, []int) { 1233 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{14} 1234 } 1235 1236 func (x *QueryClusterExoneratedTestVariantsResponse) GetTestVariants() []*ClusterExoneratedTestVariant { 1237 if x != nil { 1238 return x.TestVariants 1239 } 1240 return nil 1241 } 1242 1243 // ClusterExoneratedTestVariant represents a test variant in a cluster 1244 // which has been exonerated. A cluster test variant is the subset 1245 // of a test variant that intersects with the failures of a cluster. 1246 type ClusterExoneratedTestVariant struct { 1247 state protoimpl.MessageState 1248 sizeCache protoimpl.SizeCache 1249 unknownFields protoimpl.UnknownFields 1250 1251 // A unique identifier of the test in a LUCI project. 1252 TestId string `protobuf:"bytes,1,opt,name=test_id,json=testId,proto3" json:"test_id,omitempty"` 1253 // Description of one specific way of running the test, 1254 // e.g. a specific bucket, builder and a test suite. 1255 Variant *Variant `protobuf:"bytes,2,opt,name=variant,proto3" json:"variant,omitempty"` 1256 // The number of critical (presubmit-blocking) failures in the 1257 // cluster which have been exonerated on this test variant 1258 // in the last week. 1259 CriticalFailuresExonerated int32 `protobuf:"varint,3,opt,name=critical_failures_exonerated,json=criticalFailuresExonerated,proto3" json:"critical_failures_exonerated,omitempty"` 1260 // The partition time of the most recent exoneration of a 1261 // critical failure. 1262 LastExoneration *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=last_exoneration,json=lastExoneration,proto3" json:"last_exoneration,omitempty"` 1263 } 1264 1265 func (x *ClusterExoneratedTestVariant) Reset() { 1266 *x = ClusterExoneratedTestVariant{} 1267 if protoimpl.UnsafeEnabled { 1268 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[15] 1269 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1270 ms.StoreMessageInfo(mi) 1271 } 1272 } 1273 1274 func (x *ClusterExoneratedTestVariant) String() string { 1275 return protoimpl.X.MessageStringOf(x) 1276 } 1277 1278 func (*ClusterExoneratedTestVariant) ProtoMessage() {} 1279 1280 func (x *ClusterExoneratedTestVariant) ProtoReflect() protoreflect.Message { 1281 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[15] 1282 if protoimpl.UnsafeEnabled && x != nil { 1283 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1284 if ms.LoadMessageInfo() == nil { 1285 ms.StoreMessageInfo(mi) 1286 } 1287 return ms 1288 } 1289 return mi.MessageOf(x) 1290 } 1291 1292 // Deprecated: Use ClusterExoneratedTestVariant.ProtoReflect.Descriptor instead. 1293 func (*ClusterExoneratedTestVariant) Descriptor() ([]byte, []int) { 1294 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{15} 1295 } 1296 1297 func (x *ClusterExoneratedTestVariant) GetTestId() string { 1298 if x != nil { 1299 return x.TestId 1300 } 1301 return "" 1302 } 1303 1304 func (x *ClusterExoneratedTestVariant) GetVariant() *Variant { 1305 if x != nil { 1306 return x.Variant 1307 } 1308 return nil 1309 } 1310 1311 func (x *ClusterExoneratedTestVariant) GetCriticalFailuresExonerated() int32 { 1312 if x != nil { 1313 return x.CriticalFailuresExonerated 1314 } 1315 return 0 1316 } 1317 1318 func (x *ClusterExoneratedTestVariant) GetLastExoneration() *timestamppb.Timestamp { 1319 if x != nil { 1320 return x.LastExoneration 1321 } 1322 return nil 1323 } 1324 1325 type QueryClusterExoneratedTestVariantBranchesRequest struct { 1326 state protoimpl.MessageState 1327 sizeCache protoimpl.SizeCache 1328 unknownFields protoimpl.UnknownFields 1329 1330 // The resource name of the cluster exonerated test variant branches to retrieve. 1331 // Format: projects/{project}/clusters/{cluster_algorithm}/{cluster_id}/exoneratedTestVariantBranches. 1332 Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"` 1333 } 1334 1335 func (x *QueryClusterExoneratedTestVariantBranchesRequest) Reset() { 1336 *x = QueryClusterExoneratedTestVariantBranchesRequest{} 1337 if protoimpl.UnsafeEnabled { 1338 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[16] 1339 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1340 ms.StoreMessageInfo(mi) 1341 } 1342 } 1343 1344 func (x *QueryClusterExoneratedTestVariantBranchesRequest) String() string { 1345 return protoimpl.X.MessageStringOf(x) 1346 } 1347 1348 func (*QueryClusterExoneratedTestVariantBranchesRequest) ProtoMessage() {} 1349 1350 func (x *QueryClusterExoneratedTestVariantBranchesRequest) ProtoReflect() protoreflect.Message { 1351 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[16] 1352 if protoimpl.UnsafeEnabled && x != nil { 1353 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1354 if ms.LoadMessageInfo() == nil { 1355 ms.StoreMessageInfo(mi) 1356 } 1357 return ms 1358 } 1359 return mi.MessageOf(x) 1360 } 1361 1362 // Deprecated: Use QueryClusterExoneratedTestVariantBranchesRequest.ProtoReflect.Descriptor instead. 1363 func (*QueryClusterExoneratedTestVariantBranchesRequest) Descriptor() ([]byte, []int) { 1364 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{16} 1365 } 1366 1367 func (x *QueryClusterExoneratedTestVariantBranchesRequest) GetParent() string { 1368 if x != nil { 1369 return x.Parent 1370 } 1371 return "" 1372 } 1373 1374 type QueryClusterExoneratedTestVariantBranchesResponse struct { 1375 state protoimpl.MessageState 1376 sizeCache protoimpl.SizeCache 1377 unknownFields protoimpl.UnknownFields 1378 1379 // A list of test variants branches in the cluster which have exonerated 1380 // critical failures. Ordered by recency of the exoneration (most recent 1381 // exonerations first) and limited to at most 100 test variant branches. 1382 // 1383 // Pagination following AIP-158 may be implemented in future if 1384 // more than 100 items is needed. 1385 TestVariantBranches []*ClusterExoneratedTestVariantBranch `protobuf:"bytes,1,rep,name=test_variant_branches,json=testVariantBranches,proto3" json:"test_variant_branches,omitempty"` 1386 } 1387 1388 func (x *QueryClusterExoneratedTestVariantBranchesResponse) Reset() { 1389 *x = QueryClusterExoneratedTestVariantBranchesResponse{} 1390 if protoimpl.UnsafeEnabled { 1391 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[17] 1392 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1393 ms.StoreMessageInfo(mi) 1394 } 1395 } 1396 1397 func (x *QueryClusterExoneratedTestVariantBranchesResponse) String() string { 1398 return protoimpl.X.MessageStringOf(x) 1399 } 1400 1401 func (*QueryClusterExoneratedTestVariantBranchesResponse) ProtoMessage() {} 1402 1403 func (x *QueryClusterExoneratedTestVariantBranchesResponse) ProtoReflect() protoreflect.Message { 1404 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[17] 1405 if protoimpl.UnsafeEnabled && x != nil { 1406 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1407 if ms.LoadMessageInfo() == nil { 1408 ms.StoreMessageInfo(mi) 1409 } 1410 return ms 1411 } 1412 return mi.MessageOf(x) 1413 } 1414 1415 // Deprecated: Use QueryClusterExoneratedTestVariantBranchesResponse.ProtoReflect.Descriptor instead. 1416 func (*QueryClusterExoneratedTestVariantBranchesResponse) Descriptor() ([]byte, []int) { 1417 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{17} 1418 } 1419 1420 func (x *QueryClusterExoneratedTestVariantBranchesResponse) GetTestVariantBranches() []*ClusterExoneratedTestVariantBranch { 1421 if x != nil { 1422 return x.TestVariantBranches 1423 } 1424 return nil 1425 } 1426 1427 // ClusterExoneratedTestVariantBranch represents a (test, variant, source ref) 1428 // in a cluster which has been exonerated. A cluster test variant branch is 1429 // the subset of a test variant branch that intersects with the failures of a 1430 // cluster. 1431 type ClusterExoneratedTestVariantBranch struct { 1432 state protoimpl.MessageState 1433 sizeCache protoimpl.SizeCache 1434 unknownFields protoimpl.UnknownFields 1435 1436 // The LUCI project. 1437 Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` 1438 // A unique identifier of the test in a LUCI project. 1439 TestId string `protobuf:"bytes,2,opt,name=test_id,json=testId,proto3" json:"test_id,omitempty"` 1440 // Description of one specific way of running the test, 1441 // e.g. a specific bucket, builder and a test suite. 1442 Variant *Variant `protobuf:"bytes,3,opt,name=variant,proto3" json:"variant,omitempty"` 1443 // The branch in source control that was tested, if known. 1444 // For example, the `refs/heads/main` branch in the `chromium/src` repo 1445 // hosted by `chromium.googlesource.com`. 1446 SourceRef *SourceRef `protobuf:"bytes,4,opt,name=source_ref,json=sourceRef,proto3" json:"source_ref,omitempty"` 1447 // The number of critical (presubmit-blocking) failures in the 1448 // cluster which have been exonerated on this test variant 1449 // in the last week. 1450 CriticalFailuresExonerated int32 `protobuf:"varint,5,opt,name=critical_failures_exonerated,json=criticalFailuresExonerated,proto3" json:"critical_failures_exonerated,omitempty"` 1451 // The partition time of the most recent exoneration of a 1452 // critical failure. 1453 LastExoneration *timestamppb.Timestamp `protobuf:"bytes,6,opt,name=last_exoneration,json=lastExoneration,proto3" json:"last_exoneration,omitempty"` 1454 } 1455 1456 func (x *ClusterExoneratedTestVariantBranch) Reset() { 1457 *x = ClusterExoneratedTestVariantBranch{} 1458 if protoimpl.UnsafeEnabled { 1459 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[18] 1460 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1461 ms.StoreMessageInfo(mi) 1462 } 1463 } 1464 1465 func (x *ClusterExoneratedTestVariantBranch) String() string { 1466 return protoimpl.X.MessageStringOf(x) 1467 } 1468 1469 func (*ClusterExoneratedTestVariantBranch) ProtoMessage() {} 1470 1471 func (x *ClusterExoneratedTestVariantBranch) ProtoReflect() protoreflect.Message { 1472 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[18] 1473 if protoimpl.UnsafeEnabled && x != nil { 1474 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1475 if ms.LoadMessageInfo() == nil { 1476 ms.StoreMessageInfo(mi) 1477 } 1478 return ms 1479 } 1480 return mi.MessageOf(x) 1481 } 1482 1483 // Deprecated: Use ClusterExoneratedTestVariantBranch.ProtoReflect.Descriptor instead. 1484 func (*ClusterExoneratedTestVariantBranch) Descriptor() ([]byte, []int) { 1485 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{18} 1486 } 1487 1488 func (x *ClusterExoneratedTestVariantBranch) GetProject() string { 1489 if x != nil { 1490 return x.Project 1491 } 1492 return "" 1493 } 1494 1495 func (x *ClusterExoneratedTestVariantBranch) GetTestId() string { 1496 if x != nil { 1497 return x.TestId 1498 } 1499 return "" 1500 } 1501 1502 func (x *ClusterExoneratedTestVariantBranch) GetVariant() *Variant { 1503 if x != nil { 1504 return x.Variant 1505 } 1506 return nil 1507 } 1508 1509 func (x *ClusterExoneratedTestVariantBranch) GetSourceRef() *SourceRef { 1510 if x != nil { 1511 return x.SourceRef 1512 } 1513 return nil 1514 } 1515 1516 func (x *ClusterExoneratedTestVariantBranch) GetCriticalFailuresExonerated() int32 { 1517 if x != nil { 1518 return x.CriticalFailuresExonerated 1519 } 1520 return 0 1521 } 1522 1523 func (x *ClusterExoneratedTestVariantBranch) GetLastExoneration() *timestamppb.Timestamp { 1524 if x != nil { 1525 return x.LastExoneration 1526 } 1527 return nil 1528 } 1529 1530 type QueryClusterHistoryRequest struct { 1531 state protoimpl.MessageState 1532 sizeCache protoimpl.SizeCache 1533 unknownFields protoimpl.UnknownFields 1534 1535 // The LUCI Project. 1536 Project string `protobuf:"bytes,1,opt,name=project,proto3" json:"project,omitempty"` 1537 // An AIP-160 style filter to select test failures in the project 1538 // to calculate metrics for. 1539 // 1540 // See the description of the QueryClusterSummariesRequest.failure_filter 1541 // above for the format of this field. 1542 // 1543 // Note that cost is greatly reduced (more than 90%) if exact matches for the 1544 // cluster_algorithm and cluster_id field are both provided in the filter string. 1545 FailureFilter string `protobuf:"bytes,2,opt,name=failure_filter,json=failureFilter,proto3" json:"failure_filter,omitempty"` 1546 // The number of days of history to return. Maximum of 90 as only 90 days of 1547 // history is kept by LUCI Analysis. Note that the cost of the query scales 1548 // linearly with the number of days. 1549 Days int32 `protobuf:"varint,3,opt,name=days,proto3" json:"days,omitempty"` 1550 // The resource name(s) of the metrics to include in the cluster histories. 1551 // Format: projects/{project}/metrics/{metric_id}. 1552 // See the metrics field on the luci.analysis.v1.Cluster message for details 1553 // about valid metric identifiers. 1554 Metrics []string `protobuf:"bytes,4,rep,name=metrics,proto3" json:"metrics,omitempty"` 1555 } 1556 1557 func (x *QueryClusterHistoryRequest) Reset() { 1558 *x = QueryClusterHistoryRequest{} 1559 if protoimpl.UnsafeEnabled { 1560 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[19] 1561 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1562 ms.StoreMessageInfo(mi) 1563 } 1564 } 1565 1566 func (x *QueryClusterHistoryRequest) String() string { 1567 return protoimpl.X.MessageStringOf(x) 1568 } 1569 1570 func (*QueryClusterHistoryRequest) ProtoMessage() {} 1571 1572 func (x *QueryClusterHistoryRequest) ProtoReflect() protoreflect.Message { 1573 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[19] 1574 if protoimpl.UnsafeEnabled && x != nil { 1575 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1576 if ms.LoadMessageInfo() == nil { 1577 ms.StoreMessageInfo(mi) 1578 } 1579 return ms 1580 } 1581 return mi.MessageOf(x) 1582 } 1583 1584 // Deprecated: Use QueryClusterHistoryRequest.ProtoReflect.Descriptor instead. 1585 func (*QueryClusterHistoryRequest) Descriptor() ([]byte, []int) { 1586 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{19} 1587 } 1588 1589 func (x *QueryClusterHistoryRequest) GetProject() string { 1590 if x != nil { 1591 return x.Project 1592 } 1593 return "" 1594 } 1595 1596 func (x *QueryClusterHistoryRequest) GetFailureFilter() string { 1597 if x != nil { 1598 return x.FailureFilter 1599 } 1600 return "" 1601 } 1602 1603 func (x *QueryClusterHistoryRequest) GetDays() int32 { 1604 if x != nil { 1605 return x.Days 1606 } 1607 return 0 1608 } 1609 1610 func (x *QueryClusterHistoryRequest) GetMetrics() []string { 1611 if x != nil { 1612 return x.Metrics 1613 } 1614 return nil 1615 } 1616 1617 type QueryClusterHistoryResponse struct { 1618 state protoimpl.MessageState 1619 sizeCache protoimpl.SizeCache 1620 unknownFields protoimpl.UnknownFields 1621 1622 // The metrics for each day. There will be the same number of days as 1623 // requested in the request. The entries will be returned in sorted date 1624 // order, earliest day first. 1625 Days []*ClusterHistoryDay `protobuf:"bytes,1,rep,name=days,proto3" json:"days,omitempty"` 1626 } 1627 1628 func (x *QueryClusterHistoryResponse) Reset() { 1629 *x = QueryClusterHistoryResponse{} 1630 if protoimpl.UnsafeEnabled { 1631 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[20] 1632 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1633 ms.StoreMessageInfo(mi) 1634 } 1635 } 1636 1637 func (x *QueryClusterHistoryResponse) String() string { 1638 return protoimpl.X.MessageStringOf(x) 1639 } 1640 1641 func (*QueryClusterHistoryResponse) ProtoMessage() {} 1642 1643 func (x *QueryClusterHistoryResponse) ProtoReflect() protoreflect.Message { 1644 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[20] 1645 if protoimpl.UnsafeEnabled && x != nil { 1646 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1647 if ms.LoadMessageInfo() == nil { 1648 ms.StoreMessageInfo(mi) 1649 } 1650 return ms 1651 } 1652 return mi.MessageOf(x) 1653 } 1654 1655 // Deprecated: Use QueryClusterHistoryResponse.ProtoReflect.Descriptor instead. 1656 func (*QueryClusterHistoryResponse) Descriptor() ([]byte, []int) { 1657 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{20} 1658 } 1659 1660 func (x *QueryClusterHistoryResponse) GetDays() []*ClusterHistoryDay { 1661 if x != nil { 1662 return x.Days 1663 } 1664 return nil 1665 } 1666 1667 // Represents metrics about a cluster on a specific day. 1668 type ClusterHistoryDay struct { 1669 state protoimpl.MessageState 1670 sizeCache protoimpl.SizeCache 1671 unknownFields protoimpl.UnknownFields 1672 1673 // A map from requested metric name to the value of that metric on this day. 1674 // The key of the map is the metric ID. 1675 Metrics map[string]int32 `protobuf:"bytes,1,rep,name=metrics,proto3" json:"metrics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"varint,2,opt,name=value,proto3"` 1676 // The date that these metrics are for. 1677 // This is a UTC date in ISO 8601 format, e.g. 2022-11-29 1678 Date string `protobuf:"bytes,2,opt,name=date,proto3" json:"date,omitempty"` 1679 } 1680 1681 func (x *ClusterHistoryDay) Reset() { 1682 *x = ClusterHistoryDay{} 1683 if protoimpl.UnsafeEnabled { 1684 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[21] 1685 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1686 ms.StoreMessageInfo(mi) 1687 } 1688 } 1689 1690 func (x *ClusterHistoryDay) String() string { 1691 return protoimpl.X.MessageStringOf(x) 1692 } 1693 1694 func (*ClusterHistoryDay) ProtoMessage() {} 1695 1696 func (x *ClusterHistoryDay) ProtoReflect() protoreflect.Message { 1697 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[21] 1698 if protoimpl.UnsafeEnabled && x != nil { 1699 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1700 if ms.LoadMessageInfo() == nil { 1701 ms.StoreMessageInfo(mi) 1702 } 1703 return ms 1704 } 1705 return mi.MessageOf(x) 1706 } 1707 1708 // Deprecated: Use ClusterHistoryDay.ProtoReflect.Descriptor instead. 1709 func (*ClusterHistoryDay) Descriptor() ([]byte, []int) { 1710 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{21} 1711 } 1712 1713 func (x *ClusterHistoryDay) GetMetrics() map[string]int32 { 1714 if x != nil { 1715 return x.Metrics 1716 } 1717 return nil 1718 } 1719 1720 func (x *ClusterHistoryDay) GetDate() string { 1721 if x != nil { 1722 return x.Date 1723 } 1724 return "" 1725 } 1726 1727 // TestResult captures information about a test result, sufficient to 1728 // cluster it. The fields requested here may be expanded over time. 1729 // For example, variant information may be requested in future. 1730 type ClusterRequest_TestResult struct { 1731 state protoimpl.MessageState 1732 sizeCache protoimpl.SizeCache 1733 unknownFields protoimpl.UnknownFields 1734 1735 // Opaque tag supplied by the caller, to be returned in the 1736 // response. Provided to assist correlating responses with requests. 1737 // Does not need to be unique. Optional. 1738 RequestTag string `protobuf:"bytes,1,opt,name=request_tag,json=requestTag,proto3" json:"request_tag,omitempty"` 1739 // Identifier of the test (as reported to ResultDB). 1740 // For chromium projects, this starts with ninja://. 1741 TestId string `protobuf:"bytes,2,opt,name=test_id,json=testId,proto3" json:"test_id,omitempty"` 1742 // The failure reason of the test (if any). 1743 FailureReason *FailureReason `protobuf:"bytes,3,opt,name=failure_reason,json=failureReason,proto3" json:"failure_reason,omitempty"` 1744 } 1745 1746 func (x *ClusterRequest_TestResult) Reset() { 1747 *x = ClusterRequest_TestResult{} 1748 if protoimpl.UnsafeEnabled { 1749 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[22] 1750 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1751 ms.StoreMessageInfo(mi) 1752 } 1753 } 1754 1755 func (x *ClusterRequest_TestResult) String() string { 1756 return protoimpl.X.MessageStringOf(x) 1757 } 1758 1759 func (*ClusterRequest_TestResult) ProtoMessage() {} 1760 1761 func (x *ClusterRequest_TestResult) ProtoReflect() protoreflect.Message { 1762 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[22] 1763 if protoimpl.UnsafeEnabled && x != nil { 1764 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1765 if ms.LoadMessageInfo() == nil { 1766 ms.StoreMessageInfo(mi) 1767 } 1768 return ms 1769 } 1770 return mi.MessageOf(x) 1771 } 1772 1773 // Deprecated: Use ClusterRequest_TestResult.ProtoReflect.Descriptor instead. 1774 func (*ClusterRequest_TestResult) Descriptor() ([]byte, []int) { 1775 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{0, 0} 1776 } 1777 1778 func (x *ClusterRequest_TestResult) GetRequestTag() string { 1779 if x != nil { 1780 return x.RequestTag 1781 } 1782 return "" 1783 } 1784 1785 func (x *ClusterRequest_TestResult) GetTestId() string { 1786 if x != nil { 1787 return x.TestId 1788 } 1789 return "" 1790 } 1791 1792 func (x *ClusterRequest_TestResult) GetFailureReason() *FailureReason { 1793 if x != nil { 1794 return x.FailureReason 1795 } 1796 return nil 1797 } 1798 1799 // The cluster(s) a test result is contained in. 1800 type ClusterResponse_ClusteredTestResult struct { 1801 state protoimpl.MessageState 1802 sizeCache protoimpl.SizeCache 1803 unknownFields protoimpl.UnknownFields 1804 1805 // Opaque tag supplied by the caller in the request. Provided to assist 1806 // the caller correlate responses with requests. 1807 RequestTag string `protobuf:"bytes,1,opt,name=request_tag,json=requestTag,proto3" json:"request_tag,omitempty"` 1808 // The clusters the test result is contained within. 1809 Clusters []*ClusterResponse_ClusteredTestResult_ClusterEntry `protobuf:"bytes,2,rep,name=clusters,proto3" json:"clusters,omitempty"` 1810 } 1811 1812 func (x *ClusterResponse_ClusteredTestResult) Reset() { 1813 *x = ClusterResponse_ClusteredTestResult{} 1814 if protoimpl.UnsafeEnabled { 1815 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[23] 1816 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1817 ms.StoreMessageInfo(mi) 1818 } 1819 } 1820 1821 func (x *ClusterResponse_ClusteredTestResult) String() string { 1822 return protoimpl.X.MessageStringOf(x) 1823 } 1824 1825 func (*ClusterResponse_ClusteredTestResult) ProtoMessage() {} 1826 1827 func (x *ClusterResponse_ClusteredTestResult) ProtoReflect() protoreflect.Message { 1828 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[23] 1829 if protoimpl.UnsafeEnabled && x != nil { 1830 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1831 if ms.LoadMessageInfo() == nil { 1832 ms.StoreMessageInfo(mi) 1833 } 1834 return ms 1835 } 1836 return mi.MessageOf(x) 1837 } 1838 1839 // Deprecated: Use ClusterResponse_ClusteredTestResult.ProtoReflect.Descriptor instead. 1840 func (*ClusterResponse_ClusteredTestResult) Descriptor() ([]byte, []int) { 1841 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{1, 0} 1842 } 1843 1844 func (x *ClusterResponse_ClusteredTestResult) GetRequestTag() string { 1845 if x != nil { 1846 return x.RequestTag 1847 } 1848 return "" 1849 } 1850 1851 func (x *ClusterResponse_ClusteredTestResult) GetClusters() []*ClusterResponse_ClusteredTestResult_ClusterEntry { 1852 if x != nil { 1853 return x.Clusters 1854 } 1855 return nil 1856 } 1857 1858 // An individual cluster a test result is contained in. 1859 type ClusterResponse_ClusteredTestResult_ClusterEntry struct { 1860 state protoimpl.MessageState 1861 sizeCache protoimpl.SizeCache 1862 unknownFields protoimpl.UnknownFields 1863 1864 // The unique identifier of the cluster. 1865 // If the algorithm is "rules", the cluster ID is also a rule ID. 1866 ClusterId *ClusterId `protobuf:"bytes,1,opt,name=cluster_id,json=clusterId,proto3" json:"cluster_id,omitempty"` 1867 // The bug associated with the cluster, if any. This is only 1868 // populated for clusters defined by a failure association rule, 1869 // which associates specified failures to a bug. 1870 Bug *AssociatedBug `protobuf:"bytes,2,opt,name=bug,proto3" json:"bug,omitempty"` 1871 } 1872 1873 func (x *ClusterResponse_ClusteredTestResult_ClusterEntry) Reset() { 1874 *x = ClusterResponse_ClusteredTestResult_ClusterEntry{} 1875 if protoimpl.UnsafeEnabled { 1876 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[24] 1877 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1878 ms.StoreMessageInfo(mi) 1879 } 1880 } 1881 1882 func (x *ClusterResponse_ClusteredTestResult_ClusterEntry) String() string { 1883 return protoimpl.X.MessageStringOf(x) 1884 } 1885 1886 func (*ClusterResponse_ClusteredTestResult_ClusterEntry) ProtoMessage() {} 1887 1888 func (x *ClusterResponse_ClusteredTestResult_ClusterEntry) ProtoReflect() protoreflect.Message { 1889 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[24] 1890 if protoimpl.UnsafeEnabled && x != nil { 1891 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1892 if ms.LoadMessageInfo() == nil { 1893 ms.StoreMessageInfo(mi) 1894 } 1895 return ms 1896 } 1897 return mi.MessageOf(x) 1898 } 1899 1900 // Deprecated: Use ClusterResponse_ClusteredTestResult_ClusterEntry.ProtoReflect.Descriptor instead. 1901 func (*ClusterResponse_ClusteredTestResult_ClusterEntry) Descriptor() ([]byte, []int) { 1902 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{1, 0, 0} 1903 } 1904 1905 func (x *ClusterResponse_ClusteredTestResult_ClusterEntry) GetClusterId() *ClusterId { 1906 if x != nil { 1907 return x.ClusterId 1908 } 1909 return nil 1910 } 1911 1912 func (x *ClusterResponse_ClusteredTestResult_ClusterEntry) GetBug() *AssociatedBug { 1913 if x != nil { 1914 return x.Bug 1915 } 1916 return nil 1917 } 1918 1919 type Cluster_Counts struct { 1920 state protoimpl.MessageState 1921 sizeCache protoimpl.SizeCache 1922 unknownFields protoimpl.UnknownFields 1923 1924 // The value of the metric (summed over all failures). 1925 Nominal int64 `protobuf:"varint,1,opt,name=nominal,proto3" json:"nominal,omitempty"` 1926 } 1927 1928 func (x *Cluster_Counts) Reset() { 1929 *x = Cluster_Counts{} 1930 if protoimpl.UnsafeEnabled { 1931 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[25] 1932 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1933 ms.StoreMessageInfo(mi) 1934 } 1935 } 1936 1937 func (x *Cluster_Counts) String() string { 1938 return protoimpl.X.MessageStringOf(x) 1939 } 1940 1941 func (*Cluster_Counts) ProtoMessage() {} 1942 1943 func (x *Cluster_Counts) ProtoReflect() protoreflect.Message { 1944 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[25] 1945 if protoimpl.UnsafeEnabled && x != nil { 1946 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1947 if ms.LoadMessageInfo() == nil { 1948 ms.StoreMessageInfo(mi) 1949 } 1950 return ms 1951 } 1952 return mi.MessageOf(x) 1953 } 1954 1955 // Deprecated: Use Cluster_Counts.ProtoReflect.Descriptor instead. 1956 func (*Cluster_Counts) Descriptor() ([]byte, []int) { 1957 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{4, 0} 1958 } 1959 1960 func (x *Cluster_Counts) GetNominal() int64 { 1961 if x != nil { 1962 return x.Nominal 1963 } 1964 return 0 1965 } 1966 1967 type Cluster_TimewiseCounts struct { 1968 state protoimpl.MessageState 1969 sizeCache protoimpl.SizeCache 1970 unknownFields protoimpl.UnknownFields 1971 1972 // The impact value for the last day. 1973 OneDay *Cluster_Counts `protobuf:"bytes,2,opt,name=one_day,json=oneDay,proto3" json:"one_day,omitempty"` 1974 // The impact value for the last three days. 1975 ThreeDay *Cluster_Counts `protobuf:"bytes,3,opt,name=three_day,json=threeDay,proto3" json:"three_day,omitempty"` 1976 // The impact value for the last week. 1977 SevenDay *Cluster_Counts `protobuf:"bytes,4,opt,name=seven_day,json=sevenDay,proto3" json:"seven_day,omitempty"` 1978 } 1979 1980 func (x *Cluster_TimewiseCounts) Reset() { 1981 *x = Cluster_TimewiseCounts{} 1982 if protoimpl.UnsafeEnabled { 1983 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[26] 1984 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1985 ms.StoreMessageInfo(mi) 1986 } 1987 } 1988 1989 func (x *Cluster_TimewiseCounts) String() string { 1990 return protoimpl.X.MessageStringOf(x) 1991 } 1992 1993 func (*Cluster_TimewiseCounts) ProtoMessage() {} 1994 1995 func (x *Cluster_TimewiseCounts) ProtoReflect() protoreflect.Message { 1996 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[26] 1997 if protoimpl.UnsafeEnabled && x != nil { 1998 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 1999 if ms.LoadMessageInfo() == nil { 2000 ms.StoreMessageInfo(mi) 2001 } 2002 return ms 2003 } 2004 return mi.MessageOf(x) 2005 } 2006 2007 // Deprecated: Use Cluster_TimewiseCounts.ProtoReflect.Descriptor instead. 2008 func (*Cluster_TimewiseCounts) Descriptor() ([]byte, []int) { 2009 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{4, 1} 2010 } 2011 2012 func (x *Cluster_TimewiseCounts) GetOneDay() *Cluster_Counts { 2013 if x != nil { 2014 return x.OneDay 2015 } 2016 return nil 2017 } 2018 2019 func (x *Cluster_TimewiseCounts) GetThreeDay() *Cluster_Counts { 2020 if x != nil { 2021 return x.ThreeDay 2022 } 2023 return nil 2024 } 2025 2026 func (x *Cluster_TimewiseCounts) GetSevenDay() *Cluster_Counts { 2027 if x != nil { 2028 return x.SevenDay 2029 } 2030 return nil 2031 } 2032 2033 type ClusterSummary_MetricValue struct { 2034 state protoimpl.MessageState 2035 sizeCache protoimpl.SizeCache 2036 unknownFields protoimpl.UnknownFields 2037 2038 // The residual value of the cluster metric. 2039 // For bug clusters, the residual metric value is the metric value 2040 // calculated using all of the failures in the cluster. 2041 // For suggested clusters, the residual metric value is calculated 2042 // using the failures in the cluster which are not also part of a 2043 // bug cluster. In this way, measures attributed to bug clusters 2044 // are not counted again against suggested clusters. 2045 Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` 2046 // The value of the cluster metric over time, grouped by 24-hour periods 2047 // in the queried time range, in reverse chronological order 2048 // i.e. the first entry is the metric value for the 24-hour period 2049 // immediately preceding the time range's latest time. 2050 DailyBreakdown []int64 `protobuf:"varint,2,rep,packed,name=daily_breakdown,json=dailyBreakdown,proto3" json:"daily_breakdown,omitempty"` 2051 } 2052 2053 func (x *ClusterSummary_MetricValue) Reset() { 2054 *x = ClusterSummary_MetricValue{} 2055 if protoimpl.UnsafeEnabled { 2056 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[28] 2057 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2058 ms.StoreMessageInfo(mi) 2059 } 2060 } 2061 2062 func (x *ClusterSummary_MetricValue) String() string { 2063 return protoimpl.X.MessageStringOf(x) 2064 } 2065 2066 func (*ClusterSummary_MetricValue) ProtoMessage() {} 2067 2068 func (x *ClusterSummary_MetricValue) ProtoReflect() protoreflect.Message { 2069 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[28] 2070 if protoimpl.UnsafeEnabled && x != nil { 2071 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2072 if ms.LoadMessageInfo() == nil { 2073 ms.StoreMessageInfo(mi) 2074 } 2075 return ms 2076 } 2077 return mi.MessageOf(x) 2078 } 2079 2080 // Deprecated: Use ClusterSummary_MetricValue.ProtoReflect.Descriptor instead. 2081 func (*ClusterSummary_MetricValue) Descriptor() ([]byte, []int) { 2082 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{9, 0} 2083 } 2084 2085 func (x *ClusterSummary_MetricValue) GetValue() int64 { 2086 if x != nil { 2087 return x.Value 2088 } 2089 return 0 2090 } 2091 2092 func (x *ClusterSummary_MetricValue) GetDailyBreakdown() []int64 { 2093 if x != nil { 2094 return x.DailyBreakdown 2095 } 2096 return nil 2097 } 2098 2099 // Representation of an exoneration. An exoneration means the subject of 2100 // the test (e.g. a CL) is absolved from blame for the unexpected results 2101 // of the test variant. 2102 type DistinctClusterFailure_Exoneration struct { 2103 state protoimpl.MessageState 2104 sizeCache protoimpl.SizeCache 2105 unknownFields protoimpl.UnknownFields 2106 2107 // The machine-readable reason for the exoneration. 2108 Reason ExonerationReason `protobuf:"varint,1,opt,name=reason,proto3,enum=luci.analysis.v1.ExonerationReason" json:"reason,omitempty"` 2109 } 2110 2111 func (x *DistinctClusterFailure_Exoneration) Reset() { 2112 *x = DistinctClusterFailure_Exoneration{} 2113 if protoimpl.UnsafeEnabled { 2114 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[30] 2115 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2116 ms.StoreMessageInfo(mi) 2117 } 2118 } 2119 2120 func (x *DistinctClusterFailure_Exoneration) String() string { 2121 return protoimpl.X.MessageStringOf(x) 2122 } 2123 2124 func (*DistinctClusterFailure_Exoneration) ProtoMessage() {} 2125 2126 func (x *DistinctClusterFailure_Exoneration) ProtoReflect() protoreflect.Message { 2127 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[30] 2128 if protoimpl.UnsafeEnabled && x != nil { 2129 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2130 if ms.LoadMessageInfo() == nil { 2131 ms.StoreMessageInfo(mi) 2132 } 2133 return ms 2134 } 2135 return mi.MessageOf(x) 2136 } 2137 2138 // Deprecated: Use DistinctClusterFailure_Exoneration.ProtoReflect.Descriptor instead. 2139 func (*DistinctClusterFailure_Exoneration) Descriptor() ([]byte, []int) { 2140 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{12, 0} 2141 } 2142 2143 func (x *DistinctClusterFailure_Exoneration) GetReason() ExonerationReason { 2144 if x != nil { 2145 return x.Reason 2146 } 2147 return ExonerationReason_EXONERATION_REASON_UNSPECIFIED 2148 } 2149 2150 // Representation of a presubmit run (e.g. LUCI CV Run). 2151 type DistinctClusterFailure_PresubmitRun struct { 2152 state protoimpl.MessageState 2153 sizeCache protoimpl.SizeCache 2154 unknownFields protoimpl.UnknownFields 2155 2156 // Identity of the presubmit run that contains this test result. 2157 // This should be unique per "CQ+1"/"CQ+2" attempt on gerrit. 2158 // 2159 // One presumbit run MAY have many ingested invocation IDs (e.g. for its 2160 // various tryjobs), but every ingested invocation ID only ever has one 2161 // presubmit run ID (if any). 2162 // 2163 // All test results for the same presubmit run will have one 2164 // partition_time. 2165 // 2166 // If the test result was not collected as part of a presubmit run, 2167 // this is unset. 2168 PresubmitRunId *PresubmitRunId `protobuf:"bytes,1,opt,name=presubmit_run_id,json=presubmitRunId,proto3" json:"presubmit_run_id,omitempty"` 2169 // The owner of the presubmit run (if any). 2170 // This is the owner of the CL on which CQ+1/CQ+2 was clicked 2171 // (even in case of presubmit run with multiple CLs). 2172 // There is scope for this field to become an email address if privacy 2173 // approval is obtained, until then it is "automation" (for automation 2174 // service accounts) and "user" otherwise. 2175 Owner string `protobuf:"bytes,2,opt,name=owner,proto3" json:"owner,omitempty"` 2176 // The mode of the presubmit run. E.g. DRY_RUN, FULL_RUN, QUICK_DRY_RUN. 2177 Mode PresubmitRunMode `protobuf:"varint,3,opt,name=mode,proto3,enum=luci.analysis.v1.PresubmitRunMode" json:"mode,omitempty"` 2178 // The status of the presubmit run. E.g. succeeded, failed or cancelled. 2179 Status PresubmitRunStatus `protobuf:"varint,4,opt,name=status,proto3,enum=luci.analysis.v1.PresubmitRunStatus" json:"status,omitempty"` 2180 } 2181 2182 func (x *DistinctClusterFailure_PresubmitRun) Reset() { 2183 *x = DistinctClusterFailure_PresubmitRun{} 2184 if protoimpl.UnsafeEnabled { 2185 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[31] 2186 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2187 ms.StoreMessageInfo(mi) 2188 } 2189 } 2190 2191 func (x *DistinctClusterFailure_PresubmitRun) String() string { 2192 return protoimpl.X.MessageStringOf(x) 2193 } 2194 2195 func (*DistinctClusterFailure_PresubmitRun) ProtoMessage() {} 2196 2197 func (x *DistinctClusterFailure_PresubmitRun) ProtoReflect() protoreflect.Message { 2198 mi := &file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[31] 2199 if protoimpl.UnsafeEnabled && x != nil { 2200 ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 2201 if ms.LoadMessageInfo() == nil { 2202 ms.StoreMessageInfo(mi) 2203 } 2204 return ms 2205 } 2206 return mi.MessageOf(x) 2207 } 2208 2209 // Deprecated: Use DistinctClusterFailure_PresubmitRun.ProtoReflect.Descriptor instead. 2210 func (*DistinctClusterFailure_PresubmitRun) Descriptor() ([]byte, []int) { 2211 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP(), []int{12, 1} 2212 } 2213 2214 func (x *DistinctClusterFailure_PresubmitRun) GetPresubmitRunId() *PresubmitRunId { 2215 if x != nil { 2216 return x.PresubmitRunId 2217 } 2218 return nil 2219 } 2220 2221 func (x *DistinctClusterFailure_PresubmitRun) GetOwner() string { 2222 if x != nil { 2223 return x.Owner 2224 } 2225 return "" 2226 } 2227 2228 func (x *DistinctClusterFailure_PresubmitRun) GetMode() PresubmitRunMode { 2229 if x != nil { 2230 return x.Mode 2231 } 2232 return PresubmitRunMode_PRESUBMIT_RUN_MODE_UNSPECIFIED 2233 } 2234 2235 func (x *DistinctClusterFailure_PresubmitRun) GetStatus() PresubmitRunStatus { 2236 if x != nil { 2237 return x.Status 2238 } 2239 return PresubmitRunStatus_PRESUBMIT_RUN_STATUS_UNSPECIFIED 2240 } 2241 2242 var File_go_chromium_org_luci_analysis_proto_v1_clusters_proto protoreflect.FileDescriptor 2243 2244 var file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDesc = []byte{ 2245 0x0a, 0x35, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 2246 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 2247 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 2248 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 2249 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 2250 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 2251 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x33, 0x67, 0x6f, 0x2e, 0x63, 2252 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 2253 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 2254 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 2255 0x34, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 2256 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x70, 2257 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x73, 0x2e, 2258 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x3b, 0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 2259 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 0x63, 0x69, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 2260 0x79, 0x73, 0x69, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x61, 2261 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 2262 0x74, 0x6f, 0x22, 0x8b, 0x02, 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 2263 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 2264 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 2265 0x4e, 0x0a, 0x0c, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 2266 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 2267 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 2268 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 2269 0x6c, 0x74, 0x52, 0x0b, 0x74, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, 2270 0x8e, 0x01, 0x0a, 0x0a, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1f, 2271 0x0a, 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 2272 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x61, 0x67, 0x12, 2273 0x17, 0x0a, 0x07, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 2274 0x52, 0x06, 0x74, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x46, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 2275 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 2276 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 2277 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 2278 0x6e, 0x52, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 2279 0x22, 0xea, 0x03, 0x0a, 0x0f, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 2280 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6b, 0x0a, 0x16, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x65, 2281 0x64, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, 2282 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 2283 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 2284 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x65, 2285 0x64, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x14, 0x63, 0x6c, 0x75, 2286 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 2287 0x73, 0x12, 0x52, 0x0a, 0x12, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 2288 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 2289 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 2290 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 2291 0x6f, 0x6e, 0x52, 0x11, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x65, 2292 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x95, 0x02, 0x0a, 0x13, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 2293 0x72, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1f, 0x0a, 2294 0x0b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 2295 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x61, 0x67, 0x12, 0x5e, 2296 0x0a, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 2297 0x32, 0x42, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 2298 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 2299 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x54, 0x65, 0x73, 2300 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 2301 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x7d, 2302 0x0a, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x3a, 2303 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 2304 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 2305 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x52, 2306 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x31, 0x0a, 0x03, 0x62, 0x75, 2307 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 2308 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x6f, 0x63, 2309 0x69, 0x61, 0x74, 0x65, 0x64, 0x42, 0x75, 0x67, 0x52, 0x03, 0x62, 0x75, 0x67, 0x22, 0xc6, 0x01, 2310 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x65, 0x72, 0x73, 2311 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x12, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 2312 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 2313 0x11, 0x61, 0x6c, 0x67, 0x6f, 0x72, 0x69, 0x74, 0x68, 0x6d, 0x73, 0x56, 0x65, 0x72, 0x73, 0x69, 2314 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0d, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 2315 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 2316 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 2317 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x56, 0x65, 0x72, 0x73, 2318 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x76, 0x65, 2319 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 2320 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 2321 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x56, 2322 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x27, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 2323 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 2324 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 2325 0xbb, 0x04, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 2326 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 2327 0x1f, 0x0a, 0x0b, 0x68, 0x61, 0x73, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x02, 2328 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 2329 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 2330 0x05, 0x74, 0x69, 0x74, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 2331 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 2332 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 2333 0x65, 0x72, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 2334 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x4d, 0x0a, 0x23, 0x65, 0x71, 0x75, 0x69, 2335 0x76, 0x61, 0x6c, 0x65, 0x6e, 0x74, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x61, 2336 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 2337 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x20, 0x65, 0x71, 0x75, 0x69, 0x76, 0x61, 0x6c, 0x65, 0x6e, 2338 0x74, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 2339 0x69, 0x6f, 0x6e, 0x52, 0x75, 0x6c, 0x65, 0x1a, 0x22, 0x0a, 0x06, 0x43, 0x6f, 0x75, 0x6e, 0x74, 2340 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 2341 0x28, 0x03, 0x52, 0x07, 0x6e, 0x6f, 0x6d, 0x69, 0x6e, 0x61, 0x6c, 0x1a, 0xc9, 0x01, 0x0a, 0x0e, 2342 0x54, 0x69, 0x6d, 0x65, 0x77, 0x69, 0x73, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x39, 2343 0x0a, 0x07, 0x6f, 0x6e, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 2344 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 2345 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 2346 0x73, 0x52, 0x06, 0x6f, 0x6e, 0x65, 0x44, 0x61, 0x79, 0x12, 0x3d, 0x0a, 0x09, 0x74, 0x68, 0x72, 2347 0x65, 0x65, 0x5f, 0x64, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 2348 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 2349 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x08, 2350 0x74, 0x68, 0x72, 0x65, 0x65, 0x44, 0x61, 0x79, 0x12, 0x3d, 0x0a, 0x09, 0x73, 0x65, 0x76, 0x65, 2351 0x6e, 0x5f, 0x64, 0x61, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75, 2352 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 2353 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x08, 0x73, 2354 0x65, 0x76, 0x65, 0x6e, 0x44, 0x61, 0x79, 0x1a, 0x64, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x72, 0x69, 2355 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 2356 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x3e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 2357 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 2358 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 2359 0x74, 0x65, 0x72, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x77, 0x69, 0x73, 0x65, 0x43, 0x6f, 0x75, 0x6e, 2360 0x74, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x34, 0x0a, 2361 0x1e, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 2362 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 2363 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 2364 0x61, 0x6d, 0x65, 0x22, 0xca, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 2365 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 2366 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 2367 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x65, 0x72, 2368 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x70, 0x72, 2369 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6c, 0x6c, 0x65, 0x12, 0x37, 2370 0x0a, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 2371 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 2372 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 2373 0x6e, 0x52, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x04, 0x6e, 0x65, 0x78, 0x74, 0x18, 2374 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 2375 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 2376 0x69, 0x6e, 0x67, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x6e, 0x65, 0x78, 0x74, 2377 0x22, 0x8a, 0x02, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 2378 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 2379 0x74, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 2380 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x66, 2381 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 2382 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x74, 2383 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x5f, 0x62, 0x79, 0x18, 0x03, 2384 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x79, 0x12, 0x18, 0x0a, 2385 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 2386 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x3a, 0x0a, 0x0a, 0x74, 0x69, 0x6d, 0x65, 0x5f, 2387 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 2388 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x54, 2389 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x61, 2390 0x6e, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x04, 0x76, 0x69, 0x65, 0x77, 0x18, 0x06, 0x20, 0x01, 0x28, 2391 0x0e, 0x32, 0x24, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 2392 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 2393 0x61, 0x72, 0x79, 0x56, 0x69, 0x65, 0x77, 0x52, 0x04, 0x76, 0x69, 0x65, 0x77, 0x22, 0x6e, 0x0a, 2394 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d, 2395 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4d, 2396 0x0a, 0x11, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 2397 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x69, 2398 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 2399 0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x10, 0x63, 0x6c, 0x75, 2400 0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x96, 0x03, 2401 0x0a, 0x0e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 2402 0x12, 0x3a, 0x0a, 0x0a, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x01, 2403 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 2404 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 2405 0x64, 0x52, 0x09, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 2406 0x74, 0x69, 0x74, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, 0x69, 0x74, 2407 0x6c, 0x65, 0x12, 0x31, 0x0a, 0x03, 0x62, 0x75, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 2408 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 2409 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x42, 0x75, 0x67, 2410 0x52, 0x03, 0x62, 0x75, 0x67, 0x12, 0x47, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 2411 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 2412 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 2413 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 2414 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x1a, 0x4c, 2415 0x0a, 0x0b, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 2416 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 2417 0x6c, 0x75, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x61, 0x69, 0x6c, 0x79, 0x5f, 0x62, 0x72, 0x65, 2418 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x18, 0x02, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0e, 0x64, 0x61, 2419 0x69, 0x6c, 0x79, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x64, 0x6f, 0x77, 0x6e, 0x1a, 0x68, 0x0a, 0x0c, 2420 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 2421 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x42, 2422 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 2423 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 2424 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2e, 2425 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 2426 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x5a, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 2427 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 2428 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 2429 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x23, 0x0a, 2430 0x0d, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 2431 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x46, 0x69, 0x6c, 0x74, 2432 0x65, 0x72, 0x22, 0x64, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 2433 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 2434 0x73, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 2435 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 2436 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 2437 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x08, 2438 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x22, 0xd3, 0x07, 0x0a, 0x16, 0x44, 0x69, 0x73, 2439 0x74, 0x69, 0x6e, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 2440 0x75, 0x72, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 2441 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07, 2442 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 2443 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 2444 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x07, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 2445 0x74, 0x12, 0x41, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 2446 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 2447 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 2448 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x74, 0x69, 0x6f, 0x6e, 2449 0x54, 0x69, 0x6d, 0x65, 0x12, 0x5a, 0x0a, 0x0d, 0x70, 0x72, 0x65, 0x73, 0x75, 0x62, 0x6d, 0x69, 2450 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x6c, 0x75, 2451 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 2452 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61, 2453 0x69, 0x6c, 0x75, 0x72, 0x65, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 2454 0x75, 0x6e, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x75, 0x6e, 2455 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x73, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x63, 0x72, 0x69, 2456 0x74, 0x69, 0x63, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x69, 0x73, 0x42, 2457 0x75, 0x69, 0x6c, 0x64, 0x43, 0x72, 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x12, 0x58, 0x0a, 0x0c, 2458 0x65, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 2459 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 2460 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x63, 0x74, 0x43, 0x6c, 2461 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x2e, 0x45, 0x78, 0x6f, 2462 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x65, 0x78, 0x6f, 0x6e, 0x65, 0x72, 2463 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x40, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 2464 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x6c, 2465 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 2466 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0b, 0x62, 0x75, 0x69, 2467 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x69, 0x6e, 0x67, 0x65, 2468 0x73, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 2469 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 2470 0x65, 0x64, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x43, 2471 0x0a, 0x1e, 0x69, 0x73, 0x5f, 0x69, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x69, 0x6e, 2472 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 2473 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x69, 0x73, 0x49, 0x6e, 0x67, 0x65, 0x73, 0x74, 2474 0x65, 0x64, 0x49, 0x6e, 0x76, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 2475 0x6b, 0x65, 0x64, 0x12, 0x3e, 0x0a, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x69, 0x73, 2476 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 2477 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x61, 0x6e, 2478 0x67, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x52, 0x0b, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x6c, 0x69, 2479 0x73, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0b, 0x20, 0x01, 2480 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x4a, 0x0a, 0x0b, 0x45, 0x78, 0x6f, 2481 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 2482 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 2483 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x6f, 0x6e, 2484 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 2485 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x1a, 0xe6, 0x01, 0x0a, 0x0c, 0x50, 0x72, 0x65, 0x73, 0x75, 0x62, 2486 0x6d, 0x69, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x4a, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x73, 0x75, 0x62, 2487 0x6d, 0x69, 0x74, 0x5f, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 2488 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 2489 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x75, 0x6e, 2490 0x49, 0x64, 0x52, 0x0e, 0x70, 0x72, 0x65, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x75, 0x6e, 2491 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 2492 0x09, 0x52, 0x05, 0x6f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 2493 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x22, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 2494 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x75, 0x62, 2495 0x6d, 0x69, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 2496 0x12, 0x3c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 2497 0x32, 0x24, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 2498 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x65, 0x73, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x52, 0x75, 0x6e, 2499 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x43, 2500 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 2501 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 2502 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 2503 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 2504 0x65, 0x6e, 0x74, 0x22, 0x81, 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 2505 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 2506 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 2507 0x73, 0x65, 0x12, 0x53, 0x0a, 0x0d, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 2508 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6c, 0x75, 0x63, 0x69, 2509 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 2510 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 2511 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x0c, 0x74, 0x65, 0x73, 0x74, 0x56, 2512 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x22, 0xf5, 0x01, 0x0a, 0x1c, 0x43, 0x6c, 0x75, 0x73, 2513 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 2514 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x65, 0x73, 0x74, 2515 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x65, 0x73, 0x74, 0x49, 2516 0x64, 0x12, 0x33, 0x0a, 0x07, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 2517 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 2518 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x52, 0x07, 0x76, 2519 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 2520 0x61, 0x6c, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x6f, 0x6e, 2521 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1a, 0x63, 0x72, 2522 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x45, 0x78, 2523 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 2524 0x5f, 0x65, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 2525 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 2526 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 2527 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 2528 0x4a, 0x0a, 0x30, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 2529 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 2530 0x69, 0x61, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 2531 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 2532 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x22, 0x9d, 0x01, 0x0a, 0x31, 2533 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 2534 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 2535 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 2536 0x65, 0x12, 0x68, 0x0a, 0x15, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 2537 0x74, 0x5f, 0x62, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 2538 0x32, 0x34, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 2539 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65, 2540 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 2541 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x52, 0x13, 0x74, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 2542 0x61, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x22, 0xd1, 0x02, 0x0a, 0x22, 2543 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 2544 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e, 2545 0x63, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 2546 0x01, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x17, 0x0a, 0x07, 2547 0x74, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 2548 0x65, 0x73, 0x74, 0x49, 0x64, 0x12, 0x33, 0x0a, 0x07, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 2549 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 2550 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 2551 0x74, 0x52, 0x07, 0x76, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x12, 0x3a, 0x0a, 0x0a, 0x73, 0x6f, 2552 0x75, 0x72, 0x63, 0x65, 0x5f, 0x72, 0x65, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 2553 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 2554 0x31, 0x2e, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x52, 0x09, 0x73, 0x6f, 0x75, 2555 0x72, 0x63, 0x65, 0x52, 0x65, 0x66, 0x12, 0x40, 0x0a, 0x1c, 0x63, 0x72, 0x69, 0x74, 0x69, 0x63, 2556 0x61, 0x6c, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x5f, 0x65, 0x78, 0x6f, 0x6e, 2557 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1a, 0x63, 0x72, 2558 0x69, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x45, 0x78, 2559 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x12, 0x45, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 2560 0x5f, 0x65, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 2561 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 2562 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 2563 0x6c, 0x61, 0x73, 0x74, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 2564 0x8b, 0x01, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 2565 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 2566 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 2567 0x07, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 2568 0x75, 0x72, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 2569 0x52, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 2570 0x12, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 2571 0x61, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x04, 2572 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0x56, 0x0a, 2573 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x48, 0x69, 0x73, 2574 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x04, 2575 0x64, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x75, 0x63, 2576 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 2577 0x75, 0x73, 0x74, 0x65, 0x72, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x61, 0x79, 0x52, 2578 0x04, 0x64, 0x61, 0x79, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x11, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 2579 0x72, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x61, 0x79, 0x12, 0x4a, 0x0a, 0x07, 0x6d, 2580 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x6c, 2581 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 2582 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x44, 0x61, 2583 0x79, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 2584 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 2585 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x1a, 0x3a, 0x0a, 0x0c, 0x4d, 2586 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 2587 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 2588 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x76, 0x61, 2589 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0x4f, 0x0a, 0x12, 0x43, 0x6c, 0x75, 0x73, 0x74, 2590 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x56, 0x69, 0x65, 0x77, 0x12, 0x24, 0x0a, 2591 0x20, 0x43, 0x4c, 0x55, 0x53, 0x54, 0x45, 0x52, 0x5f, 0x53, 0x55, 0x4d, 0x4d, 0x41, 0x52, 0x59, 2592 0x5f, 0x56, 0x49, 0x45, 0x57, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 2593 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x42, 0x41, 0x53, 0x49, 0x43, 0x10, 0x01, 0x12, 0x08, 2594 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x02, 0x32, 0xcf, 0x07, 0x0a, 0x08, 0x43, 0x6c, 0x75, 2595 0x73, 0x74, 0x65, 0x72, 0x73, 0x12, 0x50, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 2596 0x12, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 2597 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 2598 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 2599 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 2600 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x47, 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x23, 2601 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 2602 0x31, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 2603 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 2604 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x22, 0x00, 2605 0x12, 0x75, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 2606 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x12, 0x30, 0x2e, 0x6c, 0x75, 2607 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 2608 0x65, 0x74, 0x52, 0x65, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 2609 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 2610 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 2611 0x2e, 0x52, 0x65, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 2612 0x67, 0x72, 0x65, 0x73, 0x73, 0x22, 0x00, 0x12, 0x7a, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 2613 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 2614 0x12, 0x2e, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 2615 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 2616 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 2617 0x1a, 0x2f, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 2618 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 2619 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 2620 0x65, 0x22, 0x00, 0x12, 0x77, 0x0a, 0x14, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 2621 0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x73, 0x12, 0x2d, 0x2e, 0x6c, 0x75, 2622 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 2623 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75, 2624 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x6c, 0x75, 0x63, 2625 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 2626 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 2627 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x9a, 0x01, 0x0a, 2628 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 2629 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x3b, 0x2e, 0x6c, 2630 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 2631 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 2632 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 2633 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x6c, 0x75, 0x63, 0x69, 2634 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 2635 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 2636 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x73, 0x52, 2637 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0xaf, 0x01, 0x0a, 0x22, 0x51, 0x75, 2638 0x65, 0x72, 0x79, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 2639 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 2640 0x12, 0x42, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 2641 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 2642 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 0x73, 0x74, 0x56, 0x61, 2643 0x72, 0x69, 0x61, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 0x73, 0x52, 0x65, 0x71, 2644 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x6c, 0x75, 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 2645 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 2646 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x6f, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x64, 0x54, 0x65, 2647 0x73, 0x74, 0x56, 0x61, 0x72, 0x69, 0x61, 0x6e, 0x74, 0x42, 0x72, 0x61, 0x6e, 0x63, 0x68, 0x65, 2648 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x0c, 0x51, 2649 0x75, 0x65, 0x72, 0x79, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x2c, 0x2e, 0x6c, 0x75, 2650 0x63, 0x69, 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 2651 0x75, 0x65, 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x48, 0x69, 0x73, 0x74, 0x6f, 2652 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x6c, 0x75, 0x63, 0x69, 2653 0x2e, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x51, 0x75, 0x65, 2654 0x72, 0x79, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 2655 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x6f, 2656 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x6c, 0x75, 2657 0x63, 0x69, 0x2f, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 2658 0x6f, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x70, 0x62, 0x62, 2659 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 2660 } 2661 2662 var ( 2663 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescOnce sync.Once 2664 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescData = file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDesc 2665 ) 2666 2667 func file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescGZIP() []byte { 2668 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescOnce.Do(func() { 2669 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescData = protoimpl.X.CompressGZIP(file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescData) 2670 }) 2671 return file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDescData 2672 } 2673 2674 var file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_enumTypes = make([]protoimpl.EnumInfo, 1) 2675 var file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes = make([]protoimpl.MessageInfo, 33) 2676 var file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_goTypes = []interface{}{ 2677 (ClusterSummaryView)(0), // 0: luci.analysis.v1.ClusterSummaryView 2678 (*ClusterRequest)(nil), // 1: luci.analysis.v1.ClusterRequest 2679 (*ClusterResponse)(nil), // 2: luci.analysis.v1.ClusterResponse 2680 (*ClusteringVersion)(nil), // 3: luci.analysis.v1.ClusteringVersion 2681 (*GetClusterRequest)(nil), // 4: luci.analysis.v1.GetClusterRequest 2682 (*Cluster)(nil), // 5: luci.analysis.v1.Cluster 2683 (*GetReclusteringProgressRequest)(nil), // 6: luci.analysis.v1.GetReclusteringProgressRequest 2684 (*ReclusteringProgress)(nil), // 7: luci.analysis.v1.ReclusteringProgress 2685 (*QueryClusterSummariesRequest)(nil), // 8: luci.analysis.v1.QueryClusterSummariesRequest 2686 (*QueryClusterSummariesResponse)(nil), // 9: luci.analysis.v1.QueryClusterSummariesResponse 2687 (*ClusterSummary)(nil), // 10: luci.analysis.v1.ClusterSummary 2688 (*QueryClusterFailuresRequest)(nil), // 11: luci.analysis.v1.QueryClusterFailuresRequest 2689 (*QueryClusterFailuresResponse)(nil), // 12: luci.analysis.v1.QueryClusterFailuresResponse 2690 (*DistinctClusterFailure)(nil), // 13: luci.analysis.v1.DistinctClusterFailure 2691 (*QueryClusterExoneratedTestVariantsRequest)(nil), // 14: luci.analysis.v1.QueryClusterExoneratedTestVariantsRequest 2692 (*QueryClusterExoneratedTestVariantsResponse)(nil), // 15: luci.analysis.v1.QueryClusterExoneratedTestVariantsResponse 2693 (*ClusterExoneratedTestVariant)(nil), // 16: luci.analysis.v1.ClusterExoneratedTestVariant 2694 (*QueryClusterExoneratedTestVariantBranchesRequest)(nil), // 17: luci.analysis.v1.QueryClusterExoneratedTestVariantBranchesRequest 2695 (*QueryClusterExoneratedTestVariantBranchesResponse)(nil), // 18: luci.analysis.v1.QueryClusterExoneratedTestVariantBranchesResponse 2696 (*ClusterExoneratedTestVariantBranch)(nil), // 19: luci.analysis.v1.ClusterExoneratedTestVariantBranch 2697 (*QueryClusterHistoryRequest)(nil), // 20: luci.analysis.v1.QueryClusterHistoryRequest 2698 (*QueryClusterHistoryResponse)(nil), // 21: luci.analysis.v1.QueryClusterHistoryResponse 2699 (*ClusterHistoryDay)(nil), // 22: luci.analysis.v1.ClusterHistoryDay 2700 (*ClusterRequest_TestResult)(nil), // 23: luci.analysis.v1.ClusterRequest.TestResult 2701 (*ClusterResponse_ClusteredTestResult)(nil), // 24: luci.analysis.v1.ClusterResponse.ClusteredTestResult 2702 (*ClusterResponse_ClusteredTestResult_ClusterEntry)(nil), // 25: luci.analysis.v1.ClusterResponse.ClusteredTestResult.ClusterEntry 2703 (*Cluster_Counts)(nil), // 26: luci.analysis.v1.Cluster.Counts 2704 (*Cluster_TimewiseCounts)(nil), // 27: luci.analysis.v1.Cluster.TimewiseCounts 2705 nil, // 28: luci.analysis.v1.Cluster.MetricsEntry 2706 (*ClusterSummary_MetricValue)(nil), // 29: luci.analysis.v1.ClusterSummary.MetricValue 2707 nil, // 30: luci.analysis.v1.ClusterSummary.MetricsEntry 2708 (*DistinctClusterFailure_Exoneration)(nil), // 31: luci.analysis.v1.DistinctClusterFailure.Exoneration 2709 (*DistinctClusterFailure_PresubmitRun)(nil), // 32: luci.analysis.v1.DistinctClusterFailure.PresubmitRun 2710 nil, // 33: luci.analysis.v1.ClusterHistoryDay.MetricsEntry 2711 (*timestamppb.Timestamp)(nil), // 34: google.protobuf.Timestamp 2712 (*TimeRange)(nil), // 35: luci.analysis.v1.TimeRange 2713 (*ClusterId)(nil), // 36: luci.analysis.v1.ClusterId 2714 (*AssociatedBug)(nil), // 37: luci.analysis.v1.AssociatedBug 2715 (*Variant)(nil), // 38: luci.analysis.v1.Variant 2716 (BuildStatus)(0), // 39: luci.analysis.v1.BuildStatus 2717 (*Changelist)(nil), // 40: luci.analysis.v1.Changelist 2718 (*SourceRef)(nil), // 41: luci.analysis.v1.SourceRef 2719 (*FailureReason)(nil), // 42: luci.analysis.v1.FailureReason 2720 (ExonerationReason)(0), // 43: luci.analysis.v1.ExonerationReason 2721 (*PresubmitRunId)(nil), // 44: luci.analysis.v1.PresubmitRunId 2722 (PresubmitRunMode)(0), // 45: luci.analysis.v1.PresubmitRunMode 2723 (PresubmitRunStatus)(0), // 46: luci.analysis.v1.PresubmitRunStatus 2724 } 2725 var file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_depIdxs = []int32{ 2726 23, // 0: luci.analysis.v1.ClusterRequest.test_results:type_name -> luci.analysis.v1.ClusterRequest.TestResult 2727 24, // 1: luci.analysis.v1.ClusterResponse.clustered_test_results:type_name -> luci.analysis.v1.ClusterResponse.ClusteredTestResult 2728 3, // 2: luci.analysis.v1.ClusterResponse.clustering_version:type_name -> luci.analysis.v1.ClusteringVersion 2729 34, // 3: luci.analysis.v1.ClusteringVersion.rules_version:type_name -> google.protobuf.Timestamp 2730 34, // 4: luci.analysis.v1.ClusteringVersion.config_version:type_name -> google.protobuf.Timestamp 2731 28, // 5: luci.analysis.v1.Cluster.metrics:type_name -> luci.analysis.v1.Cluster.MetricsEntry 2732 3, // 6: luci.analysis.v1.ReclusteringProgress.last:type_name -> luci.analysis.v1.ClusteringVersion 2733 3, // 7: luci.analysis.v1.ReclusteringProgress.next:type_name -> luci.analysis.v1.ClusteringVersion 2734 35, // 8: luci.analysis.v1.QueryClusterSummariesRequest.time_range:type_name -> luci.analysis.v1.TimeRange 2735 0, // 9: luci.analysis.v1.QueryClusterSummariesRequest.view:type_name -> luci.analysis.v1.ClusterSummaryView 2736 10, // 10: luci.analysis.v1.QueryClusterSummariesResponse.cluster_summaries:type_name -> luci.analysis.v1.ClusterSummary 2737 36, // 11: luci.analysis.v1.ClusterSummary.cluster_id:type_name -> luci.analysis.v1.ClusterId 2738 37, // 12: luci.analysis.v1.ClusterSummary.bug:type_name -> luci.analysis.v1.AssociatedBug 2739 30, // 13: luci.analysis.v1.ClusterSummary.metrics:type_name -> luci.analysis.v1.ClusterSummary.MetricsEntry 2740 13, // 14: luci.analysis.v1.QueryClusterFailuresResponse.failures:type_name -> luci.analysis.v1.DistinctClusterFailure 2741 38, // 15: luci.analysis.v1.DistinctClusterFailure.variant:type_name -> luci.analysis.v1.Variant 2742 34, // 16: luci.analysis.v1.DistinctClusterFailure.partition_time:type_name -> google.protobuf.Timestamp 2743 32, // 17: luci.analysis.v1.DistinctClusterFailure.presubmit_run:type_name -> luci.analysis.v1.DistinctClusterFailure.PresubmitRun 2744 31, // 18: luci.analysis.v1.DistinctClusterFailure.exonerations:type_name -> luci.analysis.v1.DistinctClusterFailure.Exoneration 2745 39, // 19: luci.analysis.v1.DistinctClusterFailure.build_status:type_name -> luci.analysis.v1.BuildStatus 2746 40, // 20: luci.analysis.v1.DistinctClusterFailure.changelists:type_name -> luci.analysis.v1.Changelist 2747 16, // 21: luci.analysis.v1.QueryClusterExoneratedTestVariantsResponse.test_variants:type_name -> luci.analysis.v1.ClusterExoneratedTestVariant 2748 38, // 22: luci.analysis.v1.ClusterExoneratedTestVariant.variant:type_name -> luci.analysis.v1.Variant 2749 34, // 23: luci.analysis.v1.ClusterExoneratedTestVariant.last_exoneration:type_name -> google.protobuf.Timestamp 2750 19, // 24: luci.analysis.v1.QueryClusterExoneratedTestVariantBranchesResponse.test_variant_branches:type_name -> luci.analysis.v1.ClusterExoneratedTestVariantBranch 2751 38, // 25: luci.analysis.v1.ClusterExoneratedTestVariantBranch.variant:type_name -> luci.analysis.v1.Variant 2752 41, // 26: luci.analysis.v1.ClusterExoneratedTestVariantBranch.source_ref:type_name -> luci.analysis.v1.SourceRef 2753 34, // 27: luci.analysis.v1.ClusterExoneratedTestVariantBranch.last_exoneration:type_name -> google.protobuf.Timestamp 2754 22, // 28: luci.analysis.v1.QueryClusterHistoryResponse.days:type_name -> luci.analysis.v1.ClusterHistoryDay 2755 33, // 29: luci.analysis.v1.ClusterHistoryDay.metrics:type_name -> luci.analysis.v1.ClusterHistoryDay.MetricsEntry 2756 42, // 30: luci.analysis.v1.ClusterRequest.TestResult.failure_reason:type_name -> luci.analysis.v1.FailureReason 2757 25, // 31: luci.analysis.v1.ClusterResponse.ClusteredTestResult.clusters:type_name -> luci.analysis.v1.ClusterResponse.ClusteredTestResult.ClusterEntry 2758 36, // 32: luci.analysis.v1.ClusterResponse.ClusteredTestResult.ClusterEntry.cluster_id:type_name -> luci.analysis.v1.ClusterId 2759 37, // 33: luci.analysis.v1.ClusterResponse.ClusteredTestResult.ClusterEntry.bug:type_name -> luci.analysis.v1.AssociatedBug 2760 26, // 34: luci.analysis.v1.Cluster.TimewiseCounts.one_day:type_name -> luci.analysis.v1.Cluster.Counts 2761 26, // 35: luci.analysis.v1.Cluster.TimewiseCounts.three_day:type_name -> luci.analysis.v1.Cluster.Counts 2762 26, // 36: luci.analysis.v1.Cluster.TimewiseCounts.seven_day:type_name -> luci.analysis.v1.Cluster.Counts 2763 27, // 37: luci.analysis.v1.Cluster.MetricsEntry.value:type_name -> luci.analysis.v1.Cluster.TimewiseCounts 2764 29, // 38: luci.analysis.v1.ClusterSummary.MetricsEntry.value:type_name -> luci.analysis.v1.ClusterSummary.MetricValue 2765 43, // 39: luci.analysis.v1.DistinctClusterFailure.Exoneration.reason:type_name -> luci.analysis.v1.ExonerationReason 2766 44, // 40: luci.analysis.v1.DistinctClusterFailure.PresubmitRun.presubmit_run_id:type_name -> luci.analysis.v1.PresubmitRunId 2767 45, // 41: luci.analysis.v1.DistinctClusterFailure.PresubmitRun.mode:type_name -> luci.analysis.v1.PresubmitRunMode 2768 46, // 42: luci.analysis.v1.DistinctClusterFailure.PresubmitRun.status:type_name -> luci.analysis.v1.PresubmitRunStatus 2769 1, // 43: luci.analysis.v1.Clusters.Cluster:input_type -> luci.analysis.v1.ClusterRequest 2770 4, // 44: luci.analysis.v1.Clusters.Get:input_type -> luci.analysis.v1.GetClusterRequest 2771 6, // 45: luci.analysis.v1.Clusters.GetReclusteringProgress:input_type -> luci.analysis.v1.GetReclusteringProgressRequest 2772 8, // 46: luci.analysis.v1.Clusters.QueryClusterSummaries:input_type -> luci.analysis.v1.QueryClusterSummariesRequest 2773 11, // 47: luci.analysis.v1.Clusters.QueryClusterFailures:input_type -> luci.analysis.v1.QueryClusterFailuresRequest 2774 14, // 48: luci.analysis.v1.Clusters.QueryExoneratedTestVariants:input_type -> luci.analysis.v1.QueryClusterExoneratedTestVariantsRequest 2775 17, // 49: luci.analysis.v1.Clusters.QueryExoneratedTestVariantBranches:input_type -> luci.analysis.v1.QueryClusterExoneratedTestVariantBranchesRequest 2776 20, // 50: luci.analysis.v1.Clusters.QueryHistory:input_type -> luci.analysis.v1.QueryClusterHistoryRequest 2777 2, // 51: luci.analysis.v1.Clusters.Cluster:output_type -> luci.analysis.v1.ClusterResponse 2778 5, // 52: luci.analysis.v1.Clusters.Get:output_type -> luci.analysis.v1.Cluster 2779 7, // 53: luci.analysis.v1.Clusters.GetReclusteringProgress:output_type -> luci.analysis.v1.ReclusteringProgress 2780 9, // 54: luci.analysis.v1.Clusters.QueryClusterSummaries:output_type -> luci.analysis.v1.QueryClusterSummariesResponse 2781 12, // 55: luci.analysis.v1.Clusters.QueryClusterFailures:output_type -> luci.analysis.v1.QueryClusterFailuresResponse 2782 15, // 56: luci.analysis.v1.Clusters.QueryExoneratedTestVariants:output_type -> luci.analysis.v1.QueryClusterExoneratedTestVariantsResponse 2783 18, // 57: luci.analysis.v1.Clusters.QueryExoneratedTestVariantBranches:output_type -> luci.analysis.v1.QueryClusterExoneratedTestVariantBranchesResponse 2784 21, // 58: luci.analysis.v1.Clusters.QueryHistory:output_type -> luci.analysis.v1.QueryClusterHistoryResponse 2785 51, // [51:59] is the sub-list for method output_type 2786 43, // [43:51] is the sub-list for method input_type 2787 43, // [43:43] is the sub-list for extension type_name 2788 43, // [43:43] is the sub-list for extension extendee 2789 0, // [0:43] is the sub-list for field type_name 2790 } 2791 2792 func init() { file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_init() } 2793 func file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_init() { 2794 if File_go_chromium_org_luci_analysis_proto_v1_clusters_proto != nil { 2795 return 2796 } 2797 file_go_chromium_org_luci_analysis_proto_v1_common_proto_init() 2798 file_go_chromium_org_luci_analysis_proto_v1_sources_proto_init() 2799 file_go_chromium_org_luci_analysis_proto_v1_failure_reason_proto_init() 2800 if !protoimpl.UnsafeEnabled { 2801 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { 2802 switch v := v.(*ClusterRequest); i { 2803 case 0: 2804 return &v.state 2805 case 1: 2806 return &v.sizeCache 2807 case 2: 2808 return &v.unknownFields 2809 default: 2810 return nil 2811 } 2812 } 2813 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { 2814 switch v := v.(*ClusterResponse); i { 2815 case 0: 2816 return &v.state 2817 case 1: 2818 return &v.sizeCache 2819 case 2: 2820 return &v.unknownFields 2821 default: 2822 return nil 2823 } 2824 } 2825 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { 2826 switch v := v.(*ClusteringVersion); i { 2827 case 0: 2828 return &v.state 2829 case 1: 2830 return &v.sizeCache 2831 case 2: 2832 return &v.unknownFields 2833 default: 2834 return nil 2835 } 2836 } 2837 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { 2838 switch v := v.(*GetClusterRequest); i { 2839 case 0: 2840 return &v.state 2841 case 1: 2842 return &v.sizeCache 2843 case 2: 2844 return &v.unknownFields 2845 default: 2846 return nil 2847 } 2848 } 2849 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { 2850 switch v := v.(*Cluster); i { 2851 case 0: 2852 return &v.state 2853 case 1: 2854 return &v.sizeCache 2855 case 2: 2856 return &v.unknownFields 2857 default: 2858 return nil 2859 } 2860 } 2861 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { 2862 switch v := v.(*GetReclusteringProgressRequest); i { 2863 case 0: 2864 return &v.state 2865 case 1: 2866 return &v.sizeCache 2867 case 2: 2868 return &v.unknownFields 2869 default: 2870 return nil 2871 } 2872 } 2873 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { 2874 switch v := v.(*ReclusteringProgress); i { 2875 case 0: 2876 return &v.state 2877 case 1: 2878 return &v.sizeCache 2879 case 2: 2880 return &v.unknownFields 2881 default: 2882 return nil 2883 } 2884 } 2885 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { 2886 switch v := v.(*QueryClusterSummariesRequest); i { 2887 case 0: 2888 return &v.state 2889 case 1: 2890 return &v.sizeCache 2891 case 2: 2892 return &v.unknownFields 2893 default: 2894 return nil 2895 } 2896 } 2897 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { 2898 switch v := v.(*QueryClusterSummariesResponse); i { 2899 case 0: 2900 return &v.state 2901 case 1: 2902 return &v.sizeCache 2903 case 2: 2904 return &v.unknownFields 2905 default: 2906 return nil 2907 } 2908 } 2909 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { 2910 switch v := v.(*ClusterSummary); i { 2911 case 0: 2912 return &v.state 2913 case 1: 2914 return &v.sizeCache 2915 case 2: 2916 return &v.unknownFields 2917 default: 2918 return nil 2919 } 2920 } 2921 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { 2922 switch v := v.(*QueryClusterFailuresRequest); i { 2923 case 0: 2924 return &v.state 2925 case 1: 2926 return &v.sizeCache 2927 case 2: 2928 return &v.unknownFields 2929 default: 2930 return nil 2931 } 2932 } 2933 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { 2934 switch v := v.(*QueryClusterFailuresResponse); i { 2935 case 0: 2936 return &v.state 2937 case 1: 2938 return &v.sizeCache 2939 case 2: 2940 return &v.unknownFields 2941 default: 2942 return nil 2943 } 2944 } 2945 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { 2946 switch v := v.(*DistinctClusterFailure); i { 2947 case 0: 2948 return &v.state 2949 case 1: 2950 return &v.sizeCache 2951 case 2: 2952 return &v.unknownFields 2953 default: 2954 return nil 2955 } 2956 } 2957 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { 2958 switch v := v.(*QueryClusterExoneratedTestVariantsRequest); i { 2959 case 0: 2960 return &v.state 2961 case 1: 2962 return &v.sizeCache 2963 case 2: 2964 return &v.unknownFields 2965 default: 2966 return nil 2967 } 2968 } 2969 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { 2970 switch v := v.(*QueryClusterExoneratedTestVariantsResponse); i { 2971 case 0: 2972 return &v.state 2973 case 1: 2974 return &v.sizeCache 2975 case 2: 2976 return &v.unknownFields 2977 default: 2978 return nil 2979 } 2980 } 2981 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { 2982 switch v := v.(*ClusterExoneratedTestVariant); i { 2983 case 0: 2984 return &v.state 2985 case 1: 2986 return &v.sizeCache 2987 case 2: 2988 return &v.unknownFields 2989 default: 2990 return nil 2991 } 2992 } 2993 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { 2994 switch v := v.(*QueryClusterExoneratedTestVariantBranchesRequest); i { 2995 case 0: 2996 return &v.state 2997 case 1: 2998 return &v.sizeCache 2999 case 2: 3000 return &v.unknownFields 3001 default: 3002 return nil 3003 } 3004 } 3005 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { 3006 switch v := v.(*QueryClusterExoneratedTestVariantBranchesResponse); i { 3007 case 0: 3008 return &v.state 3009 case 1: 3010 return &v.sizeCache 3011 case 2: 3012 return &v.unknownFields 3013 default: 3014 return nil 3015 } 3016 } 3017 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { 3018 switch v := v.(*ClusterExoneratedTestVariantBranch); i { 3019 case 0: 3020 return &v.state 3021 case 1: 3022 return &v.sizeCache 3023 case 2: 3024 return &v.unknownFields 3025 default: 3026 return nil 3027 } 3028 } 3029 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { 3030 switch v := v.(*QueryClusterHistoryRequest); i { 3031 case 0: 3032 return &v.state 3033 case 1: 3034 return &v.sizeCache 3035 case 2: 3036 return &v.unknownFields 3037 default: 3038 return nil 3039 } 3040 } 3041 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { 3042 switch v := v.(*QueryClusterHistoryResponse); i { 3043 case 0: 3044 return &v.state 3045 case 1: 3046 return &v.sizeCache 3047 case 2: 3048 return &v.unknownFields 3049 default: 3050 return nil 3051 } 3052 } 3053 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { 3054 switch v := v.(*ClusterHistoryDay); i { 3055 case 0: 3056 return &v.state 3057 case 1: 3058 return &v.sizeCache 3059 case 2: 3060 return &v.unknownFields 3061 default: 3062 return nil 3063 } 3064 } 3065 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { 3066 switch v := v.(*ClusterRequest_TestResult); i { 3067 case 0: 3068 return &v.state 3069 case 1: 3070 return &v.sizeCache 3071 case 2: 3072 return &v.unknownFields 3073 default: 3074 return nil 3075 } 3076 } 3077 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { 3078 switch v := v.(*ClusterResponse_ClusteredTestResult); i { 3079 case 0: 3080 return &v.state 3081 case 1: 3082 return &v.sizeCache 3083 case 2: 3084 return &v.unknownFields 3085 default: 3086 return nil 3087 } 3088 } 3089 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { 3090 switch v := v.(*ClusterResponse_ClusteredTestResult_ClusterEntry); i { 3091 case 0: 3092 return &v.state 3093 case 1: 3094 return &v.sizeCache 3095 case 2: 3096 return &v.unknownFields 3097 default: 3098 return nil 3099 } 3100 } 3101 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { 3102 switch v := v.(*Cluster_Counts); i { 3103 case 0: 3104 return &v.state 3105 case 1: 3106 return &v.sizeCache 3107 case 2: 3108 return &v.unknownFields 3109 default: 3110 return nil 3111 } 3112 } 3113 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { 3114 switch v := v.(*Cluster_TimewiseCounts); i { 3115 case 0: 3116 return &v.state 3117 case 1: 3118 return &v.sizeCache 3119 case 2: 3120 return &v.unknownFields 3121 default: 3122 return nil 3123 } 3124 } 3125 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { 3126 switch v := v.(*ClusterSummary_MetricValue); i { 3127 case 0: 3128 return &v.state 3129 case 1: 3130 return &v.sizeCache 3131 case 2: 3132 return &v.unknownFields 3133 default: 3134 return nil 3135 } 3136 } 3137 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { 3138 switch v := v.(*DistinctClusterFailure_Exoneration); i { 3139 case 0: 3140 return &v.state 3141 case 1: 3142 return &v.sizeCache 3143 case 2: 3144 return &v.unknownFields 3145 default: 3146 return nil 3147 } 3148 } 3149 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { 3150 switch v := v.(*DistinctClusterFailure_PresubmitRun); i { 3151 case 0: 3152 return &v.state 3153 case 1: 3154 return &v.sizeCache 3155 case 2: 3156 return &v.unknownFields 3157 default: 3158 return nil 3159 } 3160 } 3161 } 3162 type x struct{} 3163 out := protoimpl.TypeBuilder{ 3164 File: protoimpl.DescBuilder{ 3165 GoPackagePath: reflect.TypeOf(x{}).PkgPath(), 3166 RawDescriptor: file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDesc, 3167 NumEnums: 1, 3168 NumMessages: 33, 3169 NumExtensions: 0, 3170 NumServices: 1, 3171 }, 3172 GoTypes: file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_goTypes, 3173 DependencyIndexes: file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_depIdxs, 3174 EnumInfos: file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_enumTypes, 3175 MessageInfos: file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_msgTypes, 3176 }.Build() 3177 File_go_chromium_org_luci_analysis_proto_v1_clusters_proto = out.File 3178 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_rawDesc = nil 3179 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_goTypes = nil 3180 file_go_chromium_org_luci_analysis_proto_v1_clusters_proto_depIdxs = nil 3181 } 3182 3183 // Reference imports to suppress errors if they are not otherwise used. 3184 var _ context.Context 3185 var _ grpc.ClientConnInterface 3186 3187 // This is a compile-time assertion to ensure that this generated file 3188 // is compatible with the grpc package it is being compiled against. 3189 const _ = grpc.SupportPackageIsVersion6 3190 3191 // ClustersClient is the client API for Clusters service. 3192 // 3193 // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. 3194 type ClustersClient interface { 3195 // Identifies the cluster(s) for one or more test failure(s). 3196 // 3197 // This RPC returns the clusters of each test result, using 3198 // current suggested cluster algorithms, configured failure 3199 // association rules, and ingested project configuration with 3200 // a bounded staleness of up to one minute. (Returned clusters 3201 // may be based on project configuration and configured failure 3202 // association rules that is up to one minute out-of-date). 3203 // 3204 // As at April 2022, the implementation does not use stale 3205 // rules, but you are instructed NOT to rely on this property to 3206 // allow reversion to the faster implementation that is tolerant 3207 // to higher QPS in future. If your use case require strong reads 3208 // (e.g. you want to call cluster immediately after updating a rule), 3209 // please contact LUCI Analysis owners. We may be able to provide a 3210 // request flag to select this processing behaviour. 3211 // 3212 // This RPC is a pure query API and does not lead to the ingestion of the 3213 // test failures by LUCI Analysis (e.g. for cluster impact calculations). 3214 Cluster(ctx context.Context, in *ClusterRequest, opts ...grpc.CallOption) (*ClusterResponse, error) 3215 // Reads information about the given cluster. 3216 // 3217 // Please consult LUCI Analysis owners before adding additional calls to 3218 // this RPC, as the implementation currently calls back to BigQuery and as 3219 // such, is not cost-optimised if many queries are to be made. 3220 // 3221 // As of writing (April 13, 2022) this query reads ~1 GB per call for 3222 // the largest LUCI Project, which translates to a cost of 0.5 US cents 3223 // per query at published pricing (US$5/TB analyzed for BigQuery). 3224 // 3225 // Changes to this RPC should comply with https://google.aip.dev/131. 3226 Get(ctx context.Context, in *GetClusterRequest, opts ...grpc.CallOption) (*Cluster, error) 3227 // Reads current progress re-clustering the given project. Re-clustering 3228 // means updating the clusters each failure is in to reflect the latest 3229 // failure association rules, suggested clustering algorithms and 3230 // clustering configuration. 3231 GetReclusteringProgress(ctx context.Context, in *GetReclusteringProgressRequest, opts ...grpc.CallOption) (*ReclusteringProgress, error) 3232 // Queries summary information about top clusters. 3233 // 3234 // The set of test failures used as input to the clustering can be 3235 // specified using the failure_filter field on the request. 3236 // The returned clusters include only the impact derived from the 3237 // filtered failures. 3238 // 3239 // This allows investigation of the highest impact clusters for some 3240 // subset of the failure data in a project. For example, a filter string 3241 // of "failure_reason:ssh" would find all of the clusters where any test 3242 // results mention "ssh" in their failure reason, and show how big the 3243 // impact from these ssh failures is in each cluster. This is useful when 3244 // investigating specific problems, or ownership areas of the tests. 3245 // 3246 // Please consult LUCI Analysis owners before adding additional calls 3247 // to this RPC, as the implementation currently calls back to BigQuery and as 3248 // such, is not cost-optimised if many queries are to be made. 3249 // 3250 // As of writing (April 13, 2022) this query reads up to 10 GB per call for 3251 // 7 days of data for the largest LUCI Project, which translates to a cost 3252 // of up to 5 US cents per query at published pricing 3253 // (US$5/TB analyzed for BigQuery). 3254 QueryClusterSummaries(ctx context.Context, in *QueryClusterSummariesRequest, opts ...grpc.CallOption) (*QueryClusterSummariesResponse, error) 3255 // Queries examples of failures in the given cluster. 3256 // 3257 // Please consult LUCI Analysis owners before adding additional calls to 3258 // this RPC, as the implementation currently calls back to BigQuery and as 3259 // such, is not cost-optimised if many queries are to be made. 3260 QueryClusterFailures(ctx context.Context, in *QueryClusterFailuresRequest, opts ...grpc.CallOption) (*QueryClusterFailuresResponse, error) 3261 // Queries test variants in the cluster which have recently had an 3262 // exoneration recorded against them. Only exonerations on failures 3263 // which are part of the cluster are considered. 3264 // 3265 // Consider solving this use case in future by a standard AIP-132 List 3266 // method with filter and order_by support. 3267 // 3268 // This RPC is useful for projects using the legacy QueryFailureRate 3269 // API for exoneration. 3270 QueryExoneratedTestVariants(ctx context.Context, in *QueryClusterExoneratedTestVariantsRequest, opts ...grpc.CallOption) (*QueryClusterExoneratedTestVariantsResponse, error) 3271 // Queries test variant branches in the cluster which have recently had 3272 // an exoneration recorded against them. Only exonerations on failures 3273 // which are part of the cluster are considered. 3274 // 3275 // Use for projects performing branch-scoped exoneration using 3276 // QueryStability. 3277 QueryExoneratedTestVariantBranches(ctx context.Context, in *QueryClusterExoneratedTestVariantBranchesRequest, opts ...grpc.CallOption) (*QueryClusterExoneratedTestVariantBranchesResponse, error) 3278 // Queries the history of metrics for clustered failures satisying given criteria. 3279 // For example the number of test runs failed on each day for the last 7 days. 3280 // 3281 // Please consult LUCI Analysis owners before adding additional calls to 3282 // this RPC, as the implementation currently calls back to BigQuery and as 3283 // such, is not cost-optimised if many queries are to be made. 3284 QueryHistory(ctx context.Context, in *QueryClusterHistoryRequest, opts ...grpc.CallOption) (*QueryClusterHistoryResponse, error) 3285 } 3286 type clustersPRPCClient struct { 3287 client *prpc.Client 3288 } 3289 3290 func NewClustersPRPCClient(client *prpc.Client) ClustersClient { 3291 return &clustersPRPCClient{client} 3292 } 3293 3294 func (c *clustersPRPCClient) Cluster(ctx context.Context, in *ClusterRequest, opts ...grpc.CallOption) (*ClusterResponse, error) { 3295 out := new(ClusterResponse) 3296 err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "Cluster", in, out, opts...) 3297 if err != nil { 3298 return nil, err 3299 } 3300 return out, nil 3301 } 3302 3303 func (c *clustersPRPCClient) Get(ctx context.Context, in *GetClusterRequest, opts ...grpc.CallOption) (*Cluster, error) { 3304 out := new(Cluster) 3305 err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "Get", in, out, opts...) 3306 if err != nil { 3307 return nil, err 3308 } 3309 return out, nil 3310 } 3311 3312 func (c *clustersPRPCClient) GetReclusteringProgress(ctx context.Context, in *GetReclusteringProgressRequest, opts ...grpc.CallOption) (*ReclusteringProgress, error) { 3313 out := new(ReclusteringProgress) 3314 err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "GetReclusteringProgress", in, out, opts...) 3315 if err != nil { 3316 return nil, err 3317 } 3318 return out, nil 3319 } 3320 3321 func (c *clustersPRPCClient) QueryClusterSummaries(ctx context.Context, in *QueryClusterSummariesRequest, opts ...grpc.CallOption) (*QueryClusterSummariesResponse, error) { 3322 out := new(QueryClusterSummariesResponse) 3323 err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "QueryClusterSummaries", in, out, opts...) 3324 if err != nil { 3325 return nil, err 3326 } 3327 return out, nil 3328 } 3329 3330 func (c *clustersPRPCClient) QueryClusterFailures(ctx context.Context, in *QueryClusterFailuresRequest, opts ...grpc.CallOption) (*QueryClusterFailuresResponse, error) { 3331 out := new(QueryClusterFailuresResponse) 3332 err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "QueryClusterFailures", in, out, opts...) 3333 if err != nil { 3334 return nil, err 3335 } 3336 return out, nil 3337 } 3338 3339 func (c *clustersPRPCClient) QueryExoneratedTestVariants(ctx context.Context, in *QueryClusterExoneratedTestVariantsRequest, opts ...grpc.CallOption) (*QueryClusterExoneratedTestVariantsResponse, error) { 3340 out := new(QueryClusterExoneratedTestVariantsResponse) 3341 err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "QueryExoneratedTestVariants", in, out, opts...) 3342 if err != nil { 3343 return nil, err 3344 } 3345 return out, nil 3346 } 3347 3348 func (c *clustersPRPCClient) QueryExoneratedTestVariantBranches(ctx context.Context, in *QueryClusterExoneratedTestVariantBranchesRequest, opts ...grpc.CallOption) (*QueryClusterExoneratedTestVariantBranchesResponse, error) { 3349 out := new(QueryClusterExoneratedTestVariantBranchesResponse) 3350 err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "QueryExoneratedTestVariantBranches", in, out, opts...) 3351 if err != nil { 3352 return nil, err 3353 } 3354 return out, nil 3355 } 3356 3357 func (c *clustersPRPCClient) QueryHistory(ctx context.Context, in *QueryClusterHistoryRequest, opts ...grpc.CallOption) (*QueryClusterHistoryResponse, error) { 3358 out := new(QueryClusterHistoryResponse) 3359 err := c.client.Call(ctx, "luci.analysis.v1.Clusters", "QueryHistory", in, out, opts...) 3360 if err != nil { 3361 return nil, err 3362 } 3363 return out, nil 3364 } 3365 3366 type clustersClient struct { 3367 cc grpc.ClientConnInterface 3368 } 3369 3370 func NewClustersClient(cc grpc.ClientConnInterface) ClustersClient { 3371 return &clustersClient{cc} 3372 } 3373 3374 func (c *clustersClient) Cluster(ctx context.Context, in *ClusterRequest, opts ...grpc.CallOption) (*ClusterResponse, error) { 3375 out := new(ClusterResponse) 3376 err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/Cluster", in, out, opts...) 3377 if err != nil { 3378 return nil, err 3379 } 3380 return out, nil 3381 } 3382 3383 func (c *clustersClient) Get(ctx context.Context, in *GetClusterRequest, opts ...grpc.CallOption) (*Cluster, error) { 3384 out := new(Cluster) 3385 err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/Get", in, out, opts...) 3386 if err != nil { 3387 return nil, err 3388 } 3389 return out, nil 3390 } 3391 3392 func (c *clustersClient) GetReclusteringProgress(ctx context.Context, in *GetReclusteringProgressRequest, opts ...grpc.CallOption) (*ReclusteringProgress, error) { 3393 out := new(ReclusteringProgress) 3394 err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/GetReclusteringProgress", in, out, opts...) 3395 if err != nil { 3396 return nil, err 3397 } 3398 return out, nil 3399 } 3400 3401 func (c *clustersClient) QueryClusterSummaries(ctx context.Context, in *QueryClusterSummariesRequest, opts ...grpc.CallOption) (*QueryClusterSummariesResponse, error) { 3402 out := new(QueryClusterSummariesResponse) 3403 err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/QueryClusterSummaries", in, out, opts...) 3404 if err != nil { 3405 return nil, err 3406 } 3407 return out, nil 3408 } 3409 3410 func (c *clustersClient) QueryClusterFailures(ctx context.Context, in *QueryClusterFailuresRequest, opts ...grpc.CallOption) (*QueryClusterFailuresResponse, error) { 3411 out := new(QueryClusterFailuresResponse) 3412 err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/QueryClusterFailures", in, out, opts...) 3413 if err != nil { 3414 return nil, err 3415 } 3416 return out, nil 3417 } 3418 3419 func (c *clustersClient) QueryExoneratedTestVariants(ctx context.Context, in *QueryClusterExoneratedTestVariantsRequest, opts ...grpc.CallOption) (*QueryClusterExoneratedTestVariantsResponse, error) { 3420 out := new(QueryClusterExoneratedTestVariantsResponse) 3421 err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/QueryExoneratedTestVariants", in, out, opts...) 3422 if err != nil { 3423 return nil, err 3424 } 3425 return out, nil 3426 } 3427 3428 func (c *clustersClient) QueryExoneratedTestVariantBranches(ctx context.Context, in *QueryClusterExoneratedTestVariantBranchesRequest, opts ...grpc.CallOption) (*QueryClusterExoneratedTestVariantBranchesResponse, error) { 3429 out := new(QueryClusterExoneratedTestVariantBranchesResponse) 3430 err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/QueryExoneratedTestVariantBranches", in, out, opts...) 3431 if err != nil { 3432 return nil, err 3433 } 3434 return out, nil 3435 } 3436 3437 func (c *clustersClient) QueryHistory(ctx context.Context, in *QueryClusterHistoryRequest, opts ...grpc.CallOption) (*QueryClusterHistoryResponse, error) { 3438 out := new(QueryClusterHistoryResponse) 3439 err := c.cc.Invoke(ctx, "/luci.analysis.v1.Clusters/QueryHistory", in, out, opts...) 3440 if err != nil { 3441 return nil, err 3442 } 3443 return out, nil 3444 } 3445 3446 // ClustersServer is the server API for Clusters service. 3447 type ClustersServer interface { 3448 // Identifies the cluster(s) for one or more test failure(s). 3449 // 3450 // This RPC returns the clusters of each test result, using 3451 // current suggested cluster algorithms, configured failure 3452 // association rules, and ingested project configuration with 3453 // a bounded staleness of up to one minute. (Returned clusters 3454 // may be based on project configuration and configured failure 3455 // association rules that is up to one minute out-of-date). 3456 // 3457 // As at April 2022, the implementation does not use stale 3458 // rules, but you are instructed NOT to rely on this property to 3459 // allow reversion to the faster implementation that is tolerant 3460 // to higher QPS in future. If your use case require strong reads 3461 // (e.g. you want to call cluster immediately after updating a rule), 3462 // please contact LUCI Analysis owners. We may be able to provide a 3463 // request flag to select this processing behaviour. 3464 // 3465 // This RPC is a pure query API and does not lead to the ingestion of the 3466 // test failures by LUCI Analysis (e.g. for cluster impact calculations). 3467 Cluster(context.Context, *ClusterRequest) (*ClusterResponse, error) 3468 // Reads information about the given cluster. 3469 // 3470 // Please consult LUCI Analysis owners before adding additional calls to 3471 // this RPC, as the implementation currently calls back to BigQuery and as 3472 // such, is not cost-optimised if many queries are to be made. 3473 // 3474 // As of writing (April 13, 2022) this query reads ~1 GB per call for 3475 // the largest LUCI Project, which translates to a cost of 0.5 US cents 3476 // per query at published pricing (US$5/TB analyzed for BigQuery). 3477 // 3478 // Changes to this RPC should comply with https://google.aip.dev/131. 3479 Get(context.Context, *GetClusterRequest) (*Cluster, error) 3480 // Reads current progress re-clustering the given project. Re-clustering 3481 // means updating the clusters each failure is in to reflect the latest 3482 // failure association rules, suggested clustering algorithms and 3483 // clustering configuration. 3484 GetReclusteringProgress(context.Context, *GetReclusteringProgressRequest) (*ReclusteringProgress, error) 3485 // Queries summary information about top clusters. 3486 // 3487 // The set of test failures used as input to the clustering can be 3488 // specified using the failure_filter field on the request. 3489 // The returned clusters include only the impact derived from the 3490 // filtered failures. 3491 // 3492 // This allows investigation of the highest impact clusters for some 3493 // subset of the failure data in a project. For example, a filter string 3494 // of "failure_reason:ssh" would find all of the clusters where any test 3495 // results mention "ssh" in their failure reason, and show how big the 3496 // impact from these ssh failures is in each cluster. This is useful when 3497 // investigating specific problems, or ownership areas of the tests. 3498 // 3499 // Please consult LUCI Analysis owners before adding additional calls 3500 // to this RPC, as the implementation currently calls back to BigQuery and as 3501 // such, is not cost-optimised if many queries are to be made. 3502 // 3503 // As of writing (April 13, 2022) this query reads up to 10 GB per call for 3504 // 7 days of data for the largest LUCI Project, which translates to a cost 3505 // of up to 5 US cents per query at published pricing 3506 // (US$5/TB analyzed for BigQuery). 3507 QueryClusterSummaries(context.Context, *QueryClusterSummariesRequest) (*QueryClusterSummariesResponse, error) 3508 // Queries examples of failures in the given cluster. 3509 // 3510 // Please consult LUCI Analysis owners before adding additional calls to 3511 // this RPC, as the implementation currently calls back to BigQuery and as 3512 // such, is not cost-optimised if many queries are to be made. 3513 QueryClusterFailures(context.Context, *QueryClusterFailuresRequest) (*QueryClusterFailuresResponse, error) 3514 // Queries test variants in the cluster which have recently had an 3515 // exoneration recorded against them. Only exonerations on failures 3516 // which are part of the cluster are considered. 3517 // 3518 // Consider solving this use case in future by a standard AIP-132 List 3519 // method with filter and order_by support. 3520 // 3521 // This RPC is useful for projects using the legacy QueryFailureRate 3522 // API for exoneration. 3523 QueryExoneratedTestVariants(context.Context, *QueryClusterExoneratedTestVariantsRequest) (*QueryClusterExoneratedTestVariantsResponse, error) 3524 // Queries test variant branches in the cluster which have recently had 3525 // an exoneration recorded against them. Only exonerations on failures 3526 // which are part of the cluster are considered. 3527 // 3528 // Use for projects performing branch-scoped exoneration using 3529 // QueryStability. 3530 QueryExoneratedTestVariantBranches(context.Context, *QueryClusterExoneratedTestVariantBranchesRequest) (*QueryClusterExoneratedTestVariantBranchesResponse, error) 3531 // Queries the history of metrics for clustered failures satisying given criteria. 3532 // For example the number of test runs failed on each day for the last 7 days. 3533 // 3534 // Please consult LUCI Analysis owners before adding additional calls to 3535 // this RPC, as the implementation currently calls back to BigQuery and as 3536 // such, is not cost-optimised if many queries are to be made. 3537 QueryHistory(context.Context, *QueryClusterHistoryRequest) (*QueryClusterHistoryResponse, error) 3538 } 3539 3540 // UnimplementedClustersServer can be embedded to have forward compatible implementations. 3541 type UnimplementedClustersServer struct { 3542 } 3543 3544 func (*UnimplementedClustersServer) Cluster(context.Context, *ClusterRequest) (*ClusterResponse, error) { 3545 return nil, status.Errorf(codes.Unimplemented, "method Cluster not implemented") 3546 } 3547 func (*UnimplementedClustersServer) Get(context.Context, *GetClusterRequest) (*Cluster, error) { 3548 return nil, status.Errorf(codes.Unimplemented, "method Get not implemented") 3549 } 3550 func (*UnimplementedClustersServer) GetReclusteringProgress(context.Context, *GetReclusteringProgressRequest) (*ReclusteringProgress, error) { 3551 return nil, status.Errorf(codes.Unimplemented, "method GetReclusteringProgress not implemented") 3552 } 3553 func (*UnimplementedClustersServer) QueryClusterSummaries(context.Context, *QueryClusterSummariesRequest) (*QueryClusterSummariesResponse, error) { 3554 return nil, status.Errorf(codes.Unimplemented, "method QueryClusterSummaries not implemented") 3555 } 3556 func (*UnimplementedClustersServer) QueryClusterFailures(context.Context, *QueryClusterFailuresRequest) (*QueryClusterFailuresResponse, error) { 3557 return nil, status.Errorf(codes.Unimplemented, "method QueryClusterFailures not implemented") 3558 } 3559 func (*UnimplementedClustersServer) QueryExoneratedTestVariants(context.Context, *QueryClusterExoneratedTestVariantsRequest) (*QueryClusterExoneratedTestVariantsResponse, error) { 3560 return nil, status.Errorf(codes.Unimplemented, "method QueryExoneratedTestVariants not implemented") 3561 } 3562 func (*UnimplementedClustersServer) QueryExoneratedTestVariantBranches(context.Context, *QueryClusterExoneratedTestVariantBranchesRequest) (*QueryClusterExoneratedTestVariantBranchesResponse, error) { 3563 return nil, status.Errorf(codes.Unimplemented, "method QueryExoneratedTestVariantBranches not implemented") 3564 } 3565 func (*UnimplementedClustersServer) QueryHistory(context.Context, *QueryClusterHistoryRequest) (*QueryClusterHistoryResponse, error) { 3566 return nil, status.Errorf(codes.Unimplemented, "method QueryHistory not implemented") 3567 } 3568 3569 func RegisterClustersServer(s prpc.Registrar, srv ClustersServer) { 3570 s.RegisterService(&_Clusters_serviceDesc, srv) 3571 } 3572 3573 func _Clusters_Cluster_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 3574 in := new(ClusterRequest) 3575 if err := dec(in); err != nil { 3576 return nil, err 3577 } 3578 if interceptor == nil { 3579 return srv.(ClustersServer).Cluster(ctx, in) 3580 } 3581 info := &grpc.UnaryServerInfo{ 3582 Server: srv, 3583 FullMethod: "/luci.analysis.v1.Clusters/Cluster", 3584 } 3585 handler := func(ctx context.Context, req interface{}) (interface{}, error) { 3586 return srv.(ClustersServer).Cluster(ctx, req.(*ClusterRequest)) 3587 } 3588 return interceptor(ctx, in, info, handler) 3589 } 3590 3591 func _Clusters_Get_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 3592 in := new(GetClusterRequest) 3593 if err := dec(in); err != nil { 3594 return nil, err 3595 } 3596 if interceptor == nil { 3597 return srv.(ClustersServer).Get(ctx, in) 3598 } 3599 info := &grpc.UnaryServerInfo{ 3600 Server: srv, 3601 FullMethod: "/luci.analysis.v1.Clusters/Get", 3602 } 3603 handler := func(ctx context.Context, req interface{}) (interface{}, error) { 3604 return srv.(ClustersServer).Get(ctx, req.(*GetClusterRequest)) 3605 } 3606 return interceptor(ctx, in, info, handler) 3607 } 3608 3609 func _Clusters_GetReclusteringProgress_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 3610 in := new(GetReclusteringProgressRequest) 3611 if err := dec(in); err != nil { 3612 return nil, err 3613 } 3614 if interceptor == nil { 3615 return srv.(ClustersServer).GetReclusteringProgress(ctx, in) 3616 } 3617 info := &grpc.UnaryServerInfo{ 3618 Server: srv, 3619 FullMethod: "/luci.analysis.v1.Clusters/GetReclusteringProgress", 3620 } 3621 handler := func(ctx context.Context, req interface{}) (interface{}, error) { 3622 return srv.(ClustersServer).GetReclusteringProgress(ctx, req.(*GetReclusteringProgressRequest)) 3623 } 3624 return interceptor(ctx, in, info, handler) 3625 } 3626 3627 func _Clusters_QueryClusterSummaries_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 3628 in := new(QueryClusterSummariesRequest) 3629 if err := dec(in); err != nil { 3630 return nil, err 3631 } 3632 if interceptor == nil { 3633 return srv.(ClustersServer).QueryClusterSummaries(ctx, in) 3634 } 3635 info := &grpc.UnaryServerInfo{ 3636 Server: srv, 3637 FullMethod: "/luci.analysis.v1.Clusters/QueryClusterSummaries", 3638 } 3639 handler := func(ctx context.Context, req interface{}) (interface{}, error) { 3640 return srv.(ClustersServer).QueryClusterSummaries(ctx, req.(*QueryClusterSummariesRequest)) 3641 } 3642 return interceptor(ctx, in, info, handler) 3643 } 3644 3645 func _Clusters_QueryClusterFailures_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 3646 in := new(QueryClusterFailuresRequest) 3647 if err := dec(in); err != nil { 3648 return nil, err 3649 } 3650 if interceptor == nil { 3651 return srv.(ClustersServer).QueryClusterFailures(ctx, in) 3652 } 3653 info := &grpc.UnaryServerInfo{ 3654 Server: srv, 3655 FullMethod: "/luci.analysis.v1.Clusters/QueryClusterFailures", 3656 } 3657 handler := func(ctx context.Context, req interface{}) (interface{}, error) { 3658 return srv.(ClustersServer).QueryClusterFailures(ctx, req.(*QueryClusterFailuresRequest)) 3659 } 3660 return interceptor(ctx, in, info, handler) 3661 } 3662 3663 func _Clusters_QueryExoneratedTestVariants_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 3664 in := new(QueryClusterExoneratedTestVariantsRequest) 3665 if err := dec(in); err != nil { 3666 return nil, err 3667 } 3668 if interceptor == nil { 3669 return srv.(ClustersServer).QueryExoneratedTestVariants(ctx, in) 3670 } 3671 info := &grpc.UnaryServerInfo{ 3672 Server: srv, 3673 FullMethod: "/luci.analysis.v1.Clusters/QueryExoneratedTestVariants", 3674 } 3675 handler := func(ctx context.Context, req interface{}) (interface{}, error) { 3676 return srv.(ClustersServer).QueryExoneratedTestVariants(ctx, req.(*QueryClusterExoneratedTestVariantsRequest)) 3677 } 3678 return interceptor(ctx, in, info, handler) 3679 } 3680 3681 func _Clusters_QueryExoneratedTestVariantBranches_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 3682 in := new(QueryClusterExoneratedTestVariantBranchesRequest) 3683 if err := dec(in); err != nil { 3684 return nil, err 3685 } 3686 if interceptor == nil { 3687 return srv.(ClustersServer).QueryExoneratedTestVariantBranches(ctx, in) 3688 } 3689 info := &grpc.UnaryServerInfo{ 3690 Server: srv, 3691 FullMethod: "/luci.analysis.v1.Clusters/QueryExoneratedTestVariantBranches", 3692 } 3693 handler := func(ctx context.Context, req interface{}) (interface{}, error) { 3694 return srv.(ClustersServer).QueryExoneratedTestVariantBranches(ctx, req.(*QueryClusterExoneratedTestVariantBranchesRequest)) 3695 } 3696 return interceptor(ctx, in, info, handler) 3697 } 3698 3699 func _Clusters_QueryHistory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 3700 in := new(QueryClusterHistoryRequest) 3701 if err := dec(in); err != nil { 3702 return nil, err 3703 } 3704 if interceptor == nil { 3705 return srv.(ClustersServer).QueryHistory(ctx, in) 3706 } 3707 info := &grpc.UnaryServerInfo{ 3708 Server: srv, 3709 FullMethod: "/luci.analysis.v1.Clusters/QueryHistory", 3710 } 3711 handler := func(ctx context.Context, req interface{}) (interface{}, error) { 3712 return srv.(ClustersServer).QueryHistory(ctx, req.(*QueryClusterHistoryRequest)) 3713 } 3714 return interceptor(ctx, in, info, handler) 3715 } 3716 3717 var _Clusters_serviceDesc = grpc.ServiceDesc{ 3718 ServiceName: "luci.analysis.v1.Clusters", 3719 HandlerType: (*ClustersServer)(nil), 3720 Methods: []grpc.MethodDesc{ 3721 { 3722 MethodName: "Cluster", 3723 Handler: _Clusters_Cluster_Handler, 3724 }, 3725 { 3726 MethodName: "Get", 3727 Handler: _Clusters_Get_Handler, 3728 }, 3729 { 3730 MethodName: "GetReclusteringProgress", 3731 Handler: _Clusters_GetReclusteringProgress_Handler, 3732 }, 3733 { 3734 MethodName: "QueryClusterSummaries", 3735 Handler: _Clusters_QueryClusterSummaries_Handler, 3736 }, 3737 { 3738 MethodName: "QueryClusterFailures", 3739 Handler: _Clusters_QueryClusterFailures_Handler, 3740 }, 3741 { 3742 MethodName: "QueryExoneratedTestVariants", 3743 Handler: _Clusters_QueryExoneratedTestVariants_Handler, 3744 }, 3745 { 3746 MethodName: "QueryExoneratedTestVariantBranches", 3747 Handler: _Clusters_QueryExoneratedTestVariantBranches_Handler, 3748 }, 3749 { 3750 MethodName: "QueryHistory", 3751 Handler: _Clusters_QueryHistory_Handler, 3752 }, 3753 }, 3754 Streams: []grpc.StreamDesc{}, 3755 Metadata: "go.chromium.org/luci/analysis/proto/v1/clusters.proto", 3756 }