diff --git a/buf.gen.yaml b/buf.gen.yaml index dd470114..575ea840 100644 --- a/buf.gen.yaml +++ b/buf.gen.yaml @@ -6,7 +6,7 @@ managed: default: github.com/depot/cli/pkg/proto except: - buf.build/googleapis/googleapis - + - buf.build/depot/buildkit plugins: - plugin: buf.build/protocolbuffers/go:v1.30.0 out: pkg/proto diff --git a/pkg/progress/progress.go b/pkg/progress/progress.go index 727ef8ba..006ba0cc 100644 --- a/pkg/progress/progress.go +++ b/pkg/progress/progress.go @@ -2,8 +2,6 @@ package progress import ( "context" - "sort" - "strings" "sync" "time" @@ -12,10 +10,10 @@ import ( cliv1 "github.com/depot/cli/pkg/proto/depot/cli/v1" cliv1connect "github.com/depot/cli/pkg/proto/depot/cli/v1/cliv1connect" "github.com/docker/buildx/util/progress" + controlapi "github.com/moby/buildkit/api/services/control" "github.com/moby/buildkit/client" "github.com/moby/buildkit/identity" "github.com/opencontainers/go-digest" - "google.golang.org/protobuf/types/known/timestamppb" ) var _ progress.Writer = (*Progress)(nil) @@ -25,7 +23,7 @@ type Progress struct { token string client cliv1connect.BuildServiceClient - vertices chan []*client.Vertex + vertices chan *client.SolveStatus lmu sync.Mutex listeners []Listener @@ -48,7 +46,7 @@ func NewProgress(ctx context.Context, buildID, token string, p *progress.Printer buildID: buildID, token: token, client: depotapi.NewBuildClient(), - vertices: make(chan []*client.Vertex, channelBufferSize), + vertices: make(chan *client.SolveStatus, channelBufferSize), p: p, } @@ -112,7 +110,7 @@ func (p *Progress) Write(s *client.SolveStatus) { // Only buffer vertices to send if this progress writer is running in the context of an active build if p.HasActiveBuild() { select { - case p.vertices <- s.Vertexes: + case p.vertices <- s: default: // if channel is full skip recording vertex time to prevent blocking the build. } @@ -133,15 +131,6 @@ func (p *Progress) Write(s *client.SolveStatus) { // // However, the error message is still uploaded to the API. func (p *Progress) WriteLint(vertex client.Vertex, statuses []*client.VertexStatus, logs []*client.VertexLog) { - // Only buffer vertices to send if this progress writer is running in the context of an active build - if p.HasActiveBuild() { - select { - case p.vertices <- []*client.Vertex{&vertex}: - default: - // if channel is full skip recording vertex time to prevent blocking the build. - } - } - // We are stripping the error here because the UX printing the error and // the status show the same information twice. withoutError := vertex @@ -149,11 +138,22 @@ func (p *Progress) WriteLint(vertex client.Vertex, statuses []*client.VertexStat // Filling in a generic error message to cause the UX to fail with a red color. withoutError.Error = "linting failed " } - p.p.Write(&client.SolveStatus{ + + status := &client.SolveStatus{ Vertexes: []*client.Vertex{&withoutError}, Statuses: statuses, Logs: logs, - }) + } + // Only buffer vertices to send if this progress writer is running in the context of an active build + if p.HasActiveBuild() { + select { + case p.vertices <- status: + default: + // if channel is full skip recording vertex time to prevent blocking the build. + } + } + + p.p.Write(status) } func (p *Progress) ValidateLogSource(digest digest.Digest, v interface{}) bool { @@ -189,61 +189,41 @@ func (p *Progress) Run(ctx context.Context) { ticker := time.NewTicker(bufferTimeout) defer ticker.Stop() - // The same vertex can be reported multiple times. The data appears - // the same except for the duration. It's not clear to me if we should - // merge the durations or just use the first one. - uniqueVertices := map[digest.Digest]struct{}{} - steps := []*Step{} + statuses := []*client.SolveStatus{} for { select { - case vs := <-p.vertices: - for _, v := range vs { - // Only record vertices that have completed. - if v == nil || v.Started == nil || v.Completed == nil { - continue - } - - // skip if recorded already. - if _, ok := uniqueVertices[v.Digest]; ok { - continue - } - - uniqueVertices[v.Digest] = struct{}{} - step := NewStep(v) - steps = append(steps, &step) + case status := <-p.vertices: + if status == nil { + continue } + statuses = append(statuses, status) case <-ticker.C: - Analyze(steps) // Requires a new context because the previous one may be canceled while we are // sending the build timings. At most one will wait 5 seconds. ctx2, cancel := context.WithTimeout(context.Background(), 5*time.Second) - p.ReportBuildSteps(ctx2, steps) + if err := p.ReportStatus(ctx2, statuses); err == nil { + // Clear all reported steps. + statuses = statuses[:0] + } + ticker.Reset(bufferTimeout) cancel() case <-ctx.Done(): // Send all remaining build timings before exiting. for { select { - case vs := <-p.vertices: - for _, v := range vs { - if v == nil || v.Started == nil || v.Completed == nil { - continue - } - - if _, ok := uniqueVertices[v.Digest]; ok { - continue - } - - uniqueVertices[v.Digest] = struct{}{} - step := NewStep(v) - steps = append(steps, &step) + case status := <-p.vertices: + if status == nil { + continue } + + statuses = append(statuses, status) default: - Analyze(steps) // Requires a new context because the previous one was canceled. ctx2, cancel := context.WithTimeout(context.Background(), 5*time.Second) - p.ReportBuildSteps(ctx2, steps) + // Any errors are ignored and steps are not reported. + _ = p.ReportStatus(ctx2, statuses) cancel() return @@ -257,30 +237,46 @@ func (p *Progress) HasActiveBuild() bool { return p.buildID != "" && p.token != "" } -func (p *Progress) ReportBuildSteps(ctx context.Context, steps []*Step) { - if len(steps) == 0 { - return +func (p *Progress) ReportStatus(ctx context.Context, ss []*client.SolveStatus) error { + if len(ss) == 0 { + return nil } - req := NewTimingRequest(p.buildID, steps) - if req == nil { - return + statuses := make([]*controlapi.StatusResponse, 0, len(ss)) + stableDigests := map[string]string{} + for _, s := range ss { + status := s.Marshal() + statuses = append(statuses, status...) + + for _, sr := range status { + for _, v := range sr.Vertexes { + // Some vertex may not have stable digests. + // This generally happens when the vertex in an informational log like "pulling fs layer." + stableDigest := v.StableDigest.String() + if stableDigest == "" { + stableDigest = digest.FromString(v.Name).String() + } + stableDigests[v.Digest.String()] = stableDigest + } + } + } + + req := &cliv1.ReportStatusRequest{ + BuildId: p.buildID, + Statuses: statuses, + StableDigests: stableDigests, } ctx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() - _, err := p.client.ReportTimings(ctx, depotapi.WithAuthentication(connect.NewRequest(req), p.token)) - + _, err := p.client.ReportStatus(ctx, depotapi.WithAuthentication(connect.NewRequest(req), p.token)) if err != nil { // No need to log errors to the user as it is fine if we miss some build timings. - return - } else { - // Mark the steps as reported if the request was successful. - for i := range steps { - steps[i].Reported = true - } + return err } + + return nil } func (p *Progress) AddListener(l Listener) { @@ -288,181 +284,3 @@ func (p *Progress) AddListener(l Listener) { defer p.lmu.Unlock() p.listeners = append(p.listeners, l) } - -// Analyze computes the input duration for each step. -func Analyze(steps []*Step) { - // Used to lookup the index of a step's input digests. - digestIdx := make(map[digest.Digest]int, len(steps)) - for i := range steps { - digestIdx[steps[i].Digest] = i - digestIdx[steps[i].StableDigest] = i - } - - stableDigests := make(map[digest.Digest]digest.Digest, len(steps)) - for i := range steps { - // Filters out "random" digests that are not stable. - // An example of this is: - // { "Name": "[internal] load build context", "StableDigest": "random:8831e066dc1584a0ff85128626b574bcb4bf68e46ab71957522169d84586768d" } - - if !strings.HasPrefix(steps[i].StableDigest.String(), "random:") { - stableDigests[steps[i].Digest] = steps[i].StableDigest - } - } - - // Discover all stable input digests for each step. - for i := range steps { - // Already analyzed (minor optimization). - if len(steps[i].StableInputDigests) > 0 { - continue - } - - for _, inputDigest := range steps[i].InputDigests { - if stableDigest, ok := stableDigests[inputDigest]; ok { - steps[i].StableInputDigests = append(steps[i].StableInputDigests, stableDigest) - } - } - } - - // Discover all stable ancestor digests for each step. - for i := range steps { - // Already analyzed (minor optimization). - if len(steps[i].AncestorDigests) > 0 { - continue - } - - // Using the StableInputDigests filters out any vertex without a stable digest. - ancestorDigests := make(map[digest.Digest]struct{}, len(steps[i].InputDigests)) - - stack := make([]digest.Digest, len(steps[i].InputDigests)) - copy(stack, steps[i].InputDigests) - - var stepDigest digest.Digest - // Depth first traversal reading from leaves to first cached vertex or to root. - for { - if len(stack) == 0 { - break - } - - for j := range stack { - ancestorDigests[stack[j]] = struct{}{} - } - - stepDigest, stack = stack[len(stack)-1], stack[:len(stack)-1] - idx, ok := digestIdx[stepDigest] - if !ok { - // Missing vertex; not sure this happens. - continue - } - - step := steps[idx] - stack = append(stack, step.InputDigests...) - } - - for ancestor := range ancestorDigests { - if stableAncestor, ok := stableDigests[ancestor]; ok { - steps[i].AncestorDigests = append(steps[i].AncestorDigests, stableAncestor) - } - } - - // Sort the ancestor digests to ensure that the order is consistent. - // Order is the same as the order of the input digests. - // Effectively this is a topological sort. - sort.Slice(steps[i].AncestorDigests, func(j, k int) bool { - return digestIdx[steps[i].AncestorDigests[j]] < - digestIdx[steps[i].AncestorDigests[k]] - }) - } -} - -func NewTimingRequest(buildID string, steps []*Step) *cliv1.ReportTimingsRequest { - buildSteps := make([]*cliv1.BuildStep, 0, len(steps)) - for _, step := range steps { - // Skip steps that have already been reported. - if step.Reported { - continue - } - - buildStep := &cliv1.BuildStep{ - StartTime: timestamppb.New(step.StartTime), - DurationMs: int32(step.Duration.Milliseconds()), - Name: step.Name, - Cached: step.Cached, - } - - if step.Error != "" { - buildStep.Error = &step.Error - } - - stableDigest := step.StableDigest.String() - // Do not report "random" digests such as local build context. - if !strings.HasPrefix(stableDigest, "random:") && stableDigest != "" { - buildStep.StableDigest = &stableDigest - } - - for _, stableInputDigest := range step.StableInputDigests { - buildStep.InputDigests = append(buildStep.InputDigests, stableInputDigest.String()) - } - - for _, ancestor := range step.AncestorDigests { - buildStep.AncestorDigests = append(buildStep.AncestorDigests, ancestor.String()) - } - - buildSteps = append(buildSteps, buildStep) - } - - if len(buildSteps) == 0 { - return nil - } - - req := &cliv1.ReportTimingsRequest{ - BuildId: buildID, - BuildSteps: buildSteps, - } - - return req -} - -// Step is one of those internal data structures that translates domains from -// buildkitd to CLI and from CLI to the API server. -type Step struct { - Name string - - Digest digest.Digest // Buildkit digest is hashed with random inputs to create random input digests. - StableDigest digest.Digest // Stable digest is the same for the same inputs. This is a depot extension. - - StartTime time.Time - Duration time.Duration - - Cached bool - Error string - - InputDigests []digest.Digest // Buildkit input digests are hashed with random inputs to create random input digests. - StableInputDigests []digest.Digest // Stable input digests are the same for the same inputs. - AncestorDigests []digest.Digest // Ancestor digests are the input digests of all previous steps. - - Reported bool -} - -// Assumes that Completed and Started are not nil. -func NewStep(v *client.Vertex) Step { - step := Step{ - Name: v.Name, - Digest: v.Digest, - StartTime: *v.Started, - Duration: v.Completed.Sub(*v.Started), - Cached: v.Cached, - StableDigest: v.StableDigest, - Error: v.Error, - InputDigests: v.Inputs, - } - - return step -} - -// Instruction is the parsed instruction from a build step. -type Instruction struct { - Platform string - Stage string - Step int - Total int -} diff --git a/pkg/progress/progress_test.go b/pkg/progress/progress_test.go index 2924a7bb..4ef6e4b1 100644 --- a/pkg/progress/progress_test.go +++ b/pkg/progress/progress_test.go @@ -8,344 +8,90 @@ import ( "github.com/bufbuild/connect-go" cliv1 "github.com/depot/cli/pkg/proto/depot/cli/v1" + controlapi "github.com/moby/buildkit/api/services/control" + "github.com/moby/buildkit/client" "github.com/opencontainers/go-digest" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" - "google.golang.org/protobuf/types/known/timestamppb" ) -func TestAnalyze(t *testing.T) { - tests := []struct { - name string - steps []*Step - want []*Step - }{ - { - name: "empty", - steps: []*Step{}, - want: []*Step{}, - }, - { - steps: []*Step{ - { - Name: "[internal] load build context", - Digest: "sha256:8ced7971a11d2bd437ee0469091c3b32d2698bf27d11ed88cb74a5f775fa2708", - StableDigest: "random:8831e066dc1584a0ff85128626b574bcb4bf68e46ab71957522169d84586768d", - StartTime: time.Unix(1677700406, 42807307), - Duration: 1 * time.Millisecond, - Cached: false, - Reported: false, - }, - { - Name: "[linux/arm64 1/5] FROM docker.io/library/nginx:latest@sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - Digest: "sha256:83fb6f3d8df633fe9b547e8fbcedc67c20434a6cb4c61fa362204f0bf02e800b", - StableDigest: "sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - StartTime: time.Unix(1677700406, 42807307), - Duration: 13377 * time.Nanosecond, - InputDigests: []digest.Digest{}, - Cached: true, - Reported: false, - }, - { - Name: "[linux/arm64 2/5] ADD server.conf.tmpl /templates/", - Digest: "sha256:f8439fc1cdca327a9955d985988af06aa424960a446fb47570aec7bb86d53ce0", - StableDigest: "sha256:0d3769130c18cb99812166d7a0d67261ec06b439b9756a7b4f3af7bea2c52d6b", - StartTime: time.Unix(1677700407, 880021803), - Duration: 314674 * time.Nanosecond, - InputDigests: []digest.Digest{ - "sha256:83fb6f3d8df633fe9b547e8fbcedc67c20434a6cb4c61fa362204f0bf02e800b", - "sha256:8ced7971a11d2bd437ee0469091c3b32d2698bf27d11ed88cb74a5f775fa2708", - }, - Cached: true, - Reported: false, - }, - { - Name: "[linux/arm64 3/5] ADD docker-start /usr/local/bin/", - Digest: "sha256:97909ca8737039d395333471a78367423d2e7c1404074e4a9328e2ad5a17e259", - StableDigest: "sha256:f2969bd263ff6cb209be6abe3e78401f3aff99fd8ef352d8e4050037e39cd566", - StartTime: time.Unix(1677700408, 197343736), - Duration: 36467 * time.Nanosecond, - InputDigests: []digest.Digest{ - "sha256:f8439fc1cdca327a9955d985988af06aa424960a446fb47570aec7bb86d53ce0", - "sha256:8ced7971a11d2bd437ee0469091c3b32d2698bf27d11ed88cb74a5f775fa2708", - }, - Cached: true, - Reported: false, - }, - { - Name: "[linux/arm64 4/5] ADD docker-entry /usr/local/bin", - Digest: "sha256:abcbe96857349f5da5bf54c44351ab466151416eeda3afaf137f1920f2102156", - StableDigest: "sha256:08ebd82d42af87517b9a0042172e7f1d30ee8e3c18f4389eacf0974800ebecd5", - StartTime: time.Unix(1677700408, 237218947), - Duration: 35049 * time.Nanosecond, - InputDigests: []digest.Digest{ - "sha256:97909ca8737039d395333471a78367423d2e7c1404074e4a9328e2ad5a17e259", - "sha256:8ced7971a11d2bd437ee0469091c3b32d2698bf27d11ed88cb74a5f775fa2708", - }, - Cached: true, - Reported: false, - }, - { - Name: "[linux/arm64 5/5] RUN chmod +x /usr/local/bin/*", - Digest: "sha256:ac91518ab41d8356a383de8d9eafdae2ae7c45b880ce3c13140eb50187112404", - StableDigest: "sha256:0f1d2d3d4d5d6d7d8d9d0d1d2d3d4d5d6d7d8d9d0d1d2d3d4d5d6d7d8d9d0d1", - StartTime: time.Unix(1677700408, 274438691), - Duration: 237074 * time.Nanosecond, - InputDigests: []digest.Digest{ - "sha256:abcbe96857349f5da5bf54c44351ab466151416eeda3afaf137f1920f2102156", - "sha256:8ced7971a11d2bd437ee0469091c3b32d2698bf27d11ed88cb74a5f775fa2708", - }, - Cached: false, - Reported: false, - }, - }, - want: []*Step{ - { - Name: "[internal] load build context", - Digest: "sha256:8ced7971a11d2bd437ee0469091c3b32d2698bf27d11ed88cb74a5f775fa2708", - StableDigest: "random:8831e066dc1584a0ff85128626b574bcb4bf68e46ab71957522169d84586768d", - StartTime: time.Unix(1677700406, 42807307), - Duration: 1 * time.Millisecond, - Cached: false, - Reported: false, - }, - { - Name: "[linux/arm64 1/5] FROM docker.io/library/nginx:latest@sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - Digest: "sha256:83fb6f3d8df633fe9b547e8fbcedc67c20434a6cb4c61fa362204f0bf02e800b", - StableDigest: "sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - StartTime: time.Unix(1677700406, 42807307), - Duration: 13377 * time.Nanosecond, - InputDigests: []digest.Digest{}, - Cached: true, - Reported: false, - }, - { - Name: "[linux/arm64 2/5] ADD server.conf.tmpl /templates/", - Digest: "sha256:f8439fc1cdca327a9955d985988af06aa424960a446fb47570aec7bb86d53ce0", - StableDigest: "sha256:0d3769130c18cb99812166d7a0d67261ec06b439b9756a7b4f3af7bea2c52d6b", - StartTime: time.Unix(1677700407, 880021803), - Duration: 314674 * time.Nanosecond, - InputDigests: []digest.Digest{ - "sha256:83fb6f3d8df633fe9b547e8fbcedc67c20434a6cb4c61fa362204f0bf02e800b", - "sha256:8ced7971a11d2bd437ee0469091c3b32d2698bf27d11ed88cb74a5f775fa2708", - }, - Cached: true, - Reported: false, - StableInputDigests: []digest.Digest{"sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2"}, - AncestorDigests: []digest.Digest{ - "sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - }, - }, - { - Name: "[linux/arm64 3/5] ADD docker-start /usr/local/bin/", - Digest: "sha256:97909ca8737039d395333471a78367423d2e7c1404074e4a9328e2ad5a17e259", - StableDigest: "sha256:f2969bd263ff6cb209be6abe3e78401f3aff99fd8ef352d8e4050037e39cd566", - StartTime: time.Unix(1677700408, 197343736), - Duration: 36467 * time.Nanosecond, - InputDigests: []digest.Digest{ - "sha256:f8439fc1cdca327a9955d985988af06aa424960a446fb47570aec7bb86d53ce0", - "sha256:8ced7971a11d2bd437ee0469091c3b32d2698bf27d11ed88cb74a5f775fa2708", - }, - Cached: true, - Reported: false, - StableInputDigests: []digest.Digest{"sha256:0d3769130c18cb99812166d7a0d67261ec06b439b9756a7b4f3af7bea2c52d6b"}, - AncestorDigests: []digest.Digest{ - "sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - "sha256:0d3769130c18cb99812166d7a0d67261ec06b439b9756a7b4f3af7bea2c52d6b", - }, - }, - { - Name: "[linux/arm64 4/5] ADD docker-entry /usr/local/bin", - Digest: "sha256:abcbe96857349f5da5bf54c44351ab466151416eeda3afaf137f1920f2102156", - StableDigest: "sha256:08ebd82d42af87517b9a0042172e7f1d30ee8e3c18f4389eacf0974800ebecd5", - StartTime: time.Unix(1677700408, 237218947), - Duration: 35049 * time.Nanosecond, - InputDigests: []digest.Digest{ - "sha256:97909ca8737039d395333471a78367423d2e7c1404074e4a9328e2ad5a17e259", - "sha256:8ced7971a11d2bd437ee0469091c3b32d2698bf27d11ed88cb74a5f775fa2708", - }, - Cached: true, - Reported: false, - StableInputDigests: []digest.Digest{"sha256:f2969bd263ff6cb209be6abe3e78401f3aff99fd8ef352d8e4050037e39cd566"}, - AncestorDigests: []digest.Digest{ - "sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - "sha256:0d3769130c18cb99812166d7a0d67261ec06b439b9756a7b4f3af7bea2c52d6b", - "sha256:f2969bd263ff6cb209be6abe3e78401f3aff99fd8ef352d8e4050037e39cd566", - }, - }, - { - Name: "[linux/arm64 5/5] RUN chmod +x /usr/local/bin/*", - Digest: "sha256:ac91518ab41d8356a383de8d9eafdae2ae7c45b880ce3c13140eb50187112404", - StableDigest: "sha256:0f1d2d3d4d5d6d7d8d9d0d1d2d3d4d5d6d7d8d9d0d1d2d3d4d5d6d7d8d9d0d1", - StartTime: time.Unix(1677700408, 274438691), - Duration: 237074 * time.Nanosecond, - InputDigests: []digest.Digest{ - "sha256:abcbe96857349f5da5bf54c44351ab466151416eeda3afaf137f1920f2102156", - "sha256:8ced7971a11d2bd437ee0469091c3b32d2698bf27d11ed88cb74a5f775fa2708", - }, - Cached: false, - Reported: false, - StableInputDigests: []digest.Digest{"sha256:08ebd82d42af87517b9a0042172e7f1d30ee8e3c18f4389eacf0974800ebecd5"}, - AncestorDigests: []digest.Digest{ - "sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - "sha256:0d3769130c18cb99812166d7a0d67261ec06b439b9756a7b4f3af7bea2c52d6b", - "sha256:f2969bd263ff6cb209be6abe3e78401f3aff99fd8ef352d8e4050037e39cd566", - "sha256:08ebd82d42af87517b9a0042172e7f1d30ee8e3c18f4389eacf0974800ebecd5", - }, - }, - }, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - Analyze(tt.steps) - assert.Equal(t, tt.want, tt.steps) - }) - } -} +// Sends steps and authorization to server +func TestProgress_ReportBuildSteps(t *testing.T) { + buildID := "bid1" + token := "hunter2" -func TestNewTimingRequest(t *testing.T) { - type args struct { - buildID string - steps []*Step - } - tests := []struct { - name string - args args - want *cliv1.ReportTimingsRequest - }{ - { - name: "If all steps already reported no request", - args: args{ - buildID: "bid1", - steps: []*Step{ - { - Name: "[linux/arm64 1/5] FROM docker.io/library/nginx:latest@sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - StableDigest: "sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - StartTime: time.Unix(1677700406, 42807307), - Duration: 13377 * time.Nanosecond, - Cached: true, - Reported: true, - }, - }, - }, - want: nil, - }, + reqVertexes := []*client.Vertex{ { - name: "If not steps no request", - args: args{ - buildID: "bid1", - steps: []*Step{}, - }, - want: nil, + Name: "[linux/arm64 1/5] FROM docker.io/library/nginx:latest@sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", + Digest: "sha256:83fb6f3d8df633fe9b547e8fbcedc67c20434a6cb4c61fa362204f0bf02e800b", + StableDigest: "sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", + Started: func() *time.Time { t := time.Unix(1677700406, 42807307); return &t }(), + Completed: func() *time.Time { t := time.Unix(1677700407, 42807307); return &t }(), + Inputs: []digest.Digest{}, + Cached: true, }, { - name: "happy path", - args: args{ - buildID: "bid1", - steps: []*Step{ - { - Name: "[linux/arm64 1/5] FROM docker.io/library/nginx:latest@sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - Digest: "sha256:83fb6f3d8df633fe9b547e8fbcedc67c20434a6cb4c61fa362204f0bf02e800b", - StableDigest: "sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - StartTime: time.Unix(1677700406, 42807307), - Duration: 13377 * time.Nanosecond, - InputDigests: []digest.Digest{}, - Cached: true, - Reported: false, - }, - { - Name: "[linux/arm64 2/5] ADD server.conf.tmpl /templates/", - Digest: "sha256:f8439fc1cdca327a9955d985988af06aa424960a446fb47570aec7bb86d53ce0", - StableDigest: "sha256:0d3769130c18cb99812166d7a0d67261ec06b439b9756a7b4f3af7bea2c52d6b", - StartTime: time.Unix(1677700407, 880021803), - Duration: 314674 * time.Nanosecond, - InputDigests: []digest.Digest{ - "sha256:83fb6f3d8df633fe9b547e8fbcedc67c20434a6cb4c61fa362204f0bf02e800b", - "sha256:8ced7971a11d2bd437ee0469091c3b32d2698bf27d11ed88cb74a5f775fa2708", - }, - Cached: true, - Reported: false, - StableInputDigests: []digest.Digest{"sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2"}, - AncestorDigests: []digest.Digest{ - "sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - }, - }, - }, - }, - want: &cliv1.ReportTimingsRequest{ - BuildId: "bid1", - BuildSteps: []*cliv1.BuildStep{ - { - StartTime: timestamppb.New(time.Unix(1677700406, 42807307)), - DurationMs: int32(13377 / time.Millisecond), - Name: "[linux/arm64 1/5] FROM docker.io/library/nginx:latest@sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - StableDigest: func(s string) *string { return &s }("sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2"), - Cached: true, - InputDigests: nil, - AncestorDigests: nil, - }, - { - StartTime: timestamppb.New(time.Unix(1677700407, 880021803)), - DurationMs: int32(314674 / time.Millisecond), - Name: "[linux/arm64 2/5] ADD server.conf.tmpl /templates/", - StableDigest: func(s string) *string { return &s }("sha256:0d3769130c18cb99812166d7a0d67261ec06b439b9756a7b4f3af7bea2c52d6b"), - Cached: true, - InputDigests: []string{"sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2"}, - AncestorDigests: []string{"sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2"}, - }, - }, + Name: "[linux/arm64 2/5] ADD server.conf.tmpl /templates/", + Digest: "sha256:f8439fc1cdca327a9955d985988af06aa424960a446fb47570aec7bb86d53ce0", + StableDigest: "sha256:0d3769130c18cb99812166d7a0d67261ec06b439b9756a7b4f3af7bea2c52d6b", + Started: func() *time.Time { t := time.Unix(1677700407, 880021803); return &t }(), + Completed: func() *time.Time { t := time.Unix(1677700408, 880021803); return &t }(), + Inputs: []digest.Digest{ + "sha256:83fb6f3d8df633fe9b547e8fbcedc67c20434a6cb4c61fa362204f0bf02e800b", + "sha256:8ced7971a11d2bd437ee0469091c3b32d2698bf27d11ed88cb74a5f775fa2708", }, + Cached: true, }, } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - assert.Equal(t, tt.want, NewTimingRequest(tt.args.buildID, tt.args.steps)) - }) - } -} -// Sends steps and authorization to server -func TestProgress_ReportBuildSteps(t *testing.T) { - buildID := "bid1" - token := "hunter2" - steps := []*Step{ + // These are identical to reqVertexes; just a different type. + wantVertexes := []*controlapi.Vertex{ { Name: "[linux/arm64 1/5] FROM docker.io/library/nginx:latest@sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", Digest: "sha256:83fb6f3d8df633fe9b547e8fbcedc67c20434a6cb4c61fa362204f0bf02e800b", StableDigest: "sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - StartTime: time.Unix(1677700406, 42807307), - Duration: 13377 * time.Nanosecond, - InputDigests: []digest.Digest{}, + Started: func() *time.Time { t := time.Unix(1677700406, 42807307); return &t }(), + Completed: func() *time.Time { t := time.Unix(1677700407, 42807307); return &t }(), + Inputs: []digest.Digest{}, Cached: true, - Reported: false, }, { Name: "[linux/arm64 2/5] ADD server.conf.tmpl /templates/", Digest: "sha256:f8439fc1cdca327a9955d985988af06aa424960a446fb47570aec7bb86d53ce0", StableDigest: "sha256:0d3769130c18cb99812166d7a0d67261ec06b439b9756a7b4f3af7bea2c52d6b", - StartTime: time.Unix(1677700407, 880021803), - Duration: 314674 * time.Nanosecond, - InputDigests: []digest.Digest{ + Started: func() *time.Time { t := time.Unix(1677700407, 880021803); return &t }(), + Completed: func() *time.Time { t := time.Unix(1677700408, 880021803); return &t }(), + Inputs: []digest.Digest{ "sha256:83fb6f3d8df633fe9b547e8fbcedc67c20434a6cb4c61fa362204f0bf02e800b", "sha256:8ced7971a11d2bd437ee0469091c3b32d2698bf27d11ed88cb74a5f775fa2708", }, - Cached: true, - Reported: false, - StableInputDigests: []digest.Digest{"sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2"}, - AncestorDigests: []digest.Digest{ - "sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", - }, + Cached: true, }, } + wantStableDigests := map[string]string{ + "sha256:83fb6f3d8df633fe9b547e8fbcedc67c20434a6cb4c61fa362204f0bf02e800b": "sha256:aa0afebbb3cfa473099a62c4b32e9b3fb73ed23f2a75a65ce1d4b4f55a5c2ef2", + "sha256:f8439fc1cdca327a9955d985988af06aa424960a446fb47570aec7bb86d53ce0": "sha256:0d3769130c18cb99812166d7a0d67261ec06b439b9756a7b4f3af7bea2c52d6b", + } - wantRequest := NewTimingRequest(buildID, steps) + wantRequest := &cliv1.ReportStatusRequest{ + BuildId: buildID, + Statuses: []*controlapi.StatusResponse{{Vertexes: wantVertexes}}, + StableDigests: wantStableDigests, + } wantHeaders := http.Header{} wantHeaders["Authorization"] = []string{"Bearer " + token} mockClient := new(mockBuildServiceClient) - mockClient.On("ReportTimings", wantRequest, wantHeaders).Return(&cliv1.ReportTimingsResponse{}, nil) + mockClient.On("ReportStatus", + mock.MatchedBy(func(gotRequest *cliv1.ReportStatusRequest) bool { + return assert.Equal(t, wantRequest.Statuses, gotRequest.Statuses) && + assert.Equal(t, wantRequest.BuildId, gotRequest.BuildId) && + assert.Equal(t, wantRequest.StableDigests, gotRequest.StableDigests) + }), + wantHeaders).Return(&cliv1.ReportStatusResponse{}, + nil, + ) p := &Progress{ buildID: buildID, @@ -353,7 +99,8 @@ func TestProgress_ReportBuildSteps(t *testing.T) { client: mockClient, } - p.ReportBuildSteps(context.Background(), steps) + err := p.ReportStatus(context.Background(), []*client.SolveStatus{{Vertexes: reqVertexes}}) + assert.NoError(t, err) mockClient.AssertExpectations(t) } @@ -362,11 +109,15 @@ type mockBuildServiceClient struct { mock.Mock } -func (m *mockBuildServiceClient) ReportTimings(ctx context.Context, req *connect.Request[cliv1.ReportTimingsRequest]) (*connect.Response[cliv1.ReportTimingsResponse], error) { +func (m *mockBuildServiceClient) ReportStatus(ctx context.Context, req *connect.Request[cliv1.ReportStatusRequest]) (*connect.Response[cliv1.ReportStatusResponse], error) { args := m.Called(req.Msg, req.Header()) return connect.NewResponse( - args.Get(0).(*cliv1.ReportTimingsResponse)), args.Error(1) + args.Get(0).(*cliv1.ReportStatusResponse)), args.Error(1) +} + +func (m *mockBuildServiceClient) ReportTimings(ctx context.Context, req *connect.Request[cliv1.ReportTimingsRequest]) (*connect.Response[cliv1.ReportTimingsResponse], error) { + return nil, nil } func (m *mockBuildServiceClient) CreateBuild(context.Context, *connect.Request[cliv1.CreateBuildRequest]) (*connect.Response[cliv1.CreateBuildResponse], error) { diff --git a/pkg/proto/depot/cli/v1/build.pb.go b/pkg/proto/depot/cli/v1/build.pb.go index be319064..319218dd 100644 --- a/pkg/proto/depot/cli/v1/build.pb.go +++ b/pkg/proto/depot/cli/v1/build.pb.go @@ -7,6 +7,7 @@ package cliv1 import ( + control "github.com/moby/buildkit/api/services/control" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" timestamppb "google.golang.org/protobuf/types/known/timestamppb" @@ -1146,6 +1147,107 @@ func (x *BuildStep) GetAncestorDigests() []string { return nil } +type ReportStatusRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + BuildId string `protobuf:"bytes,1,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"` + Statuses []*control.StatusResponse `protobuf:"bytes,2,rep,name=statuses,proto3" json:"statuses,omitempty"` + StableDigests map[string]string `protobuf:"bytes,3,rep,name=stable_digests,json=stableDigests,proto3" json:"stable_digests,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *ReportStatusRequest) Reset() { + *x = ReportStatusRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_cli_v1_build_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReportStatusRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReportStatusRequest) ProtoMessage() {} + +func (x *ReportStatusRequest) ProtoReflect() protoreflect.Message { + mi := &file_depot_cli_v1_build_proto_msgTypes[15] + 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 ReportStatusRequest.ProtoReflect.Descriptor instead. +func (*ReportStatusRequest) Descriptor() ([]byte, []int) { + return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{15} +} + +func (x *ReportStatusRequest) GetBuildId() string { + if x != nil { + return x.BuildId + } + return "" +} + +func (x *ReportStatusRequest) GetStatuses() []*control.StatusResponse { + if x != nil { + return x.Statuses + } + return nil +} + +func (x *ReportStatusRequest) GetStableDigests() map[string]string { + if x != nil { + return x.StableDigests + } + return nil +} + +type ReportStatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *ReportStatusResponse) Reset() { + *x = ReportStatusResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_depot_cli_v1_build_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReportStatusResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReportStatusResponse) ProtoMessage() {} + +func (x *ReportStatusResponse) ProtoReflect() protoreflect.Message { + mi := &file_depot_cli_v1_build_proto_msgTypes[16] + 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 ReportStatusResponse.ProtoReflect.Descriptor instead. +func (*ReportStatusResponse) Descriptor() ([]byte, []int) { + return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{16} +} + type ListBuildsRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1162,7 +1264,7 @@ type ListBuildsRequest struct { func (x *ListBuildsRequest) Reset() { *x = ListBuildsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_cli_v1_build_proto_msgTypes[15] + mi := &file_depot_cli_v1_build_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1175,7 +1277,7 @@ func (x *ListBuildsRequest) String() string { func (*ListBuildsRequest) ProtoMessage() {} func (x *ListBuildsRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_cli_v1_build_proto_msgTypes[15] + mi := &file_depot_cli_v1_build_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1188,7 +1290,7 @@ func (x *ListBuildsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBuildsRequest.ProtoReflect.Descriptor instead. func (*ListBuildsRequest) Descriptor() ([]byte, []int) { - return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{15} + return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{17} } func (x *ListBuildsRequest) GetProjectId() string { @@ -1225,7 +1327,7 @@ type ListBuildsResponse struct { func (x *ListBuildsResponse) Reset() { *x = ListBuildsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_cli_v1_build_proto_msgTypes[16] + mi := &file_depot_cli_v1_build_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1238,7 +1340,7 @@ func (x *ListBuildsResponse) String() string { func (*ListBuildsResponse) ProtoMessage() {} func (x *ListBuildsResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_cli_v1_build_proto_msgTypes[16] + mi := &file_depot_cli_v1_build_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1251,7 +1353,7 @@ func (x *ListBuildsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListBuildsResponse.ProtoReflect.Descriptor instead. func (*ListBuildsResponse) Descriptor() ([]byte, []int) { - return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{16} + return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{18} } func (x *ListBuildsResponse) GetBuilds() []*Build { @@ -1283,7 +1385,7 @@ type Build struct { func (x *Build) Reset() { *x = Build{} if protoimpl.UnsafeEnabled { - mi := &file_depot_cli_v1_build_proto_msgTypes[17] + mi := &file_depot_cli_v1_build_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1296,7 +1398,7 @@ func (x *Build) String() string { func (*Build) ProtoMessage() {} func (x *Build) ProtoReflect() protoreflect.Message { - mi := &file_depot_cli_v1_build_proto_msgTypes[17] + mi := &file_depot_cli_v1_build_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1309,7 +1411,7 @@ func (x *Build) ProtoReflect() protoreflect.Message { // Deprecated: Use Build.ProtoReflect.Descriptor instead. func (*Build) Descriptor() ([]byte, []int) { - return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{17} + return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{19} } func (x *Build) GetId() string { @@ -1352,7 +1454,7 @@ type PageToken struct { func (x *PageToken) Reset() { *x = PageToken{} if protoimpl.UnsafeEnabled { - mi := &file_depot_cli_v1_build_proto_msgTypes[18] + mi := &file_depot_cli_v1_build_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1365,7 +1467,7 @@ func (x *PageToken) String() string { func (*PageToken) ProtoMessage() {} func (x *PageToken) ProtoReflect() protoreflect.Message { - mi := &file_depot_cli_v1_build_proto_msgTypes[18] + mi := &file_depot_cli_v1_build_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1378,7 +1480,7 @@ func (x *PageToken) ProtoReflect() protoreflect.Message { // Deprecated: Use PageToken.ProtoReflect.Descriptor instead. func (*PageToken) Descriptor() ([]byte, []int) { - return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{18} + return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{20} } func (x *PageToken) GetProjectId() string { @@ -1407,7 +1509,7 @@ type ReportBuildContextRequest struct { func (x *ReportBuildContextRequest) Reset() { *x = ReportBuildContextRequest{} if protoimpl.UnsafeEnabled { - mi := &file_depot_cli_v1_build_proto_msgTypes[19] + mi := &file_depot_cli_v1_build_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1420,7 +1522,7 @@ func (x *ReportBuildContextRequest) String() string { func (*ReportBuildContextRequest) ProtoMessage() {} func (x *ReportBuildContextRequest) ProtoReflect() protoreflect.Message { - mi := &file_depot_cli_v1_build_proto_msgTypes[19] + mi := &file_depot_cli_v1_build_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1433,7 +1535,7 @@ func (x *ReportBuildContextRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReportBuildContextRequest.ProtoReflect.Descriptor instead. func (*ReportBuildContextRequest) Descriptor() ([]byte, []int) { - return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{19} + return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{21} } func (x *ReportBuildContextRequest) GetBuildId() string { @@ -1463,7 +1565,7 @@ type Dockerfile struct { func (x *Dockerfile) Reset() { *x = Dockerfile{} if protoimpl.UnsafeEnabled { - mi := &file_depot_cli_v1_build_proto_msgTypes[20] + mi := &file_depot_cli_v1_build_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1476,7 +1578,7 @@ func (x *Dockerfile) String() string { func (*Dockerfile) ProtoMessage() {} func (x *Dockerfile) ProtoReflect() protoreflect.Message { - mi := &file_depot_cli_v1_build_proto_msgTypes[20] + mi := &file_depot_cli_v1_build_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1489,7 +1591,7 @@ func (x *Dockerfile) ProtoReflect() protoreflect.Message { // Deprecated: Use Dockerfile.ProtoReflect.Descriptor instead. func (*Dockerfile) Descriptor() ([]byte, []int) { - return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{20} + return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{22} } func (x *Dockerfile) GetTarget() string { @@ -1522,7 +1624,7 @@ type ReportBuildContextResponse struct { func (x *ReportBuildContextResponse) Reset() { *x = ReportBuildContextResponse{} if protoimpl.UnsafeEnabled { - mi := &file_depot_cli_v1_build_proto_msgTypes[21] + mi := &file_depot_cli_v1_build_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1535,7 +1637,7 @@ func (x *ReportBuildContextResponse) String() string { func (*ReportBuildContextResponse) ProtoMessage() {} func (x *ReportBuildContextResponse) ProtoReflect() protoreflect.Message { - mi := &file_depot_cli_v1_build_proto_msgTypes[21] + mi := &file_depot_cli_v1_build_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1548,7 +1650,7 @@ func (x *ReportBuildContextResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReportBuildContextResponse.ProtoReflect.Descriptor instead. func (*ReportBuildContextResponse) Descriptor() ([]byte, []int) { - return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{21} + return file_depot_cli_v1_build_proto_rawDescGZIP(), []int{23} } type CreateBuildResponse_Profiler struct { @@ -1562,7 +1664,7 @@ type CreateBuildResponse_Profiler struct { func (x *CreateBuildResponse_Profiler) Reset() { *x = CreateBuildResponse_Profiler{} if protoimpl.UnsafeEnabled { - mi := &file_depot_cli_v1_build_proto_msgTypes[23] + mi := &file_depot_cli_v1_build_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1575,7 +1677,7 @@ func (x *CreateBuildResponse_Profiler) String() string { func (*CreateBuildResponse_Profiler) ProtoMessage() {} func (x *CreateBuildResponse_Profiler) ProtoReflect() protoreflect.Message { - mi := &file_depot_cli_v1_build_proto_msgTypes[23] + mi := &file_depot_cli_v1_build_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1607,7 +1709,7 @@ type FinishBuildRequest_BuildSuccess struct { func (x *FinishBuildRequest_BuildSuccess) Reset() { *x = FinishBuildRequest_BuildSuccess{} if protoimpl.UnsafeEnabled { - mi := &file_depot_cli_v1_build_proto_msgTypes[24] + mi := &file_depot_cli_v1_build_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1620,7 +1722,7 @@ func (x *FinishBuildRequest_BuildSuccess) String() string { func (*FinishBuildRequest_BuildSuccess) ProtoMessage() {} func (x *FinishBuildRequest_BuildSuccess) ProtoReflect() protoreflect.Message { - mi := &file_depot_cli_v1_build_proto_msgTypes[24] + mi := &file_depot_cli_v1_build_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1647,7 +1749,7 @@ type FinishBuildRequest_BuildError struct { func (x *FinishBuildRequest_BuildError) Reset() { *x = FinishBuildRequest_BuildError{} if protoimpl.UnsafeEnabled { - mi := &file_depot_cli_v1_build_proto_msgTypes[25] + mi := &file_depot_cli_v1_build_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1660,7 +1762,7 @@ func (x *FinishBuildRequest_BuildError) String() string { func (*FinishBuildRequest_BuildError) ProtoMessage() {} func (x *FinishBuildRequest_BuildError) ProtoReflect() protoreflect.Message { - mi := &file_depot_cli_v1_build_proto_msgTypes[25] + mi := &file_depot_cli_v1_build_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1692,7 +1794,7 @@ type FinishBuildRequest_BuildCanceled struct { func (x *FinishBuildRequest_BuildCanceled) Reset() { *x = FinishBuildRequest_BuildCanceled{} if protoimpl.UnsafeEnabled { - mi := &file_depot_cli_v1_build_proto_msgTypes[26] + mi := &file_depot_cli_v1_build_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1705,7 +1807,7 @@ func (x *FinishBuildRequest_BuildCanceled) String() string { func (*FinishBuildRequest_BuildCanceled) ProtoMessage() {} func (x *FinishBuildRequest_BuildCanceled) ProtoReflect() protoreflect.Message { - mi := &file_depot_cli_v1_build_proto_msgTypes[26] + mi := &file_depot_cli_v1_build_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1732,7 +1834,7 @@ type GetBuildKitConnectionResponse_PendingConnection struct { func (x *GetBuildKitConnectionResponse_PendingConnection) Reset() { *x = GetBuildKitConnectionResponse_PendingConnection{} if protoimpl.UnsafeEnabled { - mi := &file_depot_cli_v1_build_proto_msgTypes[27] + mi := &file_depot_cli_v1_build_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1745,7 +1847,7 @@ func (x *GetBuildKitConnectionResponse_PendingConnection) String() string { func (*GetBuildKitConnectionResponse_PendingConnection) ProtoMessage() {} func (x *GetBuildKitConnectionResponse_PendingConnection) ProtoReflect() protoreflect.Message { - mi := &file_depot_cli_v1_build_proto_msgTypes[27] + mi := &file_depot_cli_v1_build_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1782,7 +1884,7 @@ type GetBuildKitConnectionResponse_ActiveConnection struct { func (x *GetBuildKitConnectionResponse_ActiveConnection) Reset() { *x = GetBuildKitConnectionResponse_ActiveConnection{} if protoimpl.UnsafeEnabled { - mi := &file_depot_cli_v1_build_proto_msgTypes[28] + mi := &file_depot_cli_v1_build_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1795,7 +1897,7 @@ func (x *GetBuildKitConnectionResponse_ActiveConnection) String() string { func (*GetBuildKitConnectionResponse_ActiveConnection) ProtoMessage() {} func (x *GetBuildKitConnectionResponse_ActiveConnection) ProtoReflect() protoreflect.Message { - mi := &file_depot_cli_v1_build_proto_msgTypes[28] + mi := &file_depot_cli_v1_build_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1846,7 +1948,9 @@ var file_depot_cli_v1_build_proto_rawDesc = []byte{ 0x75, 0x69, 0x6c, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x69, 0x0a, 0x12, 0x43, 0x72, 0x65, + 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x6d, 0x6f, 0x62, 0x79, 0x2f, + 0x62, 0x75, 0x69, 0x6c, 0x64, 0x6b, 0x69, 0x74, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x69, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x34, @@ -2003,130 +2107,154 @@ var file_depot_cli_v1_build_proto_rawDesc = []byte{ 0x03, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x69, 0x67, 0x65, 0x73, 0x74, - 0x22, 0x6e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, - 0x63, 0x74, 0x49, 0x64, 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, - 0x22, 0x69, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x06, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, - 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x06, 0x62, 0x75, 0x69, - 0x6c, 0x64, 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, 0xc2, 0x01, 0x0a, 0x05, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x31, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x66, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, - 0x22, 0x6e, 0x0a, 0x09, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, + 0x22, 0x8d, 0x02, 0x0a, 0x13, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, + 0x64, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6d, 0x6f, 0x62, 0x79, 0x2e, 0x62, 0x75, 0x69, + 0x6c, 0x64, 0x6b, 0x69, 0x74, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x65, + 0x73, 0x12, 0x5b, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x64, 0x69, 0x67, 0x65, + 0x73, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x74, 0x61, + 0x62, 0x6c, 0x65, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0d, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x1a, 0x40, + 0x0a, 0x12, 0x53, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x16, 0x0a, 0x14, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x0f, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x22, 0x72, 0x0a, 0x19, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, - 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, 0x12, 0x3a, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x6b, - 0x65, 0x72, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, - 0x6b, 0x65, 0x72, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0b, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, - 0x69, 0x6c, 0x65, 0x73, 0x22, 0x5c, 0x0a, 0x0a, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, 0x69, - 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, - 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2a, 0x5b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x0a, 0x13, 0x43, - 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, - 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4d, 0x4d, 0x41, - 0x4e, 0x44, 0x5f, 0x42, 0x41, 0x4b, 0x45, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x4d, - 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x58, 0x10, 0x03, 0x2a, 0x6b, 0x0a, - 0x0f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, - 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x45, 0x52, 0x5f, 0x50, 0x4c, 0x41, 0x54, - 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x45, 0x52, 0x5f, 0x50, 0x4c, - 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x41, 0x4d, 0x44, 0x36, 0x34, 0x10, 0x01, 0x12, 0x1a, - 0x0a, 0x16, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x45, 0x52, 0x5f, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, - 0x52, 0x4d, 0x5f, 0x41, 0x52, 0x4d, 0x36, 0x34, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0b, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x55, - 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x42, 0x55, 0x49, 0x4c, - 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, - 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4e, 0x49, 0x53, 0x48, 0x45, 0x44, 0x10, 0x02, 0x12, 0x17, 0x0a, - 0x13, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, - 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, 0x44, 0x10, - 0x04, 0x32, 0xa4, 0x05, 0x0a, 0x0c, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x52, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, - 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, 0x74, 0x43, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x11, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, - 0x68, 0x12, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, - 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x48, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x49, 0x64, 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, 0x22, 0x69, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, + 0x0a, 0x06, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x52, 0x06, 0x62, 0x75, 0x69, 0x6c, 0x64, 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, 0xc2, 0x01, 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x0e, 0x0a, + 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x31, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x39, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x52, 0x09, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3b, 0x0a, 0x0b, 0x66, + 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x66, 0x69, + 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x41, 0x74, 0x22, 0x6e, 0x0a, 0x09, 0x50, 0x61, 0x67, 0x65, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6a, 0x65, + 0x63, 0x74, 0x49, 0x64, 0x12, 0x42, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x22, 0x72, 0x0a, 0x19, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x64, + 0x12, 0x3a, 0x0a, 0x0b, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, + 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, 0x69, 0x6c, 0x65, 0x52, + 0x0b, 0x64, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x5c, 0x0a, 0x0a, + 0x44, 0x6f, 0x63, 0x6b, 0x65, 0x72, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x5b, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x12, 0x17, 0x0a, 0x13, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, + 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x10, 0x01, 0x12, + 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x42, 0x41, 0x4b, 0x45, 0x10, + 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x4d, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x42, 0x55, 0x49, + 0x4c, 0x44, 0x58, 0x10, 0x03, 0x2a, 0x6b, 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, + 0x50, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x20, 0x0a, 0x1c, 0x42, 0x55, 0x49, 0x4c, + 0x44, 0x45, 0x52, 0x5f, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x55, 0x4e, 0x53, + 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, + 0x49, 0x4c, 0x44, 0x45, 0x52, 0x5f, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x41, + 0x4d, 0x44, 0x36, 0x34, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x45, + 0x52, 0x5f, 0x50, 0x4c, 0x41, 0x54, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x41, 0x52, 0x4d, 0x36, 0x34, + 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x18, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x18, 0x0a, 0x14, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, + 0x5f, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x19, 0x0a, 0x15, 0x42, 0x55, + 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x49, 0x4e, 0x49, 0x53, + 0x48, 0x45, 0x44, 0x10, 0x02, 0x12, 0x17, 0x0a, 0x13, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x19, + 0x0a, 0x15, 0x42, 0x55, 0x49, 0x4c, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x43, + 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x32, 0xfb, 0x05, 0x0a, 0x0c, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x52, 0x0a, 0x0b, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, + 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, + 0x0a, 0x0b, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x20, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, 0x69, 0x6e, + 0x69, 0x73, 0x68, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x46, + 0x69, 0x6e, 0x69, 0x73, 0x68, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x70, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4b, 0x69, + 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x2e, 0x64, 0x65, + 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x4b, 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x4b, + 0x69, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x26, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, - 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x69, 0x6d, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x12, - 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x12, 0x27, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x65, + 0x75, 0x69, 0x6c, 0x64, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x48, 0x65, 0x61, 0x6c, + 0x74, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0d, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x73, 0x12, 0x1f, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xa3, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, - 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 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, 0x6c, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6c, 0x69, 0x76, 0x31, 0xa2, 0x02, - 0x03, 0x44, 0x43, 0x58, 0xaa, 0x02, 0x0c, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x43, 0x6c, 0x69, - 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0c, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, 0x6c, 0x69, 0x5c, - 0x56, 0x31, 0xe2, 0x02, 0x18, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, 0x6c, 0x69, 0x5c, 0x56, - 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, - 0x44, 0x65, 0x70, 0x6f, 0x74, 0x3a, 0x3a, 0x43, 0x6c, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x74, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0c, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, + 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x12, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x12, 0x27, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x64, 0x65, 0x70, + 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x73, 0x12, 0x1f, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, + 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, + 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xa3, 0x01, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x2e, + 0x64, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x63, 0x6c, 0x69, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 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, 0x6c, 0x69, 0x2f, 0x76, 0x31, 0x3b, 0x63, 0x6c, 0x69, 0x76, 0x31, 0xa2, 0x02, 0x03, + 0x44, 0x43, 0x58, 0xaa, 0x02, 0x0c, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x2e, 0x43, 0x6c, 0x69, 0x2e, + 0x56, 0x31, 0xca, 0x02, 0x0c, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, 0x6c, 0x69, 0x5c, 0x56, + 0x31, 0xe2, 0x02, 0x18, 0x44, 0x65, 0x70, 0x6f, 0x74, 0x5c, 0x43, 0x6c, 0x69, 0x5c, 0x56, 0x31, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0e, 0x44, + 0x65, 0x70, 0x6f, 0x74, 0x3a, 0x3a, 0x43, 0x6c, 0x69, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -2142,7 +2270,7 @@ func file_depot_cli_v1_build_proto_rawDescGZIP() []byte { } var file_depot_cli_v1_build_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_depot_cli_v1_build_proto_msgTypes = make([]protoimpl.MessageInfo, 29) +var file_depot_cli_v1_build_proto_msgTypes = make([]protoimpl.MessageInfo, 32) var file_depot_cli_v1_build_proto_goTypes = []interface{}{ (Command)(0), // 0: depot.cli.v1.Command (BuilderPlatform)(0), // 1: depot.cli.v1.BuilderPlatform @@ -2162,65 +2290,73 @@ var file_depot_cli_v1_build_proto_goTypes = []interface{}{ (*ReportTimingsRequest)(nil), // 15: depot.cli.v1.ReportTimingsRequest (*ReportTimingsResponse)(nil), // 16: depot.cli.v1.ReportTimingsResponse (*BuildStep)(nil), // 17: depot.cli.v1.BuildStep - (*ListBuildsRequest)(nil), // 18: depot.cli.v1.ListBuildsRequest - (*ListBuildsResponse)(nil), // 19: depot.cli.v1.ListBuildsResponse - (*Build)(nil), // 20: depot.cli.v1.Build - (*PageToken)(nil), // 21: depot.cli.v1.PageToken - (*ReportBuildContextRequest)(nil), // 22: depot.cli.v1.ReportBuildContextRequest - (*Dockerfile)(nil), // 23: depot.cli.v1.Dockerfile - (*ReportBuildContextResponse)(nil), // 24: depot.cli.v1.ReportBuildContextResponse - nil, // 25: depot.cli.v1.BuildOutput.AttributesEntry - (*CreateBuildResponse_Profiler)(nil), // 26: depot.cli.v1.CreateBuildResponse.Profiler - (*FinishBuildRequest_BuildSuccess)(nil), // 27: depot.cli.v1.FinishBuildRequest.BuildSuccess - (*FinishBuildRequest_BuildError)(nil), // 28: depot.cli.v1.FinishBuildRequest.BuildError - (*FinishBuildRequest_BuildCanceled)(nil), // 29: depot.cli.v1.FinishBuildRequest.BuildCanceled - (*GetBuildKitConnectionResponse_PendingConnection)(nil), // 30: depot.cli.v1.GetBuildKitConnectionResponse.PendingConnection - (*GetBuildKitConnectionResponse_ActiveConnection)(nil), // 31: depot.cli.v1.GetBuildKitConnectionResponse.ActiveConnection - (*timestamppb.Timestamp)(nil), // 32: google.protobuf.Timestamp + (*ReportStatusRequest)(nil), // 18: depot.cli.v1.ReportStatusRequest + (*ReportStatusResponse)(nil), // 19: depot.cli.v1.ReportStatusResponse + (*ListBuildsRequest)(nil), // 20: depot.cli.v1.ListBuildsRequest + (*ListBuildsResponse)(nil), // 21: depot.cli.v1.ListBuildsResponse + (*Build)(nil), // 22: depot.cli.v1.Build + (*PageToken)(nil), // 23: depot.cli.v1.PageToken + (*ReportBuildContextRequest)(nil), // 24: depot.cli.v1.ReportBuildContextRequest + (*Dockerfile)(nil), // 25: depot.cli.v1.Dockerfile + (*ReportBuildContextResponse)(nil), // 26: depot.cli.v1.ReportBuildContextResponse + nil, // 27: depot.cli.v1.BuildOutput.AttributesEntry + (*CreateBuildResponse_Profiler)(nil), // 28: depot.cli.v1.CreateBuildResponse.Profiler + (*FinishBuildRequest_BuildSuccess)(nil), // 29: depot.cli.v1.FinishBuildRequest.BuildSuccess + (*FinishBuildRequest_BuildError)(nil), // 30: depot.cli.v1.FinishBuildRequest.BuildError + (*FinishBuildRequest_BuildCanceled)(nil), // 31: depot.cli.v1.FinishBuildRequest.BuildCanceled + (*GetBuildKitConnectionResponse_PendingConnection)(nil), // 32: depot.cli.v1.GetBuildKitConnectionResponse.PendingConnection + (*GetBuildKitConnectionResponse_ActiveConnection)(nil), // 33: depot.cli.v1.GetBuildKitConnectionResponse.ActiveConnection + nil, // 34: depot.cli.v1.ReportStatusRequest.StableDigestsEntry + (*timestamppb.Timestamp)(nil), // 35: google.protobuf.Timestamp + (*control.StatusResponse)(nil), // 36: moby.buildkit.v1.StatusResponse } var file_depot_cli_v1_build_proto_depIdxs = []int32{ 4, // 0: depot.cli.v1.CreateBuildRequest.options:type_name -> depot.cli.v1.BuildOptions 0, // 1: depot.cli.v1.BuildOptions.command:type_name -> depot.cli.v1.Command 5, // 2: depot.cli.v1.BuildOptions.outputs:type_name -> depot.cli.v1.BuildOutput - 25, // 3: depot.cli.v1.BuildOutput.attributes:type_name -> depot.cli.v1.BuildOutput.AttributesEntry + 27, // 3: depot.cli.v1.BuildOutput.attributes:type_name -> depot.cli.v1.BuildOutput.AttributesEntry 7, // 4: depot.cli.v1.CreateBuildResponse.registry:type_name -> depot.cli.v1.Registry - 26, // 5: depot.cli.v1.CreateBuildResponse.profiler:type_name -> depot.cli.v1.CreateBuildResponse.Profiler - 27, // 6: depot.cli.v1.FinishBuildRequest.success:type_name -> depot.cli.v1.FinishBuildRequest.BuildSuccess - 28, // 7: depot.cli.v1.FinishBuildRequest.error:type_name -> depot.cli.v1.FinishBuildRequest.BuildError - 29, // 8: depot.cli.v1.FinishBuildRequest.canceled:type_name -> depot.cli.v1.FinishBuildRequest.BuildCanceled + 28, // 5: depot.cli.v1.CreateBuildResponse.profiler:type_name -> depot.cli.v1.CreateBuildResponse.Profiler + 29, // 6: depot.cli.v1.FinishBuildRequest.success:type_name -> depot.cli.v1.FinishBuildRequest.BuildSuccess + 30, // 7: depot.cli.v1.FinishBuildRequest.error:type_name -> depot.cli.v1.FinishBuildRequest.BuildError + 31, // 8: depot.cli.v1.FinishBuildRequest.canceled:type_name -> depot.cli.v1.FinishBuildRequest.BuildCanceled 1, // 9: depot.cli.v1.GetBuildKitConnectionRequest.platform:type_name -> depot.cli.v1.BuilderPlatform - 30, // 10: depot.cli.v1.GetBuildKitConnectionResponse.pending:type_name -> depot.cli.v1.GetBuildKitConnectionResponse.PendingConnection - 31, // 11: depot.cli.v1.GetBuildKitConnectionResponse.active:type_name -> depot.cli.v1.GetBuildKitConnectionResponse.ActiveConnection + 32, // 10: depot.cli.v1.GetBuildKitConnectionResponse.pending:type_name -> depot.cli.v1.GetBuildKitConnectionResponse.PendingConnection + 33, // 11: depot.cli.v1.GetBuildKitConnectionResponse.active:type_name -> depot.cli.v1.GetBuildKitConnectionResponse.ActiveConnection 1, // 12: depot.cli.v1.ReportBuildHealthRequest.platform:type_name -> depot.cli.v1.BuilderPlatform 17, // 13: depot.cli.v1.ReportTimingsRequest.build_steps:type_name -> depot.cli.v1.BuildStep - 32, // 14: depot.cli.v1.BuildStep.start_time:type_name -> google.protobuf.Timestamp - 20, // 15: depot.cli.v1.ListBuildsResponse.builds:type_name -> depot.cli.v1.Build - 2, // 16: depot.cli.v1.Build.status:type_name -> depot.cli.v1.BuildStatus - 32, // 17: depot.cli.v1.Build.created_at:type_name -> google.protobuf.Timestamp - 32, // 18: depot.cli.v1.Build.finished_at:type_name -> google.protobuf.Timestamp - 32, // 19: depot.cli.v1.PageToken.last_created_at:type_name -> google.protobuf.Timestamp - 23, // 20: depot.cli.v1.ReportBuildContextRequest.dockerfiles:type_name -> depot.cli.v1.Dockerfile - 12, // 21: depot.cli.v1.GetBuildKitConnectionResponse.ActiveConnection.cert:type_name -> depot.cli.v1.Cert - 12, // 22: depot.cli.v1.GetBuildKitConnectionResponse.ActiveConnection.ca_cert:type_name -> depot.cli.v1.Cert - 3, // 23: depot.cli.v1.BuildService.CreateBuild:input_type -> depot.cli.v1.CreateBuildRequest - 8, // 24: depot.cli.v1.BuildService.FinishBuild:input_type -> depot.cli.v1.FinishBuildRequest - 10, // 25: depot.cli.v1.BuildService.GetBuildKitConnection:input_type -> depot.cli.v1.GetBuildKitConnectionRequest - 13, // 26: depot.cli.v1.BuildService.ReportBuildHealth:input_type -> depot.cli.v1.ReportBuildHealthRequest - 15, // 27: depot.cli.v1.BuildService.ReportTimings:input_type -> depot.cli.v1.ReportTimingsRequest - 22, // 28: depot.cli.v1.BuildService.ReportBuildContext:input_type -> depot.cli.v1.ReportBuildContextRequest - 18, // 29: depot.cli.v1.BuildService.ListBuilds:input_type -> depot.cli.v1.ListBuildsRequest - 6, // 30: depot.cli.v1.BuildService.CreateBuild:output_type -> depot.cli.v1.CreateBuildResponse - 9, // 31: depot.cli.v1.BuildService.FinishBuild:output_type -> depot.cli.v1.FinishBuildResponse - 11, // 32: depot.cli.v1.BuildService.GetBuildKitConnection:output_type -> depot.cli.v1.GetBuildKitConnectionResponse - 14, // 33: depot.cli.v1.BuildService.ReportBuildHealth:output_type -> depot.cli.v1.ReportBuildHealthResponse - 16, // 34: depot.cli.v1.BuildService.ReportTimings:output_type -> depot.cli.v1.ReportTimingsResponse - 24, // 35: depot.cli.v1.BuildService.ReportBuildContext:output_type -> depot.cli.v1.ReportBuildContextResponse - 19, // 36: depot.cli.v1.BuildService.ListBuilds:output_type -> depot.cli.v1.ListBuildsResponse - 30, // [30:37] is the sub-list for method output_type - 23, // [23:30] is the sub-list for method input_type - 23, // [23:23] is the sub-list for extension type_name - 23, // [23:23] is the sub-list for extension extendee - 0, // [0:23] is the sub-list for field type_name + 35, // 14: depot.cli.v1.BuildStep.start_time:type_name -> google.protobuf.Timestamp + 36, // 15: depot.cli.v1.ReportStatusRequest.statuses:type_name -> moby.buildkit.v1.StatusResponse + 34, // 16: depot.cli.v1.ReportStatusRequest.stable_digests:type_name -> depot.cli.v1.ReportStatusRequest.StableDigestsEntry + 22, // 17: depot.cli.v1.ListBuildsResponse.builds:type_name -> depot.cli.v1.Build + 2, // 18: depot.cli.v1.Build.status:type_name -> depot.cli.v1.BuildStatus + 35, // 19: depot.cli.v1.Build.created_at:type_name -> google.protobuf.Timestamp + 35, // 20: depot.cli.v1.Build.finished_at:type_name -> google.protobuf.Timestamp + 35, // 21: depot.cli.v1.PageToken.last_created_at:type_name -> google.protobuf.Timestamp + 25, // 22: depot.cli.v1.ReportBuildContextRequest.dockerfiles:type_name -> depot.cli.v1.Dockerfile + 12, // 23: depot.cli.v1.GetBuildKitConnectionResponse.ActiveConnection.cert:type_name -> depot.cli.v1.Cert + 12, // 24: depot.cli.v1.GetBuildKitConnectionResponse.ActiveConnection.ca_cert:type_name -> depot.cli.v1.Cert + 3, // 25: depot.cli.v1.BuildService.CreateBuild:input_type -> depot.cli.v1.CreateBuildRequest + 8, // 26: depot.cli.v1.BuildService.FinishBuild:input_type -> depot.cli.v1.FinishBuildRequest + 10, // 27: depot.cli.v1.BuildService.GetBuildKitConnection:input_type -> depot.cli.v1.GetBuildKitConnectionRequest + 13, // 28: depot.cli.v1.BuildService.ReportBuildHealth:input_type -> depot.cli.v1.ReportBuildHealthRequest + 15, // 29: depot.cli.v1.BuildService.ReportTimings:input_type -> depot.cli.v1.ReportTimingsRequest + 18, // 30: depot.cli.v1.BuildService.ReportStatus:input_type -> depot.cli.v1.ReportStatusRequest + 24, // 31: depot.cli.v1.BuildService.ReportBuildContext:input_type -> depot.cli.v1.ReportBuildContextRequest + 20, // 32: depot.cli.v1.BuildService.ListBuilds:input_type -> depot.cli.v1.ListBuildsRequest + 6, // 33: depot.cli.v1.BuildService.CreateBuild:output_type -> depot.cli.v1.CreateBuildResponse + 9, // 34: depot.cli.v1.BuildService.FinishBuild:output_type -> depot.cli.v1.FinishBuildResponse + 11, // 35: depot.cli.v1.BuildService.GetBuildKitConnection:output_type -> depot.cli.v1.GetBuildKitConnectionResponse + 14, // 36: depot.cli.v1.BuildService.ReportBuildHealth:output_type -> depot.cli.v1.ReportBuildHealthResponse + 16, // 37: depot.cli.v1.BuildService.ReportTimings:output_type -> depot.cli.v1.ReportTimingsResponse + 19, // 38: depot.cli.v1.BuildService.ReportStatus:output_type -> depot.cli.v1.ReportStatusResponse + 26, // 39: depot.cli.v1.BuildService.ReportBuildContext:output_type -> depot.cli.v1.ReportBuildContextResponse + 21, // 40: depot.cli.v1.BuildService.ListBuilds:output_type -> depot.cli.v1.ListBuildsResponse + 33, // [33:41] is the sub-list for method output_type + 25, // [25:33] is the sub-list for method input_type + 25, // [25:25] is the sub-list for extension type_name + 25, // [25:25] is the sub-list for extension extendee + 0, // [0:25] is the sub-list for field type_name } func init() { file_depot_cli_v1_build_proto_init() } @@ -2410,7 +2546,7 @@ func file_depot_cli_v1_build_proto_init() { } } file_depot_cli_v1_build_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListBuildsRequest); i { + switch v := v.(*ReportStatusRequest); i { case 0: return &v.state case 1: @@ -2422,7 +2558,7 @@ func file_depot_cli_v1_build_proto_init() { } } file_depot_cli_v1_build_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListBuildsResponse); i { + switch v := v.(*ReportStatusResponse); i { case 0: return &v.state case 1: @@ -2434,7 +2570,7 @@ func file_depot_cli_v1_build_proto_init() { } } file_depot_cli_v1_build_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Build); i { + switch v := v.(*ListBuildsRequest); i { case 0: return &v.state case 1: @@ -2446,7 +2582,7 @@ func file_depot_cli_v1_build_proto_init() { } } file_depot_cli_v1_build_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PageToken); i { + switch v := v.(*ListBuildsResponse); i { case 0: return &v.state case 1: @@ -2458,7 +2594,7 @@ func file_depot_cli_v1_build_proto_init() { } } file_depot_cli_v1_build_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReportBuildContextRequest); i { + switch v := v.(*Build); i { case 0: return &v.state case 1: @@ -2470,7 +2606,7 @@ func file_depot_cli_v1_build_proto_init() { } } file_depot_cli_v1_build_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Dockerfile); i { + switch v := v.(*PageToken); i { case 0: return &v.state case 1: @@ -2482,7 +2618,19 @@ func file_depot_cli_v1_build_proto_init() { } } file_depot_cli_v1_build_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReportBuildContextResponse); i { + switch v := v.(*ReportBuildContextRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_cli_v1_build_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Dockerfile); i { case 0: return &v.state case 1: @@ -2494,6 +2642,18 @@ func file_depot_cli_v1_build_proto_init() { } } file_depot_cli_v1_build_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReportBuildContextResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_depot_cli_v1_build_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateBuildResponse_Profiler); i { case 0: return &v.state @@ -2505,7 +2665,7 @@ func file_depot_cli_v1_build_proto_init() { return nil } } - file_depot_cli_v1_build_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_depot_cli_v1_build_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FinishBuildRequest_BuildSuccess); i { case 0: return &v.state @@ -2517,7 +2677,7 @@ func file_depot_cli_v1_build_proto_init() { return nil } } - file_depot_cli_v1_build_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_depot_cli_v1_build_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FinishBuildRequest_BuildError); i { case 0: return &v.state @@ -2529,7 +2689,7 @@ func file_depot_cli_v1_build_proto_init() { return nil } } - file_depot_cli_v1_build_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_depot_cli_v1_build_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*FinishBuildRequest_BuildCanceled); i { case 0: return &v.state @@ -2541,7 +2701,7 @@ func file_depot_cli_v1_build_proto_init() { return nil } } - file_depot_cli_v1_build_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_depot_cli_v1_build_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBuildKitConnectionResponse_PendingConnection); i { case 0: return &v.state @@ -2553,7 +2713,7 @@ func file_depot_cli_v1_build_proto_init() { return nil } } - file_depot_cli_v1_build_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_depot_cli_v1_build_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetBuildKitConnectionResponse_ActiveConnection); i { case 0: return &v.state @@ -2584,7 +2744,7 @@ func file_depot_cli_v1_build_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_depot_cli_v1_build_proto_rawDesc, NumEnums: 3, - NumMessages: 29, + NumMessages: 32, NumExtensions: 0, NumServices: 1, }, diff --git a/pkg/proto/depot/cli/v1/cliv1connect/build.connect.go b/pkg/proto/depot/cli/v1/cliv1connect/build.connect.go index 4bdc6b9c..5ae41a6c 100644 --- a/pkg/proto/depot/cli/v1/cliv1connect/build.connect.go +++ b/pkg/proto/depot/cli/v1/cliv1connect/build.connect.go @@ -48,6 +48,9 @@ const ( // BuildServiceReportTimingsProcedure is the fully-qualified name of the BuildService's // ReportTimings RPC. BuildServiceReportTimingsProcedure = "/depot.cli.v1.BuildService/ReportTimings" + // BuildServiceReportStatusProcedure is the fully-qualified name of the BuildService's ReportStatus + // RPC. + BuildServiceReportStatusProcedure = "/depot.cli.v1.BuildService/ReportStatus" // BuildServiceReportBuildContextProcedure is the fully-qualified name of the BuildService's // ReportBuildContext RPC. BuildServiceReportBuildContextProcedure = "/depot.cli.v1.BuildService/ReportBuildContext" @@ -62,6 +65,7 @@ type BuildServiceClient interface { GetBuildKitConnection(context.Context, *connect_go.Request[v1.GetBuildKitConnectionRequest]) (*connect_go.Response[v1.GetBuildKitConnectionResponse], error) ReportBuildHealth(context.Context, *connect_go.Request[v1.ReportBuildHealthRequest]) (*connect_go.Response[v1.ReportBuildHealthResponse], error) ReportTimings(context.Context, *connect_go.Request[v1.ReportTimingsRequest]) (*connect_go.Response[v1.ReportTimingsResponse], error) + ReportStatus(context.Context, *connect_go.Request[v1.ReportStatusRequest]) (*connect_go.Response[v1.ReportStatusResponse], error) ReportBuildContext(context.Context, *connect_go.Request[v1.ReportBuildContextRequest]) (*connect_go.Response[v1.ReportBuildContextResponse], error) ListBuilds(context.Context, *connect_go.Request[v1.ListBuildsRequest]) (*connect_go.Response[v1.ListBuildsResponse], error) } @@ -101,6 +105,11 @@ func NewBuildServiceClient(httpClient connect_go.HTTPClient, baseURL string, opt baseURL+BuildServiceReportTimingsProcedure, opts..., ), + reportStatus: connect_go.NewClient[v1.ReportStatusRequest, v1.ReportStatusResponse]( + httpClient, + baseURL+BuildServiceReportStatusProcedure, + opts..., + ), reportBuildContext: connect_go.NewClient[v1.ReportBuildContextRequest, v1.ReportBuildContextResponse]( httpClient, baseURL+BuildServiceReportBuildContextProcedure, @@ -121,6 +130,7 @@ type buildServiceClient struct { getBuildKitConnection *connect_go.Client[v1.GetBuildKitConnectionRequest, v1.GetBuildKitConnectionResponse] reportBuildHealth *connect_go.Client[v1.ReportBuildHealthRequest, v1.ReportBuildHealthResponse] reportTimings *connect_go.Client[v1.ReportTimingsRequest, v1.ReportTimingsResponse] + reportStatus *connect_go.Client[v1.ReportStatusRequest, v1.ReportStatusResponse] reportBuildContext *connect_go.Client[v1.ReportBuildContextRequest, v1.ReportBuildContextResponse] listBuilds *connect_go.Client[v1.ListBuildsRequest, v1.ListBuildsResponse] } @@ -150,6 +160,11 @@ func (c *buildServiceClient) ReportTimings(ctx context.Context, req *connect_go. return c.reportTimings.CallUnary(ctx, req) } +// ReportStatus calls depot.cli.v1.BuildService.ReportStatus. +func (c *buildServiceClient) ReportStatus(ctx context.Context, req *connect_go.Request[v1.ReportStatusRequest]) (*connect_go.Response[v1.ReportStatusResponse], error) { + return c.reportStatus.CallUnary(ctx, req) +} + // ReportBuildContext calls depot.cli.v1.BuildService.ReportBuildContext. func (c *buildServiceClient) ReportBuildContext(ctx context.Context, req *connect_go.Request[v1.ReportBuildContextRequest]) (*connect_go.Response[v1.ReportBuildContextResponse], error) { return c.reportBuildContext.CallUnary(ctx, req) @@ -167,6 +182,7 @@ type BuildServiceHandler interface { GetBuildKitConnection(context.Context, *connect_go.Request[v1.GetBuildKitConnectionRequest]) (*connect_go.Response[v1.GetBuildKitConnectionResponse], error) ReportBuildHealth(context.Context, *connect_go.Request[v1.ReportBuildHealthRequest]) (*connect_go.Response[v1.ReportBuildHealthResponse], error) ReportTimings(context.Context, *connect_go.Request[v1.ReportTimingsRequest]) (*connect_go.Response[v1.ReportTimingsResponse], error) + ReportStatus(context.Context, *connect_go.Request[v1.ReportStatusRequest]) (*connect_go.Response[v1.ReportStatusResponse], error) ReportBuildContext(context.Context, *connect_go.Request[v1.ReportBuildContextRequest]) (*connect_go.Response[v1.ReportBuildContextResponse], error) ListBuilds(context.Context, *connect_go.Request[v1.ListBuildsRequest]) (*connect_go.Response[v1.ListBuildsResponse], error) } @@ -203,6 +219,11 @@ func NewBuildServiceHandler(svc BuildServiceHandler, opts ...connect_go.HandlerO svc.ReportTimings, opts..., )) + mux.Handle(BuildServiceReportStatusProcedure, connect_go.NewUnaryHandler( + BuildServiceReportStatusProcedure, + svc.ReportStatus, + opts..., + )) mux.Handle(BuildServiceReportBuildContextProcedure, connect_go.NewUnaryHandler( BuildServiceReportBuildContextProcedure, svc.ReportBuildContext, @@ -239,6 +260,10 @@ func (UnimplementedBuildServiceHandler) ReportTimings(context.Context, *connect_ return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("depot.cli.v1.BuildService.ReportTimings is not implemented")) } +func (UnimplementedBuildServiceHandler) ReportStatus(context.Context, *connect_go.Request[v1.ReportStatusRequest]) (*connect_go.Response[v1.ReportStatusResponse], error) { + return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("depot.cli.v1.BuildService.ReportStatus is not implemented")) +} + func (UnimplementedBuildServiceHandler) ReportBuildContext(context.Context, *connect_go.Request[v1.ReportBuildContextRequest]) (*connect_go.Response[v1.ReportBuildContextResponse], error) { return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("depot.cli.v1.BuildService.ReportBuildContext is not implemented")) } diff --git a/proto/buf.lock b/proto/buf.lock new file mode 100644 index 00000000..2c7dae93 --- /dev/null +++ b/proto/buf.lock @@ -0,0 +1,18 @@ +# Generated by buf. DO NOT EDIT. +version: v1 +deps: + - remote: buf.build + owner: depot + repository: buildkit + commit: e9588edecd7c4e56b68d0ea0e1d1badc + digest: shake256:7bbfb36878b80f60a01057ea3d1e70b28e6c4d3501cab9e8320abfdb7b3a03e07e0c327e74f67324dc7d1fdc1ec9374d8055a54dd573d3bd255bdb2a53d5c8a2 + - remote: buf.build + owner: gogo + repository: protobuf + commit: 5461a3dfa9d941da82028ab185dc2a0e + digest: shake256:37c7c75224982038cb1abf45b481ef06716c1f806ffaa162018d0df092bd11a2a9b62c2d0dc0a2ae43beff86b6014fc0eb8c594ffd84d52ade4b08fca901eadc + - remote: buf.build + owner: googleapis + repository: googleapis + commit: 711e289f6a384c4caeebaff7c6931ade + digest: shake256:e08fb55dad7469f69df00304eed31427d2d1576e9aab31e6bf86642688e04caaf0372f15fe6974cf79432779a635b3ea401ca69c943976dc42749524e4c25d94 diff --git a/proto/buf.yaml b/proto/buf.yaml index 1a519456..59804004 100644 --- a/proto/buf.yaml +++ b/proto/buf.yaml @@ -1,4 +1,6 @@ version: v1 +deps: + - buf.build/depot/buildkit breaking: use: - FILE diff --git a/proto/depot/cli/v1/build.proto b/proto/depot/cli/v1/build.proto index d456ee1d..ecfe2134 100644 --- a/proto/depot/cli/v1/build.proto +++ b/proto/depot/cli/v1/build.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package depot.cli.v1; import "google/protobuf/timestamp.proto"; +import "moby/buildkit/v1/control.proto"; service BuildService { rpc CreateBuild(CreateBuildRequest) returns (CreateBuildResponse); @@ -10,6 +11,7 @@ service BuildService { rpc GetBuildKitConnection(GetBuildKitConnectionRequest) returns (GetBuildKitConnectionResponse); rpc ReportBuildHealth(ReportBuildHealthRequest) returns (ReportBuildHealthResponse); rpc ReportTimings(ReportTimingsRequest) returns (ReportTimingsResponse); + rpc ReportStatus(ReportStatusRequest) returns (ReportStatusResponse); rpc ReportBuildContext(ReportBuildContextRequest) returns (ReportBuildContextResponse); rpc ListBuilds(ListBuildsRequest) returns (ListBuildsResponse) {} } @@ -146,6 +148,14 @@ message BuildStep { repeated string ancestor_digests = 8; } +message ReportStatusRequest { + string build_id = 1; + repeated moby.buildkit.v1.StatusResponse statuses = 2; + map stable_digests = 3; +} + +message ReportStatusResponse {} + message ListBuildsRequest { // The project ID to get the builds for string project_id = 1;