diff --git a/pkg/api/ci.go b/pkg/api/ci.go index b0abb9d3..578630f5 100644 --- a/pkg/api/ci.go +++ b/pkg/api/ci.go @@ -62,6 +62,36 @@ func CIGetRun(ctx context.Context, token, orgID, runID string) (*civ1.GetRunResp return resp.Msg, nil } +// CIGetJobAttemptMetrics returns CPU and memory samples for a CI job attempt. +func CIGetJobAttemptMetrics(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobAttemptMetricsResponse, error) { + client := newCIServiceClient() + resp, err := client.GetJobAttemptMetrics(ctx, WithAuthenticationAndOrg(connect.NewRequest(&civ1.GetJobAttemptMetricsRequest{AttemptId: attemptID}), token, orgID)) + if err != nil { + return nil, err + } + return resp.Msg, nil +} + +// CIGetJobMetrics returns per-attempt CPU and memory metric summaries for a CI job. +func CIGetJobMetrics(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobMetricsResponse, error) { + client := newCIServiceClient() + resp, err := client.GetJobMetrics(ctx, WithAuthenticationAndOrg(connect.NewRequest(&civ1.GetJobMetricsRequest{JobId: jobID}), token, orgID)) + if err != nil { + return nil, err + } + return resp.Msg, nil +} + +// CIGetRunMetrics returns workflow/job/attempt CPU and memory metric summaries for a CI run. +func CIGetRunMetrics(ctx context.Context, token, orgID, runID string) (*civ1.GetRunMetricsResponse, error) { + client := newCIServiceClient() + resp, err := client.GetRunMetrics(ctx, WithAuthenticationAndOrg(connect.NewRequest(&civ1.GetRunMetricsRequest{RunId: runID}), token, orgID)) + if err != nil { + return nil, err + } + return resp.Msg, nil +} + // CIGetJobAttemptLogs returns all log lines for a job attempt, paginating through all pages. func CIGetJobAttemptLogs(ctx context.Context, token, orgID, attemptID string) ([]*civ1.LogLine, error) { client := newCIServiceClient() diff --git a/pkg/api/ci_test.go b/pkg/api/ci_test.go index 6d9f27ef..c4f24f5a 100644 --- a/pkg/api/ci_test.go +++ b/pkg/api/ci_test.go @@ -80,6 +80,30 @@ func (h ciServiceTestHandler) GetWorkflow(_ context.Context, req *connect.Reques return connect.NewResponse(&civ1.GetWorkflowResponse{WorkflowId: req.Msg.WorkflowId, OrgId: "org-123"}), nil } +func (h ciServiceTestHandler) GetJobAttemptMetrics(_ context.Context, req *connect.Request[civ1.GetJobAttemptMetricsRequest]) (*connect.Response[civ1.GetJobAttemptMetricsResponse], error) { + assertAuthAndOrg(h.t, req.Header()) + if req.Msg.AttemptId != "attempt-123" { + h.t.Fatalf("AttemptId = %q, want attempt-123", req.Msg.AttemptId) + } + return connect.NewResponse(&civ1.GetJobAttemptMetricsResponse{SnapshotAt: "2026-05-03T12:00:00Z"}), nil +} + +func (h ciServiceTestHandler) GetJobMetrics(_ context.Context, req *connect.Request[civ1.GetJobMetricsRequest]) (*connect.Response[civ1.GetJobMetricsResponse], error) { + assertAuthAndOrg(h.t, req.Header()) + if req.Msg.JobId != "job-123" { + h.t.Fatalf("JobId = %q, want job-123", req.Msg.JobId) + } + return connect.NewResponse(&civ1.GetJobMetricsResponse{SnapshotAt: "2026-05-03T12:00:00Z"}), nil +} + +func (h ciServiceTestHandler) GetRunMetrics(_ context.Context, req *connect.Request[civ1.GetRunMetricsRequest]) (*connect.Response[civ1.GetRunMetricsResponse], error) { + assertAuthAndOrg(h.t, req.Header()) + if req.Msg.RunId != "run-123" { + h.t.Fatalf("RunId = %q, want run-123", req.Msg.RunId) + } + return connect.NewResponse(&civ1.GetRunMetricsResponse{SnapshotAt: "2026-05-03T12:00:00Z"}), nil +} + func (h ciServiceTestHandler) GetJobAttemptLogs(context.Context, *connect.Request[civ1.GetJobAttemptLogsRequest]) (*connect.Response[civ1.GetJobAttemptLogsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, nil) } @@ -136,6 +160,34 @@ func TestCIGetWorkflowWrapper(t *testing.T) { }) } +func TestCIMetricsWrappers(t *testing.T) { + withTestCIService(t, func() { + attemptResp, err := CIGetJobAttemptMetrics(context.Background(), "token-123", "org-123", "attempt-123") + if err != nil { + t.Fatalf("CIGetJobAttemptMetrics returned error: %v", err) + } + if attemptResp.SnapshotAt == "" { + t.Fatal("CIGetJobAttemptMetrics returned empty snapshot") + } + + jobResp, err := CIGetJobMetrics(context.Background(), "token-123", "org-123", "job-123") + if err != nil { + t.Fatalf("CIGetJobMetrics returned error: %v", err) + } + if jobResp.SnapshotAt == "" { + t.Fatal("CIGetJobMetrics returned empty snapshot") + } + + runResp, err := CIGetRunMetrics(context.Background(), "token-123", "org-123", "run-123") + if err != nil { + t.Fatalf("CIGetRunMetrics returned error: %v", err) + } + if runResp.SnapshotAt == "" { + t.Fatal("CIGetRunMetrics returned empty snapshot") + } + }) +} + func withTestCIService(t *testing.T, fn func()) { t.Helper() diff --git a/pkg/cmd/ci/ci.go b/pkg/cmd/ci/ci.go index 6eed7c60..7c24975c 100644 --- a/pkg/cmd/ci/ci.go +++ b/pkg/cmd/ci/ci.go @@ -15,6 +15,7 @@ func NewCmdCI() *cobra.Command { cmd.AddCommand(NewCmdCancel()) cmd.AddCommand(NewCmdDispatch()) cmd.AddCommand(NewCmdLogs()) + cmd.AddCommand(NewCmdMetrics()) cmd.AddCommand(NewCmdMigrate()) cmd.AddCommand(NewCmdRerun()) cmd.AddCommand(NewCmdRetry()) diff --git a/pkg/cmd/ci/metrics.go b/pkg/cmd/ci/metrics.go new file mode 100644 index 00000000..a623a6e6 --- /dev/null +++ b/pkg/cmd/ci/metrics.go @@ -0,0 +1,480 @@ +package ci + +import ( + "errors" + "fmt" + "strings" + + "connectrpc.com/connect" + "github.com/depot/cli/pkg/api" + "github.com/depot/cli/pkg/config" + "github.com/depot/cli/pkg/helpers" + civ1 "github.com/depot/cli/pkg/proto/depot/ci/v1" + "github.com/spf13/cobra" +) + +var ( + ciGetJobAttemptMetrics = api.CIGetJobAttemptMetrics + ciGetJobMetrics = api.CIGetJobMetrics + ciGetRunMetrics = api.CIGetRunMetrics +) + +func NewCmdMetrics() *cobra.Command { + var ( + orgID string + token string + output string + attemptID string + jobID string + runID string + ) + + cmd := &cobra.Command{ + Use: "metrics ", + Short: "Fetch CI CPU and memory metrics", + Long: "Fetch CPU and memory metrics for a CI job attempt, job, or run.", + Example: ` depot ci metrics att_123 + depot ci metrics --attempt att_123 --output json + depot ci metrics --job job_123 --output json + depot ci metrics --run run_123 --output json`, + RunE: func(cmd *cobra.Command, args []string) error { + if err := validateMetricsOutput(output); err != nil { + return err + } + if len(args) > 1 { + return fmt.Errorf("expected at most one attempt ID") + } + if len(args) == 1 && (attemptID != "" || jobID != "" || runID != "") { + return fmt.Errorf("positional attempt ID cannot be combined with --attempt, --job, or --run") + } + if countNonEmpty(attemptID, jobID, runID) > 1 { + return fmt.Errorf("--attempt, --job, and --run are mutually exclusive") + } + if len(args) == 0 && countNonEmpty(attemptID, jobID, runID) == 0 { + return cmd.Help() + } + if len(args) == 1 { + attemptID = args[0] + } + + ctx := cmd.Context() + if orgID == "" { + orgID = config.GetCurrentOrganization() + } + + tokenVal, err := helpers.ResolveOrgAuth(ctx, token) + if err != nil { + return err + } + if tokenVal == "" { + return fmt.Errorf("missing API token, please run `depot login`") + } + + orgFlag := "" + if cmd.Flags().Changed("org") { + orgFlag = " --org " + orgID + } + + switch { + case jobID != "": + resp, err := ciGetJobMetrics(ctx, tokenVal, orgID, jobID) + if err != nil { + if connect.CodeOf(err) == connect.CodeResourceExhausted { + return jobMetricsLimitError(err) + } + return fmt.Errorf("failed to get job metrics: %w", err) + } + if metricsOutputJSON(output) { + return writeJSON(buildJobMetricsJSON(resp)) + } + printJobMetrics(resp, orgFlag) + case runID != "": + resp, err := ciGetRunMetrics(ctx, tokenVal, orgID, runID) + if err != nil { + if connect.CodeOf(err) == connect.CodeResourceExhausted { + return runMetricsLimitError(err, runID) + } + return fmt.Errorf("failed to get run metrics: %w", err) + } + if metricsOutputJSON(output) { + return writeJSON(buildRunMetricsJSON(resp)) + } + printRunMetrics(resp, orgFlag) + default: + resp, err := ciGetJobAttemptMetrics(ctx, tokenVal, orgID, attemptID) + if err != nil { + if connect.CodeOf(err) == connect.CodeNotFound { + return fmt.Errorf("attempt not found; use --job or --run for job/run metrics: %w", err) + } + return fmt.Errorf("failed to get attempt metrics: %w", err) + } + if metricsOutputJSON(output) { + return writeJSON(buildAttemptMetricsJSON(resp)) + } + printAttemptMetrics(resp, orgFlag) + } + + return nil + }, + } + + cmd.Flags().StringVar(&orgID, "org", "", "Organization ID (required when user is a member of multiple organizations)") + cmd.Flags().StringVar(&token, "token", "", "Depot API token") + cmd.Flags().StringVarP(&output, "output", "o", "", "Output format (text, json)") + cmd.Flags().StringVar(&attemptID, "attempt", "", "Job attempt ID") + cmd.Flags().StringVar(&jobID, "job", "", "Job ID") + cmd.Flags().StringVar(&runID, "run", "", "Run ID") + + return cmd +} + +type attemptMetricsDocument struct { + Type string `json:"type"` + SnapshotAt string `json:"snapshot_at"` + Run *civ1.CIMetricsRunContext `json:"run"` + Workflow *civ1.CIMetricsWorkflowContext `json:"workflow"` + Job *civ1.CIMetricsJobContext `json:"job"` + Attempt attemptMetricsJSON `json:"attempt"` +} + +type jobMetricsDocument struct { + Type string `json:"type"` + SnapshotAt string `json:"snapshot_at"` + Run *civ1.CIMetricsRunContext `json:"run"` + Workflow *civ1.CIMetricsWorkflowContext `json:"workflow"` + Job *civ1.CIMetricsJobContext `json:"job"` + Attempts []attemptSummaryJSON `json:"attempts"` +} + +type runMetricsDocument struct { + Type string `json:"type"` + SnapshotAt string `json:"snapshot_at"` + Run *civ1.CIMetricsRunContext `json:"run"` + Workflows []workflowMetricsJSON `json:"workflows"` +} + +type workflowMetricsJSON struct { + Workflow *civ1.CIMetricsWorkflowContext `json:"workflow"` + Jobs []jobMetricsJSON `json:"jobs"` +} + +type jobMetricsJSON struct { + Job *civ1.CIMetricsJobContext `json:"job"` + Attempts []attemptSummaryJSON `json:"attempts"` +} + +type attemptMetricsJSON struct { + Attempt *civ1.CIMetricsAttemptContext `json:"attempt"` + Availability availabilityJSON `json:"availability"` + Stats statsJSON `json:"stats"` + Cap capJSON `json:"cap"` + Samples []sampleJSON `json:"samples"` +} + +type attemptSummaryJSON struct { + Attempt *civ1.CIMetricsAttemptContext `json:"attempt"` + Availability availabilityJSON `json:"availability"` + Stats statsJSON `json:"stats"` + Cap capJSON `json:"cap"` +} + +type availabilityJSON struct { + Code string `json:"code"` + Reason string `json:"reason"` +} + +type statsJSON struct { + SampleCount uint32 `json:"sample_count"` + CpuSampleCount uint32 `json:"cpu_sample_count"` + MemorySampleCount uint32 `json:"memory_sample_count"` + PeakCpuUtilization *float64 `json:"peak_cpu_utilization,omitempty"` + AverageCpuUtilization *float64 `json:"average_cpu_utilization,omitempty"` + PeakMemoryUtilization *float64 `json:"peak_memory_utilization,omitempty"` + AverageMemoryUtilization *float64 `json:"average_memory_utilization,omitempty"` + ObservedStartedAt string `json:"observed_started_at"` + ObservedFinishedAt string `json:"observed_finished_at"` + PeakMemoryUsageBytes *uint64 `json:"peak_memory_usage_bytes,omitempty"` + AverageMemoryUsageBytes *float64 `json:"average_memory_usage_bytes,omitempty"` +} + +type capJSON struct { + RawSampleCount uint32 `json:"raw_sample_count"` + ReturnedSampleCount uint32 `json:"returned_sample_count"` + MaxReturnedSampleCount uint32 `json:"max_returned_sample_count"` + Downsampled bool `json:"downsampled"` + DownsampleStrategy string `json:"downsample_strategy"` +} + +type sampleJSON struct { + Timestamp string `json:"timestamp"` + CpuUtilization *float64 `json:"cpu_utilization,omitempty"` + MemoryUtilization *float64 `json:"memory_utilization,omitempty"` + MemoryUsageBytes *uint64 `json:"memory_usage_bytes,omitempty"` +} + +func buildAttemptMetricsJSON(resp *civ1.GetJobAttemptMetricsResponse) attemptMetricsDocument { + return attemptMetricsDocument{ + Type: "attempt", + SnapshotAt: resp.GetSnapshotAt(), + Run: resp.GetRun(), + Workflow: resp.GetWorkflow(), + Job: resp.GetJob(), + Attempt: metricAttemptJSON(resp.GetAttempt()), + } +} + +func buildJobMetricsJSON(resp *civ1.GetJobMetricsResponse) jobMetricsDocument { + attempts := make([]attemptSummaryJSON, 0, len(resp.GetAttempts())) + for _, attempt := range resp.GetAttempts() { + attempts = append(attempts, metricAttemptSummaryJSON(attempt)) + } + return jobMetricsDocument{ + Type: "job", + SnapshotAt: resp.GetSnapshotAt(), + Run: resp.GetRun(), + Workflow: resp.GetWorkflow(), + Job: resp.GetJob(), + Attempts: attempts, + } +} + +func buildRunMetricsJSON(resp *civ1.GetRunMetricsResponse) runMetricsDocument { + workflows := make([]workflowMetricsJSON, 0, len(resp.GetWorkflows())) + for _, workflow := range resp.GetWorkflows() { + jobs := make([]jobMetricsJSON, 0, len(workflow.GetJobs())) + for _, job := range workflow.GetJobs() { + attempts := make([]attemptSummaryJSON, 0, len(job.GetAttempts())) + for _, attempt := range job.GetAttempts() { + attempts = append(attempts, metricAttemptSummaryJSON(attempt)) + } + jobs = append(jobs, jobMetricsJSON{Job: job.GetJob(), Attempts: attempts}) + } + workflows = append(workflows, workflowMetricsJSON{Workflow: workflow.GetWorkflow(), Jobs: jobs}) + } + return runMetricsDocument{ + Type: "run", + SnapshotAt: resp.GetSnapshotAt(), + Run: resp.GetRun(), + Workflows: workflows, + } +} + +func metricAttemptJSON(attempt *civ1.CIMetricsAttemptMetrics) attemptMetricsJSON { + samples := make([]sampleJSON, 0, len(attempt.GetSamples())) + for _, sample := range attempt.GetSamples() { + samples = append(samples, sampleJSON{ + Timestamp: sample.GetTimestamp(), + CpuUtilization: sample.CpuUtilization, + MemoryUtilization: sample.MemoryUtilization, + MemoryUsageBytes: sample.MemoryUsageBytes, + }) + } + return attemptMetricsJSON{ + Attempt: attempt.GetAttempt(), + Availability: metricAvailabilityJSON(attempt.GetAvailability()), + Stats: metricStatsJSON(attempt.GetStats()), + Cap: metricCapJSON(attempt.GetCap()), + Samples: samples, + } +} + +func metricAttemptSummaryJSON(attempt *civ1.CIMetricsAttemptSummary) attemptSummaryJSON { + return attemptSummaryJSON{ + Attempt: attempt.GetAttempt(), + Availability: metricAvailabilityJSON(attempt.GetAvailability()), + Stats: metricStatsJSON(attempt.GetStats()), + Cap: metricCapJSON(attempt.GetCap()), + } +} + +func metricAvailabilityJSON(availability *civ1.CIMetricsAvailability) availabilityJSON { + return availabilityJSON{ + Code: metricAvailabilityCode(availability.GetCode()), + Reason: availability.GetReason(), + } +} + +func metricAvailabilityCode(code civ1.CIMetricsAvailabilityCode) string { + switch code { + case civ1.CIMetricsAvailabilityCode_CI_METRICS_AVAILABILITY_CODE_AVAILABLE: + return "available" + case civ1.CIMetricsAvailabilityCode_CI_METRICS_AVAILABILITY_CODE_NO_SANDBOX: + return "no_sandbox" + case civ1.CIMetricsAvailabilityCode_CI_METRICS_AVAILABILITY_CODE_NO_TIME_RANGE: + return "no_time_range" + case civ1.CIMetricsAvailabilityCode_CI_METRICS_AVAILABILITY_CODE_NO_SAMPLES: + return "no_samples" + default: + return "" + } +} + +func metricStatsJSON(stats *civ1.CIMetricsStats) statsJSON { + if stats == nil { + return statsJSON{} + } + + return statsJSON{ + SampleCount: stats.GetSampleCount(), + CpuSampleCount: stats.GetCpuSampleCount(), + MemorySampleCount: stats.GetMemorySampleCount(), + PeakCpuUtilization: stats.PeakCpuUtilization, + AverageCpuUtilization: stats.AverageCpuUtilization, + PeakMemoryUtilization: stats.PeakMemoryUtilization, + AverageMemoryUtilization: stats.AverageMemoryUtilization, + ObservedStartedAt: stats.GetObservedStartedAt(), + ObservedFinishedAt: stats.GetObservedFinishedAt(), + PeakMemoryUsageBytes: stats.PeakMemoryUsageBytes, + AverageMemoryUsageBytes: stats.AverageMemoryUsageBytes, + } +} + +func metricCapJSON(cap *civ1.CIMetricsCapMetadata) capJSON { + if cap == nil { + return capJSON{} + } + + return capJSON{ + RawSampleCount: cap.GetRawSampleCount(), + ReturnedSampleCount: cap.GetReturnedSampleCount(), + MaxReturnedSampleCount: cap.GetMaxReturnedSampleCount(), + Downsampled: cap.GetDownsampled(), + DownsampleStrategy: cap.GetDownsampleStrategy(), + } +} + +func printAttemptMetrics(resp *civ1.GetJobAttemptMetricsResponse, orgFlag string) { + fmt.Printf("Run: %s (%s)\n", resp.GetRun().GetRunId(), resp.GetRun().GetStatus()) + fmt.Printf("Workflow: %s\n", resp.GetWorkflow().GetWorkflowId()) + fmt.Printf("Job: %s [%s] (%s)\n", resp.GetJob().GetJobId(), resp.GetJob().GetJobKey(), resp.GetJob().GetStatus()) + printAttemptSummary(resp.GetAttempt(), "") + fmt.Printf("Samples: %d returned / %d raw\n", resp.GetAttempt().GetCap().GetReturnedSampleCount(), resp.GetAttempt().GetCap().GetRawSampleCount()) + if attemptID := resp.GetAttempt().GetAttempt().GetAttemptId(); attemptID != "" { + fmt.Printf("Full samples: %s --output json\n", metricsCommand(attemptID, orgFlag)) + } +} + +func printJobMetrics(resp *civ1.GetJobMetricsResponse, orgFlag string) { + fmt.Printf("Run: %s (%s)\n", resp.GetRun().GetRunId(), resp.GetRun().GetStatus()) + fmt.Printf("Workflow: %s\n", resp.GetWorkflow().GetWorkflowId()) + fmt.Printf("Job: %s [%s] (%s)\n", resp.GetJob().GetJobId(), resp.GetJob().GetJobKey(), resp.GetJob().GetStatus()) + for _, attempt := range resp.GetAttempts() { + printAttemptSummaryFields(attempt.GetAttempt(), attempt.GetAvailability(), attempt.GetStats(), metricsCommand(attempt.GetAttempt().GetAttemptId(), orgFlag)) + } +} + +func printRunMetrics(resp *civ1.GetRunMetricsResponse, orgFlag string) { + fmt.Printf("Run: %s (%s)\n", resp.GetRun().GetRunId(), resp.GetRun().GetStatus()) + for _, workflow := range resp.GetWorkflows() { + fmt.Printf("\nWorkflow: %s (%s)\n", workflow.GetWorkflow().GetWorkflowId(), workflow.GetWorkflow().GetStatus()) + for _, job := range workflow.GetJobs() { + fmt.Printf(" Job: %s [%s] (%s)\n", job.GetJob().GetJobId(), job.GetJob().GetJobKey(), job.GetJob().GetStatus()) + for _, attempt := range job.GetAttempts() { + printAttemptSummaryFields(attempt.GetAttempt(), attempt.GetAvailability(), attempt.GetStats(), metricsCommand(attempt.GetAttempt().GetAttemptId(), orgFlag)) + } + } + } +} + +func printAttemptSummary(attempt *civ1.CIMetricsAttemptMetrics, metricsCommand string) { + printAttemptSummaryFields(attempt.GetAttempt(), attempt.GetAvailability(), attempt.GetStats(), metricsCommand) +} + +func printAttemptSummaryFields(attempt *civ1.CIMetricsAttemptContext, availability *civ1.CIMetricsAvailability, stats *civ1.CIMetricsStats, metricsCommand string) { + fmt.Printf(" Attempt #%d %s (%s)\n", attempt.GetAttempt(), attempt.GetAttemptId(), attempt.GetStatus()) + fmt.Printf(" Availability: %s\n", metricAvailabilityCode(availability.GetCode())) + if stats == nil { + stats = &civ1.CIMetricsStats{} + } + if stats.GetObservedStartedAt() != "" || stats.GetObservedFinishedAt() != "" { + fmt.Printf(" Observed: %s - %s\n", stats.GetObservedStartedAt(), stats.GetObservedFinishedAt()) + } + if stats.PeakCpuUtilization != nil || stats.AverageCpuUtilization != nil { + fmt.Printf(" CPU: peak %s, avg %s (%d samples)\n", formatMetricRatio(stats.PeakCpuUtilization), formatMetricRatio(stats.AverageCpuUtilization), stats.GetCpuSampleCount()) + } + if stats.PeakMemoryUtilization != nil || stats.AverageMemoryUtilization != nil { + fmt.Printf(" Memory: peak %s, avg %s (%d samples)\n", formatMetricRatio(stats.PeakMemoryUtilization), formatMetricRatio(stats.AverageMemoryUtilization), stats.GetMemorySampleCount()) + } + if metricsCommand != "" && attempt.GetAttemptId() != "" { + fmt.Printf(" Metrics: %s\n", metricsCommand) + fmt.Printf(" Full samples: %s --output json\n", metricsCommand) + } +} + +func metricsCommand(attemptID, orgFlag string) string { + return fmt.Sprintf("depot ci metrics %s%s", attemptID, orgFlag) +} + +func runMetricsLimitError(err error, runID string) error { + return metricsLimitErrorMessage( + connectErrorText(err), + fmt.Sprintf("Try a narrower metrics request:\n depot ci metrics --job \n depot ci metrics \n\nUse `depot ci status %s` to find job and attempt IDs.", runID), + ) +} + +func jobMetricsLimitError(err error) error { + message := connectErrorText(err) + runID := runIDFromMetricsLimitMessage(message) + if runID == "" { + runID = "" + } + return metricsLimitErrorMessage( + message, + fmt.Sprintf("Try a narrower metrics request:\n depot ci metrics \n\nUse `depot ci status %s` to find attempt IDs.", runID), + ) +} + +func metricsLimitErrorMessage(message, guidance string) error { + if message == "" { + return errors.New(guidance) + } + return errors.New(strings.SplitN(message, "\n", 2)[0] + "\n\n" + guidance) +} + +func runIDFromMetricsLimitMessage(message string) string { + _, after, ok := strings.Cut(message, "Use GetRunStatus for run ") + if !ok { + return "" + } + fields := strings.Fields(after) + if len(fields) == 0 { + return "" + } + return strings.TrimSuffix(fields[0], ".") +} + +func connectErrorText(err error) string { + var connectErr *connect.Error + if errors.As(err, &connectErr) && connectErr.Message() != "" { + return connectErr.Message() + } + return "" +} + +func validateMetricsOutput(output string) error { + if output == "" || output == "text" || output == "json" { + return nil + } + return fmt.Errorf("unsupported output %q (valid: text, json)", output) +} + +func metricsOutputJSON(output string) bool { + return output == "json" +} + +func countNonEmpty(values ...string) int { + count := 0 + for _, value := range values { + if value != "" { + count++ + } + } + return count +} + +func formatMetricRatio(value *float64) string { + if value == nil { + return "n/a" + } + return fmt.Sprintf("%.1f%%", *value*100) +} diff --git a/pkg/cmd/ci/metrics_test.go b/pkg/cmd/ci/metrics_test.go new file mode 100644 index 00000000..202916a2 --- /dev/null +++ b/pkg/cmd/ci/metrics_test.go @@ -0,0 +1,435 @@ +package ci + +import ( + "context" + "encoding/json" + "errors" + "io" + "strings" + "testing" + + "connectrpc.com/connect" + civ1 "github.com/depot/cli/pkg/proto/depot/ci/v1" +) + +func TestMetricsAttemptJSONOutput(t *testing.T) { + originalGetAttemptMetrics := ciGetJobAttemptMetrics + t.Cleanup(func() { ciGetJobAttemptMetrics = originalGetAttemptMetrics }) + + var capturedAttemptID string + ciGetJobAttemptMetrics = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobAttemptMetricsResponse, error) { + capturedAttemptID = attemptID + return attemptMetricsResponse(), nil + } + + cmd := NewCmdMetrics() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "--output", "json", "att-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + stdout, err := captureStdout(t, cmd.Execute) + if err != nil { + t.Fatal(err) + } + if capturedAttemptID != "att-1" { + t.Fatalf("attemptID = %q, want att-1", capturedAttemptID) + } + + var document map[string]any + if err := json.Unmarshal([]byte(stdout), &document); err != nil { + t.Fatalf("invalid JSON output: %v\n%s", err, stdout) + } + if document["type"] != "attempt" { + t.Fatalf("type = %v, want attempt", document["type"]) + } + attempt := document["attempt"].(map[string]any) + samples := attempt["samples"].([]any) + firstSample := samples[0].(map[string]any) + if firstSample["cpu_utilization"] != 0.5 { + t.Fatalf("cpu_utilization = %v, want 0.5", firstSample["cpu_utilization"]) + } + if _, ok := firstSample["memory_utilization"]; ok { + t.Fatalf("memory_utilization should be omitted for CPU-only sample: %s", stdout) + } +} + +func TestMetricsJobJSONOmitsChildSamples(t *testing.T) { + originalGetJobMetrics := ciGetJobMetrics + t.Cleanup(func() { ciGetJobMetrics = originalGetJobMetrics }) + + ciGetJobMetrics = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobMetricsResponse, error) { + return jobMetricsResponse(), nil + } + + cmd := NewCmdMetrics() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "--job", "job-1", "--output", "json"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + stdout, err := captureStdout(t, cmd.Execute) + if err != nil { + t.Fatal(err) + } + if strings.Contains(stdout, `"samples"`) { + t.Fatalf("job metrics JSON should not embed child samples:\n%s", stdout) + } + if !strings.Contains(stdout, `"type": "job"`) { + t.Fatalf("job metrics JSON missing type:\n%s", stdout) + } +} + +func TestMetricsRunJSONOmitsChildSamples(t *testing.T) { + originalGetRunMetrics := ciGetRunMetrics + t.Cleanup(func() { ciGetRunMetrics = originalGetRunMetrics }) + + ciGetRunMetrics = func(ctx context.Context, token, orgID, runID string) (*civ1.GetRunMetricsResponse, error) { + return runMetricsResponse(), nil + } + + cmd := NewCmdMetrics() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "--run", "run-1", "--output", "json"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + stdout, err := captureStdout(t, cmd.Execute) + if err != nil { + t.Fatal(err) + } + if strings.Contains(stdout, `"samples"`) { + t.Fatalf("run metrics JSON should not embed child samples:\n%s", stdout) + } + if !strings.Contains(stdout, `"type": "run"`) { + t.Fatalf("run metrics JSON missing type:\n%s", stdout) + } +} + +func TestMetricsHumanJobOutputShowsDrillDownCommand(t *testing.T) { + originalGetJobMetrics := ciGetJobMetrics + t.Cleanup(func() { ciGetJobMetrics = originalGetJobMetrics }) + + ciGetJobMetrics = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobMetricsResponse, error) { + return jobMetricsResponse(), nil + } + + cmd := NewCmdMetrics() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "--job", "job-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + stdout, err := captureStdout(t, cmd.Execute) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(stdout, "Metrics: depot ci metrics att-1 --org org-123") { + t.Fatalf("human output missing drill-down command:\n%s", stdout) + } + if !strings.Contains(stdout, "Full samples: depot ci metrics att-1 --org org-123 --output json") { + t.Fatalf("human output missing full samples command:\n%s", stdout) + } +} + +func TestMetricsHumanAttemptOutputShowsFullSamplesCommand(t *testing.T) { + originalGetAttemptMetrics := ciGetJobAttemptMetrics + t.Cleanup(func() { ciGetJobAttemptMetrics = originalGetAttemptMetrics }) + + ciGetJobAttemptMetrics = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobAttemptMetricsResponse, error) { + return attemptMetricsResponse(), nil + } + + cmd := NewCmdMetrics() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "att-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + stdout, err := captureStdout(t, cmd.Execute) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(stdout, "Samples: 2 returned / 2 raw") { + t.Fatalf("human output missing sample count:\n%s", stdout) + } + if !strings.Contains(stdout, "Full samples: depot ci metrics att-1 --org org-123 --output json") { + t.Fatalf("human output missing full samples command:\n%s", stdout) + } +} + +func TestMetricsRunResourceExhaustedShowsActionableMessage(t *testing.T) { + originalGetRunMetrics := ciGetRunMetrics + t.Cleanup(func() { ciGetRunMetrics = originalGetRunMetrics }) + + message := `This run has 198 attempts, which is too many to summarize safely. + +Request metrics for a narrower scope, such as a single job or attempt. + +Use GetRunStatus for run run-1 to find job and attempt IDs.` + ciGetRunMetrics = func(ctx context.Context, token, orgID, runID string) (*civ1.GetRunMetricsResponse, error) { + return nil, connect.NewError(connect.CodeResourceExhausted, errors.New(message)) + } + + cmd := NewCmdMetrics() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "--run", "run-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + err := cmd.Execute() + if err == nil { + t.Fatal("expected resource exhausted error") + } + want := `This run has 198 attempts, which is too many to summarize safely. + +Try a narrower metrics request: + depot ci metrics --job + depot ci metrics + +Use ` + "`depot ci status run-1`" + ` to find job and attempt IDs.` + if err.Error() != want { + t.Fatalf("err = %q, want actionable message", err.Error()) + } +} + +func TestMetricsJobResourceExhaustedShowsActionableMessage(t *testing.T) { + originalGetJobMetrics := ciGetJobMetrics + t.Cleanup(func() { ciGetJobMetrics = originalGetJobMetrics }) + + message := `This job has 51 attempts, which is too many to summarize safely. + +Request metrics for a single attempt instead. + +Use GetRunStatus for run run-1 to find attempt IDs.` + ciGetJobMetrics = func(ctx context.Context, token, orgID, jobID string) (*civ1.GetJobMetricsResponse, error) { + return nil, connect.NewError(connect.CodeResourceExhausted, errors.New(message)) + } + + cmd := NewCmdMetrics() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "--job", "job-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + err := cmd.Execute() + if err == nil { + t.Fatal("expected resource exhausted error") + } + want := `This job has 51 attempts, which is too many to summarize safely. + +Try a narrower metrics request: + depot ci metrics + +Use ` + "`depot ci status run-1`" + ` to find attempt IDs.` + if err.Error() != want { + t.Fatalf("err = %q, want actionable message", err.Error()) + } +} + +func TestMetricsJSONHandlesMissingStatsAndCap(t *testing.T) { + originalGetAttemptMetrics := ciGetJobAttemptMetrics + t.Cleanup(func() { ciGetJobAttemptMetrics = originalGetAttemptMetrics }) + + resp := attemptMetricsResponse() + resp.Attempt.Availability = &civ1.CIMetricsAvailability{ + Code: civ1.CIMetricsAvailabilityCode_CI_METRICS_AVAILABILITY_CODE_NO_SAMPLES, + Reason: "no_samples", + } + resp.Attempt.Stats = nil + resp.Attempt.Cap = nil + resp.Attempt.Samples = nil + ciGetJobAttemptMetrics = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobAttemptMetricsResponse, error) { + return resp, nil + } + + cmd := NewCmdMetrics() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "--output", "json", "att-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + stdout, err := captureStdout(t, cmd.Execute) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(stdout, `"reason": "no_samples"`) { + t.Fatalf("JSON output missing availability reason:\n%s", stdout) + } + if !strings.Contains(stdout, `"sample_count": 0`) { + t.Fatalf("JSON output missing zero stats fallback:\n%s", stdout) + } +} + +func TestMetricsTextHandlesMissingStats(t *testing.T) { + originalGetAttemptMetrics := ciGetJobAttemptMetrics + t.Cleanup(func() { ciGetJobAttemptMetrics = originalGetAttemptMetrics }) + + resp := attemptMetricsResponse() + resp.Attempt.Availability = &civ1.CIMetricsAvailability{ + Code: civ1.CIMetricsAvailabilityCode_CI_METRICS_AVAILABILITY_CODE_NO_SAMPLES, + Reason: "no_samples", + } + resp.Attempt.Stats = nil + ciGetJobAttemptMetrics = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobAttemptMetricsResponse, error) { + return resp, nil + } + + cmd := NewCmdMetrics() + cmd.SetArgs([]string{"--org", "org-123", "--token", "token-123", "att-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + stdout, err := captureStdout(t, cmd.Execute) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(stdout, "Availability: no_samples") { + t.Fatalf("text output missing availability:\n%s", stdout) + } +} + +func TestMetricsRejectsAmbiguousSelectionBeforeAPIRequest(t *testing.T) { + originalGetAttemptMetrics := ciGetJobAttemptMetrics + t.Cleanup(func() { ciGetJobAttemptMetrics = originalGetAttemptMetrics }) + + called := false + ciGetJobAttemptMetrics = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobAttemptMetricsResponse, error) { + called = true + return nil, nil + } + + cmd := NewCmdMetrics() + cmd.SetArgs([]string{"--token", "token-123", "--attempt", "att-1", "--job", "job-1"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + err := cmd.Execute() + if err == nil || !strings.Contains(err.Error(), "mutually exclusive") { + t.Fatalf("err = %v, want mutually exclusive selection error", err) + } + if called { + t.Fatal("API should not be called for invalid selection") + } +} + +func TestMetricsBareNotFoundSuggestsJobAndRunFlags(t *testing.T) { + originalGetAttemptMetrics := ciGetJobAttemptMetrics + t.Cleanup(func() { ciGetJobAttemptMetrics = originalGetAttemptMetrics }) + + ciGetJobAttemptMetrics = func(ctx context.Context, token, orgID, attemptID string) (*civ1.GetJobAttemptMetricsResponse, error) { + return nil, connect.NewError(connect.CodeNotFound, errors.New("not found")) + } + + cmd := NewCmdMetrics() + cmd.SetArgs([]string{"--token", "token-123", "job-looks-like-id"}) + cmd.SetOut(io.Discard) + cmd.SetErr(io.Discard) + + err := cmd.Execute() + if err == nil || !strings.Contains(err.Error(), "use --job or --run ") { + t.Fatalf("err = %v, want actionable job/run hint", err) + } +} + +func attemptMetricsResponse() *civ1.GetJobAttemptMetricsResponse { + return &civ1.GetJobAttemptMetricsResponse{ + SnapshotAt: "2026-05-03T12:01:00Z", + Run: metricsRun(), + Workflow: metricsWorkflow(), + Job: metricsJob(), + Attempt: &civ1.CIMetricsAttemptMetrics{ + Attempt: metricsAttempt(), + Availability: availableMetrics(), + Stats: metricsStats(), + Cap: metricsCap(), + Samples: []*civ1.CIMetricSample{ + {Timestamp: "2026-05-03T12:00:00Z", CpuUtilization: float64Ptr(0.5)}, + {Timestamp: "2026-05-03T12:00:01Z", MemoryUtilization: float64Ptr(0.75)}, + }, + }, + } +} + +func jobMetricsResponse() *civ1.GetJobMetricsResponse { + return &civ1.GetJobMetricsResponse{ + SnapshotAt: "2026-05-03T12:01:00Z", + Run: metricsRun(), + Workflow: metricsWorkflow(), + Job: metricsJob(), + Attempts: []*civ1.CIMetricsAttemptSummary{ + { + Attempt: metricsAttempt(), + Availability: availableMetrics(), + Stats: metricsStats(), + Cap: metricsCap(), + }, + }, + } +} + +func runMetricsResponse() *civ1.GetRunMetricsResponse { + return &civ1.GetRunMetricsResponse{ + SnapshotAt: "2026-05-03T12:01:00Z", + Run: metricsRun(), + Workflows: []*civ1.CIMetricsWorkflowMetrics{ + { + Workflow: metricsWorkflow(), + Jobs: []*civ1.CIMetricsJobMetrics{ + { + Job: metricsJob(), + Attempts: []*civ1.CIMetricsAttemptSummary{ + { + Attempt: metricsAttempt(), + Availability: availableMetrics(), + Stats: metricsStats(), + Cap: metricsCap(), + }, + }, + }, + }, + }, + }, + } +} + +func metricsRun() *civ1.CIMetricsRunContext { + return &civ1.CIMetricsRunContext{RunId: "run-1", Repo: "depot/api", Status: "running"} +} + +func metricsWorkflow() *civ1.CIMetricsWorkflowContext { + return &civ1.CIMetricsWorkflowContext{WorkflowId: "workflow-1", Name: "CI", Status: "running"} +} + +func metricsJob() *civ1.CIMetricsJobContext { + return &civ1.CIMetricsJobContext{JobId: "job-1", JobKey: "build", Status: "running", CurrentAttempt: 1} +} + +func metricsAttempt() *civ1.CIMetricsAttemptContext { + return &civ1.CIMetricsAttemptContext{AttemptId: "att-1", Attempt: 1, Status: "running", SandboxId: "sandbox-1"} +} + +func availableMetrics() *civ1.CIMetricsAvailability { + return &civ1.CIMetricsAvailability{ + Code: civ1.CIMetricsAvailabilityCode_CI_METRICS_AVAILABILITY_CODE_AVAILABLE, + Reason: "available", + } +} + +func metricsStats() *civ1.CIMetricsStats { + return &civ1.CIMetricsStats{ + SampleCount: 2, + CpuSampleCount: 1, + MemorySampleCount: 1, + PeakCpuUtilization: float64Ptr(0.5), + AverageCpuUtilization: float64Ptr(0.5), + PeakMemoryUtilization: float64Ptr(0.75), + AverageMemoryUtilization: float64Ptr(0.75), + ObservedStartedAt: "2026-05-03T12:00:00Z", + ObservedFinishedAt: "2026-05-03T12:00:01Z", + } +} + +func metricsCap() *civ1.CIMetricsCapMetadata { + return &civ1.CIMetricsCapMetadata{ + RawSampleCount: 2, + ReturnedSampleCount: 2, + MaxReturnedSampleCount: 5000, + } +} + +func float64Ptr(value float64) *float64 { + return &value +} diff --git a/pkg/proto/depot/ci/v1/ci.pb.go b/pkg/proto/depot/ci/v1/ci.pb.go index 8292790b..a5d622b0 100644 --- a/pkg/proto/depot/ci/v1/ci.pb.go +++ b/pkg/proto/depot/ci/v1/ci.pb.go @@ -20,6 +20,61 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type CIMetricsAvailabilityCode int32 + +const ( + CIMetricsAvailabilityCode_CI_METRICS_AVAILABILITY_CODE_UNSPECIFIED CIMetricsAvailabilityCode = 0 + CIMetricsAvailabilityCode_CI_METRICS_AVAILABILITY_CODE_AVAILABLE CIMetricsAvailabilityCode = 1 + CIMetricsAvailabilityCode_CI_METRICS_AVAILABILITY_CODE_NO_SANDBOX CIMetricsAvailabilityCode = 2 + CIMetricsAvailabilityCode_CI_METRICS_AVAILABILITY_CODE_NO_TIME_RANGE CIMetricsAvailabilityCode = 3 + CIMetricsAvailabilityCode_CI_METRICS_AVAILABILITY_CODE_NO_SAMPLES CIMetricsAvailabilityCode = 4 +) + +// Enum value maps for CIMetricsAvailabilityCode. +var ( + CIMetricsAvailabilityCode_name = map[int32]string{ + 0: "CI_METRICS_AVAILABILITY_CODE_UNSPECIFIED", + 1: "CI_METRICS_AVAILABILITY_CODE_AVAILABLE", + 2: "CI_METRICS_AVAILABILITY_CODE_NO_SANDBOX", + 3: "CI_METRICS_AVAILABILITY_CODE_NO_TIME_RANGE", + 4: "CI_METRICS_AVAILABILITY_CODE_NO_SAMPLES", + } + CIMetricsAvailabilityCode_value = map[string]int32{ + "CI_METRICS_AVAILABILITY_CODE_UNSPECIFIED": 0, + "CI_METRICS_AVAILABILITY_CODE_AVAILABLE": 1, + "CI_METRICS_AVAILABILITY_CODE_NO_SANDBOX": 2, + "CI_METRICS_AVAILABILITY_CODE_NO_TIME_RANGE": 3, + "CI_METRICS_AVAILABILITY_CODE_NO_SAMPLES": 4, + } +) + +func (x CIMetricsAvailabilityCode) Enum() *CIMetricsAvailabilityCode { + p := new(CIMetricsAvailabilityCode) + *p = x + return p +} + +func (x CIMetricsAvailabilityCode) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (CIMetricsAvailabilityCode) Descriptor() protoreflect.EnumDescriptor { + return file_depot_ci_v1_ci_proto_enumTypes[0].Descriptor() +} + +func (CIMetricsAvailabilityCode) Type() protoreflect.EnumType { + return &file_depot_ci_v1_ci_proto_enumTypes[0] +} + +func (x CIMetricsAvailabilityCode) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use CIMetricsAvailabilityCode.Descriptor instead. +func (CIMetricsAvailabilityCode) EnumDescriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{0} +} + type JobAttemptLogExportFormat int32 const ( @@ -58,11 +113,11 @@ func (x JobAttemptLogExportFormat) String() string { } func (JobAttemptLogExportFormat) Descriptor() protoreflect.EnumDescriptor { - return file_depot_ci_v1_ci_proto_enumTypes[0].Descriptor() + return file_depot_ci_v1_ci_proto_enumTypes[1].Descriptor() } func (JobAttemptLogExportFormat) Type() protoreflect.EnumType { - return &file_depot_ci_v1_ci_proto_enumTypes[0] + return &file_depot_ci_v1_ci_proto_enumTypes[1] } func (x JobAttemptLogExportFormat) Number() protoreflect.EnumNumber { @@ -71,7 +126,7 @@ func (x JobAttemptLogExportFormat) Number() protoreflect.EnumNumber { // Deprecated: Use JobAttemptLogExportFormat.Descriptor instead. func (JobAttemptLogExportFormat) EnumDescriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{0} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{1} } type GetInstallationRequest struct { @@ -2561,19 +2616,17 @@ func (x *GetWorkflowJobAttempt) GetFinishedAt() string { return "" } -type GetJobAttemptLogsRequest struct { +type GetJobAttemptMetricsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // attempt_id identifies the job attempt whose logs to fetch + // attempt_id identifies the concrete job attempt whose metric samples to fetch. AttemptId string `protobuf:"bytes,1,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` - // The page token indicating which page of results to return. - PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` } -func (x *GetJobAttemptLogsRequest) Reset() { - *x = GetJobAttemptLogsRequest{} +func (x *GetJobAttemptMetricsRequest) Reset() { + *x = GetJobAttemptMetricsRequest{} if protoimpl.UnsafeEnabled { mi := &file_depot_ci_v1_ci_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2581,13 +2634,13 @@ func (x *GetJobAttemptLogsRequest) Reset() { } } -func (x *GetJobAttemptLogsRequest) String() string { +func (x *GetJobAttemptMetricsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetJobAttemptLogsRequest) ProtoMessage() {} +func (*GetJobAttemptMetricsRequest) ProtoMessage() {} -func (x *GetJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { +func (x *GetJobAttemptMetricsRequest) ProtoReflect() protoreflect.Message { mi := &file_depot_ci_v1_ci_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2599,37 +2652,29 @@ func (x *GetJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetJobAttemptLogsRequest.ProtoReflect.Descriptor instead. -func (*GetJobAttemptLogsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetJobAttemptMetricsRequest.ProtoReflect.Descriptor instead. +func (*GetJobAttemptMetricsRequest) Descriptor() ([]byte, []int) { return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{35} } -func (x *GetJobAttemptLogsRequest) GetAttemptId() string { +func (x *GetJobAttemptMetricsRequest) GetAttemptId() string { if x != nil { return x.AttemptId } return "" } -func (x *GetJobAttemptLogsRequest) GetPageToken() string { - if x != nil { - return x.PageToken - } - return "" -} - -type GetJobAttemptLogsResponse struct { +type GetJobMetricsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Lines []*LogLine `protobuf:"bytes,1,rep,name=lines,proto3" json:"lines,omitempty"` - // Token to retrieve the next page of results; empty if no more pages. - NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + // job_id identifies the job whose attempts should be summarized. + JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` } -func (x *GetJobAttemptLogsResponse) Reset() { - *x = GetJobAttemptLogsResponse{} +func (x *GetJobMetricsRequest) Reset() { + *x = GetJobMetricsRequest{} if protoimpl.UnsafeEnabled { mi := &file_depot_ci_v1_ci_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2637,13 +2682,13 @@ func (x *GetJobAttemptLogsResponse) Reset() { } } -func (x *GetJobAttemptLogsResponse) String() string { +func (x *GetJobMetricsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*GetJobAttemptLogsResponse) ProtoMessage() {} +func (*GetJobMetricsRequest) ProtoMessage() {} -func (x *GetJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { +func (x *GetJobMetricsRequest) ProtoReflect() protoreflect.Message { mi := &file_depot_ci_v1_ci_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2655,43 +2700,29 @@ func (x *GetJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use GetJobAttemptLogsResponse.ProtoReflect.Descriptor instead. -func (*GetJobAttemptLogsResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use GetJobMetricsRequest.ProtoReflect.Descriptor instead. +func (*GetJobMetricsRequest) Descriptor() ([]byte, []int) { return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{36} } -func (x *GetJobAttemptLogsResponse) GetLines() []*LogLine { - if x != nil { - return x.Lines - } - return nil -} - -func (x *GetJobAttemptLogsResponse) GetNextPageToken() string { +func (x *GetJobMetricsRequest) GetJobId() string { if x != nil { - return x.NextPageToken + return x.JobId } return "" } -type StreamJobAttemptLogsRequest struct { +type GetRunMetricsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // attempt_id identifies the concrete job attempt whose logs to stream. Set - // exactly one of attempt_id or job_id. - AttemptId string `protobuf:"bytes,1,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` - // Opaque cursor returned by a previous stream response for the same target. - // Omit it to stream from the first persisted line. - Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` - // job_id identifies a CI job. The stream resolves it to that job's latest - // attempt. Set exactly one of attempt_id or job_id. - JobId string `protobuf:"bytes,3,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` + // run_id identifies the run whose workflow/job/attempt metrics should be summarized. + RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"` } -func (x *StreamJobAttemptLogsRequest) Reset() { - *x = StreamJobAttemptLogsRequest{} +func (x *GetRunMetricsRequest) Reset() { + *x = GetRunMetricsRequest{} if protoimpl.UnsafeEnabled { mi := &file_depot_ci_v1_ci_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2699,13 +2730,13 @@ func (x *StreamJobAttemptLogsRequest) Reset() { } } -func (x *StreamJobAttemptLogsRequest) String() string { +func (x *GetRunMetricsRequest) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StreamJobAttemptLogsRequest) ProtoMessage() {} +func (*GetRunMetricsRequest) ProtoMessage() {} -func (x *StreamJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { +func (x *GetRunMetricsRequest) ProtoReflect() protoreflect.Message { mi := &file_depot_ci_v1_ci_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2717,49 +2748,33 @@ func (x *StreamJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StreamJobAttemptLogsRequest.ProtoReflect.Descriptor instead. -func (*StreamJobAttemptLogsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetRunMetricsRequest.ProtoReflect.Descriptor instead. +func (*GetRunMetricsRequest) Descriptor() ([]byte, []int) { return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{37} } -func (x *StreamJobAttemptLogsRequest) GetAttemptId() string { - if x != nil { - return x.AttemptId - } - return "" -} - -func (x *StreamJobAttemptLogsRequest) GetCursor() string { - if x != nil { - return x.Cursor - } - return "" -} - -func (x *StreamJobAttemptLogsRequest) GetJobId() string { +func (x *GetRunMetricsRequest) GetRunId() string { if x != nil { - return x.JobId + return x.RunId } return "" } -type StreamJobAttemptLogsResponse struct { +type GetJobAttemptMetricsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // line is set when this response carries a persisted log line. - // Status-only responses can omit it while the stream is waiting for rows. - Line *LogLine `protobuf:"bytes,1,opt,name=line,proto3" json:"line,omitempty"` - // Opaque cursor to resume after the emitted line. - NextCursor string `protobuf:"bytes,2,opt,name=next_cursor,json=nextCursor,proto3" json:"next_cursor,omitempty"` - // attempt_status is the current lowercase attempt state, e.g. "queued", - // "running", "finished", "failed", or "cancelled". - AttemptStatus string `protobuf:"bytes,3,opt,name=attempt_status,json=attemptStatus,proto3" json:"attempt_status,omitempty"` + Run *CIMetricsRunContext `protobuf:"bytes,1,opt,name=run,proto3" json:"run,omitempty"` + Workflow *CIMetricsWorkflowContext `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` + Job *CIMetricsJobContext `protobuf:"bytes,3,opt,name=job,proto3" json:"job,omitempty"` + Attempt *CIMetricsAttemptMetrics `protobuf:"bytes,4,opt,name=attempt,proto3" json:"attempt,omitempty"` + // snapshot_at is the request timestamp used as the upper bound for running attempts. + SnapshotAt string `protobuf:"bytes,5,opt,name=snapshot_at,json=snapshotAt,proto3" json:"snapshot_at,omitempty"` } -func (x *StreamJobAttemptLogsResponse) Reset() { - *x = StreamJobAttemptLogsResponse{} +func (x *GetJobAttemptMetricsResponse) Reset() { + *x = GetJobAttemptMetricsResponse{} if protoimpl.UnsafeEnabled { mi := &file_depot_ci_v1_ci_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2767,13 +2782,13 @@ func (x *StreamJobAttemptLogsResponse) Reset() { } } -func (x *StreamJobAttemptLogsResponse) String() string { +func (x *GetJobAttemptMetricsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*StreamJobAttemptLogsResponse) ProtoMessage() {} +func (*GetJobAttemptMetricsResponse) ProtoMessage() {} -func (x *StreamJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { +func (x *GetJobAttemptMetricsResponse) ProtoReflect() protoreflect.Message { mi := &file_depot_ci_v1_ci_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2785,49 +2800,61 @@ func (x *StreamJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use StreamJobAttemptLogsResponse.ProtoReflect.Descriptor instead. -func (*StreamJobAttemptLogsResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use GetJobAttemptMetricsResponse.ProtoReflect.Descriptor instead. +func (*GetJobAttemptMetricsResponse) Descriptor() ([]byte, []int) { return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{38} } -func (x *StreamJobAttemptLogsResponse) GetLine() *LogLine { +func (x *GetJobAttemptMetricsResponse) GetRun() *CIMetricsRunContext { if x != nil { - return x.Line + return x.Run } return nil } -func (x *StreamJobAttemptLogsResponse) GetNextCursor() string { +func (x *GetJobAttemptMetricsResponse) GetWorkflow() *CIMetricsWorkflowContext { if x != nil { - return x.NextCursor + return x.Workflow } - return "" + return nil } -func (x *StreamJobAttemptLogsResponse) GetAttemptStatus() string { +func (x *GetJobAttemptMetricsResponse) GetJob() *CIMetricsJobContext { if x != nil { - return x.AttemptStatus + return x.Job + } + return nil +} + +func (x *GetJobAttemptMetricsResponse) GetAttempt() *CIMetricsAttemptMetrics { + if x != nil { + return x.Attempt + } + return nil +} + +func (x *GetJobAttemptMetricsResponse) GetSnapshotAt() string { + if x != nil { + return x.SnapshotAt } return "" } -type ExportJobAttemptLogsRequest struct { +type GetJobMetricsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // attempt_id identifies the concrete job attempt whose logs to export. Set - // exactly one of attempt_id or job_id. - AttemptId string `protobuf:"bytes,1,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` - // job_id identifies a CI job. Export resolves it to that job's latest attempt - // at stream start. Set exactly one of attempt_id or job_id. - JobId string `protobuf:"bytes,2,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` - // format selects the export byte format. Unspecified defaults to text. - Format JobAttemptLogExportFormat `protobuf:"varint,3,opt,name=format,proto3,enum=depot.ci.v1.JobAttemptLogExportFormat" json:"format,omitempty"` + Run *CIMetricsRunContext `protobuf:"bytes,1,opt,name=run,proto3" json:"run,omitempty"` + Workflow *CIMetricsWorkflowContext `protobuf:"bytes,2,opt,name=workflow,proto3" json:"workflow,omitempty"` + Job *CIMetricsJobContext `protobuf:"bytes,3,opt,name=job,proto3" json:"job,omitempty"` + Attempts []*CIMetricsAttemptSummary `protobuf:"bytes,4,rep,name=attempts,proto3" json:"attempts,omitempty"` + // snapshot_at is the request timestamp used as the upper bound for running attempts. + SnapshotAt string `protobuf:"bytes,5,opt,name=snapshot_at,json=snapshotAt,proto3" json:"snapshot_at,omitempty"` } -func (x *ExportJobAttemptLogsRequest) Reset() { - *x = ExportJobAttemptLogsRequest{} +func (x *GetJobMetricsResponse) Reset() { + *x = GetJobMetricsResponse{} if protoimpl.UnsafeEnabled { mi := &file_depot_ci_v1_ci_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2835,13 +2862,13 @@ func (x *ExportJobAttemptLogsRequest) Reset() { } } -func (x *ExportJobAttemptLogsRequest) String() string { +func (x *GetJobMetricsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ExportJobAttemptLogsRequest) ProtoMessage() {} +func (*GetJobMetricsResponse) ProtoMessage() {} -func (x *ExportJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { +func (x *GetJobMetricsResponse) ProtoReflect() protoreflect.Message { mi := &file_depot_ci_v1_ci_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2853,52 +2880,59 @@ func (x *ExportJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ExportJobAttemptLogsRequest.ProtoReflect.Descriptor instead. -func (*ExportJobAttemptLogsRequest) Descriptor() ([]byte, []int) { +// Deprecated: Use GetJobMetricsResponse.ProtoReflect.Descriptor instead. +func (*GetJobMetricsResponse) Descriptor() ([]byte, []int) { return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{39} } -func (x *ExportJobAttemptLogsRequest) GetAttemptId() string { +func (x *GetJobMetricsResponse) GetRun() *CIMetricsRunContext { if x != nil { - return x.AttemptId + return x.Run } - return "" + return nil } -func (x *ExportJobAttemptLogsRequest) GetJobId() string { +func (x *GetJobMetricsResponse) GetWorkflow() *CIMetricsWorkflowContext { if x != nil { - return x.JobId + return x.Workflow } - return "" + return nil } -func (x *ExportJobAttemptLogsRequest) GetFormat() JobAttemptLogExportFormat { +func (x *GetJobMetricsResponse) GetJob() *CIMetricsJobContext { if x != nil { - return x.Format + return x.Job } - return JobAttemptLogExportFormat_JOB_ATTEMPT_LOG_EXPORT_FORMAT_UNSPECIFIED + return nil } -type JobAttemptLogExportMetadata struct { +func (x *GetJobMetricsResponse) GetAttempts() []*CIMetricsAttemptSummary { + if x != nil { + return x.Attempts + } + return nil +} + +func (x *GetJobMetricsResponse) GetSnapshotAt() string { + if x != nil { + return x.SnapshotAt + } + return "" +} + +type GetRunMetricsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // filename is an advisory, non-stable basename hint for generated clients. - // It is not a destination path and clients must not depend on the stem staying - // stable across calls. It is basename-only ASCII and ends in .txt for text or - // .jsonl for JSONL. - Filename string `protobuf:"bytes,1,opt,name=filename,proto3" json:"filename,omitempty"` - // content_type is the exact media type for chunk bytes: - // `text/plain; charset=utf-8` for text or - // `application/x-ndjson; charset=utf-8` for JSONL. - ContentType string `protobuf:"bytes,2,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` - // format is the selected byte format for following chunk responses. - Format JobAttemptLogExportFormat `protobuf:"varint,3,opt,name=format,proto3,enum=depot.ci.v1.JobAttemptLogExportFormat" json:"format,omitempty"` + Run *CIMetricsRunContext `protobuf:"bytes,1,opt,name=run,proto3" json:"run,omitempty"` + Workflows []*CIMetricsWorkflowMetrics `protobuf:"bytes,2,rep,name=workflows,proto3" json:"workflows,omitempty"` + // snapshot_at is the request timestamp used as the upper bound for running attempts. + SnapshotAt string `protobuf:"bytes,3,opt,name=snapshot_at,json=snapshotAt,proto3" json:"snapshot_at,omitempty"` } -func (x *JobAttemptLogExportMetadata) Reset() { - *x = JobAttemptLogExportMetadata{} +func (x *GetRunMetricsResponse) Reset() { + *x = GetRunMetricsResponse{} if protoimpl.UnsafeEnabled { mi := &file_depot_ci_v1_ci_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2906,13 +2940,13 @@ func (x *JobAttemptLogExportMetadata) Reset() { } } -func (x *JobAttemptLogExportMetadata) String() string { +func (x *GetRunMetricsResponse) String() string { return protoimpl.X.MessageStringOf(x) } -func (*JobAttemptLogExportMetadata) ProtoMessage() {} +func (*GetRunMetricsResponse) ProtoMessage() {} -func (x *JobAttemptLogExportMetadata) ProtoReflect() protoreflect.Message { +func (x *GetRunMetricsResponse) ProtoReflect() protoreflect.Message { mi := &file_depot_ci_v1_ci_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2924,46 +2958,43 @@ func (x *JobAttemptLogExportMetadata) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use JobAttemptLogExportMetadata.ProtoReflect.Descriptor instead. -func (*JobAttemptLogExportMetadata) Descriptor() ([]byte, []int) { +// Deprecated: Use GetRunMetricsResponse.ProtoReflect.Descriptor instead. +func (*GetRunMetricsResponse) Descriptor() ([]byte, []int) { return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{40} } -func (x *JobAttemptLogExportMetadata) GetFilename() string { +func (x *GetRunMetricsResponse) GetRun() *CIMetricsRunContext { if x != nil { - return x.Filename + return x.Run } - return "" + return nil } -func (x *JobAttemptLogExportMetadata) GetContentType() string { +func (x *GetRunMetricsResponse) GetWorkflows() []*CIMetricsWorkflowMetrics { if x != nil { - return x.ContentType + return x.Workflows } - return "" + return nil } -func (x *JobAttemptLogExportMetadata) GetFormat() JobAttemptLogExportFormat { +func (x *GetRunMetricsResponse) GetSnapshotAt() string { if x != nil { - return x.Format + return x.SnapshotAt } - return JobAttemptLogExportFormat_JOB_ATTEMPT_LOG_EXPORT_FORMAT_UNSPECIFIED + return "" } -type ExportJobAttemptLogsResponse struct { +type CIMetricsWorkflowMetrics struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Types that are assignable to Event: - // - // *ExportJobAttemptLogsResponse_Metadata - // *ExportJobAttemptLogsResponse_Chunk - Event isExportJobAttemptLogsResponse_Event `protobuf_oneof:"event"` + Workflow *CIMetricsWorkflowContext `protobuf:"bytes,1,opt,name=workflow,proto3" json:"workflow,omitempty"` + Jobs []*CIMetricsJobMetrics `protobuf:"bytes,2,rep,name=jobs,proto3" json:"jobs,omitempty"` } -func (x *ExportJobAttemptLogsResponse) Reset() { - *x = ExportJobAttemptLogsResponse{} +func (x *CIMetricsWorkflowMetrics) Reset() { + *x = CIMetricsWorkflowMetrics{} if protoimpl.UnsafeEnabled { mi := &file_depot_ci_v1_ci_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2971,13 +3002,13 @@ func (x *ExportJobAttemptLogsResponse) Reset() { } } -func (x *ExportJobAttemptLogsResponse) String() string { +func (x *CIMetricsWorkflowMetrics) String() string { return protoimpl.X.MessageStringOf(x) } -func (*ExportJobAttemptLogsResponse) ProtoMessage() {} +func (*CIMetricsWorkflowMetrics) ProtoMessage() {} -func (x *ExportJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { +func (x *CIMetricsWorkflowMetrics) ProtoReflect() protoreflect.Message { mi := &file_depot_ci_v1_ci_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2989,37 +3020,1449 @@ func (x *ExportJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use ExportJobAttemptLogsResponse.ProtoReflect.Descriptor instead. -func (*ExportJobAttemptLogsResponse) Descriptor() ([]byte, []int) { +// Deprecated: Use CIMetricsWorkflowMetrics.ProtoReflect.Descriptor instead. +func (*CIMetricsWorkflowMetrics) Descriptor() ([]byte, []int) { return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{41} } -func (m *ExportJobAttemptLogsResponse) GetEvent() isExportJobAttemptLogsResponse_Event { - if m != nil { - return m.Event +func (x *CIMetricsWorkflowMetrics) GetWorkflow() *CIMetricsWorkflowContext { + if x != nil { + return x.Workflow } return nil } -func (x *ExportJobAttemptLogsResponse) GetMetadata() *JobAttemptLogExportMetadata { - if x, ok := x.GetEvent().(*ExportJobAttemptLogsResponse_Metadata); ok { - return x.Metadata +func (x *CIMetricsWorkflowMetrics) GetJobs() []*CIMetricsJobMetrics { + if x != nil { + return x.Jobs } return nil } -func (x *ExportJobAttemptLogsResponse) GetChunk() []byte { - if x, ok := x.GetEvent().(*ExportJobAttemptLogsResponse_Chunk); ok { - return x.Chunk +type CIMetricsJobMetrics struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Job *CIMetricsJobContext `protobuf:"bytes,1,opt,name=job,proto3" json:"job,omitempty"` + Attempts []*CIMetricsAttemptSummary `protobuf:"bytes,2,rep,name=attempts,proto3" json:"attempts,omitempty"` +} + +func (x *CIMetricsJobMetrics) Reset() { + *x = CIMetricsJobMetrics{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } - return nil } -type isExportJobAttemptLogsResponse_Event interface { - isExportJobAttemptLogsResponse_Event() +func (x *CIMetricsJobMetrics) String() string { + return protoimpl.X.MessageStringOf(x) } -type ExportJobAttemptLogsResponse_Metadata struct { +func (*CIMetricsJobMetrics) ProtoMessage() {} + +func (x *CIMetricsJobMetrics) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[42] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CIMetricsJobMetrics.ProtoReflect.Descriptor instead. +func (*CIMetricsJobMetrics) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{42} +} + +func (x *CIMetricsJobMetrics) GetJob() *CIMetricsJobContext { + if x != nil { + return x.Job + } + return nil +} + +func (x *CIMetricsJobMetrics) GetAttempts() []*CIMetricsAttemptSummary { + if x != nil { + return x.Attempts + } + return nil +} + +type CIMetricsAttemptMetrics struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Attempt *CIMetricsAttemptContext `protobuf:"bytes,1,opt,name=attempt,proto3" json:"attempt,omitempty"` + Availability *CIMetricsAvailability `protobuf:"bytes,2,opt,name=availability,proto3" json:"availability,omitempty"` + Stats *CIMetricsStats `protobuf:"bytes,3,opt,name=stats,proto3" json:"stats,omitempty"` + Cap *CIMetricsCapMetadata `protobuf:"bytes,4,opt,name=cap,proto3" json:"cap,omitempty"` + Samples []*CIMetricSample `protobuf:"bytes,5,rep,name=samples,proto3" json:"samples,omitempty"` +} + +func (x *CIMetricsAttemptMetrics) Reset() { + *x = CIMetricsAttemptMetrics{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CIMetricsAttemptMetrics) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CIMetricsAttemptMetrics) ProtoMessage() {} + +func (x *CIMetricsAttemptMetrics) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[43] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CIMetricsAttemptMetrics.ProtoReflect.Descriptor instead. +func (*CIMetricsAttemptMetrics) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{43} +} + +func (x *CIMetricsAttemptMetrics) GetAttempt() *CIMetricsAttemptContext { + if x != nil { + return x.Attempt + } + return nil +} + +func (x *CIMetricsAttemptMetrics) GetAvailability() *CIMetricsAvailability { + if x != nil { + return x.Availability + } + return nil +} + +func (x *CIMetricsAttemptMetrics) GetStats() *CIMetricsStats { + if x != nil { + return x.Stats + } + return nil +} + +func (x *CIMetricsAttemptMetrics) GetCap() *CIMetricsCapMetadata { + if x != nil { + return x.Cap + } + return nil +} + +func (x *CIMetricsAttemptMetrics) GetSamples() []*CIMetricSample { + if x != nil { + return x.Samples + } + return nil +} + +type CIMetricsAttemptSummary struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Attempt *CIMetricsAttemptContext `protobuf:"bytes,1,opt,name=attempt,proto3" json:"attempt,omitempty"` + Availability *CIMetricsAvailability `protobuf:"bytes,2,opt,name=availability,proto3" json:"availability,omitempty"` + Stats *CIMetricsStats `protobuf:"bytes,3,opt,name=stats,proto3" json:"stats,omitempty"` + Cap *CIMetricsCapMetadata `protobuf:"bytes,4,opt,name=cap,proto3" json:"cap,omitempty"` +} + +func (x *CIMetricsAttemptSummary) Reset() { + *x = CIMetricsAttemptSummary{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CIMetricsAttemptSummary) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CIMetricsAttemptSummary) ProtoMessage() {} + +func (x *CIMetricsAttemptSummary) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[44] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CIMetricsAttemptSummary.ProtoReflect.Descriptor instead. +func (*CIMetricsAttemptSummary) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{44} +} + +func (x *CIMetricsAttemptSummary) GetAttempt() *CIMetricsAttemptContext { + if x != nil { + return x.Attempt + } + return nil +} + +func (x *CIMetricsAttemptSummary) GetAvailability() *CIMetricsAvailability { + if x != nil { + return x.Availability + } + return nil +} + +func (x *CIMetricsAttemptSummary) GetStats() *CIMetricsStats { + if x != nil { + return x.Stats + } + return nil +} + +func (x *CIMetricsAttemptSummary) GetCap() *CIMetricsCapMetadata { + if x != nil { + return x.Cap + } + return nil +} + +type CIMetricsRunContext struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RunId string `protobuf:"bytes,1,opt,name=run_id,json=runId,proto3" json:"run_id,omitempty"` + Repo string `protobuf:"bytes,2,opt,name=repo,proto3" json:"repo,omitempty"` + Ref string `protobuf:"bytes,3,opt,name=ref,proto3" json:"ref,omitempty"` + Sha string `protobuf:"bytes,4,opt,name=sha,proto3" json:"sha,omitempty"` + HeadSha string `protobuf:"bytes,5,opt,name=head_sha,json=headSha,proto3" json:"head_sha,omitempty"` + Trigger string `protobuf:"bytes,6,opt,name=trigger,proto3" json:"trigger,omitempty"` + Status string `protobuf:"bytes,7,opt,name=status,proto3" json:"status,omitempty"` + CreatedAt string `protobuf:"bytes,8,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + StartedAt string `protobuf:"bytes,9,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` + FinishedAt string `protobuf:"bytes,10,opt,name=finished_at,json=finishedAt,proto3" json:"finished_at,omitempty"` +} + +func (x *CIMetricsRunContext) Reset() { + *x = CIMetricsRunContext{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CIMetricsRunContext) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CIMetricsRunContext) ProtoMessage() {} + +func (x *CIMetricsRunContext) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[45] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CIMetricsRunContext.ProtoReflect.Descriptor instead. +func (*CIMetricsRunContext) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{45} +} + +func (x *CIMetricsRunContext) GetRunId() string { + if x != nil { + return x.RunId + } + return "" +} + +func (x *CIMetricsRunContext) GetRepo() string { + if x != nil { + return x.Repo + } + return "" +} + +func (x *CIMetricsRunContext) GetRef() string { + if x != nil { + return x.Ref + } + return "" +} + +func (x *CIMetricsRunContext) GetSha() string { + if x != nil { + return x.Sha + } + return "" +} + +func (x *CIMetricsRunContext) GetHeadSha() string { + if x != nil { + return x.HeadSha + } + return "" +} + +func (x *CIMetricsRunContext) GetTrigger() string { + if x != nil { + return x.Trigger + } + return "" +} + +func (x *CIMetricsRunContext) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *CIMetricsRunContext) GetCreatedAt() string { + if x != nil { + return x.CreatedAt + } + return "" +} + +func (x *CIMetricsRunContext) GetStartedAt() string { + if x != nil { + return x.StartedAt + } + return "" +} + +func (x *CIMetricsRunContext) GetFinishedAt() string { + if x != nil { + return x.FinishedAt + } + return "" +} + +type CIMetricsWorkflowContext struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + WorkflowId string `protobuf:"bytes,1,opt,name=workflow_id,json=workflowId,proto3" json:"workflow_id,omitempty"` + WorkflowPath string `protobuf:"bytes,2,opt,name=workflow_path,json=workflowPath,proto3" json:"workflow_path,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + CreatedAt string `protobuf:"bytes,5,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + StartedAt string `protobuf:"bytes,6,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` + FinishedAt string `protobuf:"bytes,7,opt,name=finished_at,json=finishedAt,proto3" json:"finished_at,omitempty"` +} + +func (x *CIMetricsWorkflowContext) Reset() { + *x = CIMetricsWorkflowContext{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CIMetricsWorkflowContext) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CIMetricsWorkflowContext) ProtoMessage() {} + +func (x *CIMetricsWorkflowContext) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[46] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CIMetricsWorkflowContext.ProtoReflect.Descriptor instead. +func (*CIMetricsWorkflowContext) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{46} +} + +func (x *CIMetricsWorkflowContext) GetWorkflowId() string { + if x != nil { + return x.WorkflowId + } + return "" +} + +func (x *CIMetricsWorkflowContext) GetWorkflowPath() string { + if x != nil { + return x.WorkflowPath + } + return "" +} + +func (x *CIMetricsWorkflowContext) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *CIMetricsWorkflowContext) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *CIMetricsWorkflowContext) GetCreatedAt() string { + if x != nil { + return x.CreatedAt + } + return "" +} + +func (x *CIMetricsWorkflowContext) GetStartedAt() string { + if x != nil { + return x.StartedAt + } + return "" +} + +func (x *CIMetricsWorkflowContext) GetFinishedAt() string { + if x != nil { + return x.FinishedAt + } + return "" +} + +type CIMetricsJobContext struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + JobId string `protobuf:"bytes,1,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` + JobKey string `protobuf:"bytes,2,opt,name=job_key,json=jobKey,proto3" json:"job_key,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Conclusion string `protobuf:"bytes,4,opt,name=conclusion,proto3" json:"conclusion,omitempty"` + CurrentAttempt int32 `protobuf:"varint,5,opt,name=current_attempt,json=currentAttempt,proto3" json:"current_attempt,omitempty"` + CreatedAt string `protobuf:"bytes,6,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + StartedAt string `protobuf:"bytes,7,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` + FinishedAt string `protobuf:"bytes,8,opt,name=finished_at,json=finishedAt,proto3" json:"finished_at,omitempty"` +} + +func (x *CIMetricsJobContext) Reset() { + *x = CIMetricsJobContext{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CIMetricsJobContext) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CIMetricsJobContext) ProtoMessage() {} + +func (x *CIMetricsJobContext) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[47] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CIMetricsJobContext.ProtoReflect.Descriptor instead. +func (*CIMetricsJobContext) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{47} +} + +func (x *CIMetricsJobContext) GetJobId() string { + if x != nil { + return x.JobId + } + return "" +} + +func (x *CIMetricsJobContext) GetJobKey() string { + if x != nil { + return x.JobKey + } + return "" +} + +func (x *CIMetricsJobContext) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *CIMetricsJobContext) GetConclusion() string { + if x != nil { + return x.Conclusion + } + return "" +} + +func (x *CIMetricsJobContext) GetCurrentAttempt() int32 { + if x != nil { + return x.CurrentAttempt + } + return 0 +} + +func (x *CIMetricsJobContext) GetCreatedAt() string { + if x != nil { + return x.CreatedAt + } + return "" +} + +func (x *CIMetricsJobContext) GetStartedAt() string { + if x != nil { + return x.StartedAt + } + return "" +} + +func (x *CIMetricsJobContext) GetFinishedAt() string { + if x != nil { + return x.FinishedAt + } + return "" +} + +type CIMetricsAttemptContext struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + AttemptId string `protobuf:"bytes,1,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` + Attempt int32 `protobuf:"varint,2,opt,name=attempt,proto3" json:"attempt,omitempty"` + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Conclusion string `protobuf:"bytes,4,opt,name=conclusion,proto3" json:"conclusion,omitempty"` + SandboxId string `protobuf:"bytes,5,opt,name=sandbox_id,json=sandboxId,proto3" json:"sandbox_id,omitempty"` + SessionId string `protobuf:"bytes,6,opt,name=session_id,json=sessionId,proto3" json:"session_id,omitempty"` + CreatedAt string `protobuf:"bytes,7,opt,name=created_at,json=createdAt,proto3" json:"created_at,omitempty"` + StartedAt string `protobuf:"bytes,8,opt,name=started_at,json=startedAt,proto3" json:"started_at,omitempty"` + FinishedAt string `protobuf:"bytes,9,opt,name=finished_at,json=finishedAt,proto3" json:"finished_at,omitempty"` +} + +func (x *CIMetricsAttemptContext) Reset() { + *x = CIMetricsAttemptContext{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CIMetricsAttemptContext) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CIMetricsAttemptContext) ProtoMessage() {} + +func (x *CIMetricsAttemptContext) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[48] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CIMetricsAttemptContext.ProtoReflect.Descriptor instead. +func (*CIMetricsAttemptContext) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{48} +} + +func (x *CIMetricsAttemptContext) GetAttemptId() string { + if x != nil { + return x.AttemptId + } + return "" +} + +func (x *CIMetricsAttemptContext) GetAttempt() int32 { + if x != nil { + return x.Attempt + } + return 0 +} + +func (x *CIMetricsAttemptContext) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *CIMetricsAttemptContext) GetConclusion() string { + if x != nil { + return x.Conclusion + } + return "" +} + +func (x *CIMetricsAttemptContext) GetSandboxId() string { + if x != nil { + return x.SandboxId + } + return "" +} + +func (x *CIMetricsAttemptContext) GetSessionId() string { + if x != nil { + return x.SessionId + } + return "" +} + +func (x *CIMetricsAttemptContext) GetCreatedAt() string { + if x != nil { + return x.CreatedAt + } + return "" +} + +func (x *CIMetricsAttemptContext) GetStartedAt() string { + if x != nil { + return x.StartedAt + } + return "" +} + +func (x *CIMetricsAttemptContext) GetFinishedAt() string { + if x != nil { + return x.FinishedAt + } + return "" +} + +type CIMetricSample struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Timestamp string `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + CpuUtilization *float64 `protobuf:"fixed64,2,opt,name=cpu_utilization,json=cpuUtilization,proto3,oneof" json:"cpu_utilization,omitempty"` + MemoryUtilization *float64 `protobuf:"fixed64,3,opt,name=memory_utilization,json=memoryUtilization,proto3,oneof" json:"memory_utilization,omitempty"` + MemoryUsageBytes *uint64 `protobuf:"varint,4,opt,name=memory_usage_bytes,json=memoryUsageBytes,proto3,oneof" json:"memory_usage_bytes,omitempty"` +} + +func (x *CIMetricSample) Reset() { + *x = CIMetricSample{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CIMetricSample) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CIMetricSample) ProtoMessage() {} + +func (x *CIMetricSample) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[49] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CIMetricSample.ProtoReflect.Descriptor instead. +func (*CIMetricSample) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{49} +} + +func (x *CIMetricSample) GetTimestamp() string { + if x != nil { + return x.Timestamp + } + return "" +} + +func (x *CIMetricSample) GetCpuUtilization() float64 { + if x != nil && x.CpuUtilization != nil { + return *x.CpuUtilization + } + return 0 +} + +func (x *CIMetricSample) GetMemoryUtilization() float64 { + if x != nil && x.MemoryUtilization != nil { + return *x.MemoryUtilization + } + return 0 +} + +func (x *CIMetricSample) GetMemoryUsageBytes() uint64 { + if x != nil && x.MemoryUsageBytes != nil { + return *x.MemoryUsageBytes + } + return 0 +} + +type CIMetricsStats struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + SampleCount uint32 `protobuf:"varint,1,opt,name=sample_count,json=sampleCount,proto3" json:"sample_count,omitempty"` + CpuSampleCount uint32 `protobuf:"varint,2,opt,name=cpu_sample_count,json=cpuSampleCount,proto3" json:"cpu_sample_count,omitempty"` + MemorySampleCount uint32 `protobuf:"varint,3,opt,name=memory_sample_count,json=memorySampleCount,proto3" json:"memory_sample_count,omitempty"` + PeakCpuUtilization *float64 `protobuf:"fixed64,4,opt,name=peak_cpu_utilization,json=peakCpuUtilization,proto3,oneof" json:"peak_cpu_utilization,omitempty"` + AverageCpuUtilization *float64 `protobuf:"fixed64,5,opt,name=average_cpu_utilization,json=averageCpuUtilization,proto3,oneof" json:"average_cpu_utilization,omitempty"` + PeakMemoryUtilization *float64 `protobuf:"fixed64,6,opt,name=peak_memory_utilization,json=peakMemoryUtilization,proto3,oneof" json:"peak_memory_utilization,omitempty"` + AverageMemoryUtilization *float64 `protobuf:"fixed64,7,opt,name=average_memory_utilization,json=averageMemoryUtilization,proto3,oneof" json:"average_memory_utilization,omitempty"` + ObservedStartedAt string `protobuf:"bytes,8,opt,name=observed_started_at,json=observedStartedAt,proto3" json:"observed_started_at,omitempty"` + ObservedFinishedAt string `protobuf:"bytes,9,opt,name=observed_finished_at,json=observedFinishedAt,proto3" json:"observed_finished_at,omitempty"` + PeakMemoryUsageBytes *uint64 `protobuf:"varint,10,opt,name=peak_memory_usage_bytes,json=peakMemoryUsageBytes,proto3,oneof" json:"peak_memory_usage_bytes,omitempty"` + AverageMemoryUsageBytes *float64 `protobuf:"fixed64,11,opt,name=average_memory_usage_bytes,json=averageMemoryUsageBytes,proto3,oneof" json:"average_memory_usage_bytes,omitempty"` +} + +func (x *CIMetricsStats) Reset() { + *x = CIMetricsStats{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CIMetricsStats) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CIMetricsStats) ProtoMessage() {} + +func (x *CIMetricsStats) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[50] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CIMetricsStats.ProtoReflect.Descriptor instead. +func (*CIMetricsStats) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{50} +} + +func (x *CIMetricsStats) GetSampleCount() uint32 { + if x != nil { + return x.SampleCount + } + return 0 +} + +func (x *CIMetricsStats) GetCpuSampleCount() uint32 { + if x != nil { + return x.CpuSampleCount + } + return 0 +} + +func (x *CIMetricsStats) GetMemorySampleCount() uint32 { + if x != nil { + return x.MemorySampleCount + } + return 0 +} + +func (x *CIMetricsStats) GetPeakCpuUtilization() float64 { + if x != nil && x.PeakCpuUtilization != nil { + return *x.PeakCpuUtilization + } + return 0 +} + +func (x *CIMetricsStats) GetAverageCpuUtilization() float64 { + if x != nil && x.AverageCpuUtilization != nil { + return *x.AverageCpuUtilization + } + return 0 +} + +func (x *CIMetricsStats) GetPeakMemoryUtilization() float64 { + if x != nil && x.PeakMemoryUtilization != nil { + return *x.PeakMemoryUtilization + } + return 0 +} + +func (x *CIMetricsStats) GetAverageMemoryUtilization() float64 { + if x != nil && x.AverageMemoryUtilization != nil { + return *x.AverageMemoryUtilization + } + return 0 +} + +func (x *CIMetricsStats) GetObservedStartedAt() string { + if x != nil { + return x.ObservedStartedAt + } + return "" +} + +func (x *CIMetricsStats) GetObservedFinishedAt() string { + if x != nil { + return x.ObservedFinishedAt + } + return "" +} + +func (x *CIMetricsStats) GetPeakMemoryUsageBytes() uint64 { + if x != nil && x.PeakMemoryUsageBytes != nil { + return *x.PeakMemoryUsageBytes + } + return 0 +} + +func (x *CIMetricsStats) GetAverageMemoryUsageBytes() float64 { + if x != nil && x.AverageMemoryUsageBytes != nil { + return *x.AverageMemoryUsageBytes + } + return 0 +} + +type CIMetricsAvailability struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Code CIMetricsAvailabilityCode `protobuf:"varint,1,opt,name=code,proto3,enum=depot.ci.v1.CIMetricsAvailabilityCode" json:"code,omitempty"` + Reason string `protobuf:"bytes,2,opt,name=reason,proto3" json:"reason,omitempty"` +} + +func (x *CIMetricsAvailability) Reset() { + *x = CIMetricsAvailability{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CIMetricsAvailability) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CIMetricsAvailability) ProtoMessage() {} + +func (x *CIMetricsAvailability) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[51] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CIMetricsAvailability.ProtoReflect.Descriptor instead. +func (*CIMetricsAvailability) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{51} +} + +func (x *CIMetricsAvailability) GetCode() CIMetricsAvailabilityCode { + if x != nil { + return x.Code + } + return CIMetricsAvailabilityCode_CI_METRICS_AVAILABILITY_CODE_UNSPECIFIED +} + +func (x *CIMetricsAvailability) GetReason() string { + if x != nil { + return x.Reason + } + return "" +} + +type CIMetricsCapMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RawSampleCount uint32 `protobuf:"varint,1,opt,name=raw_sample_count,json=rawSampleCount,proto3" json:"raw_sample_count,omitempty"` + ReturnedSampleCount uint32 `protobuf:"varint,2,opt,name=returned_sample_count,json=returnedSampleCount,proto3" json:"returned_sample_count,omitempty"` + MaxReturnedSampleCount uint32 `protobuf:"varint,3,opt,name=max_returned_sample_count,json=maxReturnedSampleCount,proto3" json:"max_returned_sample_count,omitempty"` + Downsampled bool `protobuf:"varint,4,opt,name=downsampled,proto3" json:"downsampled,omitempty"` + DownsampleStrategy string `protobuf:"bytes,5,opt,name=downsample_strategy,json=downsampleStrategy,proto3" json:"downsample_strategy,omitempty"` +} + +func (x *CIMetricsCapMetadata) Reset() { + *x = CIMetricsCapMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CIMetricsCapMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CIMetricsCapMetadata) ProtoMessage() {} + +func (x *CIMetricsCapMetadata) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[52] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CIMetricsCapMetadata.ProtoReflect.Descriptor instead. +func (*CIMetricsCapMetadata) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{52} +} + +func (x *CIMetricsCapMetadata) GetRawSampleCount() uint32 { + if x != nil { + return x.RawSampleCount + } + return 0 +} + +func (x *CIMetricsCapMetadata) GetReturnedSampleCount() uint32 { + if x != nil { + return x.ReturnedSampleCount + } + return 0 +} + +func (x *CIMetricsCapMetadata) GetMaxReturnedSampleCount() uint32 { + if x != nil { + return x.MaxReturnedSampleCount + } + return 0 +} + +func (x *CIMetricsCapMetadata) GetDownsampled() bool { + if x != nil { + return x.Downsampled + } + return false +} + +func (x *CIMetricsCapMetadata) GetDownsampleStrategy() string { + if x != nil { + return x.DownsampleStrategy + } + return "" +} + +type GetJobAttemptLogsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // attempt_id identifies the job attempt whose logs to fetch + AttemptId string `protobuf:"bytes,1,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` + // The page token indicating which page of results to return. + PageToken string `protobuf:"bytes,2,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` +} + +func (x *GetJobAttemptLogsRequest) Reset() { + *x = GetJobAttemptLogsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetJobAttemptLogsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJobAttemptLogsRequest) ProtoMessage() {} + +func (x *GetJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[53] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetJobAttemptLogsRequest.ProtoReflect.Descriptor instead. +func (*GetJobAttemptLogsRequest) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{53} +} + +func (x *GetJobAttemptLogsRequest) GetAttemptId() string { + if x != nil { + return x.AttemptId + } + return "" +} + +func (x *GetJobAttemptLogsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +type GetJobAttemptLogsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Lines []*LogLine `protobuf:"bytes,1,rep,name=lines,proto3" json:"lines,omitempty"` + // Token to retrieve the next page of results; empty if no more pages. + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` +} + +func (x *GetJobAttemptLogsResponse) Reset() { + *x = GetJobAttemptLogsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GetJobAttemptLogsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetJobAttemptLogsResponse) ProtoMessage() {} + +func (x *GetJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[54] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetJobAttemptLogsResponse.ProtoReflect.Descriptor instead. +func (*GetJobAttemptLogsResponse) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{54} +} + +func (x *GetJobAttemptLogsResponse) GetLines() []*LogLine { + if x != nil { + return x.Lines + } + return nil +} + +func (x *GetJobAttemptLogsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +type StreamJobAttemptLogsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // attempt_id identifies the concrete job attempt whose logs to stream. Set + // exactly one of attempt_id or job_id. + AttemptId string `protobuf:"bytes,1,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` + // Opaque cursor returned by a previous stream response for the same target. + // Omit it to stream from the first persisted line. + Cursor string `protobuf:"bytes,2,opt,name=cursor,proto3" json:"cursor,omitempty"` + // job_id identifies a CI job. The stream resolves it to that job's latest + // attempt. Set exactly one of attempt_id or job_id. + JobId string `protobuf:"bytes,3,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` +} + +func (x *StreamJobAttemptLogsRequest) Reset() { + *x = StreamJobAttemptLogsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StreamJobAttemptLogsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StreamJobAttemptLogsRequest) ProtoMessage() {} + +func (x *StreamJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[55] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StreamJobAttemptLogsRequest.ProtoReflect.Descriptor instead. +func (*StreamJobAttemptLogsRequest) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{55} +} + +func (x *StreamJobAttemptLogsRequest) GetAttemptId() string { + if x != nil { + return x.AttemptId + } + return "" +} + +func (x *StreamJobAttemptLogsRequest) GetCursor() string { + if x != nil { + return x.Cursor + } + return "" +} + +func (x *StreamJobAttemptLogsRequest) GetJobId() string { + if x != nil { + return x.JobId + } + return "" +} + +type StreamJobAttemptLogsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // line is set when this response carries a persisted log line. + // Status-only responses can omit it while the stream is waiting for rows. + Line *LogLine `protobuf:"bytes,1,opt,name=line,proto3" json:"line,omitempty"` + // Opaque cursor to resume after the emitted line. + NextCursor string `protobuf:"bytes,2,opt,name=next_cursor,json=nextCursor,proto3" json:"next_cursor,omitempty"` + // attempt_status is the current lowercase attempt state, e.g. "queued", + // "running", "finished", "failed", or "cancelled". + AttemptStatus string `protobuf:"bytes,3,opt,name=attempt_status,json=attemptStatus,proto3" json:"attempt_status,omitempty"` +} + +func (x *StreamJobAttemptLogsResponse) Reset() { + *x = StreamJobAttemptLogsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StreamJobAttemptLogsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StreamJobAttemptLogsResponse) ProtoMessage() {} + +func (x *StreamJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[56] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StreamJobAttemptLogsResponse.ProtoReflect.Descriptor instead. +func (*StreamJobAttemptLogsResponse) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{56} +} + +func (x *StreamJobAttemptLogsResponse) GetLine() *LogLine { + if x != nil { + return x.Line + } + return nil +} + +func (x *StreamJobAttemptLogsResponse) GetNextCursor() string { + if x != nil { + return x.NextCursor + } + return "" +} + +func (x *StreamJobAttemptLogsResponse) GetAttemptStatus() string { + if x != nil { + return x.AttemptStatus + } + return "" +} + +type ExportJobAttemptLogsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // attempt_id identifies the concrete job attempt whose logs to export. Set + // exactly one of attempt_id or job_id. + AttemptId string `protobuf:"bytes,1,opt,name=attempt_id,json=attemptId,proto3" json:"attempt_id,omitempty"` + // job_id identifies a CI job. Export resolves it to that job's latest attempt + // at stream start. Set exactly one of attempt_id or job_id. + JobId string `protobuf:"bytes,2,opt,name=job_id,json=jobId,proto3" json:"job_id,omitempty"` + // format selects the export byte format. Unspecified defaults to text. + Format JobAttemptLogExportFormat `protobuf:"varint,3,opt,name=format,proto3,enum=depot.ci.v1.JobAttemptLogExportFormat" json:"format,omitempty"` +} + +func (x *ExportJobAttemptLogsRequest) Reset() { + *x = ExportJobAttemptLogsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExportJobAttemptLogsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExportJobAttemptLogsRequest) ProtoMessage() {} + +func (x *ExportJobAttemptLogsRequest) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[57] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExportJobAttemptLogsRequest.ProtoReflect.Descriptor instead. +func (*ExportJobAttemptLogsRequest) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{57} +} + +func (x *ExportJobAttemptLogsRequest) GetAttemptId() string { + if x != nil { + return x.AttemptId + } + return "" +} + +func (x *ExportJobAttemptLogsRequest) GetJobId() string { + if x != nil { + return x.JobId + } + return "" +} + +func (x *ExportJobAttemptLogsRequest) GetFormat() JobAttemptLogExportFormat { + if x != nil { + return x.Format + } + return JobAttemptLogExportFormat_JOB_ATTEMPT_LOG_EXPORT_FORMAT_UNSPECIFIED +} + +type JobAttemptLogExportMetadata struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // filename is an advisory, non-stable basename hint for generated clients. + // It is not a destination path and clients must not depend on the stem staying + // stable across calls. It is basename-only ASCII and ends in .txt for text or + // .jsonl for JSONL. + Filename string `protobuf:"bytes,1,opt,name=filename,proto3" json:"filename,omitempty"` + // content_type is the exact media type for chunk bytes: + // `text/plain; charset=utf-8` for text or + // `application/x-ndjson; charset=utf-8` for JSONL. + ContentType string `protobuf:"bytes,2,opt,name=content_type,json=contentType,proto3" json:"content_type,omitempty"` + // format is the selected byte format for following chunk responses. + Format JobAttemptLogExportFormat `protobuf:"varint,3,opt,name=format,proto3,enum=depot.ci.v1.JobAttemptLogExportFormat" json:"format,omitempty"` +} + +func (x *JobAttemptLogExportMetadata) Reset() { + *x = JobAttemptLogExportMetadata{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *JobAttemptLogExportMetadata) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*JobAttemptLogExportMetadata) ProtoMessage() {} + +func (x *JobAttemptLogExportMetadata) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[58] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use JobAttemptLogExportMetadata.ProtoReflect.Descriptor instead. +func (*JobAttemptLogExportMetadata) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{58} +} + +func (x *JobAttemptLogExportMetadata) GetFilename() string { + if x != nil { + return x.Filename + } + return "" +} + +func (x *JobAttemptLogExportMetadata) GetContentType() string { + if x != nil { + return x.ContentType + } + return "" +} + +func (x *JobAttemptLogExportMetadata) GetFormat() JobAttemptLogExportFormat { + if x != nil { + return x.Format + } + return JobAttemptLogExportFormat_JOB_ATTEMPT_LOG_EXPORT_FORMAT_UNSPECIFIED +} + +type ExportJobAttemptLogsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Types that are assignable to Event: + // + // *ExportJobAttemptLogsResponse_Metadata + // *ExportJobAttemptLogsResponse_Chunk + Event isExportJobAttemptLogsResponse_Event `protobuf_oneof:"event"` +} + +func (x *ExportJobAttemptLogsResponse) Reset() { + *x = ExportJobAttemptLogsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_ci_v1_ci_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExportJobAttemptLogsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExportJobAttemptLogsResponse) ProtoMessage() {} + +func (x *ExportJobAttemptLogsResponse) ProtoReflect() protoreflect.Message { + mi := &file_depot_ci_v1_ci_proto_msgTypes[59] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExportJobAttemptLogsResponse.ProtoReflect.Descriptor instead. +func (*ExportJobAttemptLogsResponse) Descriptor() ([]byte, []int) { + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{59} +} + +func (m *ExportJobAttemptLogsResponse) GetEvent() isExportJobAttemptLogsResponse_Event { + if m != nil { + return m.Event + } + return nil +} + +func (x *ExportJobAttemptLogsResponse) GetMetadata() *JobAttemptLogExportMetadata { + if x, ok := x.GetEvent().(*ExportJobAttemptLogsResponse_Metadata); ok { + return x.Metadata + } + return nil +} + +func (x *ExportJobAttemptLogsResponse) GetChunk() []byte { + if x, ok := x.GetEvent().(*ExportJobAttemptLogsResponse_Chunk); ok { + return x.Chunk + } + return nil +} + +type isExportJobAttemptLogsResponse_Event interface { + isExportJobAttemptLogsResponse_Event() +} + +type ExportJobAttemptLogsResponse_Metadata struct { // metadata is the first response in every successful export stream. It // describes the byte format and advisory filename for following chunks. Metadata *JobAttemptLogExportMetadata `protobuf:"bytes,1,opt,name=metadata,proto3,oneof"` @@ -3060,7 +4503,7 @@ type LogLine struct { func (x *LogLine) Reset() { *x = LogLine{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[42] + mi := &file_depot_ci_v1_ci_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3073,7 +4516,7 @@ func (x *LogLine) String() string { func (*LogLine) ProtoMessage() {} func (x *LogLine) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[42] + mi := &file_depot_ci_v1_ci_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3086,7 +4529,7 @@ func (x *LogLine) ProtoReflect() protoreflect.Message { // Deprecated: Use LogLine.ProtoReflect.Descriptor instead. func (*LogLine) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{42} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{60} } func (x *LogLine) GetStepKey() string { @@ -3163,7 +4606,7 @@ type ListRunsRequest struct { func (x *ListRunsRequest) Reset() { *x = ListRunsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[43] + mi := &file_depot_ci_v1_ci_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3176,7 +4619,7 @@ func (x *ListRunsRequest) String() string { func (*ListRunsRequest) ProtoMessage() {} func (x *ListRunsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[43] + mi := &file_depot_ci_v1_ci_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3189,7 +4632,7 @@ func (x *ListRunsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRunsRequest.ProtoReflect.Descriptor instead. func (*ListRunsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{43} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{61} } func (x *ListRunsRequest) GetStatus() []string { @@ -3253,7 +4696,7 @@ type ListRunsResponse struct { func (x *ListRunsResponse) Reset() { *x = ListRunsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[44] + mi := &file_depot_ci_v1_ci_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3266,7 +4709,7 @@ func (x *ListRunsResponse) String() string { func (*ListRunsResponse) ProtoMessage() {} func (x *ListRunsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[44] + mi := &file_depot_ci_v1_ci_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3279,7 +4722,7 @@ func (x *ListRunsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRunsResponse.ProtoReflect.Descriptor instead. func (*ListRunsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{44} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{62} } func (x *ListRunsResponse) GetRuns() []*ListRunsResponseRun { @@ -3315,7 +4758,7 @@ type ListRunsResponseRun struct { func (x *ListRunsResponseRun) Reset() { *x = ListRunsResponseRun{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[45] + mi := &file_depot_ci_v1_ci_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3328,7 +4771,7 @@ func (x *ListRunsResponseRun) String() string { func (*ListRunsResponseRun) ProtoMessage() {} func (x *ListRunsResponseRun) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[45] + mi := &file_depot_ci_v1_ci_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3341,7 +4784,7 @@ func (x *ListRunsResponseRun) ProtoReflect() protoreflect.Message { // Deprecated: Use ListRunsResponseRun.ProtoReflect.Descriptor instead. func (*ListRunsResponseRun) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{45} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{63} } func (x *ListRunsResponseRun) GetRunId() string { @@ -3424,7 +4867,7 @@ type ListWorkflowsRequest struct { func (x *ListWorkflowsRequest) Reset() { *x = ListWorkflowsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[46] + mi := &file_depot_ci_v1_ci_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3437,7 +4880,7 @@ func (x *ListWorkflowsRequest) String() string { func (*ListWorkflowsRequest) ProtoMessage() {} func (x *ListWorkflowsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[46] + mi := &file_depot_ci_v1_ci_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3450,7 +4893,7 @@ func (x *ListWorkflowsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsRequest.ProtoReflect.Descriptor instead. func (*ListWorkflowsRequest) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{46} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{64} } func (x *ListWorkflowsRequest) GetPageSize() int32 { @@ -3513,7 +4956,7 @@ type ListWorkflowsResponse struct { func (x *ListWorkflowsResponse) Reset() { *x = ListWorkflowsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[47] + mi := &file_depot_ci_v1_ci_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3526,7 +4969,7 @@ func (x *ListWorkflowsResponse) String() string { func (*ListWorkflowsResponse) ProtoMessage() {} func (x *ListWorkflowsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[47] + mi := &file_depot_ci_v1_ci_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3539,7 +4982,7 @@ func (x *ListWorkflowsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsResponse.ProtoReflect.Descriptor instead. func (*ListWorkflowsResponse) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{47} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{65} } func (x *ListWorkflowsResponse) GetWorkflows() []*ListWorkflowsResponseWorkflow { @@ -3571,7 +5014,7 @@ type ListWorkflowsResponseWorkflow struct { func (x *ListWorkflowsResponseWorkflow) Reset() { *x = ListWorkflowsResponseWorkflow{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[48] + mi := &file_depot_ci_v1_ci_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3584,7 +5027,7 @@ func (x *ListWorkflowsResponseWorkflow) String() string { func (*ListWorkflowsResponseWorkflow) ProtoMessage() {} func (x *ListWorkflowsResponseWorkflow) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[48] + mi := &file_depot_ci_v1_ci_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3597,7 +5040,7 @@ func (x *ListWorkflowsResponseWorkflow) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsResponseWorkflow.ProtoReflect.Descriptor instead. func (*ListWorkflowsResponseWorkflow) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{48} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{66} } func (x *ListWorkflowsResponseWorkflow) GetWorkflowId() string { @@ -3695,7 +5138,7 @@ type ListWorkflowsResponseJobCounts struct { func (x *ListWorkflowsResponseJobCounts) Reset() { *x = ListWorkflowsResponseJobCounts{} if protoimpl.UnsafeEnabled { - mi := &file_depot_ci_v1_ci_proto_msgTypes[49] + mi := &file_depot_ci_v1_ci_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3708,7 +5151,7 @@ func (x *ListWorkflowsResponseJobCounts) String() string { func (*ListWorkflowsResponseJobCounts) ProtoMessage() {} func (x *ListWorkflowsResponseJobCounts) ProtoReflect() protoreflect.Message { - mi := &file_depot_ci_v1_ci_proto_msgTypes[49] + mi := &file_depot_ci_v1_ci_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3721,7 +5164,7 @@ func (x *ListWorkflowsResponseJobCounts) ProtoReflect() protoreflect.Message { // Deprecated: Use ListWorkflowsResponseJobCounts.ProtoReflect.Descriptor instead. func (*ListWorkflowsResponseJobCounts) Descriptor() ([]byte, []int) { - return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{49} + return file_depot_ci_v1_ci_proto_rawDescGZIP(), []int{67} } func (x *ListWorkflowsResponseJobCounts) GetTotal() int32 { @@ -4097,289 +5540,593 @@ var file_depot_ci_v1_ci_proto_rawDesc = []byte{ 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, 0x58, - 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, - 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, - 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, - 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x05, 0x6c, 0x69, 0x6e, 0x65, - 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, - 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6b, 0x0a, 0x1b, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, - 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, - 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x1c, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x04, 0x6c, 0x69, 0x6e, - 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x73, 0x6f, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, 0x43, 0x75, 0x72, 0x73, - 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x1b, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x74, 0x74, - 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, - 0x3e, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, - 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, - 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, - 0x9c, 0x01, 0x0a, 0x1b, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, - 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x63, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, - 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, - 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x87, - 0x01, 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x46, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, - 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, - 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, 0x00, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x42, - 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xca, 0x01, 0x0a, 0x07, 0x4c, 0x6f, 0x67, - 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x65, 0x70, 0x4b, 0x65, 0x79, 0x12, - 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x4d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x6e, 0x65, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x62, - 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x12, - 0x17, 0x0a, 0x07, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x65, 0x70, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x65, 0x70, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x65, - 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, - 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, - 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x73, 0x68, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0e, 0x0a, - 0x02, 0x70, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x70, 0x72, 0x22, 0x70, 0x0a, - 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x75, - 0x6e, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, - 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0xd0, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x75, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, - 0x70, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, - 0x73, 0x68, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x65, 0x61, 0x64, 0x5f, - 0x73, 0x68, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x53, - 0x68, 0x61, 0x22, 0xc1, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, + 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, 0x3c, + 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x14, 0x47, + 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x22, 0xaa, 0x02, 0x0a, 0x1c, 0x47, + 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x03, 0x72, + 0x75, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x72, 0x75, 0x6e, 0x12, + 0x41, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x12, 0x32, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x07, 0x61, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x41, 0x74, 0x22, 0xa5, 0x02, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4a, + 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x32, 0x0a, 0x03, 0x72, 0x75, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x52, 0x03, 0x72, 0x75, 0x6e, 0x12, 0x41, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x08, + 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x32, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x40, 0x0a, 0x08, + 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x52, 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x12, 0x1f, + 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x41, 0x74, 0x22, + 0xb1, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x03, 0x72, 0x75, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x75, + 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x03, 0x72, 0x75, 0x6e, 0x12, 0x43, 0x0a, + 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, + 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x61, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x41, 0x74, 0x22, 0x93, 0x01, 0x0a, 0x18, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x12, 0x41, 0x0a, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x08, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x12, 0x34, 0x0a, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x52, 0x04, 0x6a, 0x6f, 0x62, 0x73, 0x22, 0x8b, 0x01, 0x0a, 0x13, 0x43, 0x49, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x12, 0x32, 0x0a, 0x03, 0x6a, 0x6f, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x52, 0x03, 0x6a, 0x6f, 0x62, 0x12, 0x40, 0x0a, 0x08, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x08, 0x61, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x73, 0x22, 0xc0, 0x02, 0x0a, 0x17, 0x43, 0x49, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x61, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x12, 0x46, 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x0c, 0x61, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x65, 0x70, + 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x33, + 0x0a, 0x03, 0x63, 0x61, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, + 0x69, 0x63, 0x73, 0x43, 0x61, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x03, + 0x63, 0x61, 0x70, 0x12, 0x35, 0x0a, 0x07, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x52, 0x07, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x22, 0x89, 0x02, 0x0a, 0x17, 0x43, + 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3e, 0x0a, 0x07, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x07, 0x61, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x46, 0x0a, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x52, 0x0c, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x31, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x12, 0x33, 0x0a, 0x03, 0x63, 0x61, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x43, 0x61, 0x70, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x03, 0x63, 0x61, 0x70, 0x22, 0x90, 0x02, 0x0a, 0x13, 0x43, 0x49, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x52, 0x75, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x15, + 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x10, 0x0a, 0x03, 0x73, + 0x68, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x19, 0x0a, + 0x08, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x68, 0x65, 0x61, 0x64, 0x53, 0x68, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x73, 0x68, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x70, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x65, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x78, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x48, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x09, - 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, - 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x22, 0xee, 0x02, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, + 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, 0xeb, 0x01, 0x0a, 0x18, 0x43, 0x49, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x77, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x74, 0x68, 0x12, 0x12, 0x0a, 0x04, - 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x19, 0x0a, 0x08, 0x68, - 0x65, 0x61, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, - 0x65, 0x61, 0x64, 0x53, 0x68, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x4a, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, - 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x6f, 0x62, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x73, 0x22, 0xee, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, 0x6f, 0x62, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x71, 0x75, - 0x65, 0x75, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x71, 0x75, 0x65, 0x75, - 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x18, 0x0a, 0x07, - 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, - 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, - 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x6b, 0x69, 0x70, - 0x70, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, 0x6b, 0x69, 0x70, 0x70, - 0x65, 0x64, 0x2a, 0x9b, 0x01, 0x0a, 0x19, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, - 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x12, 0x2d, 0x0a, 0x29, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, - 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, - 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, - 0x26, 0x0a, 0x22, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, - 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, - 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10, 0x01, 0x12, 0x27, 0x0a, 0x23, 0x4a, 0x4f, 0x42, 0x5f, 0x41, - 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, - 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, 0x53, 0x4f, 0x4e, 0x4c, 0x10, 0x02, - 0x32, 0x85, 0x0b, 0x0a, 0x09, 0x43, 0x49, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x3a, - 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x17, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x10, 0x44, 0x69, - 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x24, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, - 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, - 0x08, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x12, 0x1c, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x52, 0x65, 0x72, 0x75, - 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x72, 0x75, 0x6e, 0x57, 0x6f, 0x72, - 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, - 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x72, 0x75, 0x6e, - 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, - 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, - 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x65, 0x70, - 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, - 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x12, - 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, - 0x6f, 0x77, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, - 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, - 0x06, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x1a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x12, - 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, - 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, - 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x55, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, - 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1f, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, - 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x11, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, - 0x12, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x6f, 0x0a, 0x14, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, - 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, - 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, - 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x30, 0x01, 0x12, 0x6f, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, - 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, - 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, - 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x30, 0x01, 0x12, 0x49, 0x0a, 0x08, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x12, - 0x1c, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, + 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, 0x85, 0x02, 0x0a, 0x13, 0x43, 0x49, 0x4d, 0x65, + 0x74, 0x72, 0x69, 0x63, 0x73, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, + 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x6a, 0x6f, 0x62, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x6a, 0x6f, 0x62, 0x4b, 0x65, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x63, 0x6c, + 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x63, 0x6f, 0x6e, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x5f, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, + 0xa7, 0x02, 0x0a, 0x17, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, + 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x61, 0x74, 0x74, + 0x65, 0x6d, 0x70, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, + 0x63, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x61, 0x6e, 0x64, 0x62, 0x6f, 0x78, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, + 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, + 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, 0x85, 0x02, 0x0a, 0x0e, 0x43, 0x49, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x0f, 0x63, 0x70, + 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0e, 0x63, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x32, 0x0a, 0x12, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x11, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x48, 0x02, 0x52, 0x10, 0x6d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, + 0x12, 0x0a, 0x10, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, + 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x22, 0x8c, 0x06, 0x0a, 0x0e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x63, 0x70, 0x75, 0x5f, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0e, 0x63, 0x70, 0x75, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x35, 0x0a, 0x14, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, + 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x48, + 0x00, 0x52, 0x12, 0x70, 0x65, 0x61, 0x6b, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x61, 0x76, 0x65, 0x72, + 0x61, 0x67, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x15, 0x61, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x43, 0x70, 0x75, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02, 0x52, 0x15, 0x70, 0x65, 0x61, 0x6b, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x88, + 0x01, 0x01, 0x12, 0x41, 0x0a, 0x1a, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x48, 0x03, 0x52, 0x18, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, 0x13, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x30, 0x0a, 0x14, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x64, 0x5f, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x6f, 0x62, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x46, 0x69, 0x6e, + 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3a, 0x0a, 0x17, 0x70, 0x65, 0x61, 0x6b, 0x5f, + 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x04, 0x48, 0x04, 0x52, 0x14, 0x70, 0x65, 0x61, 0x6b, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x74, 0x65, 0x73, + 0x88, 0x01, 0x01, 0x12, 0x40, 0x0a, 0x1a, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x48, 0x05, 0x52, 0x17, 0x61, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x55, 0x73, 0x61, 0x67, 0x65, 0x42, 0x79, 0x74, + 0x65, 0x73, 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x63, + 0x70, 0x75, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1a, + 0x0a, 0x18, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x70, 0x75, 0x5f, 0x75, + 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x70, + 0x65, 0x61, 0x6b, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x5f, 0x6d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x70, 0x65, 0x61, 0x6b, 0x5f, 0x6d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, + 0x73, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x5f, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, + 0x22, 0x6b, 0x0a, 0x15, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, 0x76, 0x61, + 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x04, 0x63, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x41, + 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x43, 0x6f, 0x64, 0x65, 0x52, + 0x04, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0x82, 0x02, + 0x0a, 0x14, 0x43, 0x49, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x43, 0x61, 0x70, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x73, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0e, 0x72, 0x61, 0x77, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x13, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x19, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x64, 0x12, 0x2f, 0x0a, 0x13, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, + 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, + 0x67, 0x79, 0x22, 0x58, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, + 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, + 0x0a, 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6f, 0x0a, 0x19, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x05, 0x6c, 0x69, 0x6e, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, 0x05, + 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, + 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x6b, 0x0a, + 0x1b, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, + 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x63, + 0x75, 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, 0x75, 0x72, + 0x73, 0x6f, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, 0x62, 0x49, 0x64, 0x22, 0x90, 0x01, 0x0a, 0x1c, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, + 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x04, 0x6c, + 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x52, + 0x04, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x63, 0x75, + 0x72, 0x73, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6e, 0x65, 0x78, 0x74, + 0x43, 0x75, 0x72, 0x73, 0x6f, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x93, 0x01, + 0x0a, 0x1b, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x61, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x49, 0x64, 0x12, 0x15, 0x0a, 0x06, + 0x6a, 0x6f, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6a, 0x6f, + 0x62, 0x49, 0x64, 0x12, 0x3e, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x22, 0x9c, 0x01, 0x0a, 0x1b, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, + 0x70, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x22, 0x87, 0x01, 0x0a, 0x1c, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, + 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, + 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x48, + 0x00, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x05, 0x63, + 0x68, 0x75, 0x6e, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x05, 0x63, 0x68, + 0x75, 0x6e, 0x6b, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xca, 0x01, 0x0a, + 0x07, 0x4c, 0x6f, 0x67, 0x4c, 0x69, 0x6e, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x65, 0x70, + 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x74, 0x65, 0x70, + 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x5f, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x4d, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x6c, 0x69, 0x6e, + 0x65, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x06, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, + 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, + 0x6f, 0x64, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x65, 0x70, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, + 0x73, 0x74, 0x65, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x73, 0x74, 0x65, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x0f, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x70, + 0x72, 0x22, 0x70, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x75, 0x6e, 0x52, 0x04, 0x72, 0x75, 0x6e, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, + 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0xd0, 0x01, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x75, 0x6e, 0x12, 0x15, 0x0a, 0x06, 0x72, + 0x75, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, + 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, + 0x68, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x72, 0x65, 0x66, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x72, 0x65, 0x66, 0x12, 0x19, 0x0a, 0x08, 0x68, + 0x65, 0x61, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, + 0x65, 0x61, 0x64, 0x53, 0x68, 0x61, 0x22, 0xc1, 0x01, 0x0a, 0x14, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x68, 0x61, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, 0x0e, 0x0a, 0x02, 0x70, 0x72, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x70, 0x72, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x52, 0x0a, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x78, 0x0a, 0x15, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, + 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x52, 0x09, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x4a, 0x04, 0x08, + 0x02, 0x10, 0x03, 0x52, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xee, 0x02, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1f, 0x0a, 0x0b, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, + 0x6f, 0x77, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x77, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x77, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x77, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x50, 0x61, 0x74, 0x68, + 0x12, 0x12, 0x0a, 0x04, 0x72, 0x65, 0x70, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x72, 0x65, 0x70, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x74, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x74, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x15, 0x0a, 0x06, 0x72, 0x75, 0x6e, 0x5f, 0x69, 0x64, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x72, 0x75, 0x6e, 0x49, 0x64, 0x12, 0x10, 0x0a, + 0x03, 0x73, 0x68, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x73, 0x68, 0x61, 0x12, + 0x19, 0x0a, 0x08, 0x68, 0x65, 0x61, 0x64, 0x5f, 0x73, 0x68, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x53, 0x68, 0x61, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x4a, 0x0a, 0x0a, 0x6a, 0x6f, 0x62, + 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, - 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, - 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x4a, 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x52, 0x09, 0x6a, 0x6f, 0x62, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x22, 0xee, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x4a, + 0x6f, 0x62, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x16, + 0x0a, 0x06, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, + 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, + 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x77, 0x61, 0x69, 0x74, 0x69, 0x6e, 0x67, + 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x07, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, + 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, 0x69, + 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x66, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x12, 0x1c, + 0x0a, 0x09, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x63, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x6c, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x73, + 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x2a, 0xff, 0x01, 0x0a, 0x19, 0x43, 0x49, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x43, 0x6f, 0x64, 0x65, 0x12, 0x2c, 0x0a, 0x28, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, + 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, + 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, + 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, + 0x44, 0x45, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x2b, + 0x0a, 0x27, 0x43, 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, + 0x49, 0x4c, 0x41, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, + 0x4f, 0x5f, 0x53, 0x41, 0x4e, 0x44, 0x42, 0x4f, 0x58, 0x10, 0x02, 0x12, 0x2e, 0x0a, 0x2a, 0x43, + 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, + 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x54, + 0x49, 0x4d, 0x45, 0x5f, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x03, 0x12, 0x2b, 0x0a, 0x27, 0x43, + 0x49, 0x5f, 0x4d, 0x45, 0x54, 0x52, 0x49, 0x43, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, + 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x43, 0x4f, 0x44, 0x45, 0x5f, 0x4e, 0x4f, 0x5f, 0x53, + 0x41, 0x4d, 0x50, 0x4c, 0x45, 0x53, 0x10, 0x04, 0x2a, 0x9b, 0x01, 0x0a, 0x19, 0x4a, 0x6f, 0x62, + 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x2d, 0x0a, 0x29, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, + 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, + 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x26, 0x0a, 0x22, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, + 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, + 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x54, 0x45, 0x58, 0x54, 0x10, 0x01, 0x12, 0x27, 0x0a, + 0x23, 0x4a, 0x4f, 0x42, 0x5f, 0x41, 0x54, 0x54, 0x45, 0x4d, 0x50, 0x54, 0x5f, 0x4c, 0x4f, 0x47, + 0x5f, 0x45, 0x58, 0x50, 0x4f, 0x52, 0x54, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x5f, 0x4a, + 0x53, 0x4f, 0x4e, 0x4c, 0x10, 0x02, 0x32, 0xa8, 0x0d, 0x0a, 0x09, 0x43, 0x49, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x3a, 0x0a, 0x03, 0x52, 0x75, 0x6e, 0x12, 0x17, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x61, 0x0a, 0x10, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, + 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x65, 0x70, + 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x70, 0x61, 0x74, 0x63, + 0x68, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x08, 0x52, 0x65, 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x12, + 0x1c, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x74, 0x72, 0x79, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, + 0x79, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, + 0x0a, 0x0d, 0x52, 0x65, 0x72, 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, + 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x72, 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x32, 0xe1, 0x01, 0x0a, 0x10, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, - 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, - 0x14, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, - 0x64, 0x56, 0x61, 0x72, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x99, 0x01, 0x0a, - 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, - 0x42, 0x07, 0x43, 0x69, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x6c, - 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x64, 0x65, 0x70, 0x6f, - 0x74, 0x2f, 0x63, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x44, - 0x43, 0x58, 0xaa, 0x02, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x43, 0x69, 0x2e, 0x56, 0x31, - 0xca, 0x02, 0x0b, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, - 0x17, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0d, 0x44, 0x65, 0x70, 0x6f, 0x74, - 0x3a, 0x3a, 0x43, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x2e, 0x52, 0x65, 0x72, 0x75, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0f, 0x52, 0x65, 0x74, 0x72, + 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x23, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x74, 0x72, 0x79, 0x46, + 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x74, 0x72, 0x79, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x4a, 0x6f, 0x62, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5b, 0x0a, 0x0e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, + 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x57, 0x6f, 0x72, + 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, + 0x6c, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x12, 0x43, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x12, 0x1a, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, + 0x75, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4c, 0x0a, 0x09, 0x43, 0x61, 0x6e, 0x63, + 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x12, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x52, 0x0a, + 0x0b, 0x47, 0x65, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x12, 0x1f, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x6d, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, + 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x47, 0x65, + 0x74, 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6e, + 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x52, 0x75, 0x6e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x64, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x12, 0x25, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, + 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, + 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6f, 0x0a, 0x14, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, + 0x67, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, + 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, + 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x6f, 0x0a, 0x14, 0x45, + 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, + 0x6f, 0x67, 0x73, 0x12, 0x28, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, + 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x6f, + 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x4c, 0x6f, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x30, 0x01, 0x12, 0x49, 0x0a, 0x08, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x12, 0x1c, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0d, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x6f, 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x66, + 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x6f, + 0x72, 0x6b, 0x66, 0x6c, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x32, 0xe1, 0x01, 0x0a, 0x10, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, + 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x73, 0x74, 0x61, + 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, + 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x6d, 0x0a, 0x14, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x12, 0x28, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, + 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, + 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x73, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x99, 0x01, 0x0a, 0x0f, 0x63, 0x6f, 0x6d, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x07, 0x43, 0x69, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x6c, 0x69, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2f, 0x63, 0x69, 0x2f, 0x76, 0x31, + 0x3b, 0x63, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x44, 0x43, 0x58, 0xaa, 0x02, 0x0b, 0x44, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x43, 0x69, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0b, 0x44, 0x65, 0x70, 0x6f, + 0x74, 0x5c, 0x43, 0x69, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x17, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, + 0x43, 0x69, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0xea, 0x02, 0x0d, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x3a, 0x3a, 0x43, 0x69, 0x3a, 0x3a, 0x56, + 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4394,122 +6141,171 @@ func file_depot_ci_v1_ci_proto_rawDescGZIP() []byte { return file_depot_ci_v1_ci_proto_rawDescData } -var file_depot_ci_v1_ci_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_depot_ci_v1_ci_proto_msgTypes = make([]protoimpl.MessageInfo, 51) +var file_depot_ci_v1_ci_proto_enumTypes = make([]protoimpl.EnumInfo, 2) +var file_depot_ci_v1_ci_proto_msgTypes = make([]protoimpl.MessageInfo, 69) var file_depot_ci_v1_ci_proto_goTypes = []interface{}{ - (JobAttemptLogExportFormat)(0), // 0: depot.ci.v1.JobAttemptLogExportFormat - (*GetInstallationRequest)(nil), // 1: depot.ci.v1.GetInstallationRequest - (*GetInstallationResponse)(nil), // 2: depot.ci.v1.GetInstallationResponse - (*ImportSecretsAndVarsRequest)(nil), // 3: depot.ci.v1.ImportSecretsAndVarsRequest - (*ImportSecretsAndVarsResponse)(nil), // 4: depot.ci.v1.ImportSecretsAndVarsResponse - (*DryRunResult)(nil), // 5: depot.ci.v1.DryRunResult - (*RunResult)(nil), // 6: depot.ci.v1.RunResult - (*Installation)(nil), // 7: depot.ci.v1.Installation - (*RunRequest)(nil), // 8: depot.ci.v1.RunRequest - (*RunResponse)(nil), // 9: depot.ci.v1.RunResponse - (*DispatchWorkflowRequest)(nil), // 10: depot.ci.v1.DispatchWorkflowRequest - (*DispatchWorkflowResponse)(nil), // 11: depot.ci.v1.DispatchWorkflowResponse - (*RetryJobRequest)(nil), // 12: depot.ci.v1.RetryJobRequest - (*RetryJobResponse)(nil), // 13: depot.ci.v1.RetryJobResponse - (*RerunWorkflowRequest)(nil), // 14: depot.ci.v1.RerunWorkflowRequest - (*RerunWorkflowResponse)(nil), // 15: depot.ci.v1.RerunWorkflowResponse - (*RetryFailedJobsRequest)(nil), // 16: depot.ci.v1.RetryFailedJobsRequest - (*RetryFailedJobsResponse)(nil), // 17: depot.ci.v1.RetryFailedJobsResponse - (*CancelJobRequest)(nil), // 18: depot.ci.v1.CancelJobRequest - (*CancelJobResponse)(nil), // 19: depot.ci.v1.CancelJobResponse - (*CancelWorkflowRequest)(nil), // 20: depot.ci.v1.CancelWorkflowRequest - (*CancelWorkflowResponse)(nil), // 21: depot.ci.v1.CancelWorkflowResponse - (*GetRunRequest)(nil), // 22: depot.ci.v1.GetRunRequest - (*GetRunResponse)(nil), // 23: depot.ci.v1.GetRunResponse - (*CancelRunRequest)(nil), // 24: depot.ci.v1.CancelRunRequest - (*CancelRunResponse)(nil), // 25: depot.ci.v1.CancelRunResponse - (*GetRunStatusRequest)(nil), // 26: depot.ci.v1.GetRunStatusRequest - (*GetRunStatusResponse)(nil), // 27: depot.ci.v1.GetRunStatusResponse - (*WorkflowStatus)(nil), // 28: depot.ci.v1.WorkflowStatus - (*JobStatus)(nil), // 29: depot.ci.v1.JobStatus - (*AttemptStatus)(nil), // 30: depot.ci.v1.AttemptStatus - (*GetWorkflowRequest)(nil), // 31: depot.ci.v1.GetWorkflowRequest - (*GetWorkflowResponse)(nil), // 32: depot.ci.v1.GetWorkflowResponse - (*GetWorkflowExecution)(nil), // 33: depot.ci.v1.GetWorkflowExecution - (*GetWorkflowJob)(nil), // 34: depot.ci.v1.GetWorkflowJob - (*GetWorkflowJobAttempt)(nil), // 35: depot.ci.v1.GetWorkflowJobAttempt - (*GetJobAttemptLogsRequest)(nil), // 36: depot.ci.v1.GetJobAttemptLogsRequest - (*GetJobAttemptLogsResponse)(nil), // 37: depot.ci.v1.GetJobAttemptLogsResponse - (*StreamJobAttemptLogsRequest)(nil), // 38: depot.ci.v1.StreamJobAttemptLogsRequest - (*StreamJobAttemptLogsResponse)(nil), // 39: depot.ci.v1.StreamJobAttemptLogsResponse - (*ExportJobAttemptLogsRequest)(nil), // 40: depot.ci.v1.ExportJobAttemptLogsRequest - (*JobAttemptLogExportMetadata)(nil), // 41: depot.ci.v1.JobAttemptLogExportMetadata - (*ExportJobAttemptLogsResponse)(nil), // 42: depot.ci.v1.ExportJobAttemptLogsResponse - (*LogLine)(nil), // 43: depot.ci.v1.LogLine - (*ListRunsRequest)(nil), // 44: depot.ci.v1.ListRunsRequest - (*ListRunsResponse)(nil), // 45: depot.ci.v1.ListRunsResponse - (*ListRunsResponseRun)(nil), // 46: depot.ci.v1.ListRunsResponseRun - (*ListWorkflowsRequest)(nil), // 47: depot.ci.v1.ListWorkflowsRequest - (*ListWorkflowsResponse)(nil), // 48: depot.ci.v1.ListWorkflowsResponse - (*ListWorkflowsResponseWorkflow)(nil), // 49: depot.ci.v1.ListWorkflowsResponseWorkflow - (*ListWorkflowsResponseJobCounts)(nil), // 50: depot.ci.v1.ListWorkflowsResponseJobCounts - nil, // 51: depot.ci.v1.DispatchWorkflowRequest.InputsEntry + (CIMetricsAvailabilityCode)(0), // 0: depot.ci.v1.CIMetricsAvailabilityCode + (JobAttemptLogExportFormat)(0), // 1: depot.ci.v1.JobAttemptLogExportFormat + (*GetInstallationRequest)(nil), // 2: depot.ci.v1.GetInstallationRequest + (*GetInstallationResponse)(nil), // 3: depot.ci.v1.GetInstallationResponse + (*ImportSecretsAndVarsRequest)(nil), // 4: depot.ci.v1.ImportSecretsAndVarsRequest + (*ImportSecretsAndVarsResponse)(nil), // 5: depot.ci.v1.ImportSecretsAndVarsResponse + (*DryRunResult)(nil), // 6: depot.ci.v1.DryRunResult + (*RunResult)(nil), // 7: depot.ci.v1.RunResult + (*Installation)(nil), // 8: depot.ci.v1.Installation + (*RunRequest)(nil), // 9: depot.ci.v1.RunRequest + (*RunResponse)(nil), // 10: depot.ci.v1.RunResponse + (*DispatchWorkflowRequest)(nil), // 11: depot.ci.v1.DispatchWorkflowRequest + (*DispatchWorkflowResponse)(nil), // 12: depot.ci.v1.DispatchWorkflowResponse + (*RetryJobRequest)(nil), // 13: depot.ci.v1.RetryJobRequest + (*RetryJobResponse)(nil), // 14: depot.ci.v1.RetryJobResponse + (*RerunWorkflowRequest)(nil), // 15: depot.ci.v1.RerunWorkflowRequest + (*RerunWorkflowResponse)(nil), // 16: depot.ci.v1.RerunWorkflowResponse + (*RetryFailedJobsRequest)(nil), // 17: depot.ci.v1.RetryFailedJobsRequest + (*RetryFailedJobsResponse)(nil), // 18: depot.ci.v1.RetryFailedJobsResponse + (*CancelJobRequest)(nil), // 19: depot.ci.v1.CancelJobRequest + (*CancelJobResponse)(nil), // 20: depot.ci.v1.CancelJobResponse + (*CancelWorkflowRequest)(nil), // 21: depot.ci.v1.CancelWorkflowRequest + (*CancelWorkflowResponse)(nil), // 22: depot.ci.v1.CancelWorkflowResponse + (*GetRunRequest)(nil), // 23: depot.ci.v1.GetRunRequest + (*GetRunResponse)(nil), // 24: depot.ci.v1.GetRunResponse + (*CancelRunRequest)(nil), // 25: depot.ci.v1.CancelRunRequest + (*CancelRunResponse)(nil), // 26: depot.ci.v1.CancelRunResponse + (*GetRunStatusRequest)(nil), // 27: depot.ci.v1.GetRunStatusRequest + (*GetRunStatusResponse)(nil), // 28: depot.ci.v1.GetRunStatusResponse + (*WorkflowStatus)(nil), // 29: depot.ci.v1.WorkflowStatus + (*JobStatus)(nil), // 30: depot.ci.v1.JobStatus + (*AttemptStatus)(nil), // 31: depot.ci.v1.AttemptStatus + (*GetWorkflowRequest)(nil), // 32: depot.ci.v1.GetWorkflowRequest + (*GetWorkflowResponse)(nil), // 33: depot.ci.v1.GetWorkflowResponse + (*GetWorkflowExecution)(nil), // 34: depot.ci.v1.GetWorkflowExecution + (*GetWorkflowJob)(nil), // 35: depot.ci.v1.GetWorkflowJob + (*GetWorkflowJobAttempt)(nil), // 36: depot.ci.v1.GetWorkflowJobAttempt + (*GetJobAttemptMetricsRequest)(nil), // 37: depot.ci.v1.GetJobAttemptMetricsRequest + (*GetJobMetricsRequest)(nil), // 38: depot.ci.v1.GetJobMetricsRequest + (*GetRunMetricsRequest)(nil), // 39: depot.ci.v1.GetRunMetricsRequest + (*GetJobAttemptMetricsResponse)(nil), // 40: depot.ci.v1.GetJobAttemptMetricsResponse + (*GetJobMetricsResponse)(nil), // 41: depot.ci.v1.GetJobMetricsResponse + (*GetRunMetricsResponse)(nil), // 42: depot.ci.v1.GetRunMetricsResponse + (*CIMetricsWorkflowMetrics)(nil), // 43: depot.ci.v1.CIMetricsWorkflowMetrics + (*CIMetricsJobMetrics)(nil), // 44: depot.ci.v1.CIMetricsJobMetrics + (*CIMetricsAttemptMetrics)(nil), // 45: depot.ci.v1.CIMetricsAttemptMetrics + (*CIMetricsAttemptSummary)(nil), // 46: depot.ci.v1.CIMetricsAttemptSummary + (*CIMetricsRunContext)(nil), // 47: depot.ci.v1.CIMetricsRunContext + (*CIMetricsWorkflowContext)(nil), // 48: depot.ci.v1.CIMetricsWorkflowContext + (*CIMetricsJobContext)(nil), // 49: depot.ci.v1.CIMetricsJobContext + (*CIMetricsAttemptContext)(nil), // 50: depot.ci.v1.CIMetricsAttemptContext + (*CIMetricSample)(nil), // 51: depot.ci.v1.CIMetricSample + (*CIMetricsStats)(nil), // 52: depot.ci.v1.CIMetricsStats + (*CIMetricsAvailability)(nil), // 53: depot.ci.v1.CIMetricsAvailability + (*CIMetricsCapMetadata)(nil), // 54: depot.ci.v1.CIMetricsCapMetadata + (*GetJobAttemptLogsRequest)(nil), // 55: depot.ci.v1.GetJobAttemptLogsRequest + (*GetJobAttemptLogsResponse)(nil), // 56: depot.ci.v1.GetJobAttemptLogsResponse + (*StreamJobAttemptLogsRequest)(nil), // 57: depot.ci.v1.StreamJobAttemptLogsRequest + (*StreamJobAttemptLogsResponse)(nil), // 58: depot.ci.v1.StreamJobAttemptLogsResponse + (*ExportJobAttemptLogsRequest)(nil), // 59: depot.ci.v1.ExportJobAttemptLogsRequest + (*JobAttemptLogExportMetadata)(nil), // 60: depot.ci.v1.JobAttemptLogExportMetadata + (*ExportJobAttemptLogsResponse)(nil), // 61: depot.ci.v1.ExportJobAttemptLogsResponse + (*LogLine)(nil), // 62: depot.ci.v1.LogLine + (*ListRunsRequest)(nil), // 63: depot.ci.v1.ListRunsRequest + (*ListRunsResponse)(nil), // 64: depot.ci.v1.ListRunsResponse + (*ListRunsResponseRun)(nil), // 65: depot.ci.v1.ListRunsResponseRun + (*ListWorkflowsRequest)(nil), // 66: depot.ci.v1.ListWorkflowsRequest + (*ListWorkflowsResponse)(nil), // 67: depot.ci.v1.ListWorkflowsResponse + (*ListWorkflowsResponseWorkflow)(nil), // 68: depot.ci.v1.ListWorkflowsResponseWorkflow + (*ListWorkflowsResponseJobCounts)(nil), // 69: depot.ci.v1.ListWorkflowsResponseJobCounts + nil, // 70: depot.ci.v1.DispatchWorkflowRequest.InputsEntry } var file_depot_ci_v1_ci_proto_depIdxs = []int32{ - 7, // 0: depot.ci.v1.GetInstallationResponse.installations:type_name -> depot.ci.v1.Installation - 5, // 1: depot.ci.v1.ImportSecretsAndVarsResponse.dry_run_result:type_name -> depot.ci.v1.DryRunResult - 6, // 2: depot.ci.v1.ImportSecretsAndVarsResponse.run_result:type_name -> depot.ci.v1.RunResult - 51, // 3: depot.ci.v1.DispatchWorkflowRequest.inputs:type_name -> depot.ci.v1.DispatchWorkflowRequest.InputsEntry - 28, // 4: depot.ci.v1.GetRunStatusResponse.workflows:type_name -> depot.ci.v1.WorkflowStatus - 29, // 5: depot.ci.v1.WorkflowStatus.jobs:type_name -> depot.ci.v1.JobStatus - 30, // 6: depot.ci.v1.JobStatus.attempts:type_name -> depot.ci.v1.AttemptStatus - 33, // 7: depot.ci.v1.GetWorkflowResponse.executions:type_name -> depot.ci.v1.GetWorkflowExecution - 34, // 8: depot.ci.v1.GetWorkflowResponse.jobs:type_name -> depot.ci.v1.GetWorkflowJob - 35, // 9: depot.ci.v1.GetWorkflowJob.attempts:type_name -> depot.ci.v1.GetWorkflowJobAttempt - 43, // 10: depot.ci.v1.GetJobAttemptLogsResponse.lines:type_name -> depot.ci.v1.LogLine - 43, // 11: depot.ci.v1.StreamJobAttemptLogsResponse.line:type_name -> depot.ci.v1.LogLine - 0, // 12: depot.ci.v1.ExportJobAttemptLogsRequest.format:type_name -> depot.ci.v1.JobAttemptLogExportFormat - 0, // 13: depot.ci.v1.JobAttemptLogExportMetadata.format:type_name -> depot.ci.v1.JobAttemptLogExportFormat - 41, // 14: depot.ci.v1.ExportJobAttemptLogsResponse.metadata:type_name -> depot.ci.v1.JobAttemptLogExportMetadata - 46, // 15: depot.ci.v1.ListRunsResponse.runs:type_name -> depot.ci.v1.ListRunsResponseRun - 49, // 16: depot.ci.v1.ListWorkflowsResponse.workflows:type_name -> depot.ci.v1.ListWorkflowsResponseWorkflow - 50, // 17: depot.ci.v1.ListWorkflowsResponseWorkflow.job_counts:type_name -> depot.ci.v1.ListWorkflowsResponseJobCounts - 8, // 18: depot.ci.v1.CIService.Run:input_type -> depot.ci.v1.RunRequest - 10, // 19: depot.ci.v1.CIService.DispatchWorkflow:input_type -> depot.ci.v1.DispatchWorkflowRequest - 12, // 20: depot.ci.v1.CIService.RetryJob:input_type -> depot.ci.v1.RetryJobRequest - 14, // 21: depot.ci.v1.CIService.RerunWorkflow:input_type -> depot.ci.v1.RerunWorkflowRequest - 16, // 22: depot.ci.v1.CIService.RetryFailedJobs:input_type -> depot.ci.v1.RetryFailedJobsRequest - 18, // 23: depot.ci.v1.CIService.CancelJob:input_type -> depot.ci.v1.CancelJobRequest - 20, // 24: depot.ci.v1.CIService.CancelWorkflow:input_type -> depot.ci.v1.CancelWorkflowRequest - 22, // 25: depot.ci.v1.CIService.GetRun:input_type -> depot.ci.v1.GetRunRequest - 24, // 26: depot.ci.v1.CIService.CancelRun:input_type -> depot.ci.v1.CancelRunRequest - 26, // 27: depot.ci.v1.CIService.GetRunStatus:input_type -> depot.ci.v1.GetRunStatusRequest - 31, // 28: depot.ci.v1.CIService.GetWorkflow:input_type -> depot.ci.v1.GetWorkflowRequest - 36, // 29: depot.ci.v1.CIService.GetJobAttemptLogs:input_type -> depot.ci.v1.GetJobAttemptLogsRequest - 38, // 30: depot.ci.v1.CIService.StreamJobAttemptLogs:input_type -> depot.ci.v1.StreamJobAttemptLogsRequest - 40, // 31: depot.ci.v1.CIService.ExportJobAttemptLogs:input_type -> depot.ci.v1.ExportJobAttemptLogsRequest - 44, // 32: depot.ci.v1.CIService.ListRuns:input_type -> depot.ci.v1.ListRunsRequest - 47, // 33: depot.ci.v1.CIService.ListWorkflows:input_type -> depot.ci.v1.ListWorkflowsRequest - 1, // 34: depot.ci.v1.MigrationService.GetInstallation:input_type -> depot.ci.v1.GetInstallationRequest - 3, // 35: depot.ci.v1.MigrationService.ImportSecretsAndVars:input_type -> depot.ci.v1.ImportSecretsAndVarsRequest - 9, // 36: depot.ci.v1.CIService.Run:output_type -> depot.ci.v1.RunResponse - 11, // 37: depot.ci.v1.CIService.DispatchWorkflow:output_type -> depot.ci.v1.DispatchWorkflowResponse - 13, // 38: depot.ci.v1.CIService.RetryJob:output_type -> depot.ci.v1.RetryJobResponse - 15, // 39: depot.ci.v1.CIService.RerunWorkflow:output_type -> depot.ci.v1.RerunWorkflowResponse - 17, // 40: depot.ci.v1.CIService.RetryFailedJobs:output_type -> depot.ci.v1.RetryFailedJobsResponse - 19, // 41: depot.ci.v1.CIService.CancelJob:output_type -> depot.ci.v1.CancelJobResponse - 21, // 42: depot.ci.v1.CIService.CancelWorkflow:output_type -> depot.ci.v1.CancelWorkflowResponse - 23, // 43: depot.ci.v1.CIService.GetRun:output_type -> depot.ci.v1.GetRunResponse - 25, // 44: depot.ci.v1.CIService.CancelRun:output_type -> depot.ci.v1.CancelRunResponse - 27, // 45: depot.ci.v1.CIService.GetRunStatus:output_type -> depot.ci.v1.GetRunStatusResponse - 32, // 46: depot.ci.v1.CIService.GetWorkflow:output_type -> depot.ci.v1.GetWorkflowResponse - 37, // 47: depot.ci.v1.CIService.GetJobAttemptLogs:output_type -> depot.ci.v1.GetJobAttemptLogsResponse - 39, // 48: depot.ci.v1.CIService.StreamJobAttemptLogs:output_type -> depot.ci.v1.StreamJobAttemptLogsResponse - 42, // 49: depot.ci.v1.CIService.ExportJobAttemptLogs:output_type -> depot.ci.v1.ExportJobAttemptLogsResponse - 45, // 50: depot.ci.v1.CIService.ListRuns:output_type -> depot.ci.v1.ListRunsResponse - 48, // 51: depot.ci.v1.CIService.ListWorkflows:output_type -> depot.ci.v1.ListWorkflowsResponse - 2, // 52: depot.ci.v1.MigrationService.GetInstallation:output_type -> depot.ci.v1.GetInstallationResponse - 4, // 53: depot.ci.v1.MigrationService.ImportSecretsAndVars:output_type -> depot.ci.v1.ImportSecretsAndVarsResponse - 36, // [36:54] is the sub-list for method output_type - 18, // [18:36] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 18, // [18:18] is the sub-list for extension extendee - 0, // [0:18] is the sub-list for field type_name + 8, // 0: depot.ci.v1.GetInstallationResponse.installations:type_name -> depot.ci.v1.Installation + 6, // 1: depot.ci.v1.ImportSecretsAndVarsResponse.dry_run_result:type_name -> depot.ci.v1.DryRunResult + 7, // 2: depot.ci.v1.ImportSecretsAndVarsResponse.run_result:type_name -> depot.ci.v1.RunResult + 70, // 3: depot.ci.v1.DispatchWorkflowRequest.inputs:type_name -> depot.ci.v1.DispatchWorkflowRequest.InputsEntry + 29, // 4: depot.ci.v1.GetRunStatusResponse.workflows:type_name -> depot.ci.v1.WorkflowStatus + 30, // 5: depot.ci.v1.WorkflowStatus.jobs:type_name -> depot.ci.v1.JobStatus + 31, // 6: depot.ci.v1.JobStatus.attempts:type_name -> depot.ci.v1.AttemptStatus + 34, // 7: depot.ci.v1.GetWorkflowResponse.executions:type_name -> depot.ci.v1.GetWorkflowExecution + 35, // 8: depot.ci.v1.GetWorkflowResponse.jobs:type_name -> depot.ci.v1.GetWorkflowJob + 36, // 9: depot.ci.v1.GetWorkflowJob.attempts:type_name -> depot.ci.v1.GetWorkflowJobAttempt + 47, // 10: depot.ci.v1.GetJobAttemptMetricsResponse.run:type_name -> depot.ci.v1.CIMetricsRunContext + 48, // 11: depot.ci.v1.GetJobAttemptMetricsResponse.workflow:type_name -> depot.ci.v1.CIMetricsWorkflowContext + 49, // 12: depot.ci.v1.GetJobAttemptMetricsResponse.job:type_name -> depot.ci.v1.CIMetricsJobContext + 45, // 13: depot.ci.v1.GetJobAttemptMetricsResponse.attempt:type_name -> depot.ci.v1.CIMetricsAttemptMetrics + 47, // 14: depot.ci.v1.GetJobMetricsResponse.run:type_name -> depot.ci.v1.CIMetricsRunContext + 48, // 15: depot.ci.v1.GetJobMetricsResponse.workflow:type_name -> depot.ci.v1.CIMetricsWorkflowContext + 49, // 16: depot.ci.v1.GetJobMetricsResponse.job:type_name -> depot.ci.v1.CIMetricsJobContext + 46, // 17: depot.ci.v1.GetJobMetricsResponse.attempts:type_name -> depot.ci.v1.CIMetricsAttemptSummary + 47, // 18: depot.ci.v1.GetRunMetricsResponse.run:type_name -> depot.ci.v1.CIMetricsRunContext + 43, // 19: depot.ci.v1.GetRunMetricsResponse.workflows:type_name -> depot.ci.v1.CIMetricsWorkflowMetrics + 48, // 20: depot.ci.v1.CIMetricsWorkflowMetrics.workflow:type_name -> depot.ci.v1.CIMetricsWorkflowContext + 44, // 21: depot.ci.v1.CIMetricsWorkflowMetrics.jobs:type_name -> depot.ci.v1.CIMetricsJobMetrics + 49, // 22: depot.ci.v1.CIMetricsJobMetrics.job:type_name -> depot.ci.v1.CIMetricsJobContext + 46, // 23: depot.ci.v1.CIMetricsJobMetrics.attempts:type_name -> depot.ci.v1.CIMetricsAttemptSummary + 50, // 24: depot.ci.v1.CIMetricsAttemptMetrics.attempt:type_name -> depot.ci.v1.CIMetricsAttemptContext + 53, // 25: depot.ci.v1.CIMetricsAttemptMetrics.availability:type_name -> depot.ci.v1.CIMetricsAvailability + 52, // 26: depot.ci.v1.CIMetricsAttemptMetrics.stats:type_name -> depot.ci.v1.CIMetricsStats + 54, // 27: depot.ci.v1.CIMetricsAttemptMetrics.cap:type_name -> depot.ci.v1.CIMetricsCapMetadata + 51, // 28: depot.ci.v1.CIMetricsAttemptMetrics.samples:type_name -> depot.ci.v1.CIMetricSample + 50, // 29: depot.ci.v1.CIMetricsAttemptSummary.attempt:type_name -> depot.ci.v1.CIMetricsAttemptContext + 53, // 30: depot.ci.v1.CIMetricsAttemptSummary.availability:type_name -> depot.ci.v1.CIMetricsAvailability + 52, // 31: depot.ci.v1.CIMetricsAttemptSummary.stats:type_name -> depot.ci.v1.CIMetricsStats + 54, // 32: depot.ci.v1.CIMetricsAttemptSummary.cap:type_name -> depot.ci.v1.CIMetricsCapMetadata + 0, // 33: depot.ci.v1.CIMetricsAvailability.code:type_name -> depot.ci.v1.CIMetricsAvailabilityCode + 62, // 34: depot.ci.v1.GetJobAttemptLogsResponse.lines:type_name -> depot.ci.v1.LogLine + 62, // 35: depot.ci.v1.StreamJobAttemptLogsResponse.line:type_name -> depot.ci.v1.LogLine + 1, // 36: depot.ci.v1.ExportJobAttemptLogsRequest.format:type_name -> depot.ci.v1.JobAttemptLogExportFormat + 1, // 37: depot.ci.v1.JobAttemptLogExportMetadata.format:type_name -> depot.ci.v1.JobAttemptLogExportFormat + 60, // 38: depot.ci.v1.ExportJobAttemptLogsResponse.metadata:type_name -> depot.ci.v1.JobAttemptLogExportMetadata + 65, // 39: depot.ci.v1.ListRunsResponse.runs:type_name -> depot.ci.v1.ListRunsResponseRun + 68, // 40: depot.ci.v1.ListWorkflowsResponse.workflows:type_name -> depot.ci.v1.ListWorkflowsResponseWorkflow + 69, // 41: depot.ci.v1.ListWorkflowsResponseWorkflow.job_counts:type_name -> depot.ci.v1.ListWorkflowsResponseJobCounts + 9, // 42: depot.ci.v1.CIService.Run:input_type -> depot.ci.v1.RunRequest + 11, // 43: depot.ci.v1.CIService.DispatchWorkflow:input_type -> depot.ci.v1.DispatchWorkflowRequest + 13, // 44: depot.ci.v1.CIService.RetryJob:input_type -> depot.ci.v1.RetryJobRequest + 15, // 45: depot.ci.v1.CIService.RerunWorkflow:input_type -> depot.ci.v1.RerunWorkflowRequest + 17, // 46: depot.ci.v1.CIService.RetryFailedJobs:input_type -> depot.ci.v1.RetryFailedJobsRequest + 19, // 47: depot.ci.v1.CIService.CancelJob:input_type -> depot.ci.v1.CancelJobRequest + 21, // 48: depot.ci.v1.CIService.CancelWorkflow:input_type -> depot.ci.v1.CancelWorkflowRequest + 23, // 49: depot.ci.v1.CIService.GetRun:input_type -> depot.ci.v1.GetRunRequest + 25, // 50: depot.ci.v1.CIService.CancelRun:input_type -> depot.ci.v1.CancelRunRequest + 27, // 51: depot.ci.v1.CIService.GetRunStatus:input_type -> depot.ci.v1.GetRunStatusRequest + 32, // 52: depot.ci.v1.CIService.GetWorkflow:input_type -> depot.ci.v1.GetWorkflowRequest + 37, // 53: depot.ci.v1.CIService.GetJobAttemptMetrics:input_type -> depot.ci.v1.GetJobAttemptMetricsRequest + 38, // 54: depot.ci.v1.CIService.GetJobMetrics:input_type -> depot.ci.v1.GetJobMetricsRequest + 39, // 55: depot.ci.v1.CIService.GetRunMetrics:input_type -> depot.ci.v1.GetRunMetricsRequest + 55, // 56: depot.ci.v1.CIService.GetJobAttemptLogs:input_type -> depot.ci.v1.GetJobAttemptLogsRequest + 57, // 57: depot.ci.v1.CIService.StreamJobAttemptLogs:input_type -> depot.ci.v1.StreamJobAttemptLogsRequest + 59, // 58: depot.ci.v1.CIService.ExportJobAttemptLogs:input_type -> depot.ci.v1.ExportJobAttemptLogsRequest + 63, // 59: depot.ci.v1.CIService.ListRuns:input_type -> depot.ci.v1.ListRunsRequest + 66, // 60: depot.ci.v1.CIService.ListWorkflows:input_type -> depot.ci.v1.ListWorkflowsRequest + 2, // 61: depot.ci.v1.MigrationService.GetInstallation:input_type -> depot.ci.v1.GetInstallationRequest + 4, // 62: depot.ci.v1.MigrationService.ImportSecretsAndVars:input_type -> depot.ci.v1.ImportSecretsAndVarsRequest + 10, // 63: depot.ci.v1.CIService.Run:output_type -> depot.ci.v1.RunResponse + 12, // 64: depot.ci.v1.CIService.DispatchWorkflow:output_type -> depot.ci.v1.DispatchWorkflowResponse + 14, // 65: depot.ci.v1.CIService.RetryJob:output_type -> depot.ci.v1.RetryJobResponse + 16, // 66: depot.ci.v1.CIService.RerunWorkflow:output_type -> depot.ci.v1.RerunWorkflowResponse + 18, // 67: depot.ci.v1.CIService.RetryFailedJobs:output_type -> depot.ci.v1.RetryFailedJobsResponse + 20, // 68: depot.ci.v1.CIService.CancelJob:output_type -> depot.ci.v1.CancelJobResponse + 22, // 69: depot.ci.v1.CIService.CancelWorkflow:output_type -> depot.ci.v1.CancelWorkflowResponse + 24, // 70: depot.ci.v1.CIService.GetRun:output_type -> depot.ci.v1.GetRunResponse + 26, // 71: depot.ci.v1.CIService.CancelRun:output_type -> depot.ci.v1.CancelRunResponse + 28, // 72: depot.ci.v1.CIService.GetRunStatus:output_type -> depot.ci.v1.GetRunStatusResponse + 33, // 73: depot.ci.v1.CIService.GetWorkflow:output_type -> depot.ci.v1.GetWorkflowResponse + 40, // 74: depot.ci.v1.CIService.GetJobAttemptMetrics:output_type -> depot.ci.v1.GetJobAttemptMetricsResponse + 41, // 75: depot.ci.v1.CIService.GetJobMetrics:output_type -> depot.ci.v1.GetJobMetricsResponse + 42, // 76: depot.ci.v1.CIService.GetRunMetrics:output_type -> depot.ci.v1.GetRunMetricsResponse + 56, // 77: depot.ci.v1.CIService.GetJobAttemptLogs:output_type -> depot.ci.v1.GetJobAttemptLogsResponse + 58, // 78: depot.ci.v1.CIService.StreamJobAttemptLogs:output_type -> depot.ci.v1.StreamJobAttemptLogsResponse + 61, // 79: depot.ci.v1.CIService.ExportJobAttemptLogs:output_type -> depot.ci.v1.ExportJobAttemptLogsResponse + 64, // 80: depot.ci.v1.CIService.ListRuns:output_type -> depot.ci.v1.ListRunsResponse + 67, // 81: depot.ci.v1.CIService.ListWorkflows:output_type -> depot.ci.v1.ListWorkflowsResponse + 3, // 82: depot.ci.v1.MigrationService.GetInstallation:output_type -> depot.ci.v1.GetInstallationResponse + 5, // 83: depot.ci.v1.MigrationService.ImportSecretsAndVars:output_type -> depot.ci.v1.ImportSecretsAndVarsResponse + 63, // [63:84] is the sub-list for method output_type + 42, // [42:63] is the sub-list for method input_type + 42, // [42:42] is the sub-list for extension type_name + 42, // [42:42] is the sub-list for extension extendee + 0, // [0:42] is the sub-list for field type_name } func init() { file_depot_ci_v1_ci_proto_init() } @@ -4939,7 +6735,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobAttemptLogsRequest); i { + switch v := v.(*GetJobAttemptMetricsRequest); i { case 0: return &v.state case 1: @@ -4951,7 +6747,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetJobAttemptLogsResponse); i { + switch v := v.(*GetJobMetricsRequest); i { case 0: return &v.state case 1: @@ -4963,7 +6759,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamJobAttemptLogsRequest); i { + switch v := v.(*GetRunMetricsRequest); i { case 0: return &v.state case 1: @@ -4975,7 +6771,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StreamJobAttemptLogsResponse); i { + switch v := v.(*GetJobAttemptMetricsResponse); i { case 0: return &v.state case 1: @@ -4987,7 +6783,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportJobAttemptLogsRequest); i { + switch v := v.(*GetJobMetricsResponse); i { case 0: return &v.state case 1: @@ -4999,7 +6795,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*JobAttemptLogExportMetadata); i { + switch v := v.(*GetRunMetricsResponse); i { case 0: return &v.state case 1: @@ -5011,7 +6807,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportJobAttemptLogsResponse); i { + switch v := v.(*CIMetricsWorkflowMetrics); i { case 0: return &v.state case 1: @@ -5023,7 +6819,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LogLine); i { + switch v := v.(*CIMetricsJobMetrics); i { case 0: return &v.state case 1: @@ -5035,7 +6831,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRunsRequest); i { + switch v := v.(*CIMetricsAttemptMetrics); i { case 0: return &v.state case 1: @@ -5047,7 +6843,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRunsResponse); i { + switch v := v.(*CIMetricsAttemptSummary); i { case 0: return &v.state case 1: @@ -5059,7 +6855,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRunsResponseRun); i { + switch v := v.(*CIMetricsRunContext); i { case 0: return &v.state case 1: @@ -5071,7 +6867,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowsRequest); i { + switch v := v.(*CIMetricsWorkflowContext); i { case 0: return &v.state case 1: @@ -5083,7 +6879,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowsResponse); i { + switch v := v.(*CIMetricsJobContext); i { case 0: return &v.state case 1: @@ -5095,7 +6891,7 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListWorkflowsResponseWorkflow); i { + switch v := v.(*CIMetricsAttemptContext); i { case 0: return &v.state case 1: @@ -5107,6 +6903,222 @@ func file_depot_ci_v1_ci_proto_init() { } } file_depot_ci_v1_ci_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CIMetricSample); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CIMetricsStats); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CIMetricsAvailability); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CIMetricsCapMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetJobAttemptLogsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetJobAttemptLogsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StreamJobAttemptLogsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StreamJobAttemptLogsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExportJobAttemptLogsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*JobAttemptLogExportMetadata); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ExportJobAttemptLogsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*LogLine); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListRunsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListRunsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListRunsResponseRun); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkflowsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkflowsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListWorkflowsResponseWorkflow); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_ci_v1_ci_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListWorkflowsResponseJobCounts); i { case 0: return &v.state @@ -5124,7 +7136,9 @@ func file_depot_ci_v1_ci_proto_init() { (*ImportSecretsAndVarsResponse_RunResult)(nil), } file_depot_ci_v1_ci_proto_msgTypes[7].OneofWrappers = []interface{}{} - file_depot_ci_v1_ci_proto_msgTypes[41].OneofWrappers = []interface{}{ + file_depot_ci_v1_ci_proto_msgTypes[49].OneofWrappers = []interface{}{} + file_depot_ci_v1_ci_proto_msgTypes[50].OneofWrappers = []interface{}{} + file_depot_ci_v1_ci_proto_msgTypes[59].OneofWrappers = []interface{}{ (*ExportJobAttemptLogsResponse_Metadata)(nil), (*ExportJobAttemptLogsResponse_Chunk)(nil), } @@ -5133,8 +7147,8 @@ func file_depot_ci_v1_ci_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_depot_ci_v1_ci_proto_rawDesc, - NumEnums: 1, - NumMessages: 51, + NumEnums: 2, + NumMessages: 69, NumExtensions: 0, NumServices: 2, }, diff --git a/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go b/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go index 26966fdc..8417d8b9 100644 --- a/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go +++ b/pkg/proto/depot/ci/v1/civ1connect/ci.connect.go @@ -60,6 +60,13 @@ const ( CIServiceGetRunStatusProcedure = "/depot.ci.v1.CIService/GetRunStatus" // CIServiceGetWorkflowProcedure is the fully-qualified name of the CIService's GetWorkflow RPC. CIServiceGetWorkflowProcedure = "/depot.ci.v1.CIService/GetWorkflow" + // CIServiceGetJobAttemptMetricsProcedure is the fully-qualified name of the CIService's + // GetJobAttemptMetrics RPC. + CIServiceGetJobAttemptMetricsProcedure = "/depot.ci.v1.CIService/GetJobAttemptMetrics" + // CIServiceGetJobMetricsProcedure is the fully-qualified name of the CIService's GetJobMetrics RPC. + CIServiceGetJobMetricsProcedure = "/depot.ci.v1.CIService/GetJobMetrics" + // CIServiceGetRunMetricsProcedure is the fully-qualified name of the CIService's GetRunMetrics RPC. + CIServiceGetRunMetricsProcedure = "/depot.ci.v1.CIService/GetRunMetrics" // CIServiceGetJobAttemptLogsProcedure is the fully-qualified name of the CIService's // GetJobAttemptLogs RPC. CIServiceGetJobAttemptLogsProcedure = "/depot.ci.v1.CIService/GetJobAttemptLogs" @@ -105,6 +112,12 @@ type CIServiceClient interface { GetRunStatus(context.Context, *connect.Request[v1.GetRunStatusRequest]) (*connect.Response[v1.GetRunStatusResponse], error) // GetWorkflow returns curated workflow, run, execution, job, and attempt metadata for single-workflow inspection GetWorkflow(context.Context, *connect.Request[v1.GetWorkflowRequest]) (*connect.Response[v1.GetWorkflowResponse], error) + // GetJobAttemptMetrics returns CPU and memory metrics for one concrete job attempt + GetJobAttemptMetrics(context.Context, *connect.Request[v1.GetJobAttemptMetricsRequest]) (*connect.Response[v1.GetJobAttemptMetricsResponse], error) + // GetJobMetrics returns per-attempt CPU and memory metric summaries for one job + GetJobMetrics(context.Context, *connect.Request[v1.GetJobMetricsRequest]) (*connect.Response[v1.GetJobMetricsResponse], error) + // GetRunMetrics returns workflow/job/attempt CPU and memory metric summaries for one run + GetRunMetrics(context.Context, *connect.Request[v1.GetRunMetricsRequest]) (*connect.Response[v1.GetRunMetricsResponse], error) // GetJobAttemptLogs returns log lines for a job attempt GetJobAttemptLogs(context.Context, *connect.Request[v1.GetJobAttemptLogsRequest]) (*connect.Response[v1.GetJobAttemptLogsResponse], error) // StreamJobAttemptLogs follows persisted log lines for a job attempt. @@ -197,6 +210,21 @@ func NewCIServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...c baseURL+CIServiceGetWorkflowProcedure, opts..., ), + getJobAttemptMetrics: connect.NewClient[v1.GetJobAttemptMetricsRequest, v1.GetJobAttemptMetricsResponse]( + httpClient, + baseURL+CIServiceGetJobAttemptMetricsProcedure, + opts..., + ), + getJobMetrics: connect.NewClient[v1.GetJobMetricsRequest, v1.GetJobMetricsResponse]( + httpClient, + baseURL+CIServiceGetJobMetricsProcedure, + opts..., + ), + getRunMetrics: connect.NewClient[v1.GetRunMetricsRequest, v1.GetRunMetricsResponse]( + httpClient, + baseURL+CIServiceGetRunMetricsProcedure, + opts..., + ), getJobAttemptLogs: connect.NewClient[v1.GetJobAttemptLogsRequest, v1.GetJobAttemptLogsResponse]( httpClient, baseURL+CIServiceGetJobAttemptLogsProcedure, @@ -238,6 +266,9 @@ type cIServiceClient struct { cancelRun *connect.Client[v1.CancelRunRequest, v1.CancelRunResponse] getRunStatus *connect.Client[v1.GetRunStatusRequest, v1.GetRunStatusResponse] getWorkflow *connect.Client[v1.GetWorkflowRequest, v1.GetWorkflowResponse] + getJobAttemptMetrics *connect.Client[v1.GetJobAttemptMetricsRequest, v1.GetJobAttemptMetricsResponse] + getJobMetrics *connect.Client[v1.GetJobMetricsRequest, v1.GetJobMetricsResponse] + getRunMetrics *connect.Client[v1.GetRunMetricsRequest, v1.GetRunMetricsResponse] getJobAttemptLogs *connect.Client[v1.GetJobAttemptLogsRequest, v1.GetJobAttemptLogsResponse] streamJobAttemptLogs *connect.Client[v1.StreamJobAttemptLogsRequest, v1.StreamJobAttemptLogsResponse] exportJobAttemptLogs *connect.Client[v1.ExportJobAttemptLogsRequest, v1.ExportJobAttemptLogsResponse] @@ -300,6 +331,21 @@ func (c *cIServiceClient) GetWorkflow(ctx context.Context, req *connect.Request[ return c.getWorkflow.CallUnary(ctx, req) } +// GetJobAttemptMetrics calls depot.ci.v1.CIService.GetJobAttemptMetrics. +func (c *cIServiceClient) GetJobAttemptMetrics(ctx context.Context, req *connect.Request[v1.GetJobAttemptMetricsRequest]) (*connect.Response[v1.GetJobAttemptMetricsResponse], error) { + return c.getJobAttemptMetrics.CallUnary(ctx, req) +} + +// GetJobMetrics calls depot.ci.v1.CIService.GetJobMetrics. +func (c *cIServiceClient) GetJobMetrics(ctx context.Context, req *connect.Request[v1.GetJobMetricsRequest]) (*connect.Response[v1.GetJobMetricsResponse], error) { + return c.getJobMetrics.CallUnary(ctx, req) +} + +// GetRunMetrics calls depot.ci.v1.CIService.GetRunMetrics. +func (c *cIServiceClient) GetRunMetrics(ctx context.Context, req *connect.Request[v1.GetRunMetricsRequest]) (*connect.Response[v1.GetRunMetricsResponse], error) { + return c.getRunMetrics.CallUnary(ctx, req) +} + // GetJobAttemptLogs calls depot.ci.v1.CIService.GetJobAttemptLogs. func (c *cIServiceClient) GetJobAttemptLogs(ctx context.Context, req *connect.Request[v1.GetJobAttemptLogsRequest]) (*connect.Response[v1.GetJobAttemptLogsResponse], error) { return c.getJobAttemptLogs.CallUnary(ctx, req) @@ -349,6 +395,12 @@ type CIServiceHandler interface { GetRunStatus(context.Context, *connect.Request[v1.GetRunStatusRequest]) (*connect.Response[v1.GetRunStatusResponse], error) // GetWorkflow returns curated workflow, run, execution, job, and attempt metadata for single-workflow inspection GetWorkflow(context.Context, *connect.Request[v1.GetWorkflowRequest]) (*connect.Response[v1.GetWorkflowResponse], error) + // GetJobAttemptMetrics returns CPU and memory metrics for one concrete job attempt + GetJobAttemptMetrics(context.Context, *connect.Request[v1.GetJobAttemptMetricsRequest]) (*connect.Response[v1.GetJobAttemptMetricsResponse], error) + // GetJobMetrics returns per-attempt CPU and memory metric summaries for one job + GetJobMetrics(context.Context, *connect.Request[v1.GetJobMetricsRequest]) (*connect.Response[v1.GetJobMetricsResponse], error) + // GetRunMetrics returns workflow/job/attempt CPU and memory metric summaries for one run + GetRunMetrics(context.Context, *connect.Request[v1.GetRunMetricsRequest]) (*connect.Response[v1.GetRunMetricsResponse], error) // GetJobAttemptLogs returns log lines for a job attempt GetJobAttemptLogs(context.Context, *connect.Request[v1.GetJobAttemptLogsRequest]) (*connect.Response[v1.GetJobAttemptLogsResponse], error) // StreamJobAttemptLogs follows persisted log lines for a job attempt. @@ -437,6 +489,21 @@ func NewCIServiceHandler(svc CIServiceHandler, opts ...connect.HandlerOption) (s svc.GetWorkflow, opts..., ) + cIServiceGetJobAttemptMetricsHandler := connect.NewUnaryHandler( + CIServiceGetJobAttemptMetricsProcedure, + svc.GetJobAttemptMetrics, + opts..., + ) + cIServiceGetJobMetricsHandler := connect.NewUnaryHandler( + CIServiceGetJobMetricsProcedure, + svc.GetJobMetrics, + opts..., + ) + cIServiceGetRunMetricsHandler := connect.NewUnaryHandler( + CIServiceGetRunMetricsProcedure, + svc.GetRunMetrics, + opts..., + ) cIServiceGetJobAttemptLogsHandler := connect.NewUnaryHandler( CIServiceGetJobAttemptLogsProcedure, svc.GetJobAttemptLogs, @@ -486,6 +553,12 @@ func NewCIServiceHandler(svc CIServiceHandler, opts ...connect.HandlerOption) (s cIServiceGetRunStatusHandler.ServeHTTP(w, r) case CIServiceGetWorkflowProcedure: cIServiceGetWorkflowHandler.ServeHTTP(w, r) + case CIServiceGetJobAttemptMetricsProcedure: + cIServiceGetJobAttemptMetricsHandler.ServeHTTP(w, r) + case CIServiceGetJobMetricsProcedure: + cIServiceGetJobMetricsHandler.ServeHTTP(w, r) + case CIServiceGetRunMetricsProcedure: + cIServiceGetRunMetricsHandler.ServeHTTP(w, r) case CIServiceGetJobAttemptLogsProcedure: cIServiceGetJobAttemptLogsHandler.ServeHTTP(w, r) case CIServiceStreamJobAttemptLogsProcedure: @@ -549,6 +622,18 @@ func (UnimplementedCIServiceHandler) GetWorkflow(context.Context, *connect.Reque return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetWorkflow is not implemented")) } +func (UnimplementedCIServiceHandler) GetJobAttemptMetrics(context.Context, *connect.Request[v1.GetJobAttemptMetricsRequest]) (*connect.Response[v1.GetJobAttemptMetricsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetJobAttemptMetrics is not implemented")) +} + +func (UnimplementedCIServiceHandler) GetJobMetrics(context.Context, *connect.Request[v1.GetJobMetricsRequest]) (*connect.Response[v1.GetJobMetricsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetJobMetrics is not implemented")) +} + +func (UnimplementedCIServiceHandler) GetRunMetrics(context.Context, *connect.Request[v1.GetRunMetricsRequest]) (*connect.Response[v1.GetRunMetricsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetRunMetrics is not implemented")) +} + func (UnimplementedCIServiceHandler) GetJobAttemptLogs(context.Context, *connect.Request[v1.GetJobAttemptLogsRequest]) (*connect.Response[v1.GetJobAttemptLogsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("depot.ci.v1.CIService.GetJobAttemptLogs is not implemented")) } diff --git a/proto/depot/ci/v1/ci.proto b/proto/depot/ci/v1/ci.proto index f3452937..652a1f83 100644 --- a/proto/depot/ci/v1/ci.proto +++ b/proto/depot/ci/v1/ci.proto @@ -38,6 +38,15 @@ service CIService { // GetWorkflow returns curated workflow, run, execution, job, and attempt metadata for single-workflow inspection rpc GetWorkflow(GetWorkflowRequest) returns (GetWorkflowResponse) {} + // GetJobAttemptMetrics returns CPU and memory metrics for one concrete job attempt + rpc GetJobAttemptMetrics(GetJobAttemptMetricsRequest) returns (GetJobAttemptMetricsResponse) {} + + // GetJobMetrics returns per-attempt CPU and memory metric summaries for one job + rpc GetJobMetrics(GetJobMetricsRequest) returns (GetJobMetricsResponse) {} + + // GetRunMetrics returns workflow/job/attempt CPU and memory metric summaries for one run + rpc GetRunMetrics(GetRunMetricsRequest) returns (GetRunMetricsResponse) {} + // GetJobAttemptLogs returns log lines for a job attempt rpc GetJobAttemptLogs(GetJobAttemptLogsRequest) returns (GetJobAttemptLogsResponse) {} @@ -399,6 +408,161 @@ message GetWorkflowJobAttempt { string finished_at = 7; } +// CI metrics messages + +message GetJobAttemptMetricsRequest { + // attempt_id identifies the concrete job attempt whose metric samples to fetch. + string attempt_id = 1; +} + +message GetJobMetricsRequest { + // job_id identifies the job whose attempts should be summarized. + string job_id = 1; +} + +message GetRunMetricsRequest { + // run_id identifies the run whose workflow/job/attempt metrics should be summarized. + string run_id = 1; +} + +message GetJobAttemptMetricsResponse { + CIMetricsRunContext run = 1; + CIMetricsWorkflowContext workflow = 2; + CIMetricsJobContext job = 3; + CIMetricsAttemptMetrics attempt = 4; + // snapshot_at is the request timestamp used as the upper bound for running attempts. + string snapshot_at = 5; +} + +message GetJobMetricsResponse { + CIMetricsRunContext run = 1; + CIMetricsWorkflowContext workflow = 2; + CIMetricsJobContext job = 3; + repeated CIMetricsAttemptSummary attempts = 4; + // snapshot_at is the request timestamp used as the upper bound for running attempts. + string snapshot_at = 5; +} + +message GetRunMetricsResponse { + CIMetricsRunContext run = 1; + repeated CIMetricsWorkflowMetrics workflows = 2; + // snapshot_at is the request timestamp used as the upper bound for running attempts. + string snapshot_at = 3; +} + +message CIMetricsWorkflowMetrics { + CIMetricsWorkflowContext workflow = 1; + repeated CIMetricsJobMetrics jobs = 2; +} + +message CIMetricsJobMetrics { + CIMetricsJobContext job = 1; + repeated CIMetricsAttemptSummary attempts = 2; +} + +message CIMetricsAttemptMetrics { + CIMetricsAttemptContext attempt = 1; + CIMetricsAvailability availability = 2; + CIMetricsStats stats = 3; + CIMetricsCapMetadata cap = 4; + repeated CIMetricSample samples = 5; +} + +message CIMetricsAttemptSummary { + CIMetricsAttemptContext attempt = 1; + CIMetricsAvailability availability = 2; + CIMetricsStats stats = 3; + CIMetricsCapMetadata cap = 4; +} + +message CIMetricsRunContext { + string run_id = 1; + string repo = 2; + string ref = 3; + string sha = 4; + string head_sha = 5; + string trigger = 6; + string status = 7; + string created_at = 8; + string started_at = 9; + string finished_at = 10; +} + +message CIMetricsWorkflowContext { + string workflow_id = 1; + string workflow_path = 2; + string name = 3; + string status = 4; + string created_at = 5; + string started_at = 6; + string finished_at = 7; +} + +message CIMetricsJobContext { + string job_id = 1; + string job_key = 2; + string status = 3; + string conclusion = 4; + int32 current_attempt = 5; + string created_at = 6; + string started_at = 7; + string finished_at = 8; +} + +message CIMetricsAttemptContext { + string attempt_id = 1; + int32 attempt = 2; + string status = 3; + string conclusion = 4; + string sandbox_id = 5; + string session_id = 6; + string created_at = 7; + string started_at = 8; + string finished_at = 9; +} + +message CIMetricSample { + string timestamp = 1; + optional double cpu_utilization = 2; + optional double memory_utilization = 3; + optional uint64 memory_usage_bytes = 4; +} + +message CIMetricsStats { + uint32 sample_count = 1; + uint32 cpu_sample_count = 2; + uint32 memory_sample_count = 3; + optional double peak_cpu_utilization = 4; + optional double average_cpu_utilization = 5; + optional double peak_memory_utilization = 6; + optional double average_memory_utilization = 7; + string observed_started_at = 8; + string observed_finished_at = 9; + optional uint64 peak_memory_usage_bytes = 10; + optional double average_memory_usage_bytes = 11; +} + +enum CIMetricsAvailabilityCode { + CI_METRICS_AVAILABILITY_CODE_UNSPECIFIED = 0; + CI_METRICS_AVAILABILITY_CODE_AVAILABLE = 1; + CI_METRICS_AVAILABILITY_CODE_NO_SANDBOX = 2; + CI_METRICS_AVAILABILITY_CODE_NO_TIME_RANGE = 3; + CI_METRICS_AVAILABILITY_CODE_NO_SAMPLES = 4; +} + +message CIMetricsAvailability { + CIMetricsAvailabilityCode code = 1; + string reason = 2; +} + +message CIMetricsCapMetadata { + uint32 raw_sample_count = 1; + uint32 returned_sample_count = 2; + uint32 max_returned_sample_count = 3; + bool downsampled = 4; + string downsample_strategy = 5; +} + // GetJobAttemptLogs messages message GetJobAttemptLogsRequest {