55 "encoding/json"
66 "fmt"
77 "io"
8+ "maps"
89 "net"
910 "os"
1011 "strings"
@@ -25,6 +26,7 @@ import (
2526 "github.com/moby/buildkit/util/imageutil"
2627 "github.com/moby/sys/signal"
2728 digest "github.com/opencontainers/go-digest"
29+ ocispecs "github.com/opencontainers/image-spec/specs-go/v1"
2830 "github.com/pkg/errors"
2931 fstypes "github.com/tonistiigi/fsutil/types"
3032 "golang.org/x/sync/errgroup"
@@ -497,8 +499,14 @@ func (c *grpcClient) ResolveSourceMetadata(ctx context.Context, op *opspb.Source
497499 }, nil
498500 }
499501
502+ var platform * ocispecs.Platform
503+ if imgOpt := opt .ImageOpt ; imgOpt != nil && imgOpt .Platform != nil {
504+ platform = imgOpt .Platform
505+ } else if ociOpt := opt .OCILayoutOpt ; ociOpt != nil && ociOpt .Platform != nil {
506+ platform = ociOpt .Platform
507+ }
500508 var p * opspb.Platform
501- if platform := opt . Platform ; platform != nil {
509+ if platform != nil {
502510 p = & opspb.Platform {
503511 OS : platform .OS ,
504512 Architecture : platform .Architecture ,
@@ -529,10 +537,7 @@ func (c *grpcClient) ResolveSourceMetadata(ctx context.Context, op *opspb.Source
529537 Op : resp .Source ,
530538 }
531539 if resp .Image != nil {
532- r .Image = & sourceresolver.ResolveImageResponse {
533- Digest : digest .Digest (resp .Image .Digest ),
534- Config : resp .Image .Config ,
535- }
540+ r .Image = imgResponseFromPB (resp .Image )
536541 }
537542 if resp .Git != nil {
538543 r .Git = & sourceresolver.ResolveGitResponse {
@@ -561,6 +566,45 @@ func (c *grpcClient) ResolveSourceMetadata(ctx context.Context, op *opspb.Source
561566 return r , nil
562567}
563568
569+ func imgResponseFromPB (resp * pb.ResolveSourceImageResponse ) * sourceresolver.ResolveImageResponse {
570+ r := & sourceresolver.ResolveImageResponse {
571+ Digest : digest .Digest (resp .Digest ),
572+ Config : resp .Config ,
573+ }
574+ if resp .AttestationChain != nil {
575+ ac := & sourceresolver.AttestationChain {
576+ Root : digest .Digest (resp .AttestationChain .Root ),
577+ ImageManifest : digest .Digest (resp .AttestationChain .ImageManifest ),
578+ AttestationManifest : digest .Digest (resp .AttestationChain .AttestationManifest ),
579+ SignatureManifests : []digest.Digest {},
580+ Blobs : map [digest.Digest ]sourceresolver.Blob {},
581+ }
582+ for _ , sm := range resp .AttestationChain .SignatureManifests {
583+ ac .SignatureManifests = append (ac .SignatureManifests , digest .Digest (sm ))
584+ }
585+ for k , v := range resp .AttestationChain .Blobs {
586+ ac .Blobs [digest .Digest (k )] = sourceresolver.Blob {
587+ Descriptor : descriptorFromPB (v .GetDescriptor_ ()),
588+ Data : v .Data ,
589+ }
590+ }
591+ r .AttestationChain = ac
592+ }
593+ return r
594+ }
595+
596+ func descriptorFromPB (pbDesc * pb.Descriptor ) ocispecs.Descriptor {
597+ if pbDesc == nil {
598+ return ocispecs.Descriptor {}
599+ }
600+ return ocispecs.Descriptor {
601+ MediaType : pbDesc .GetMediaType (),
602+ Size : pbDesc .GetSize (),
603+ Digest : digest .Digest (pbDesc .GetDigest ()),
604+ Annotations : maps .Clone (pbDesc .GetAnnotations ()),
605+ }
606+ }
607+
564608func (c * grpcClient ) resolveImageConfigViaSourceMetadata (ctx context.Context , ref string , opt sourceresolver.Opt , p * opspb.Platform ) (string , digest.Digest , []byte , error ) {
565609 op := & opspb.SourceOp {
566610 Identifier : "docker-image://" + ref ,
@@ -596,8 +640,15 @@ func (c *grpcClient) resolveImageConfigViaSourceMetadata(ctx context.Context, re
596640}
597641
598642func (c * grpcClient ) ResolveImageConfig (ctx context.Context , ref string , opt sourceresolver.Opt ) (string , digest.Digest , []byte , error ) {
643+ var platform * ocispecs.Platform
644+ if imgOpt := opt .ImageOpt ; imgOpt != nil && imgOpt .Platform != nil {
645+ platform = imgOpt .Platform
646+ } else if ociOpt := opt .OCILayoutOpt ; ociOpt != nil && ociOpt .Platform != nil {
647+ platform = ociOpt .Platform
648+ }
649+
599650 var p * opspb.Platform
600- if platform := opt . Platform ; platform != nil {
651+ if platform != nil {
601652 p = & opspb.Platform {
602653 OS : platform .OS ,
603654 Architecture : platform .Architecture ,
0 commit comments