Skip to content
This repository was archived by the owner on Sep 23, 2025. It is now read-only.

Commit 414bf18

Browse files
authored
Merge pull request #1824 from 0xiso/main
Preserve original tag when resolving an image tag to digest
2 parents e2b050f + ea54b96 commit 414bf18

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

pkg/webhook/validator.go

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1078,7 +1078,12 @@ func (v *Validator) resolvePodSpec(ctx context.Context, ps *corev1.PodSpec, opt
10781078
logging.FromContext(ctx).Debugf("Unable to resolve digest %q: %v", ref.String(), err)
10791079
continue
10801080
}
1081-
cs[i].Image = digest.String()
1081+
// Keep the original tag and append the digest
1082+
if tagRef, ok := ref.(name.Tag); ok {
1083+
cs[i].Image = fmt.Sprintf("%s@%s", tagRef.Name(), digest.DigestStr())
1084+
} else {
1085+
cs[i].Image = digest.String()
1086+
}
10821087
}
10831088
}
10841089
}
@@ -1102,7 +1107,12 @@ func (v *Validator) resolvePodSpec(ctx context.Context, ps *corev1.PodSpec, opt
11021107
logging.FromContext(ctx).Debugf("Unable to resolve digest %q: %v", ref.String(), err)
11031108
continue
11041109
}
1105-
cs[i].Image = digest.String()
1110+
// Keep the original tag and append the digest
1111+
if tagRef, ok := ref.(name.Tag); ok {
1112+
cs[i].Image = fmt.Sprintf("%s@%s", tagRef.Name(), digest.DigestStr())
1113+
} else {
1114+
cs[i].Image = digest.String()
1115+
}
11061116
}
11071117
}
11081118
}

pkg/webhook/validator_test.go

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1000,6 +1000,7 @@ func TestResolvePodSpec(t *testing.T) {
10001000
tag := name.MustParseReference("gcr.io/distroless/static:nonroot")
10011001
// Resolved via crane digest on 2021/09/25
10021002
digest := name.MustParseReference("gcr.io/distroless/static:nonroot@sha256:be5d77c62dbe7fedfb0a4e5ec2f91078080800ab1f18358e5f31fcc8faa023c4")
1003+
digestWithoutTag := name.MustParseReference("gcr.io/distroless/static@sha256:be5d77c62dbe7fedfb0a4e5ec2f91078080800ab1f18358e5f31fcc8faa023c4")
10031004

10041005
ctx, _ := rtesting.SetupFakeContext(t)
10051006

@@ -1017,7 +1018,7 @@ func TestResolvePodSpec(t *testing.T) {
10171018
remoteResolveDigest = rrd
10181019
}()
10191020
resolve := func(_ name.Reference, _ ...remote.Option) (name.Digest, error) {
1020-
return digest.(name.Digest), nil
1021+
return tag.Context().Digest(digestWithoutTag.Identifier()), nil
10211022
}
10221023

10231024
tests := []struct {
@@ -1107,6 +1108,30 @@ func TestResolvePodSpec(t *testing.T) {
11071108
},
11081109
wc: apis.WithinCreate,
11091110
rrd: resolve,
1111+
}, {
1112+
name: "digests without tag resolve (in create)",
1113+
ps: &corev1.PodSpec{
1114+
InitContainers: []corev1.Container{{
1115+
Name: "setup-stuff",
1116+
Image: digestWithoutTag.String(),
1117+
}},
1118+
Containers: []corev1.Container{{
1119+
Name: "user-container",
1120+
Image: digestWithoutTag.String(),
1121+
}},
1122+
},
1123+
want: &corev1.PodSpec{
1124+
InitContainers: []corev1.Container{{
1125+
Name: "setup-stuff",
1126+
Image: digestWithoutTag.String(),
1127+
}},
1128+
Containers: []corev1.Container{{
1129+
Name: "user-container",
1130+
Image: digestWithoutTag.String(),
1131+
}},
1132+
},
1133+
wc: apis.WithinCreate,
1134+
rrd: resolve,
11101135
}}
11111136

11121137
for _, test := range tests {

0 commit comments

Comments
 (0)