Skip to content

Commit 0f6535c

Browse files
wkingrh-atomic-bot
authored andcommitted
libpod/image: Use ParseNormalizedNamed in RepoDigests
Avoid generating quay.io/openshift-release-dev/ocp-release@sha256@sha256:239... and similar when the image name is already digest-based [1]. It's not clear exactly how we get into this state, but as shown by the unit tests, the new code handles this case correctly (while the previous code does not). [1]: containers#2086 Signed-off-by: W. Trevor King <[email protected]> Closes: containers#2106 Approved by: rhatdan
1 parent a60090c commit 0f6535c

File tree

4 files changed

+76
-6
lines changed

4 files changed

+76
-6
lines changed

cmd/podman/sign.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,10 @@ func signCmd(c *cli.Context) error {
126126
sigStoreDir = SignatureStoreDir
127127
}
128128

129-
repos := newImage.RepoDigests()
129+
repos, err := newImage.RepoDigests()
130+
if err != nil {
131+
return errors.Wrapf(err, "error calculating repo digests for %s", signimage)
132+
}
130133
if len(repos) == 0 {
131134
logrus.Errorf("no repodigests associated with the image %s", signimage)
132135
continue

libpod/image/image.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -305,12 +305,24 @@ func (i *Image) Names() []string {
305305
}
306306

307307
// RepoDigests returns a string array of repodigests associated with the image
308-
func (i *Image) RepoDigests() []string {
308+
func (i *Image) RepoDigests() ([]string, error) {
309309
var repoDigests []string
310+
digest := i.Digest()
311+
310312
for _, name := range i.Names() {
311-
repoDigests = append(repoDigests, strings.SplitN(name, ":", 2)[0]+"@"+i.Digest().String())
313+
named, err := reference.ParseNormalizedNamed(name)
314+
if err != nil {
315+
return nil, err
316+
}
317+
318+
canonical, err := reference.WithDigest(reference.TrimNamed(named), digest)
319+
if err != nil {
320+
return nil, err
321+
}
322+
323+
repoDigests = append(repoDigests, canonical.String())
312324
}
313-
return repoDigests
325+
return repoDigests, nil
314326
}
315327

316328
// Created returns the time the image was created

libpod/image/image_test.go

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"testing"
1010

1111
"github.com/containers/storage"
12+
"github.com/opencontainers/go-digest"
1213
"github.com/stretchr/testify/assert"
1314
)
1415

@@ -192,6 +193,51 @@ func TestImage_MatchRepoTag(t *testing.T) {
192193
cleanup(workdir, ir)
193194
}
194195

196+
// TestImage_RepoDigests tests RepoDigest generation.
197+
func TestImage_RepoDigests(t *testing.T) {
198+
dgst, err := digest.Parse("sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc")
199+
if err != nil {
200+
t.Fatal(err)
201+
}
202+
203+
for _, test := range []struct {
204+
name string
205+
names []string
206+
expected []string
207+
}{
208+
{
209+
name: "empty",
210+
names: []string{},
211+
expected: nil,
212+
},
213+
{
214+
name: "tagged",
215+
names: []string{"docker.io/library/busybox:latest"},
216+
expected: []string{"docker.io/library/busybox@sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc"},
217+
},
218+
{
219+
name: "digest",
220+
names: []string{"docker.io/library/busybox@sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc"},
221+
expected: []string{"docker.io/library/busybox@sha256:7173b809ca12ec5dee4506cd86be934c4596dd234ee82c0662eac04a8c2c71dc"},
222+
},
223+
} {
224+
t.Run(test.name, func(t *testing.T) {
225+
image := &Image{
226+
image: &storage.Image{
227+
Names: test.names,
228+
Digest: dgst,
229+
},
230+
}
231+
actual, err := image.RepoDigests()
232+
if err != nil {
233+
t.Fatal(err)
234+
}
235+
236+
assert.Equal(t, test.expected, actual)
237+
})
238+
}
239+
}
240+
195241
// Test_splitString tests the splitString function in image that
196242
// takes input and splits on / and returns the last array item
197243
func Test_splitString(t *testing.T) {

pkg/varlinkapi/images.go

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,18 @@ func (i *LibpodAPI) ListImages(call iopodman.VarlinkCall) error {
4141
for _, image := range images {
4242
labels, _ := image.Labels(getContext())
4343
containers, _ := image.Containers()
44+
repoDigests, err := image.RepoDigests()
45+
if err != nil {
46+
return err
47+
}
48+
4449
size, _ := image.Size(getContext())
4550

4651
i := iopodman.ImageInList{
4752
Id: image.ID(),
4853
ParentId: image.Parent,
4954
RepoTags: image.Names(),
50-
RepoDigests: image.RepoDigests(),
55+
RepoDigests: repoDigests,
5156
Created: image.Created().String(),
5257
Size: int64(*size),
5358
VirtualSize: image.VirtualSize,
@@ -73,6 +78,10 @@ func (i *LibpodAPI) GetImage(call iopodman.VarlinkCall, name string) error {
7378
if err != nil {
7479
return err
7580
}
81+
repoDigests, err := newImage.RepoDigests()
82+
if err != nil {
83+
return err
84+
}
7685
size, err := newImage.Size(getContext())
7786
if err != nil {
7887
return err
@@ -82,7 +91,7 @@ func (i *LibpodAPI) GetImage(call iopodman.VarlinkCall, name string) error {
8291
Id: newImage.ID(),
8392
ParentId: newImage.Parent,
8493
RepoTags: newImage.Names(),
85-
RepoDigests: newImage.RepoDigests(),
94+
RepoDigests: repoDigests,
8695
Created: newImage.Created().String(),
8796
Size: int64(*size),
8897
VirtualSize: newImage.VirtualSize,

0 commit comments

Comments
 (0)