Skip to content

Commit 2690ac9

Browse files
authored
feat(image): pass global context to docker/podman image save func (#9733)
1 parent c03facf commit 2690ac9

File tree

6 files changed

+36
-27
lines changed

6 files changed

+36
-27
lines changed

pkg/fanal/image/daemon.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ import (
99
"github.com/aquasecurity/trivy/pkg/fanal/types"
1010
)
1111

12-
func tryDockerDaemon(_ context.Context, imageName string, ref name.Reference, opt types.ImageOptions) (types.Image, func(), error) {
13-
img, cleanup, err := daemon.DockerImage(ref, opt.DockerOptions.Host)
12+
func tryDockerDaemon(ctx context.Context, imageName string, ref name.Reference, opt types.ImageOptions) (types.Image, func(), error) {
13+
img, cleanup, err := daemon.DockerImage(ctx, ref, opt.DockerOptions.Host)
1414
if err != nil {
1515
return nil, nil, err
1616
}
@@ -21,8 +21,8 @@ func tryDockerDaemon(_ context.Context, imageName string, ref name.Reference, op
2121

2222
}
2323

24-
func tryPodmanDaemon(_ context.Context, imageName string, _ name.Reference, opts types.ImageOptions) (types.Image, func(), error) {
25-
img, cleanup, err := daemon.PodmanImage(imageName, opts.PodmanOptions.Host)
24+
func tryPodmanDaemon(ctx context.Context, imageName string, _ name.Reference, opts types.ImageOptions) (types.Image, func(), error) {
25+
img, cleanup, err := daemon.PodmanImage(ctx, imageName, opts.PodmanOptions.Host)
2626
if err != nil {
2727
return nil, nil, err
2828
}

pkg/fanal/image/daemon/docker.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import (
1313

1414
// DockerImage implements v1.Image by extending daemon.Image.
1515
// The caller must call cleanup() to remove a temporary file.
16-
func DockerImage(ref name.Reference, host string) (Image, func(), error) {
16+
func DockerImage(ctx context.Context, ref name.Reference, host string) (Image, func(), error) {
1717
cleanup := func() {}
1818

1919
// Resolve Docker host based on priority: --docker-host > DOCKER_HOST > DOCKER_CONTEXT > current context
@@ -44,16 +44,16 @@ func DockerImage(ref name.Reference, host string) (Image, func(), error) {
4444
// or
4545
// <image_name>@<digest> pattern like "alpine@sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300"
4646
imageID := ref.Name()
47-
inspect, err := c.ImageInspect(context.Background(), imageID)
47+
inspect, err := c.ImageInspect(ctx, imageID)
4848
if err != nil {
4949
imageID = ref.String() // <image_id> pattern like `5ac716b05a9c`
50-
inspect, err = c.ImageInspect(context.Background(), imageID)
50+
inspect, err = c.ImageInspect(ctx, imageID)
5151
if err != nil {
5252
return nil, cleanup, xerrors.Errorf("unable to inspect the image (%s): %w", imageID, err)
5353
}
5454
}
5555

56-
history, err := c.ImageHistory(context.Background(), imageID)
56+
history, err := c.ImageHistory(ctx, imageID)
5757
if err != nil {
5858
return nil, cleanup, xerrors.Errorf("unable to get history (%s): %w", imageID, err)
5959
}
@@ -70,7 +70,7 @@ func DockerImage(ref name.Reference, host string) (Image, func(), error) {
7070
}
7171

7272
return &image{
73-
opener: imageOpener(context.Background(), imageID, f, c.ImageSave),
73+
opener: imageOpener(ctx, imageID, f, c.ImageSave),
7474
inspect: inspect,
7575
history: configHistory(history),
7676
}, cleanup, nil

pkg/fanal/image/daemon/docker_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ func TestDockerImage(t *testing.T) {
3737
ref, err := name.ParseReference(tt.imageName)
3838
require.NoError(t, err)
3939

40-
_, cleanup, err := DockerImage(ref, "")
40+
_, cleanup, err := DockerImage(t.Context(), ref, "")
4141
assert.Equal(t, tt.wantErr, err != nil, err)
4242
defer func() {
4343
if cleanup != nil {

pkg/fanal/image/daemon/image_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ func Test_image_ConfigName(t *testing.T) {
6060
ref, err := name.ParseReference(tt.imageName)
6161
require.NoError(t, err)
6262

63-
img, cleanup, err := DockerImage(ref, "")
63+
img, cleanup, err := DockerImage(t.Context(), ref, "")
6464
require.NoError(t, err)
6565
defer cleanup()
6666

@@ -101,7 +101,7 @@ func Test_image_ConfigNameWithCustomDockerHost(t *testing.T) {
101101
dockerHostParam = te.Listener.Addr().Network() + "://" + te.Listener.Addr().String()
102102
}
103103

104-
img, cleanup, err := DockerImage(ref, dockerHostParam)
104+
img, cleanup, err := DockerImage(t.Context(), ref, dockerHostParam)
105105
require.NoError(t, err)
106106
defer cleanup()
107107

@@ -139,7 +139,7 @@ func Test_image_ConfigNameWithCustomPodmanHost(t *testing.T) {
139139
te := engine.NewDockerEngine(eo)
140140
defer te.Close()
141141

142-
img, cleanup, err := PodmanImage(ref.Name(), podmanSocket)
142+
img, cleanup, err := PodmanImage(t.Context(), ref.Name(), podmanSocket)
143143
require.NoError(t, err)
144144
defer cleanup()
145145

@@ -235,7 +235,7 @@ func Test_image_ConfigFile(t *testing.T) {
235235
ref, err := name.ParseReference(tt.imageName)
236236
require.NoError(t, err)
237237

238-
img, cleanup, err := DockerImage(ref, "")
238+
img, cleanup, err := DockerImage(t.Context(), ref, "")
239239
require.NoError(t, err)
240240
defer cleanup()
241241

@@ -280,7 +280,7 @@ func Test_image_LayerByDiffID(t *testing.T) {
280280
ref, err := name.ParseReference(tt.imageName)
281281
require.NoError(t, err)
282282

283-
img, cleanup, err := DockerImage(ref, "")
283+
img, cleanup, err := DockerImage(t.Context(), ref, "")
284284
require.NoError(t, err)
285285
defer cleanup()
286286

@@ -309,7 +309,7 @@ func Test_image_RawConfigFile(t *testing.T) {
309309
ref, err := name.ParseReference(tt.imageName)
310310
require.NoError(t, err)
311311

312-
img, cleanup, err := DockerImage(ref, "")
312+
img, cleanup, err := DockerImage(t.Context(), ref, "")
313313
require.NoError(t, err)
314314
defer cleanup()
315315

pkg/fanal/image/daemon/podman.go

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ type errResponse struct {
5555
Message string
5656
}
5757

58-
func (p podmanClient) imageInspect(imageName string) (api.ImageInspect, error) {
58+
func (p podmanClient) imageInspect(ctx context.Context, imageName string) (api.ImageInspect, error) {
5959
url := fmt.Sprintf(inspectURL, imageName)
60-
resp, err := p.c.Get(url)
60+
resp, err := p.get(ctx, url)
6161
if err != nil {
6262
return api.ImageInspect{}, xerrors.Errorf("http error: %w", err)
6363
}
@@ -78,9 +78,9 @@ func (p podmanClient) imageInspect(imageName string) (api.ImageInspect, error) {
7878
return inspect, nil
7979
}
8080

81-
func (p podmanClient) imageHistoryInspect(imageName string) ([]dimage.HistoryResponseItem, error) {
81+
func (p podmanClient) imageHistoryInspect(ctx context.Context, imageName string) ([]dimage.HistoryResponseItem, error) {
8282
url := fmt.Sprintf(historyURL, imageName)
83-
resp, err := p.c.Get(url)
83+
resp, err := p.get(ctx, url)
8484
if err != nil {
8585
return []dimage.HistoryResponseItem{}, xerrors.Errorf("http error: %w", err)
8686
}
@@ -101,33 +101,42 @@ func (p podmanClient) imageHistoryInspect(imageName string) ([]dimage.HistoryRes
101101
return history, nil
102102
}
103103

104-
func (p podmanClient) imageSave(_ context.Context, imageNames []string, _ ...client.ImageSaveOption) (io.ReadCloser, error) {
104+
func (p podmanClient) imageSave(ctx context.Context, imageNames []string, _ ...client.ImageSaveOption) (io.ReadCloser, error) {
105105
if len(imageNames) < 1 {
106106
return nil, xerrors.Errorf("no specified image")
107107
}
108108
url := fmt.Sprintf(saveURL, imageNames[0])
109-
resp, err := p.c.Get(url)
109+
resp, err := p.get(ctx, url)
110110
if err != nil {
111111
return nil, xerrors.Errorf("http error: %w", err)
112112
}
113113
return resp.Body, nil
114114
}
115115

116+
func (p podmanClient) get(ctx context.Context, url string) (*http.Response, error) {
117+
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, http.NoBody)
118+
if err != nil {
119+
return nil, err
120+
}
121+
122+
return p.c.Do(req)
123+
}
124+
116125
// PodmanImage implements v1.Image by extending daemon.Image.
117126
// The caller must call cleanup() to remove a temporary file.
118-
func PodmanImage(ref, host string) (Image, func(), error) {
127+
func PodmanImage(ctx context.Context, ref, host string) (Image, func(), error) {
119128
cleanup := func() {}
120129

121130
c, err := newPodmanClient(host)
122131
if err != nil {
123132
return nil, cleanup, xerrors.Errorf("unable to initialize Podman client: %w", err)
124133
}
125-
inspect, err := c.imageInspect(ref)
134+
inspect, err := c.imageInspect(ctx, ref)
126135
if err != nil {
127136
return nil, cleanup, xerrors.Errorf("unable to inspect the image (%s): %w", ref, err)
128137
}
129138

130-
history, err := c.imageHistoryInspect(ref)
139+
history, err := c.imageHistoryInspect(ctx, ref)
131140
if err != nil {
132141
return nil, cleanup, xerrors.Errorf("unable to inspect the image (%s): %w", ref, err)
133142
}
@@ -143,7 +152,7 @@ func PodmanImage(ref, host string) (Image, func(), error) {
143152
}
144153

145154
return &image{
146-
opener: imageOpener(context.Background(), ref, f, c.imageSave),
155+
opener: imageOpener(ctx, ref, f, c.imageSave),
147156
inspect: inspect,
148157
history: configHistory(history),
149158
}, cleanup, nil

pkg/fanal/image/daemon/podman_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ func TestPodmanImage(t *testing.T) {
8383
ref, err := name.ParseReference(tt.imageName)
8484
require.NoError(t, err)
8585

86-
img, cleanup, err := PodmanImage(ref.Name(), "")
86+
img, cleanup, err := PodmanImage(t.Context(), ref.Name(), "")
8787
defer cleanup()
8888

8989
if tt.wantErr {

0 commit comments

Comments
 (0)