1
0
mirror of https://github.com/moby/buildkit.git synced 2025-08-08 10:02:07 +03:00

replace resolveimageconfig with generic sourcemetaresolver

This is more versatile function that works for any source,
not just images.

It can be used together with a policy that switches
between input and output source as well as for adding
additional metadata for other sources in the future.

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
This commit is contained in:
Tonis Tiigi
2024-01-13 17:53:16 -08:00
parent effe19a9a1
commit 30c069cb03
36 changed files with 1712 additions and 497 deletions

View File

@@ -14,7 +14,7 @@ import (
"github.com/containerd/containerd/remotes/docker"
"github.com/moby/buildkit/cache"
"github.com/moby/buildkit/client"
"github.com/moby/buildkit/client/llb"
"github.com/moby/buildkit/client/llb/sourceresolver"
"github.com/moby/buildkit/session"
"github.com/moby/buildkit/snapshot"
"github.com/moby/buildkit/solver"
@@ -89,7 +89,7 @@ func (is *Source) Resolve(ctx context.Context, id source.Identifier, sm *session
mode resolver.ResolveMode
recordType client.UsageRecordType
ref reference.Spec
store llb.ResolveImageConfigOptStore
store sourceresolver.ResolveImageConfigOptStore
layerLimit *int
)
switch is.ResolverType {
@@ -116,7 +116,7 @@ func (is *Source) Resolve(ctx context.Context, id source.Identifier, sm *session
platform = *ociIdentifier.Platform
}
mode = resolver.ResolveModeForcePull // with OCI layout, we always just "pull"
store = llb.ResolveImageConfigOptStore{
store = sourceresolver.ResolveImageConfigOptStore{
SessionID: ociIdentifier.SessionID,
StoreID: ociIdentifier.StoreID,
}
@@ -148,44 +148,51 @@ func (is *Source) Resolve(ctx context.Context, id source.Identifier, sm *session
return p, nil
}
func (is *Source) ResolveImageConfig(ctx context.Context, ref string, opt llb.ResolveImageConfigOpt, sm *session.Manager, g session.Group) (string, digest.Digest, []byte, error) {
func (is *Source) ResolveImageConfig(ctx context.Context, ref string, opt sourceresolver.Opt, sm *session.Manager, g session.Group) (digest.Digest, []byte, error) {
key := ref
if platform := opt.Platform; platform != nil {
key += platforms.Format(*platform)
}
var (
rm resolver.ResolveMode
rslvr remotes.Resolver
err error
)
if platform := opt.Platform; platform != nil {
key += platforms.Format(*platform)
}
switch is.ResolverType {
case ResolverTypeRegistry:
rm, err = resolver.ParseImageResolveMode(opt.ResolveMode)
iopt := opt.ImageOpt
if iopt == nil {
return "", nil, errors.Errorf("missing imageopt for resolve")
}
rm, err = resolver.ParseImageResolveMode(iopt.ResolveMode)
if err != nil {
return "", "", nil, err
return "", nil, err
}
rslvr = resolver.DefaultPool.GetResolver(is.RegistryHosts, ref, "pull", sm, g).WithImageStore(is.ImageStore, rm)
case ResolverTypeOCILayout:
iopt := opt.OCILayoutOpt
if iopt == nil {
return "", nil, errors.Errorf("missing ocilayoutopt for resolve")
}
rm = resolver.ResolveModeForcePull
rslvr = getOCILayoutResolver(opt.Store, sm, g)
rslvr = getOCILayoutResolver(iopt.Store, sm, g)
}
key += rm.String()
res, err := is.g.Do(ctx, key, func(ctx context.Context) (*resolveImageResult, error) {
newRef, dgst, dt, err := imageutil.Config(ctx, ref, rslvr, is.ContentStore, is.LeaseManager, opt.Platform, opt.SourcePolicies)
dgst, dt, err := imageutil.Config(ctx, ref, rslvr, is.ContentStore, is.LeaseManager, opt.Platform)
if err != nil {
return nil, err
}
return &resolveImageResult{dgst: dgst, dt: dt, ref: newRef}, nil
return &resolveImageResult{dgst: dgst, dt: dt}, nil
})
if err != nil {
return "", "", nil, err
return "", nil, err
}
return res.ref, res.dgst, res.dt, nil
return res.dgst, res.dt, nil
}
type resolveImageResult struct {
ref string
dgst digest.Digest
dt []byte
}