Skip to content

Commit 320bc6b

Browse files
committed
image: move image source resolver away from old interface
ResolveImageConfig was changed to ResolveSourceMetadata long time ago for cross-source implementation but the worker implementation was still using old method name with conversions. Signed-off-by: Tonis Tiigi <[email protected]>
1 parent 4a36f3a commit 320bc6b

File tree

15 files changed

+2644
-712
lines changed

15 files changed

+2644
-712
lines changed

client/llb/imagemetaresolver/resolver.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,8 @@ func (imr *imageMetaResolver) ResolveImageConfig(ctx context.Context, ref string
8686
defer imr.locker.Unlock(ref)
8787

8888
platform := imr.platform
89-
if opt.Platform != nil {
90-
platform = opt.Platform
89+
if imgOpt := opt.ImageOpt; imgOpt != nil && imgOpt.Platform != nil {
90+
platform = imgOpt.Platform
9191
}
9292

9393
k := imr.key(ref, platform)

client/llb/resolver_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,8 @@ func (r *testResolver) ResolveImageConfig(ctx context.Context, ref string, opt s
8787

8888
img.Config.WorkingDir = r.dir
8989

90-
if opt.Platform != nil {
91-
r.platform = platforms.Format(*opt.Platform)
90+
if imgOpt := opt.ImageOpt; imgOpt != nil && imgOpt.Platform != nil {
91+
r.platform = platforms.Format(*imgOpt.Platform)
9292
}
9393

9494
dt, err := json.Marshal(img)

client/llb/source.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,8 +146,8 @@ func Image(ref string, opts ...ImageOption) State {
146146
p = c.Platform
147147
}
148148
_, _, dt, err := info.metaResolver.ResolveImageConfig(ctx, ref, sourceresolver.Opt{
149-
Platform: p,
150149
ImageOpt: &sourceresolver.ResolveImageOpt{
150+
Platform: p,
151151
ResolveMode: info.resolveMode.String(),
152152
},
153153
})
@@ -163,8 +163,8 @@ func Image(ref string, opts ...ImageOption) State {
163163
p = c.Platform
164164
}
165165
ref, dgst, dt, err := info.metaResolver.ResolveImageConfig(context.TODO(), ref, sourceresolver.Opt{
166-
Platform: p,
167166
ImageOpt: &sourceresolver.ResolveImageOpt{
167+
Platform: p,
168168
ResolveMode: info.resolveMode.String(),
169169
},
170170
})

client/llb/sourceresolver/types.go

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ type MetaResolver interface {
2424
type Opt struct {
2525
LogName string
2626
SourcePolicies []*spb.Policy
27-
Platform *ocispecs.Platform
2827

2928
ImageOpt *ResolveImageOpt
3029
OCILayoutOpt *ResolveOCILayoutOpt
@@ -40,12 +39,27 @@ type MetaResponse struct {
4039
}
4140

4241
type ResolveImageOpt struct {
42+
Platform *ocispecs.Platform
4343
ResolveMode string
4444
}
4545

4646
type ResolveImageResponse struct {
47-
Digest digest.Digest
48-
Config []byte
47+
Digest digest.Digest
48+
Config []byte
49+
AttestationChain *AttestationChain
50+
}
51+
52+
type AttestationChain struct {
53+
Root digest.Digest
54+
ImageManifest digest.Digest
55+
AttestationManifest digest.Digest
56+
SignatureManifests []digest.Digest
57+
Blobs map[digest.Digest]Blob
58+
}
59+
60+
type Blob struct {
61+
Descriptor ocispecs.Descriptor
62+
Data []byte
4963
}
5064

5165
type ResolveGitOpt struct {
@@ -67,7 +81,8 @@ type ResolveHTTPResponse struct {
6781
}
6882

6983
type ResolveOCILayoutOpt struct {
70-
Store ResolveImageConfigOptStore
84+
Platform *ocispecs.Platform
85+
Store ResolveImageConfigOptStore
7186
}
7287

7388
type ResolveImageConfigOptStore struct {

frontend/dockerfile/dockerfile2llb/convert.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -541,9 +541,9 @@ func toDispatchState(ctx context.Context, dt []byte, opt ConvertOpt) (*dispatchS
541541
}
542542
prefix += "internal]"
543543
mutRef, dgst, dt, err := metaResolver.ResolveImageConfig(ctx, d.stage.BaseName, sourceresolver.Opt{
544-
LogName: fmt.Sprintf("%s load metadata for %s", prefix, d.stage.BaseName),
545-
Platform: platform,
544+
LogName: fmt.Sprintf("%s load metadata for %s", prefix, d.stage.BaseName),
546545
ImageOpt: &sourceresolver.ResolveImageOpt{
546+
Platform: platform,
547547
ResolveMode: opt.ImageResolveMode.String(),
548548
},
549549
})

frontend/dockerui/namedcontext.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -94,9 +94,9 @@ func (nc *NamedContext) load(ctx context.Context, count int) (*llb.State, *docke
9494
named = reference.TagNameOnly(named)
9595

9696
ref, dgst, data, err := nc.bc.client.ResolveImageConfig(ctx, named.String(), sourceresolver.Opt{
97-
LogName: fmt.Sprintf("[context %s] load metadata for %s", nc.nameWithPlatform, ref),
98-
Platform: opt.Platform,
97+
LogName: fmt.Sprintf("[context %s] load metadata for %s", nc.nameWithPlatform, ref),
9998
ImageOpt: &sourceresolver.ResolveImageOpt{
99+
Platform: opt.Platform,
100100
ResolveMode: opt.ResolveMode,
101101
},
102102
})
@@ -183,9 +183,9 @@ func (nc *NamedContext) load(ctx context.Context, count int) (*llb.State, *docke
183183
}
184184

185185
_, dgst, data, err := nc.bc.client.ResolveImageConfig(ctx, dummyRef.String(), sourceresolver.Opt{
186-
LogName: fmt.Sprintf("[context %s] load metadata for %s", nc.nameWithPlatform, dummyRef.String()),
187-
Platform: opt.Platform,
186+
LogName: fmt.Sprintf("[context %s] load metadata for %s", nc.nameWithPlatform, dummyRef.String()),
188187
OCILayoutOpt: &sourceresolver.ResolveOCILayoutOpt{
188+
Platform: opt.Platform,
189189
Store: sourceresolver.ResolveImageConfigOptStore{
190190
SessionID: nc.bc.bopts.SessionID,
191191
StoreID: named.Name(),

frontend/gateway/gateway.go

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -631,10 +631,13 @@ func (lbf *llbBridgeForwarder) ResolveSourceMeta(ctx context.Context, req *pb.Re
631631
resolveopt := sourceresolver.Opt{
632632
LogName: req.LogName,
633633
SourcePolicies: req.SourcePolicies,
634-
Platform: platform,
635634
}
636635
resolveopt.ImageOpt = &sourceresolver.ResolveImageOpt{
637636
ResolveMode: req.ResolveMode,
637+
Platform: platform,
638+
}
639+
resolveopt.OCILayoutOpt = &sourceresolver.ResolveOCILayoutOpt{
640+
Platform: platform,
638641
}
639642
if req.Git != nil {
640643
resolveopt.GitOpt = &sourceresolver.ResolveGitOpt{
@@ -698,18 +701,19 @@ func (lbf *llbBridgeForwarder) ResolveImageConfig(ctx context.Context, req *pb.R
698701
resolveopt := sourceresolver.Opt{
699702
LogName: req.LogName,
700703
SourcePolicies: req.SourcePolicies,
701-
Platform: platform,
702704
}
703705
if sourceresolver.ResolverType(req.ResolverType) == sourceresolver.ResolverTypeRegistry {
704706
resolveopt.ImageOpt = &sourceresolver.ResolveImageOpt{
705707
ResolveMode: req.ResolveMode,
708+
Platform: platform,
706709
}
707710
} else if sourceresolver.ResolverType(req.ResolverType) == sourceresolver.ResolverTypeOCILayout {
708711
resolveopt.OCILayoutOpt = &sourceresolver.ResolveOCILayoutOpt{
709712
Store: sourceresolver.ResolveImageConfigOptStore{
710713
SessionID: req.SessionID,
711714
StoreID: req.StoreID,
712715
},
716+
Platform: platform,
713717
}
714718
}
715719

frontend/gateway/grpcclient/client.go

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
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+
564608
func (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

598642
func (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

Comments
 (0)