If you remove an image with digest+tag, it will fail because it wont
find it in the reference store (where digest+tag -> digest). Let's
make sure we do the same in ImageDelete, stripping the tag if
digest+tag are present.
Signed-off-by: Vincent Demeester <vincent@sbr.pm>
| ... | ... |
@@ -106,20 +106,29 @@ func (store *store) AddDigest(ref reference.Canonical, id digest.Digest, force b |
| 106 | 106 |
return store.addReference(ref, id, force) |
| 107 | 107 |
} |
| 108 | 108 |
|
| 109 |
-func (store *store) addReference(ref reference.Named, id digest.Digest, force bool) error {
|
|
| 109 |
+func favorDigest(originalRef reference.Named) (reference.Named, error) {
|
|
| 110 |
+ ref := originalRef |
|
| 110 | 111 |
// If the reference includes a digest and a tag, we must store only the |
| 111 | 112 |
// digest. |
| 112 |
- canonical, isCanonical := ref.(reference.Canonical) |
|
| 113 |
- _, isNamedTagged := ref.(reference.NamedTagged) |
|
| 113 |
+ canonical, isCanonical := originalRef.(reference.Canonical) |
|
| 114 |
+ _, isNamedTagged := originalRef.(reference.NamedTagged) |
|
| 114 | 115 |
|
| 115 | 116 |
if isCanonical && isNamedTagged {
|
| 116 | 117 |
trimmed, err := reference.WithDigest(reference.TrimNamed(canonical), canonical.Digest()) |
| 117 | 118 |
if err != nil {
|
| 118 | 119 |
// should never happen |
| 119 |
- return err |
|
| 120 |
+ return originalRef, err |
|
| 120 | 121 |
} |
| 121 | 122 |
ref = trimmed |
| 122 | 123 |
} |
| 124 |
+ return ref, nil |
|
| 125 |
+} |
|
| 126 |
+ |
|
| 127 |
+func (store *store) addReference(ref reference.Named, id digest.Digest, force bool) error {
|
|
| 128 |
+ ref, err := favorDigest(ref) |
|
| 129 |
+ if err != nil {
|
|
| 130 |
+ return err |
|
| 131 |
+ } |
|
| 123 | 132 |
|
| 124 | 133 |
refName := reference.FamiliarName(ref) |
| 125 | 134 |
refStr := reference.FamiliarString(ref) |
| ... | ... |
@@ -169,6 +178,11 @@ func (store *store) addReference(ref reference.Named, id digest.Digest, force bo |
| 169 | 169 |
// Delete deletes a reference from the store. It returns true if a deletion |
| 170 | 170 |
// happened, or false otherwise. |
| 171 | 171 |
func (store *store) Delete(ref reference.Named) (bool, error) {
|
| 172 |
+ ref, err := favorDigest(ref) |
|
| 173 |
+ if err != nil {
|
|
| 174 |
+ return false, err |
|
| 175 |
+ } |
|
| 176 |
+ |
|
| 172 | 177 |
ref = reference.TagNameOnly(ref) |
| 173 | 178 |
|
| 174 | 179 |
refName := reference.FamiliarName(ref) |