diff --git a/client/client_test.go b/client/client_test.go index 2cbcef37e..1ccb1c88f 100644 --- a/client/client_test.go +++ b/client/client_test.go @@ -44,6 +44,7 @@ import ( "github.com/moby/buildkit/session/sshforward/sshprovider" "github.com/moby/buildkit/solver/errdefs" "github.com/moby/buildkit/solver/pb" + "github.com/moby/buildkit/solver/result" "github.com/moby/buildkit/util/attestation" binfotypes "github.com/moby/buildkit/util/buildinfo/types" "github.com/moby/buildkit/util/contentutil" @@ -6377,23 +6378,25 @@ func testExportAttestations(t *testing.T, sb integration.Sandbox) { if err != nil { return nil, err } - res.AddInTotoAttestation(pk, &attestation.InTotoAttestation{ - PredicatePath: "/attestation.json", - PredicateType: "https://example.com/attestations/v1.0", - Subjects: []attestation.InTotoSubject{ - &attestation.InTotoSubjectSelf{}, + res.AddAttestation(pk, &result.InTotoAttestation{ + PredicateRefKey: "foo", + PredicatePath: "/attestation.json", + PredicateType: "https://example.com/attestations/v1.0", + Subjects: []result.InTotoSubject{ + &result.InTotoSubjectSelf{}, }, - }, refAttest) - res.AddInTotoAttestation(pk, &attestation.InTotoAttestation{ - PredicatePath: "/attestation2.json", - PredicateType: "https://example.com/attestations2/v1.0", - Subjects: []attestation.InTotoSubject{ - &attestation.InTotoSubjectRaw{ + }, map[string]gateway.Reference{"foo": refAttest}) + res.AddAttestation(pk, &result.InTotoAttestation{ + PredicateRefKey: "bar", + PredicatePath: "/attestation2.json", + PredicateType: "https://example.com/attestations2/v1.0", + Subjects: []result.InTotoSubject{ + &result.InTotoSubjectRaw{ Name: "/attestation.json", Digest: []digest.Digest{successDigest}, }, }, - }, refAttest) + }, map[string]gateway.Reference{"bar": refAttest}) } dt, err := json.Marshal(expPlatforms) diff --git a/exporter/containerimage/export.go b/exporter/containerimage/export.go index 6f01de233..18b5f4dfc 100644 --- a/exporter/containerimage/export.go +++ b/exporter/containerimage/export.go @@ -195,7 +195,7 @@ func (e *imageExporterInstance) Config() exporter.Config { } } -func (e *imageExporterInstance) Export(ctx context.Context, src exporter.Source, sessionID string) (map[string]string, error) { +func (e *imageExporterInstance) Export(ctx context.Context, src *exporter.Source, sessionID string) (map[string]string, error) { if src.Metadata == nil { src.Metadata = make(map[string][]byte) } @@ -324,7 +324,7 @@ func (e *imageExporterInstance) Export(ctx context.Context, src exporter.Source, return resp, nil } -func (e *imageExporterInstance) pushImage(ctx context.Context, src exporter.Source, sessionID string, targetName string, dgst digest.Digest) error { +func (e *imageExporterInstance) pushImage(ctx context.Context, src *exporter.Source, sessionID string, targetName string, dgst digest.Digest) error { annotations := map[digest.Digest]map[string]string{} mprovider := contentutil.NewMultiProvider(e.opt.ImageWriter.ContentStore()) if src.Ref != nil { @@ -355,7 +355,7 @@ func (e *imageExporterInstance) pushImage(ctx context.Context, src exporter.Sour return push.Push(ctx, e.opt.SessionManager, sessionID, mprovider, e.opt.ImageWriter.ContentStore(), dgst, targetName, e.insecure, e.opt.RegistryHosts, e.pushByDigest, annotations) } -func (e *imageExporterInstance) unpackImage(ctx context.Context, img images.Image, src exporter.Source, s session.Group) (err0 error) { +func (e *imageExporterInstance) unpackImage(ctx context.Context, img images.Image, src *exporter.Source, s session.Group) (err0 error) { unpackDone := progress.OneOff(ctx, "unpacking to "+img.Name) defer func() { unpackDone(err0) diff --git a/exporter/containerimage/writer.go b/exporter/containerimage/writer.go index 0d65b5517..f38752d5f 100644 --- a/exporter/containerimage/writer.go +++ b/exporter/containerimage/writer.go @@ -22,6 +22,7 @@ import ( "github.com/moby/buildkit/session" "github.com/moby/buildkit/snapshot" "github.com/moby/buildkit/solver" + "github.com/moby/buildkit/solver/result" "github.com/moby/buildkit/util/attestation" "github.com/moby/buildkit/util/bklog" "github.com/moby/buildkit/util/buildinfo" @@ -54,7 +55,7 @@ type ImageWriter struct { opt WriterOpt } -func (ic *ImageWriter) Commit(ctx context.Context, inp exporter.Source, sessionID string, opts *ImageCommitOpts) (*ocispecs.Descriptor, error) { +func (ic *ImageWriter) Commit(ctx context.Context, inp *exporter.Source, sessionID string, opts *ImageCommitOpts) (*ocispecs.Descriptor, error) { platformsBytes, ok := inp.Metadata[exptypes.ExporterPlatformsKey] if len(inp.Refs) > 0 && !ok { @@ -248,7 +249,7 @@ func (ic *ImageWriter) exportLayers(ctx context.Context, refCfg cacheconfig.RefC return out, err } -func (ic *ImageWriter) extractAttestations(ctx context.Context, s session.Group, desc *ocispecs.Descriptor, refs map[string]cache.ImmutableRef, attestations []attestation.Attestation) ([]intoto.Statement, error) { +func (ic *ImageWriter) extractAttestations(ctx context.Context, s session.Group, desc *ocispecs.Descriptor, refs map[string]cache.ImmutableRef, attestations []result.Attestation) ([]intoto.Statement, error) { eg, ctx := errgroup.WithContext(ctx) statements := make([]intoto.Statement, len(attestations)) @@ -260,7 +261,7 @@ func (ic *ImageWriter) extractAttestations(ctx context.Context, s session.Group, i, att := i, att eg.Go(func() error { switch att := att.(type) { - case *attestation.InTotoAttestation: + case *result.InTotoAttestation: ref, ok := refs[att.PredicateRefKey] if !ok { return errors.Errorf("key %s not found in refs map", att.PredicateRefKey) @@ -293,12 +294,12 @@ func (ic *ImageWriter) extractAttestations(ctx context.Context, s session.Group, } for _, subject := range att.Subjects { switch subject2 := subject.(type) { - case *attestation.InTotoSubjectSelf: + case *result.InTotoSubjectSelf: statements[i].Subject = append(statements[i].Subject, intoto.Subject{ Name: "_", - Digest: attestation.DigestToDigestMap(desc.Digest), + Digest: result.DigestToDigestMap(desc.Digest), }) - case *attestation.InTotoSubjectRaw: + case *result.InTotoSubjectRaw: statements[i].Subject = append(statements[i].Subject, intoto.Subject{ Name: subject2.Name, Digest: subject2.DigestMap(), diff --git a/exporter/exporter.go b/exporter/exporter.go index 925c13c21..284cb5615 100644 --- a/exporter/exporter.go +++ b/exporter/exporter.go @@ -4,10 +4,12 @@ import ( "context" "github.com/moby/buildkit/cache" - "github.com/moby/buildkit/util/attestation" + "github.com/moby/buildkit/solver/result" "github.com/moby/buildkit/util/compression" ) +type Source = result.Result[cache.ImmutableRef] + type Exporter interface { Resolve(context.Context, map[string]string) (ExporterInstance, error) } @@ -15,16 +17,9 @@ type Exporter interface { type ExporterInstance interface { Name() string Config() Config - Export(ctx context.Context, src Source, sessionID string) (map[string]string, error) + Export(ctx context.Context, src *Source, sessionID string) (map[string]string, error) } type Config struct { Compression compression.Config } - -type Source struct { - Ref cache.ImmutableRef - Refs map[string]cache.ImmutableRef - Metadata map[string][]byte - Attestations map[string][]attestation.Attestation -} diff --git a/exporter/local/export.go b/exporter/local/export.go index a3cd94062..fbd727d87 100644 --- a/exporter/local/export.go +++ b/exporter/local/export.go @@ -52,7 +52,7 @@ func (e *localExporter) Config() exporter.Config { return exporter.Config{} } -func (e *localExporterInstance) Export(ctx context.Context, inp exporter.Source, sessionID string) (map[string]string, error) { +func (e *localExporterInstance) Export(ctx context.Context, inp *exporter.Source, sessionID string) (map[string]string, error) { timeoutCtx, cancel := context.WithTimeout(ctx, 5*time.Second) defer cancel() diff --git a/exporter/oci/export.go b/exporter/oci/export.go index c2ef4b3ab..047d9d5a8 100644 --- a/exporter/oci/export.go +++ b/exporter/oci/export.go @@ -93,7 +93,7 @@ func (e *imageExporterInstance) Config() exporter.Config { } } -func (e *imageExporterInstance) Export(ctx context.Context, src exporter.Source, sessionID string) (map[string]string, error) { +func (e *imageExporterInstance) Export(ctx context.Context, src *exporter.Source, sessionID string) (map[string]string, error) { if e.opt.Variant == VariantDocker && len(src.Refs) > 0 { return nil, errors.Errorf("docker exporter does not currently support exporting manifest lists") } diff --git a/exporter/tar/export.go b/exporter/tar/export.go index 806dbef7f..82af4404f 100644 --- a/exporter/tar/export.go +++ b/exporter/tar/export.go @@ -70,7 +70,7 @@ func (e *localExporterInstance) Config() exporter.Config { return exporter.Config{} } -func (e *localExporterInstance) Export(ctx context.Context, inp exporter.Source, sessionID string) (map[string]string, error) { +func (e *localExporterInstance) Export(ctx context.Context, inp *exporter.Source, sessionID string) (map[string]string, error) { var defers []func() defer func() { diff --git a/frontend/frontend.go b/frontend/frontend.go index dedda54c6..2409891cb 100644 --- a/frontend/frontend.go +++ b/frontend/frontend.go @@ -6,10 +6,14 @@ import ( "github.com/moby/buildkit/client/llb" gw "github.com/moby/buildkit/frontend/gateway/client" "github.com/moby/buildkit/session" + "github.com/moby/buildkit/solver" "github.com/moby/buildkit/solver/pb" + "github.com/moby/buildkit/solver/result" digest "github.com/opencontainers/go-digest" ) +type Result = result.Result[solver.ResultProxy] + type Frontend interface { Solve(ctx context.Context, llb FrontendLLBBridge, opt map[string]string, inputs map[string]*pb.Definition, sid string, sm *session.Manager) (*Result, error) } diff --git a/frontend/gateway/client/client.go b/frontend/gateway/client/client.go index 61bc018ff..fe7752238 100644 --- a/frontend/gateway/client/client.go +++ b/frontend/gateway/client/client.go @@ -7,12 +7,21 @@ import ( "github.com/moby/buildkit/client/llb" "github.com/moby/buildkit/solver/pb" + "github.com/moby/buildkit/solver/result" "github.com/moby/buildkit/util/apicaps" digest "github.com/opencontainers/go-digest" ocispecs "github.com/opencontainers/image-spec/specs-go/v1" fstypes "github.com/tonistiigi/fsutil/types" ) +type Result = result.Result[Reference] + +type BuildFunc func(context.Context, Client) (*Result, error) + +func NewResult() *Result { + return &Result{} +} + type Client interface { Solve(ctx context.Context, req SolveRequest) (*Result, error) ResolveImageConfig(ctx context.Context, ref string, opt llb.ResolveImageConfigOpt) (digest.Digest, []byte, error) diff --git a/frontend/gateway/client/result.go b/frontend/gateway/client/result.go deleted file mode 100644 index 845e3ad58..000000000 --- a/frontend/gateway/client/result.go +++ /dev/null @@ -1,68 +0,0 @@ -package client - -import ( - "context" - "sync" - - "github.com/moby/buildkit/identity" - "github.com/moby/buildkit/util/attestation" - "github.com/pkg/errors" -) - -type BuildFunc func(context.Context, Client) (*Result, error) - -type Result struct { - mu sync.Mutex - Ref Reference - Refs map[string]Reference - Metadata map[string][]byte - Attestations map[string][]attestation.Attestation -} - -func NewResult() *Result { - return &Result{} -} - -func (r *Result) AddMeta(k string, v []byte) { - r.mu.Lock() - if r.Metadata == nil { - r.Metadata = map[string][]byte{} - } - r.Metadata[k] = v - r.mu.Unlock() -} - -func (r *Result) AddRef(k string, ref Reference) { - r.mu.Lock() - if r.Refs == nil { - r.Refs = map[string]Reference{} - } - r.Refs[k] = ref - r.mu.Unlock() -} - -func (r *Result) AddInTotoAttestation(k string, v *attestation.InTotoAttestation, predicateRef Reference) { - r.mu.Lock() - if r.Attestations == nil { - r.Attestations = map[string][]attestation.Attestation{} - } - v.PredicateRefKey = "attestation:" + identity.NewID() - r.Refs[v.PredicateRefKey] = predicateRef - r.Attestations[k] = append(r.Attestations[k], v) - r.mu.Unlock() -} - -func (r *Result) SetRef(ref Reference) { - r.Ref = ref -} - -func (r *Result) SingleRef() (Reference, error) { - r.mu.Lock() - defer r.mu.Unlock() - - if r.Refs != nil && r.Ref == nil { - return nil, errors.Errorf("invalid map result") - } - - return r.Ref, nil -} diff --git a/frontend/gateway/forwarder/forward.go b/frontend/gateway/forwarder/forward.go index e95449870..e98bf6ed7 100644 --- a/frontend/gateway/forwarder/forward.go +++ b/frontend/gateway/forwarder/forward.go @@ -17,6 +17,7 @@ import ( "github.com/moby/buildkit/solver/errdefs" llberrdefs "github.com/moby/buildkit/solver/llbsolver/errdefs" opspb "github.com/moby/buildkit/solver/pb" + "github.com/moby/buildkit/solver/result" "github.com/moby/buildkit/util/apicaps" "github.com/moby/buildkit/worker" digest "github.com/opencontainers/go-digest" @@ -66,27 +67,19 @@ func (c *bridgeClient) Solve(ctx context.Context, req client.SolveRequest) (*cli return nil, c.wrapSolveError(err) } - cRes := &client.Result{} c.mu.Lock() - for k, r := range res.Refs { + cRes, err := result.ConvertResult(res, func(r solver.ResultProxy) (client.Reference, error) { rr, err := c.newRef(r, session.NewGroup(c.sid)) if err != nil { return nil, err } c.refs = append(c.refs, rr) - cRes.AddRef(k, rr) - } - if r := res.Ref; r != nil { - rr, err := c.newRef(r, session.NewGroup(c.sid)) - if err != nil { - return nil, err - } - c.refs = append(c.refs, rr) - cRes.SetRef(rr) - } + return rr, nil + }) c.mu.Unlock() - cRes.Metadata = res.Metadata - cRes.Attestations = res.Attestations + if err != nil { + return nil, err + } return cRes, nil } @@ -185,28 +178,16 @@ func (c *bridgeClient) toFrontendResult(r *client.Result) (*frontend.Result, err return nil, nil } - res := &frontend.Result{} - - if r.Refs != nil { - res.Refs = make(map[string]solver.ResultProxy, len(r.Refs)) - for k, r := range r.Refs { - rr, ok := r.(*ref) - if !ok { - return nil, errors.Errorf("invalid reference type for forward %T", r) - } - res.Refs[k] = rr.acquireResultProxy() - } - } - if r := r.Ref; r != nil { + res, err := result.ConvertResult(r, func(r client.Reference) (solver.ResultProxy, error) { rr, ok := r.(*ref) if !ok { return nil, errors.Errorf("invalid reference type for forward %T", r) } - res.Ref = rr.acquireResultProxy() + return rr.acquireResultProxy(), nil + }) + if err != nil { + return nil, err } - res.Metadata = r.Metadata - res.Attestations = r.Attestations - return res, nil } diff --git a/frontend/gateway/gateway.go b/frontend/gateway/gateway.go index 598977c21..2154782b7 100644 --- a/frontend/gateway/gateway.go +++ b/frontend/gateway/gateway.go @@ -38,7 +38,6 @@ import ( llberrdefs "github.com/moby/buildkit/solver/llbsolver/errdefs" opspb "github.com/moby/buildkit/solver/pb" "github.com/moby/buildkit/util/apicaps" - "github.com/moby/buildkit/util/attestation" "github.com/moby/buildkit/util/bklog" "github.com/moby/buildkit/util/buildinfo" "github.com/moby/buildkit/util/grpcerrors" @@ -707,7 +706,7 @@ func (lbf *llbBridgeForwarder) Solve(ctx context.Context, req *pb.SolveRequest) } if res.Attestations != nil { - attestations := map[string]*pb.Attestations{} + pbRes.Attestations = map[string]*pb.Attestations{} for k, atts := range res.Attestations { for _, att := range atts { pbAtt, err := pb.ToAttestationPB(att) @@ -715,13 +714,12 @@ func (lbf *llbBridgeForwarder) Solve(ctx context.Context, req *pb.SolveRequest) return nil, err } - if attestations[k] == nil { - attestations[k] = &pb.Attestations{} + if pbRes.Attestations[k] == nil { + pbRes.Attestations[k] = &pb.Attestations{} } - attestations[k].Attestation = append(attestations[k].Attestation, pbAtt) + pbRes.Attestations[k].Attestation = append(pbRes.Attestations[k].Attestation, pbAtt) } } - pbRes.Attestations = attestations } lbf.mu.Unlock() @@ -890,44 +888,39 @@ func (lbf *llbBridgeForwarder) Return(ctx context.Context, in *pb.ReturnRequest) if err != nil { return nil, err } - r.Ref = ref + r.SetRef(ref) case *pb.Result_RefsDeprecated: - m := map[string]solver.ResultProxy{} for k, id := range res.RefsDeprecated.Refs { ref, err := lbf.cloneRef(id) if err != nil { return nil, err } - m[k] = ref + r.AddRef(k, ref) } - r.Refs = m case *pb.Result_Ref: ref, err := lbf.cloneRef(res.Ref.Id) if err != nil { return nil, err } - r.Ref = ref + r.SetRef(ref) case *pb.Result_Refs: - m := map[string]solver.ResultProxy{} for k, ref := range res.Refs.Refs { ref, err := lbf.cloneRef(ref.Id) if err != nil { return nil, err } - m[k] = ref + r.AddRef(k, ref) } - r.Refs = m } if in.Result.Attestations != nil { - r.Attestations = map[string][]attestation.Attestation{} for k, pbAtts := range in.Result.Attestations { for _, pbAtt := range pbAtts.Attestation { att, err := pb.FromAttestationPB(pbAtt) if err != nil { return nil, err } - r.Attestations[k] = append(r.Attestations[k], att) + r.AddAttestation(k, att, nil) } } } diff --git a/frontend/gateway/grpcclient/client.go b/frontend/gateway/grpcclient/client.go index fad0a55e6..3013992d6 100644 --- a/frontend/gateway/grpcclient/client.go +++ b/frontend/gateway/grpcclient/client.go @@ -21,7 +21,6 @@ import ( "github.com/moby/buildkit/identity" opspb "github.com/moby/buildkit/solver/pb" "github.com/moby/buildkit/util/apicaps" - "github.com/moby/buildkit/util/attestation" "github.com/moby/buildkit/util/bklog" "github.com/moby/buildkit/util/grpcerrors" "github.com/moby/sys/signal" @@ -116,7 +115,7 @@ func (c *grpcClient) Run(ctx context.Context, f client.BuildFunc) (retError erro req := &pb.ReturnRequest{} if retError == nil { if res == nil { - res = &client.Result{} + res = client.NewResult() } pbRes := &pb.Result{ Metadata: res.Metadata, @@ -422,7 +421,7 @@ func (c *grpcClient) Solve(ctx context.Context, creq client.SolveRequest) (res * return nil, err } - res = &client.Result{} + res = client.NewResult() if resp.Result == nil { if id := resp.Ref; id != "" { c.requests[id] = req @@ -465,14 +464,13 @@ func (c *grpcClient) Solve(ctx context.Context, creq client.SolveRequest) (res * } if resp.Result.Attestations != nil { - res.Attestations = map[string][]attestation.Attestation{} for p, as := range resp.Result.Attestations { for _, a := range as.Attestation { att, err := pb.FromAttestationPB(a) if err != nil { return nil, err } - res.Attestations[p] = append(res.Attestations[p], att) + res.AddAttestation(p, att, nil) } } } diff --git a/frontend/gateway/pb/attestation.go b/frontend/gateway/pb/attestation.go index 7afe155ae..838d14e3d 100644 --- a/frontend/gateway/pb/attestation.go +++ b/frontend/gateway/pb/attestation.go @@ -1,17 +1,17 @@ package moby_buildkit_v1_frontend //nolint:revive import ( - "github.com/moby/buildkit/util/attestation" + "github.com/moby/buildkit/solver/result" "github.com/pkg/errors" ) -func ToAttestationPB(a attestation.Attestation) (*Attestations_Attestation, error) { +func ToAttestationPB(a result.Attestation) (*Attestations_Attestation, error) { switch a := a.(type) { - case *attestation.InTotoAttestation: + case *result.InTotoAttestation: subjects := []*InToto_Subject{} for _, subject := range a.Subjects { switch s := subject.(type) { - case *attestation.InTotoSubjectRaw: + case *result.InTotoSubjectRaw: subjects = append(subjects, &InToto_Subject{ Subject: &InToto_Subject_Raw{ Raw: &InToto_Subject_RawSubject{ @@ -20,7 +20,7 @@ func ToAttestationPB(a attestation.Attestation) (*Attestations_Attestation, erro }, }, }) - case *attestation.InTotoSubjectSelf: + case *result.InTotoSubjectSelf: subjects = append(subjects, &InToto_Subject{ Subject: &InToto_Subject_Self{ Self: &InToto_Subject_SelfSubject{}, @@ -41,29 +41,29 @@ func ToAttestationPB(a attestation.Attestation) (*Attestations_Attestation, erro Attestation: &Attestations_Attestation_Intoto{intoto}, }, nil default: - return nil, errors.Errorf("unknown attestation type %T", a) + return nil, errors.Errorf("unknown result type %T", a) } } -func FromAttestationPB(a *Attestations_Attestation) (attestation.Attestation, error) { +func FromAttestationPB(a *Attestations_Attestation) (result.Attestation, error) { switch a := a.Attestation.(type) { case *Attestations_Attestation_Intoto: - subjects := []attestation.InTotoSubject{} + subjects := []result.InTotoSubject{} for _, pbSubject := range a.Intoto.Subjects { switch pbSubject := pbSubject.Subject.(type) { case *InToto_Subject_Raw: - subjects = append(subjects, &attestation.InTotoSubjectRaw{ + subjects = append(subjects, &result.InTotoSubjectRaw{ Name: pbSubject.Raw.Name, Digest: pbSubject.Raw.Digest, }) case *InToto_Subject_Self: - subjects = append(subjects, &attestation.InTotoSubjectSelf{}) + subjects = append(subjects, &result.InTotoSubjectSelf{}) default: return nil, errors.Errorf("unknown in toto subject type %T", pbSubject) } } - return &attestation.InTotoAttestation{ + return &result.InTotoAttestation{ PredicateType: a.Intoto.PredicateType, PredicatePath: a.Intoto.PredicatePath, PredicateRefKey: a.Intoto.PredicateRefKey, diff --git a/frontend/result.go b/frontend/result.go deleted file mode 100644 index a85bd46a4..000000000 --- a/frontend/result.go +++ /dev/null @@ -1,27 +0,0 @@ -package frontend - -import ( - "github.com/moby/buildkit/solver" - "github.com/moby/buildkit/util/attestation" -) - -type Result struct { - Ref solver.ResultProxy - Refs map[string]solver.ResultProxy - Metadata map[string][]byte - Attestations map[string][]attestation.Attestation -} - -func (r *Result) EachRef(fn func(solver.ResultProxy) error) (err error) { - if r.Ref != nil { - err = fn(r.Ref) - } - for _, r := range r.Refs { - if r != nil { - if err1 := fn(r); err1 != nil && err == nil { - err = err1 - } - } - } - return err -} diff --git a/go.mod b/go.mod index 2fffcc88c..6622bc87d 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/moby/buildkit -go 1.17 +go 1.18 require ( github.com/Microsoft/go-winio v0.5.2 diff --git a/go.sum b/go.sum index 5cdceec40..303f1f0af 100644 --- a/go.sum +++ b/go.sum @@ -245,7 +245,6 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb/go.mod h1:PkYb9DJNAwrSvRx5DYA+gUcOIgTGVMNkfSCbZM8cWpI= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/blang/semver v3.5.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= @@ -272,7 +271,6 @@ github.com/census-instrumentation/opencensus-proto v0.2.0/go.mod h1:f6KPmirojxKA github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= @@ -305,7 +303,6 @@ github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoC github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codahale/hdrhistogram v0.0.0-20160425231609-f8ad88b59a58/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb h1:EDmT6Q9Zs+SbUoc7Ik9EfrFqcylYqgPZ9ANSbTAntnE= -github.com/codahale/rfc6979 v0.0.0-20141003034818-6a90f24967eb/go.mod h1:ZjrT6AXHbDs86ZSdt/osfBi5qfexBrKUdONk989Wnk4= github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= @@ -442,7 +439,6 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= @@ -451,7 +447,6 @@ github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSV github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180108230652-97fdf19511ea/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.0 h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM= @@ -798,7 +793,6 @@ github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= -github.com/hanwen/go-fuse v1.0.0 h1:GxS9Zrn6c35/BnfiVsZVWmsG803xwE7eVRDvcf/BEVc= github.com/hanwen/go-fuse v1.0.0/go.mod h1:unqXarDXqzAk0rt98O2tVndEPIpUgLD9+rwFisZH3Ok= github.com/hanwen/go-fuse/v2 v2.0.3/go.mod h1:0EQM6aH2ctVpvZ6a+onrQ/vaykxh2GH7hy3e13vzTUY= github.com/hanwen/go-fuse/v2 v2.1.1-0.20220112183258-f57e95bda82d h1:ibbzF2InxMOS+lLCphY9PHNKPURDUBNKaG6ErSq8gJQ= @@ -909,7 +903,6 @@ github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgo github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= @@ -931,7 +924,6 @@ github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= @@ -977,7 +969,6 @@ github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrk github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/hashstructure v1.0.0 h1:ZkRJX1CyOoTkar7p/mLS5TZU4nJ1Rn/F8u9dGS02Q3Y= github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ= github.com/mitchellh/hashstructure/v2 v2.0.2 h1:vGKWl0YJqUNxE8d+h8f6NJLcCJrgbhC4NcD46KavDd4= github.com/mitchellh/hashstructure/v2 v2.0.2/go.mod h1:MG3aRVU/N29oo/V/IhBX8GR/zz4kQkprJgF2EVszyDE= @@ -985,7 +976,6 @@ github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0Qu github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.3.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= github.com/moby/buildkit v0.8.1/go.mod h1:/kyU1hKy/aYCuP39GZA9MaKioovHku57N6cqlKZIaiQ= github.com/moby/locker v1.0.1 h1:fOXqR41zeveg4fFODix+1Ch4mj/gT0NE1XJbp/epuBg= @@ -1130,7 +1120,6 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.5.0 h1:042Buzk+NhDI+DeSAA62RwJL8VAuZUMQZUjCsRz1Mug= github.com/pkg/profile v1.5.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= -github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -1195,7 +1184,6 @@ github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTE github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rubiojr/go-vhd v0.0.0-20160810183302-0bfd3b39853c/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1 h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -1248,7 +1236,6 @@ github.com/sourcegraph/go-diff v0.5.3/go.mod h1:v9JDtjCE4HHHCZGId75rg8gkKKa98RVj github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= -github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= @@ -1256,7 +1243,6 @@ github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3 github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -1268,7 +1254,6 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= @@ -1394,7 +1379,6 @@ go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0 h1:gqCw0LfLxScz8irSi8exQc7fyQ0fKQU/qnC/X8+V/1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opentelemetry.io/contrib v0.20.0 h1:ubFQUn0VCZ0gPwIoJfBJVpeBlyRMxu8Mm/huKWYd9p0= go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= @@ -1412,7 +1396,6 @@ go.opentelemetry.io/otel v1.4.1 h1:QbINgGDDcoQUoMJa2mMaWno49lja9sHwp6aoa2n3a4g= go.opentelemetry.io/otel v1.4.1/go.mod h1:StM6F/0fSwpd8dKWDCdRr7uRvEPYdW0hBSlbdTiUde4= go.opentelemetry.io/otel/exporters/jaeger v1.4.1 h1:VHCK+2yTZDqDaVXj7JH2Z/khptuydo6C0ttBh2bxAbc= go.opentelemetry.io/otel/exporters/jaeger v1.4.1/go.mod h1:ZW7vkOu9nC1CxsD8bHNHCia5JUbwP39vxgd1q4Z5rCI= -go.opentelemetry.io/otel/exporters/otlp v0.20.0 h1:PTNgq9MRmQqqJY0REVbZFvwkYOA85vbdQU/nVfxDyqg= go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.4.1 h1:imIM3vRDMyZK1ypQlQlO+brE22I9lRhJsBDXpDWjlz8= @@ -1473,7 +1456,6 @@ golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -1610,7 +1592,6 @@ golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8 h1:RerP+noqYHUQ8CMRcPlC2nvTa4dcBIjegkuWdcUDuqg= @@ -1735,7 +1716,6 @@ golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210909193231-528a39cd75f3/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211116061358-0a5406a5449c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1899,7 +1879,6 @@ google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34q google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -2033,7 +2012,6 @@ gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKW gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.56.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= diff --git a/solver/llbsolver/bridge.go b/solver/llbsolver/bridge.go index 0bf8ac905..8e6555107 100644 --- a/solver/llbsolver/bridge.go +++ b/solver/llbsolver/bridge.go @@ -165,10 +165,7 @@ func (b *llbBridge) Solve(ctx context.Context, req frontend.SolveRequest, sid st return nil, err } if len(dtbi) > 0 { - if res.Metadata == nil { - res.Metadata = make(map[string][]byte) - } - res.Metadata[fmt.Sprintf("%s/%s", exptypes.ExporterBuildInfo, p)] = dtbi + res.AddMeta(fmt.Sprintf("%s/%s", exptypes.ExporterBuildInfo, p), dtbi) } } } else { @@ -177,10 +174,7 @@ func (b *llbBridge) Solve(ctx context.Context, req frontend.SolveRequest, sid st return nil, err } if len(dtbi) > 0 { - if res.Metadata == nil { - res.Metadata = make(map[string][]byte) - } - res.Metadata[exptypes.ExporterBuildInfo] = dtbi + res.AddMeta(exptypes.ExporterBuildInfo, dtbi) } } diff --git a/solver/llbsolver/solver.go b/solver/llbsolver/solver.go index 0f27b1f7c..ccaea995f 100644 --- a/solver/llbsolver/solver.go +++ b/solver/llbsolver/solver.go @@ -19,7 +19,7 @@ import ( "github.com/moby/buildkit/identity" "github.com/moby/buildkit/session" "github.com/moby/buildkit/solver" - "github.com/moby/buildkit/util/attestation" + "github.com/moby/buildkit/solver/result" "github.com/moby/buildkit/util/buildinfo" "github.com/moby/buildkit/util/compression" "github.com/moby/buildkit/util/entitlements" @@ -176,55 +176,40 @@ func (s *Solver) Solve(ctx context.Context, id string, sessionID string, req fro return nil, err } if len(dtbi) > 0 { - if res.Metadata == nil { - res.Metadata = make(map[string][]byte) - } - res.Metadata[exptypes.ExporterBuildInfo] = dtbi + res.AddMeta(exptypes.ExporterBuildInfo, dtbi) } } - if res.Refs != nil { - for k, r := range res.Refs { - if r == nil { - continue - } - dtbi, err := buildinfo.Encode(ctx, res.Metadata, fmt.Sprintf("%s/%s", exptypes.ExporterBuildInfo, k), r.BuildSources()) - if err != nil { - return nil, err - } - if len(dtbi) > 0 { - if res.Metadata == nil { - res.Metadata = make(map[string][]byte) - } - res.Metadata[fmt.Sprintf("%s/%s", exptypes.ExporterBuildInfo, k)] = dtbi - } + for k, r := range res.Refs { + if r == nil { + continue + } + dtbi, err := buildinfo.Encode(ctx, res.Metadata, fmt.Sprintf("%s/%s", exptypes.ExporterBuildInfo, k), r.BuildSources()) + if err != nil { + return nil, err + } + if len(dtbi) > 0 { + res.AddMeta(fmt.Sprintf("%s/%s", exptypes.ExporterBuildInfo, k), dtbi) } } var exporterResponse map[string]string if e := exp.Exporter; e != nil { - inp := exporter.Source{ - Metadata: res.Metadata, - Attestations: res.Attestations, + cached, err := result.ConvertResult(res, func(res solver.ResultProxy) (solver.CachedResult, error) { + return res.Result(ctx) + }) + if err != nil { + return nil, err } - if inp.Metadata == nil { - inp.Metadata = make(map[string][]byte) - } - if inp.Attestations == nil { - inp.Attestations = make(map[string][]attestation.Attestation) - } - var cr solver.CachedResult - var crMap = map[string]solver.CachedResult{} - if res := res.Ref; res != nil { - r, err := res.Result(ctx) - if err != nil { - return nil, err - } - workerRef, ok := r.Sys().(*worker.WorkerRef) + + inp, err := result.ConvertResult(cached, func(res solver.CachedResult) (cache.ImmutableRef, error) { + workerRef, ok := res.Sys().(*worker.WorkerRef) if !ok { - return nil, errors.Errorf("invalid reference: %T", r.Sys()) + return nil, errors.Errorf("invalid reference: %T", res.Sys()) } - inp.Ref = workerRef.ImmutableRef - cr = r + return workerRef.ImmutableRef, nil + }) + if err != nil { + return nil, err } if res.Refs != nil { m := make(map[string]cache.ImmutableRef, len(res.Refs)) @@ -241,29 +226,29 @@ func (s *Solver) Solve(ctx context.Context, id string, sessionID string, req fro return nil, errors.Errorf("invalid reference: %T", r.Sys()) } m[k] = workerRef.ImmutableRef - crMap[k] = r } } inp.Refs = m } + if _, ok := asInlineCache(exp.CacheExporter); ok { if err := inBuilderContext(ctx, j, "preparing layers for inline cache", j.SessionID+"-cache-inline", func(ctx context.Context, _ session.Group) error { - if cr != nil { - dtic, err := inlineCache(ctx, exp.CacheExporter, cr, e.Config().Compression, session.NewGroup(sessionID)) + if cached.Ref != nil { + dtic, err := inlineCache(ctx, exp.CacheExporter, cached.Ref, e.Config().Compression, session.NewGroup(sessionID)) if err != nil { return err } if dtic != nil { - inp.Metadata[exptypes.ExporterInlineCache] = dtic + inp.AddMeta(exptypes.ExporterInlineCache, dtic) } } - for k, res := range crMap { + for k, res := range cached.Refs { dtic, err := inlineCache(ctx, exp.CacheExporter, res, e.Config().Compression, session.NewGroup(sessionID)) if err != nil { return err } if dtic != nil { - inp.Metadata[fmt.Sprintf("%s/%s", exptypes.ExporterInlineCache, k)] = dtic + inp.AddMeta(fmt.Sprintf("%s/%s", exptypes.ExporterInlineCache, k), dtic) } } exp.CacheExporter = nil diff --git a/util/attestation/attestation.go b/solver/result/attestation.go similarity index 97% rename from util/attestation/attestation.go rename to solver/result/attestation.go index 8ee67e4d6..2db3dfac4 100644 --- a/util/attestation/attestation.go +++ b/solver/result/attestation.go @@ -1,4 +1,4 @@ -package attestation +package result import ( digest "github.com/opencontainers/go-digest" diff --git a/solver/result/result.go b/solver/result/result.go new file mode 100644 index 000000000..1fa6c2ff6 --- /dev/null +++ b/solver/result/result.go @@ -0,0 +1,118 @@ +package result + +import ( + "reflect" + "strings" + "sync" + + "github.com/moby/buildkit/identity" + "github.com/pkg/errors" +) + +const ( + attestationRefPrefix = "attestation:" +) + +type Result[T any] struct { + mu sync.Mutex + Ref T + Refs map[string]T + Metadata map[string][]byte + Attestations map[string][]Attestation +} + +func (r *Result[T]) AddMeta(k string, v []byte) { + r.mu.Lock() + if r.Metadata == nil { + r.Metadata = map[string][]byte{} + } + r.Metadata[k] = v + r.mu.Unlock() +} + +func (r *Result[T]) AddRef(k string, ref T) { + r.mu.Lock() + if r.Refs == nil { + r.Refs = map[string]T{} + } + r.Refs[k] = ref + r.mu.Unlock() +} + +func (r *Result[T]) AddAttestation(k string, v Attestation, refs map[string]T) { + r.mu.Lock() + if r.Attestations == nil { + r.Attestations = map[string][]Attestation{} + } + + // if the attestation refs aren't already internal, then insert them + switch v := v.(type) { + case *InTotoAttestation: + if !strings.HasPrefix(v.PredicateRefKey, attestationRefPrefix) { + internalKey := attestationRefPrefix + identity.NewID() + r.Refs[internalKey] = refs[v.PredicateRefKey] + v.PredicateRefKey = internalKey + } + } + r.Attestations[k] = append(r.Attestations[k], v) + + r.mu.Unlock() +} + +func (r *Result[T]) SetRef(ref T) { + r.Ref = ref +} + +func (r *Result[T]) SingleRef() (T, error) { + r.mu.Lock() + defer r.mu.Unlock() + + if r.Refs != nil && !reflect.ValueOf(r.Ref).IsValid() { + var t T + return t, errors.Errorf("invalid map result") + } + return r.Ref, nil +} + +func (r *Result[T]) EachRef(fn func(T) error) (err error) { + if reflect.ValueOf(r.Ref).IsValid() { + err = fn(r.Ref) + } + for _, r := range r.Refs { + if reflect.ValueOf(r).IsValid() { + if err1 := fn(r); err1 != nil && err == nil { + err = err1 + } + } + } + return err +} + +func ConvertResult[U any, V any](r *Result[U], fn func(U) (V, error)) (*Result[V], error) { + r2 := &Result[V]{} + var err error + + if reflect.ValueOf(r.Ref).IsValid() { + r2.Ref, err = fn(r.Ref) + if err != nil { + return nil, err + } + } + + if r.Refs != nil { + r2.Refs = map[string]V{} + } + for k, r := range r.Refs { + if reflect.ValueOf(r).IsValid() { + r2.Refs[k], err = fn(r) + if err != nil { + return nil, err + } + } + } + + r2.Attestations = r.Attestations + r2.Metadata = r.Metadata + + return r2, nil +}