Add imageParts.normalizedReference()

This will be used in normalizeTag to work with references instead of strings.

Not used anywhere yet, should not change behavior.

Signed-off-by: Miloslav Trmač <mitr@redhat.com>
This commit is contained in:
Miloslav Trmač 2019-01-09 21:33:01 +01:00
parent e58aa74766
commit 1c19d19c6e
2 changed files with 42 additions and 0 deletions

View File

@ -92,3 +92,17 @@ func (ip *imageParts) referenceWithRegistry(registry string) (reference.Named, e
}
return ref, nil
}
// normalizedReference returns a (normalized) reference for ip (with ip.hasRegistry)
func (ip *imageParts) normalizedReference() (reference.Named, error) {
if !ip.hasRegistry {
return nil, errors.Errorf("internal error: normalizedReference called on imageParts without a registry (%#v)", *ip)
}
// We need to round-trip via a string to get the right normalization of docker.io/library
s := ip.unnormalizedRef.String()
ref, err := reference.ParseNormalizedNamed(s)
if err != nil { // Should never happen
return nil, errors.Wrapf(err, "error normalizing qualified reference %#v", s)
}
return ref, nil
}

View File

@ -93,3 +93,31 @@ func TestImagePartsReferenceWithRegistry(t *testing.T) {
_, err = parts.referenceWithRegistry("invalid@domain")
assert.Error(t, err)
}
func TestImagePartsNormalizedReference(t *testing.T) {
const digestSuffix = "@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef"
for _, c := range []struct{ input, expected string }{
{"busybox", ""}, // Unqualified input is invalid
{"docker.io/busybox", "docker.io/library/busybox"}, // docker.io single-name
{"example.com/busybox", "example.com/busybox"}, // example.com single-name
{"docker.io/ns/busybox", "docker.io/ns/busybox"}, // docker.io namespaced
{"example.com/ns/busybox", "example.com/ns/busybox"}, // example.com namespaced
{"example.com/ns/busybox:notlatest", "example.com/ns/busybox:notlatest"}, // name:tag
{"example.com/ns/busybox" + digestSuffix, "example.com/ns/busybox" + digestSuffix}, // name@digest
{ // name:tag@digest
"example.com/ns/busybox:notlatest" + digestSuffix, "example.com/ns/busybox:notlatest" + digestSuffix,
},
} {
parts, err := decompose(c.input)
require.NoError(t, err)
if c.expected == "" {
_, err := parts.normalizedReference()
assert.Error(t, err, c.input)
} else {
ref, err := parts.normalizedReference()
require.NoError(t, err, c.input)
assert.Equal(t, c.expected, ref.String())
}
}
}