Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions client/client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -242,6 +242,7 @@ var allTests = []func(t *testing.T, sb integration.Sandbox){
testFileOpSymlink,
testMetadataOnlyLocal,
testGitResolveSourceMetadata,
testHTTPResolveSourceMetadata,
}

func TestIntegration(t *testing.T) {
Expand Down Expand Up @@ -12057,6 +12058,64 @@ func testGitResolveSourceMetadata(t *testing.T, sb integration.Sandbox) {
require.NoError(t, err)
}

func testHTTPResolveSourceMetadata(t *testing.T, sb integration.Sandbox) {
ctx := sb.Context()
c, err := New(ctx, sb.Address())
require.NoError(t, err)
defer c.Close()

modTime := time.Now().Add(-24 * time.Hour) // avoid falso positive with current time

resp := httpserver.Response{
Etag: identity.NewID(),
Content: []byte("content1"),
LastModified: &modTime,
}

resp2 := httpserver.Response{
Etag: identity.NewID(),
Content: []byte("content2"),
ContentDisposition: "attachment; filename=\"my img.jpg\"",
}

server := httpserver.NewTestServer(map[string]httpserver.Response{
"/foo": resp,
"/bar": resp2,
})
defer server.Close()

_, err = c.Build(ctx, SolveOpt{}, "test", func(ctx context.Context, c gateway.Client) (*gateway.Result, error) {
id := server.URL + "/foo"
md, err := c.ResolveSourceMetadata(ctx, &pb.SourceOp{
Identifier: id,
}, sourceresolver.Opt{})
if err != nil {
return nil, err
}
require.NotNil(t, md.HTTP)
require.Equal(t, digest.FromBytes(resp.Content), md.HTTP.Digest)
require.Equal(t, "foo", md.HTTP.Filename)
require.NotNil(t, md.HTTP.LastModified)
require.Equal(t, modTime.Unix(), md.HTTP.LastModified.Unix())
require.Equal(t, id, md.Op.Identifier)

id = server.URL + "/bar"
md, err = c.ResolveSourceMetadata(ctx, &pb.SourceOp{
Identifier: id,
}, sourceresolver.Opt{})
if err != nil {
return nil, err
}
require.NotNil(t, md.HTTP)
require.Equal(t, digest.FromBytes(resp2.Content), md.HTTP.Digest)
require.Equal(t, "my img.jpg", md.HTTP.Filename)
require.Nil(t, md.HTTP.LastModified)
require.Equal(t, id, md.Op.Identifier)
return nil, nil
}, nil)
require.NoError(t, err)
}

func runInDir(dir string, cmds ...string) error {
for _, args := range cmds {
var cmd *exec.Cmd
Expand Down
8 changes: 8 additions & 0 deletions client/llb/sourceresolver/types.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package sourceresolver

import (
"context"
"time"

"github.com/moby/buildkit/solver/pb"
spb "github.com/moby/buildkit/sourcepolicy/pb"
Expand Down Expand Up @@ -34,6 +35,7 @@ type MetaResponse struct {

Image *ResolveImageResponse
Git *ResolveGitResponse
HTTP *ResolveHTTPResponse
}

type ResolveImageOpt struct {
Expand All @@ -51,6 +53,12 @@ type ResolveGitResponse struct {
CommitChecksum string
}

type ResolveHTTPResponse struct {
Digest digest.Digest
Filename string
LastModified *time.Time
}

type ResolveOCILayoutOpt struct {
Store ResolveImageConfigOptStore
}
Expand Down
14 changes: 14 additions & 0 deletions frontend/gateway/gateway.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ import (
"github.com/containerd/containerd/v2/core/mount"
"github.com/containerd/containerd/v2/defaults"
"github.com/distribution/reference"
"github.com/golang/protobuf/ptypes/timestamp"
apitypes "github.com/moby/buildkit/api/types"
"github.com/moby/buildkit/cache"
cacheutil "github.com/moby/buildkit/cache/util"
Expand Down Expand Up @@ -657,6 +658,19 @@ func (lbf *llbBridgeForwarder) ResolveSourceMeta(ctx context.Context, req *pb.Re
CommitChecksum: resp.Git.CommitChecksum,
}
}
if resp.HTTP != nil {
var lastModified *timestamp.Timestamp
if resp.HTTP.LastModified != nil {
lastModified = &timestamp.Timestamp{
Seconds: resp.HTTP.LastModified.Unix(),
}
}
r.HTTP = &pb.ResolveSourceHTTPResponse{
Checksum: resp.HTTP.Digest.String(),
Filename: resp.HTTP.Filename,
LastModified: lastModified,
}
}
return r, nil
}

Expand Down
15 changes: 15 additions & 0 deletions frontend/gateway/grpcclient/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -535,6 +535,21 @@ func (c *grpcClient) ResolveSourceMetadata(ctx context.Context, op *opspb.Source
CommitChecksum: resp.Git.CommitChecksum,
}
}
if resp.HTTP != nil {
dgst, err := digest.Parse(resp.HTTP.Checksum)
if err != nil {
return nil, errors.Wrapf(err, "invalid http checksum digest %q", resp.HTTP.Checksum)
}

r.HTTP = &sourceresolver.ResolveHTTPResponse{
Digest: dgst,
Filename: resp.HTTP.Filename,
}
if resp.HTTP.LastModified != nil {
tm := resp.HTTP.LastModified.AsTime()
r.HTTP.LastModified = &tm
}
}
return r, nil
}

Expand Down
Loading