Skip to content

Commit b41ad2f

Browse files
committed
http: add http support to ResolveSourceMeta
Signed-off-by: Tonis Tiigi <[email protected]>
1 parent 35b3879 commit b41ad2f

File tree

10 files changed

+855
-263
lines changed

10 files changed

+855
-263
lines changed

client/client_test.go

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,7 @@ var allTests = []func(t *testing.T, sb integration.Sandbox){
242242
testFileOpSymlink,
243243
testMetadataOnlyLocal,
244244
testGitResolveSourceMetadata,
245+
testHTTPResolveSourceMetadata,
245246
}
246247

247248
func TestIntegration(t *testing.T) {
@@ -12057,6 +12058,64 @@ func testGitResolveSourceMetadata(t *testing.T, sb integration.Sandbox) {
1205712058
require.NoError(t, err)
1205812059
}
1205912060

12061+
func testHTTPResolveSourceMetadata(t *testing.T, sb integration.Sandbox) {
12062+
ctx := sb.Context()
12063+
c, err := New(ctx, sb.Address())
12064+
require.NoError(t, err)
12065+
defer c.Close()
12066+
12067+
modTime := time.Now().Add(-24 * time.Hour) // avoid falso positive with current time
12068+
12069+
resp := httpserver.Response{
12070+
Etag: identity.NewID(),
12071+
Content: []byte("content1"),
12072+
LastModified: &modTime,
12073+
}
12074+
12075+
resp2 := httpserver.Response{
12076+
Etag: identity.NewID(),
12077+
Content: []byte("content2"),
12078+
ContentDisposition: "attachment; filename=\"my img.jpg\"",
12079+
}
12080+
12081+
server := httpserver.NewTestServer(map[string]httpserver.Response{
12082+
"/foo": resp,
12083+
"/bar": resp2,
12084+
})
12085+
defer server.Close()
12086+
12087+
_, err = c.Build(ctx, SolveOpt{}, "test", func(ctx context.Context, c gateway.Client) (*gateway.Result, error) {
12088+
id := server.URL + "/foo"
12089+
md, err := c.ResolveSourceMetadata(ctx, &pb.SourceOp{
12090+
Identifier: id,
12091+
}, sourceresolver.Opt{})
12092+
if err != nil {
12093+
return nil, err
12094+
}
12095+
require.NotNil(t, md.HTTP)
12096+
require.Equal(t, digest.FromBytes(resp.Content), md.HTTP.Digest)
12097+
require.Equal(t, "foo", md.HTTP.Filename)
12098+
require.NotNil(t, md.HTTP.LastModified)
12099+
require.Equal(t, modTime.Unix(), md.HTTP.LastModified.Unix())
12100+
require.Equal(t, id, md.Op.Identifier)
12101+
12102+
id = server.URL + "/bar"
12103+
md, err = c.ResolveSourceMetadata(ctx, &pb.SourceOp{
12104+
Identifier: id,
12105+
}, sourceresolver.Opt{})
12106+
if err != nil {
12107+
return nil, err
12108+
}
12109+
require.NotNil(t, md.HTTP)
12110+
require.Equal(t, digest.FromBytes(resp2.Content), md.HTTP.Digest)
12111+
require.Equal(t, "my img.jpg", md.HTTP.Filename)
12112+
require.Nil(t, md.HTTP.LastModified)
12113+
require.Equal(t, id, md.Op.Identifier)
12114+
return nil, nil
12115+
}, nil)
12116+
require.NoError(t, err)
12117+
}
12118+
1206012119
func runInDir(dir string, cmds ...string) error {
1206112120
for _, args := range cmds {
1206212121
var cmd *exec.Cmd

client/llb/sourceresolver/types.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package sourceresolver
22

33
import (
44
"context"
5+
"time"
56

67
"github.com/moby/buildkit/solver/pb"
78
spb "github.com/moby/buildkit/sourcepolicy/pb"
@@ -34,6 +35,7 @@ type MetaResponse struct {
3435

3536
Image *ResolveImageResponse
3637
Git *ResolveGitResponse
38+
HTTP *ResolveHTTPResponse
3739
}
3840

3941
type ResolveImageOpt struct {
@@ -51,6 +53,12 @@ type ResolveGitResponse struct {
5153
CommitChecksum string
5254
}
5355

56+
type ResolveHTTPResponse struct {
57+
Digest digest.Digest
58+
Filename string
59+
LastModified *time.Time
60+
}
61+
5462
type ResolveOCILayoutOpt struct {
5563
Store ResolveImageConfigOptStore
5664
}

frontend/gateway/gateway.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import (
1919
"github.com/containerd/containerd/v2/core/mount"
2020
"github.com/containerd/containerd/v2/defaults"
2121
"github.com/distribution/reference"
22+
"github.com/golang/protobuf/ptypes/timestamp"
2223
apitypes "github.com/moby/buildkit/api/types"
2324
"github.com/moby/buildkit/cache"
2425
cacheutil "github.com/moby/buildkit/cache/util"
@@ -657,6 +658,19 @@ func (lbf *llbBridgeForwarder) ResolveSourceMeta(ctx context.Context, req *pb.Re
657658
CommitChecksum: resp.Git.CommitChecksum,
658659
}
659660
}
661+
if resp.HTTP != nil {
662+
var lastModified *timestamp.Timestamp
663+
if resp.HTTP.LastModified != nil {
664+
lastModified = &timestamp.Timestamp{
665+
Seconds: resp.HTTP.LastModified.Unix(),
666+
}
667+
}
668+
r.HTTP = &pb.ResolveSourceHTTPResponse{
669+
Checksum: resp.HTTP.Digest.String(),
670+
Filename: resp.HTTP.Filename,
671+
LastModified: lastModified,
672+
}
673+
}
660674
return r, nil
661675
}
662676

frontend/gateway/grpcclient/client.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,21 @@ func (c *grpcClient) ResolveSourceMetadata(ctx context.Context, op *opspb.Source
535535
CommitChecksum: resp.Git.CommitChecksum,
536536
}
537537
}
538+
if resp.HTTP != nil {
539+
dgst, err := digest.Parse(resp.HTTP.Checksum)
540+
if err != nil {
541+
return nil, errors.Wrapf(err, "invalid http checksum digest %q", resp.HTTP.Checksum)
542+
}
543+
544+
r.HTTP = &sourceresolver.ResolveHTTPResponse{
545+
Digest: dgst,
546+
Filename: resp.HTTP.Filename,
547+
}
548+
if resp.HTTP.LastModified != nil {
549+
tm := resp.HTTP.LastModified.AsTime()
550+
r.HTTP.LastModified = &tm
551+
}
552+
}
538553
return r, nil
539554
}
540555

0 commit comments

Comments
 (0)