mirror of https://github.com/containers/image.git
Move tagOrDigest to dockerReference
This improves the dockerReference encapsulation, and makes it more clear that the reference.IsNameOnly case can not happen. Signed-off-by: Miloslav Trmač <mitr@redhat.com>
This commit is contained in:
parent
0cf04c4adf
commit
aaadde2550
|
|
@ -59,7 +59,7 @@ func simplifyContentType(contentType string) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *dockerImageSource) GetManifest(mimetypes []string) ([]byte, string, error) {
|
func (s *dockerImageSource) GetManifest(mimetypes []string) ([]byte, string, error) {
|
||||||
reference, err := tagOrDigest(s.ref.ref)
|
reference, err := s.ref.tagOrDigest()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, "", err
|
return nil, "", err
|
||||||
}
|
}
|
||||||
|
|
@ -114,7 +114,7 @@ func (s *dockerImageSource) Delete() error {
|
||||||
headers := make(map[string][]string)
|
headers := make(map[string][]string)
|
||||||
headers["Accept"] = []string{manifest.DockerV2Schema2MIMEType}
|
headers["Accept"] = []string{manifest.DockerV2Schema2MIMEType}
|
||||||
|
|
||||||
reference, err := tagOrDigest(s.ref.ref)
|
reference, err := s.ref.tagOrDigest()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -129,3 +129,15 @@ func (ref dockerReference) NewImageSource(certPath string, tlsVerify bool) (type
|
||||||
func (ref dockerReference) NewImageDestination(certPath string, tlsVerify bool) (types.ImageDestination, error) {
|
func (ref dockerReference) NewImageDestination(certPath string, tlsVerify bool) (types.ImageDestination, error) {
|
||||||
return newImageDestination(ref, certPath, tlsVerify)
|
return newImageDestination(ref, certPath, tlsVerify)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// tagOrDigest returns a tag or digest from the reference.
|
||||||
|
func (ref dockerReference) tagOrDigest() (string, error) {
|
||||||
|
if ref, ok := ref.ref.(reference.Canonical); ok {
|
||||||
|
return ref.Digest().String(), nil
|
||||||
|
}
|
||||||
|
if ref, ok := ref.ref.(reference.NamedTagged); ok {
|
||||||
|
return ref.Tag(), nil
|
||||||
|
}
|
||||||
|
// This should not happen, NewReference above refuses reference.IsNameOnly values.
|
||||||
|
return "", fmt.Errorf("Internal inconsistency: Reference %s unexpectedly has neither a digest nor a tag", ref.ref.String())
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -177,3 +177,25 @@ func TestReferenceNewImageDestination(t *testing.T) {
|
||||||
_, err = ref.NewImageDestination("", true)
|
_, err = ref.NewImageDestination("", true)
|
||||||
assert.NoError(t, err)
|
assert.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestReferenceTagOrDigest(t *testing.T) {
|
||||||
|
for input, expected := range map[string]string{
|
||||||
|
"//busybox:notlatest": "notlatest",
|
||||||
|
"//busybox" + sha256digest: "sha256:" + sha256digestHex,
|
||||||
|
} {
|
||||||
|
ref, err := ParseReference(input)
|
||||||
|
require.NoError(t, err, input)
|
||||||
|
dockerRef, ok := ref.(dockerReference)
|
||||||
|
require.True(t, ok, input)
|
||||||
|
tod, err := dockerRef.tagOrDigest()
|
||||||
|
require.NoError(t, err, input)
|
||||||
|
assert.Equal(t, expected, tod, input)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Invalid input
|
||||||
|
ref, err := reference.ParseNamed("busybox")
|
||||||
|
require.NoError(t, err)
|
||||||
|
dockerRef := dockerReference{ref: ref}
|
||||||
|
_, err = dockerRef.tagOrDigest()
|
||||||
|
assert.Error(t, err)
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
package docker
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
|
|
||||||
"github.com/docker/docker/reference"
|
|
||||||
)
|
|
||||||
|
|
||||||
// tagOrDigest returns a tag or digest from a reference for which !reference.IsNameOnly.
|
|
||||||
func tagOrDigest(ref reference.Named) (string, error) {
|
|
||||||
if ref, ok := ref.(reference.Canonical); ok {
|
|
||||||
return ref.Digest().String(), nil
|
|
||||||
}
|
|
||||||
if ref, ok := ref.(reference.NamedTagged); ok {
|
|
||||||
return ref.Tag(), nil
|
|
||||||
}
|
|
||||||
return "", fmt.Errorf("Internal inconsistency: Reference %s unexpectedly has neither a digest nor a tag", ref.String())
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue