mirror of
https://github.com/crazy-max/diun.git
synced 2025-12-21 13:23:09 +01:00
handle analysis of image with tag and digest
This commit is contained in:
@@ -35,15 +35,10 @@ func (c *Client) Manifest(image Image, dbManifest Manifest) (Manifest, bool, err
|
||||
return Manifest{}, false, errors.Wrap(err, "cannot parse reference")
|
||||
}
|
||||
|
||||
// Retrieve remote digest through HEAD request or get one from image reference
|
||||
var rmDigest digest.Digest
|
||||
if len(image.Digest) > 0 {
|
||||
rmDigest = image.Digest
|
||||
} else {
|
||||
rmDigest, err = docker.GetDigest(ctx, c.sysCtx, rmRef)
|
||||
if err != nil {
|
||||
return Manifest{}, false, errors.Wrap(err, "cannot get image digest from HEAD request")
|
||||
}
|
||||
// Retrieve remote digest through HEAD request
|
||||
rmDigest, err := docker.GetDigest(ctx, c.sysCtx, rmRef)
|
||||
if err != nil {
|
||||
return Manifest{}, false, errors.Wrap(err, "cannot get image digest from HEAD request")
|
||||
}
|
||||
|
||||
// Digest match, returns db manifest
|
||||
|
||||
@@ -339,7 +339,7 @@ func TestManifestTaggedDigest(t *testing.T) {
|
||||
assert.Equal(t, "linux/amd64", manifest.Platform)
|
||||
}
|
||||
|
||||
func TestManifestTaggedDigestDummyTag(t *testing.T) {
|
||||
func TestManifestTaggedDigestUnknownTag(t *testing.T) {
|
||||
rc, err := New(Options{
|
||||
CompareDigest: true,
|
||||
ImageOs: "linux",
|
||||
@@ -356,19 +356,8 @@ func TestManifestTaggedDigestDummyTag(t *testing.T) {
|
||||
t.Error(err)
|
||||
}
|
||||
|
||||
// download manifest
|
||||
_, _, err = rc.Manifest(img, Manifest{})
|
||||
assert.NoError(t, err)
|
||||
|
||||
// check manifest
|
||||
manifest, updated, err := rc.Manifest(img, manifestCrazymaxDiun4250)
|
||||
assert.NoError(t, err)
|
||||
assert.Equal(t, false, updated)
|
||||
assert.Equal(t, "docker.io/crazymax/diun", manifest.Name)
|
||||
assert.Equal(t, "latest", manifest.Tag)
|
||||
assert.Equal(t, "application/vnd.oci.image.index.v1+json", manifest.MIMEType)
|
||||
assert.Equal(t, "sha256:3fca3dd86c2710586208b0f92d1ec4ce25382f4cad4ae76a2275db8e8bb24031", manifest.Digest.String())
|
||||
assert.Equal(t, "linux/amd64", manifest.Platform)
|
||||
assert.Error(t, err)
|
||||
}
|
||||
|
||||
var manifestCrazymaxDiun4250 = Manifest{
|
||||
|
||||
@@ -39,31 +39,28 @@ func namedReference(name string) (reference.Named, error) {
|
||||
if err != nil {
|
||||
return nil, errors.Wrapf(err, "normalizing tagged digested name %q", name)
|
||||
}
|
||||
return ref, nil
|
||||
}
|
||||
if _, hasDigest := ref.(reference.Digested); hasDigest {
|
||||
return ref, nil
|
||||
} else if _, hasDigest := ref.(reference.Digested); hasDigest {
|
||||
ref = reference.TrimNamed(ref)
|
||||
}
|
||||
|
||||
return reference.TagNameOnly(ref), nil
|
||||
}
|
||||
|
||||
// normalizeTaggedDigestedNamed strips the tag off the specified named
|
||||
// reference if it is tagged and digested. Note that the tag is entirely
|
||||
// ignored.
|
||||
// normalizeTaggedDigestedNamed strips the digest off the specified named
|
||||
// reference if it is tagged and digested.
|
||||
func normalizeTaggedDigestedNamed(named reference.Named) (reference.Named, error) {
|
||||
_, isTagged := named.(reference.NamedTagged)
|
||||
if !isTagged {
|
||||
return named, nil
|
||||
}
|
||||
digested, isDigested := named.(reference.Digested)
|
||||
_, isDigested := named.(reference.Digested)
|
||||
if !isDigested {
|
||||
return named, nil
|
||||
}
|
||||
// strip off the tag
|
||||
tag, isTagged := named.(reference.NamedTagged)
|
||||
if !isTagged {
|
||||
return named, nil
|
||||
}
|
||||
// strip off the tag and digest
|
||||
newNamed := reference.TrimNamed(named)
|
||||
// re-add the digest
|
||||
newNamed, err := reference.WithDigest(newNamed, digested.Digest())
|
||||
// re-add the tag
|
||||
newNamed, err := reference.WithTag(newNamed, tag.Tag())
|
||||
if err != nil {
|
||||
return named, err
|
||||
}
|
||||
|
||||
@@ -36,11 +36,15 @@ func TestImageReference(t *testing.T) {
|
||||
},
|
||||
{
|
||||
input: "busybox" + sha256digest,
|
||||
expected: "docker.io/library/busybox" + sha256digest,
|
||||
expected: "docker.io/library/busybox:latest",
|
||||
},
|
||||
{
|
||||
input: "busybox:latest" + sha256digest,
|
||||
expected: "docker.io/library/busybox" + sha256digest,
|
||||
expected: "docker.io/library/busybox:latest",
|
||||
},
|
||||
{
|
||||
input: "busybox:v1.0.0" + sha256digest,
|
||||
expected: "docker.io/library/busybox:v1.0.0",
|
||||
},
|
||||
{
|
||||
input: "UPPERCASEISINVALID",
|
||||
|
||||
Reference in New Issue
Block a user