Skip to content

Commit c7d4c8a

Browse files
committed
Add Cached function for files already Download
This will return any files already in the cache, with valid digest, but not download any new ones. Signed-off-by: Anders F Björklund <[email protected]>
1 parent 50db1b7 commit c7d4c8a

File tree

2 files changed

+50
-0
lines changed

2 files changed

+50
-0
lines changed

pkg/downloader/downloader.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -242,6 +242,38 @@ func Download(local, remote string, opts ...Opt) (*Result, error) {
242242
return res, nil
243243
}
244244

245+
func Cached(remote string, opts ...Opt) (string, error) {
246+
var o options
247+
for _, f := range opts {
248+
if err := f(&o); err != nil {
249+
return "", err
250+
}
251+
}
252+
if o.cacheDir == "" {
253+
return "", fmt.Errorf("caching-only mode requires the cache directory to be specified")
254+
}
255+
256+
shad := cacheDirectoryPath(o.cacheDir, remote)
257+
shadData := filepath.Join(shad, "data")
258+
shadDigest, err := cacheDigestPath(shad, o.expectedDigest)
259+
if err != nil {
260+
return "", err
261+
}
262+
if _, err := os.Stat(shadData); err != nil {
263+
return "", err
264+
}
265+
if _, err := os.Stat(shadDigest); err != nil {
266+
if err := validateCachedDigest(shadDigest, o.expectedDigest); err != nil {
267+
return "", err
268+
}
269+
} else {
270+
if err := validateLocalFileDigest(shadData, o.expectedDigest); err != nil {
271+
return "", err
272+
}
273+
}
274+
return shadData, nil
275+
}
276+
245277
// cacheDirectoryPath returns the cache subdirectory path.
246278
// - "url" file contains the url
247279
// - "data" file contains the data

pkg/downloader/downloader_test.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os/exec"
66
"path/filepath"
77
"runtime"
8+
"strings"
89
"testing"
910

1011
"github.com/opencontainers/go-digest"
@@ -87,6 +88,23 @@ func TestDownloadRemote(t *testing.T) {
8788
assert.NilError(t, err)
8889
assert.Equal(t, StatusUsedCache, r.Status)
8990
})
91+
t.Run("cached", func(t *testing.T) {
92+
_, err := Download("", dummyRemoteFileURL, WithExpectedDigest(dummyRemoteFileDigest))
93+
assert.ErrorContains(t, err, "cache directory to be specified")
94+
95+
cacheDir := filepath.Join(t.TempDir(), "cache")
96+
r, err := Download("", dummyRemoteFileURL, WithExpectedDigest(dummyRemoteFileDigest), WithCacheDir(cacheDir))
97+
assert.NilError(t, err)
98+
assert.Equal(t, StatusDownloaded, r.Status)
99+
100+
p, err := Cached(dummyRemoteFileURL, WithExpectedDigest(dummyRemoteFileDigest), WithCacheDir(cacheDir))
101+
assert.NilError(t, err)
102+
assert.Assert(t, strings.HasPrefix(p, cacheDir), "expected %s to be in %s", p, cacheDir)
103+
104+
wrongDigest := digest.Digest("sha256:8313944efb4f38570c689813f288058b674ea6c487017a5a4738dc674b65f9d9")
105+
_, err = Cached(dummyRemoteFileURL, WithExpectedDigest(wrongDigest), WithCacheDir(cacheDir))
106+
assert.ErrorContains(t, err, "expected digest")
107+
})
90108
}
91109

92110
func TestDownloadLocal(t *testing.T) {

0 commit comments

Comments
 (0)