Skip to content

Commit c2771e3

Browse files
committed
Add new registry.Lookup wrapper to handle generic Reference lookups
This allows us to update `cmd/lookup` to use this new wrapper and thus let us easily/correctly test more edge cases / lookups. 🚀
1 parent 073cf83 commit c2771e3

File tree

5 files changed

+381
-29
lines changed

5 files changed

+381
-29
lines changed

.test/lookup-test.json

Lines changed: 190 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,5 +75,194 @@
7575
"annotations": {
7676
"org.opencontainers.image.ref.name": "tianon/test@sha256:347290ddd775c1b85a3e381b09edde95242478eb65153e9b17225356f4c072ac"
7777
}
78-
}
78+
},
79+
{
80+
"schemaVersion": 2,
81+
"mediaType": "application/vnd.oci.image.index.v1+json",
82+
"manifests": [
83+
{
84+
"mediaType": "application/vnd.oci.image.manifest.v1+json",
85+
"digest": "sha256:e2fc4e5012d16e7fe466f5291c476431beaa1f9b90a5c2125b493ed28e2aba57",
86+
"size": 861,
87+
"annotations": {
88+
"com.docker.official-images.bashbrew.arch": "amd64",
89+
"org.opencontainers.image.ref.name": "hello-world@sha256:e2fc4e5012d16e7fe466f5291c476431beaa1f9b90a5c2125b493ed28e2aba57",
90+
"org.opencontainers.image.revision": "3fb6ebca4163bf5b9cc496ac3e8f11cb1e754aee",
91+
"org.opencontainers.image.source": "https://github.com/docker-library/hello-world.git#3fb6ebca4163bf5b9cc496ac3e8f11cb1e754aee:amd64/hello-world",
92+
"org.opencontainers.image.url": "https://hub.docker.com/_/hello-world",
93+
"org.opencontainers.image.version": "linux"
94+
}
95+
},
96+
{
97+
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
98+
"digest": "sha256:2f19ce27632e6baf4ebb1b582960d68948e52902c8cfac10133da0058f1dab23",
99+
"size": 946,
100+
"annotations": {
101+
"com.docker.official-images.bashbrew.arch": "windows-amd64",
102+
"org.opencontainers.image.ref.name": "hello-world@sha256:2f19ce27632e6baf4ebb1b582960d68948e52902c8cfac10133da0058f1dab23"
103+
}
104+
},
105+
{
106+
"mediaType": "application/vnd.docker.distribution.manifest.v2+json",
107+
"digest": "sha256:3a0bd0fb5ad6dd6528dc78726b3df78e980b39b379e99c5a508904ec17cfafe5",
108+
"size": 946,
109+
"annotations": {
110+
"com.docker.official-images.bashbrew.arch": "windows-amd64",
111+
"org.opencontainers.image.ref.name": "hello-world@sha256:3a0bd0fb5ad6dd6528dc78726b3df78e980b39b379e99c5a508904ec17cfafe5"
112+
}
113+
}
114+
]
115+
},
116+
"eyJhcmNoaXRlY3R1cmUiOiJhbWQ2NCIsImNvbmZpZyI6eyJFbnYiOlsiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iXSwiQ21kIjpbIi9oZWxsbyJdLCJXb3JraW5nRGlyIjoiLyIsIkFyZ3NFc2NhcGVkIjp0cnVlLCJPbkJ1aWxkIjpudWxsfSwiY3JlYXRlZCI6IjIwMjMtMDUtMDJUMTY6NDk6MjdaIiwiaGlzdG9yeSI6W3siY3JlYXRlZCI6IjIwMjMtMDUtMDJUMTY6NDk6MjdaIiwiY3JlYXRlZF9ieSI6IkNPUFkgaGVsbG8gLyAjIGJ1aWxka2l0IiwiY29tbWVudCI6ImJ1aWxka2l0LmRvY2tlcmZpbGUudjAifSx7ImNyZWF0ZWQiOiIyMDIzLTA1LTAyVDE2OjQ5OjI3WiIsImNyZWF0ZWRfYnkiOiJDTUQgW1wiL2hlbGxvXCJdIiwiY29tbWVudCI6ImJ1aWxka2l0LmRvY2tlcmZpbGUudjAiLCJlbXB0eV9sYXllciI6dHJ1ZX1dLCJvcyI6ImxpbnV4Iiwicm9vdGZzIjp7InR5cGUiOiJsYXllcnMiLCJkaWZmX2lkcyI6WyJzaGEyNTY6YWMyODgwMGVjOGJiMzhkNWMzNWI0OWQ0NWE2YWM0Nzc3NTQ0OTQxMTk5MDc1ZGZmOGM0ZWI2M2UwOTNhYTgxZSJdfX0=",
117+
{
118+
"mediaType": "application/vnd.oci.image.index.v1+json",
119+
"digest": "sha256:347290ddd775c1b85a3e381b09edde95242478eb65153e9b17225356f4c072ac",
120+
"size": 1649,
121+
"data": "ewoJInNjaGVtYVZlcnNpb24iOiAyLAoJIm1lZGlhVHlwZSI6ICJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLmluZGV4LnYxK2pzb24iLAoJIm1hbmlmZXN0cyI6IFsKCQl7CgkJCSJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLm9jaS5pbWFnZS5tYW5pZmVzdC52MStqc29uIiwKCQkJImRpZ2VzdCI6ICJzaGEyNTY6ZTJmYzRlNTAxMmQxNmU3ZmU0NjZmNTI5MWM0NzY0MzFiZWFhMWY5YjkwYTVjMjEyNWI0OTNlZDI4ZTJhYmE1NyIsCgkJCSJzaXplIjogODYxLAoJCQkiYW5ub3RhdGlvbnMiOiB7CgkJCQkiY29tLmRvY2tlci5vZmZpY2lhbC1pbWFnZXMuYmFzaGJyZXcuYXJjaCI6ICJhbWQ2NCIsCgkJCQkib3JnLm9wZW5jb250YWluZXJzLmltYWdlLnJlZi5uYW1lIjogImhlbGxvLXdvcmxkQHNoYTI1NjplMmZjNGU1MDEyZDE2ZTdmZTQ2NmY1MjkxYzQ3NjQzMWJlYWExZjliOTBhNWMyMTI1YjQ5M2VkMjhlMmFiYTU3IiwKCQkJCSJvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UucmV2aXNpb24iOiAiM2ZiNmViY2E0MTYzYmY1YjljYzQ5NmFjM2U4ZjExY2IxZTc1NGFlZSIsCgkJCQkib3JnLm9wZW5jb250YWluZXJzLmltYWdlLnNvdXJjZSI6ICJodHRwczovL2dpdGh1Yi5jb20vZG9ja2VyLWxpYnJhcnkvaGVsbG8td29ybGQuZ2l0IzNmYjZlYmNhNDE2M2JmNWI5Y2M0OTZhYzNlOGYxMWNiMWU3NTRhZWU6YW1kNjQvaGVsbG8td29ybGQiLAoJCQkJIm9yZy5vcGVuY29udGFpbmVycy5pbWFnZS51cmwiOiAiaHR0cHM6Ly9odWIuZG9ja2VyLmNvbS9fL2hlbGxvLXdvcmxkIiwKCQkJCSJvcmcub3BlbmNvbnRhaW5lcnMuaW1hZ2UudmVyc2lvbiI6ICJsaW51eCIKCQkJfQoJCX0sCgkJewoJCQkibWVkaWFUeXBlIjogImFwcGxpY2F0aW9uL3ZuZC5kb2NrZXIuZGlzdHJpYnV0aW9uLm1hbmlmZXN0LnYyK2pzb24iLAoJCQkiZGlnZXN0IjogInNoYTI1NjoyZjE5Y2UyNzYzMmU2YmFmNGViYjFiNTgyOTYwZDY4OTQ4ZTUyOTAyYzhjZmFjMTAxMzNkYTAwNThmMWRhYjIzIiwKCQkJInNpemUiOiA5NDYsCgkJCSJhbm5vdGF0aW9ucyI6IHsKCQkJCSJjb20uZG9ja2VyLm9mZmljaWFsLWltYWdlcy5iYXNoYnJldy5hcmNoIjogIndpbmRvd3MtYW1kNjQiLAoJCQkJIm9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5yZWYubmFtZSI6ICJoZWxsby13b3JsZEBzaGEyNTY6MmYxOWNlMjc2MzJlNmJhZjRlYmIxYjU4Mjk2MGQ2ODk0OGU1MjkwMmM4Y2ZhYzEwMTMzZGEwMDU4ZjFkYWIyMyIKCQkJfQoJCX0sCgkJewoJCQkibWVkaWFUeXBlIjogImFwcGxpY2F0aW9uL3ZuZC5kb2NrZXIuZGlzdHJpYnV0aW9uLm1hbmlmZXN0LnYyK2pzb24iLAoJCQkiZGlnZXN0IjogInNoYTI1NjozYTBiZDBmYjVhZDZkZDY1MjhkYzc4NzI2YjNkZjc4ZTk4MGIzOWIzNzllOTljNWE1MDg5MDRlYzE3Y2ZhZmU1IiwKCQkJInNpemUiOiA5NDYsCgkJCSJhbm5vdGF0aW9ucyI6IHsKCQkJCSJjb20uZG9ja2VyLm9mZmljaWFsLWltYWdlcy5iYXNoYnJldy5hcmNoIjogIndpbmRvd3MtYW1kNjQiLAoJCQkJIm9yZy5vcGVuY29udGFpbmVycy5pbWFnZS5yZWYubmFtZSI6ICJoZWxsby13b3JsZEBzaGEyNTY6M2EwYmQwZmI1YWQ2ZGQ2NTI4ZGM3ODcyNmIzZGY3OGU5ODBiMzliMzc5ZTk5YzVhNTA4OTA0ZWMxN2NmYWZlNSIKCQkJfQoJCX0KCV0KfQo="
122+
},
123+
{
124+
"mediaType": "application/octet-stream",
125+
"digest": "sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a",
126+
"size": 581,
127+
"data": "eyJhcmNoaXRlY3R1cmUiOiJhbWQ2NCIsImNvbmZpZyI6eyJFbnYiOlsiUEFUSD0vdXNyL2xvY2FsL3NiaW46L3Vzci9sb2NhbC9iaW46L3Vzci9zYmluOi91c3IvYmluOi9zYmluOi9iaW4iXSwiQ21kIjpbIi9oZWxsbyJdLCJXb3JraW5nRGlyIjoiLyIsIkFyZ3NFc2NhcGVkIjp0cnVlLCJPbkJ1aWxkIjpudWxsfSwiY3JlYXRlZCI6IjIwMjMtMDUtMDJUMTY6NDk6MjdaIiwiaGlzdG9yeSI6W3siY3JlYXRlZCI6IjIwMjMtMDUtMDJUMTY6NDk6MjdaIiwiY3JlYXRlZF9ieSI6IkNPUFkgaGVsbG8gLyAjIGJ1aWxka2l0IiwiY29tbWVudCI6ImJ1aWxka2l0LmRvY2tlcmZpbGUudjAifSx7ImNyZWF0ZWQiOiIyMDIzLTA1LTAyVDE2OjQ5OjI3WiIsImNyZWF0ZWRfYnkiOiJDTUQgW1wiL2hlbGxvXCJdIiwiY29tbWVudCI6ImJ1aWxka2l0LmRvY2tlcmZpbGUudjAiLCJlbXB0eV9sYXllciI6dHJ1ZX1dLCJvcyI6ImxpbnV4Iiwicm9vdGZzIjp7InR5cGUiOiJsYXllcnMiLCJkaWZmX2lkcyI6WyJzaGEyNTY6YWMyODgwMGVjOGJiMzhkNWMzNWI0OWQ0NWE2YWM0Nzc3NTQ0OTQxMTk5MDc1ZGZmOGM0ZWI2M2UwOTNhYTgxZSJdfX0="
128+
},
129+
{
130+
"mediaType": "application/octet-stream",
131+
"digest": "sha256:25be82253336f0b8c4347bc4ecbbcdc85d0e0f118ccf8dc2e119c0a47a0a486e",
132+
"size": 396
133+
},
134+
{
135+
"mediaType": "application/vnd.oci.image.manifest.v1+json",
136+
"digest": "sha256:9ef42f1d602fb423fad935aac1caa0cfdbce1ad7edce64d080a4eb7b13f7cd9d",
137+
"size": 1165
138+
},
139+
"ewoJImFyY2hpdGVjdHVyZSI6ICJhbWQ2NCIsCgkiY29uZmlnIjogewoJCSJDbWQiOiBbCgkJCSIvdHJ1ZSIKCQldCgl9LAoJImNyZWF0ZWQiOiAiMjAyMy0wMi0wMVQwNjo1MToxMVoiLAoJImhpc3RvcnkiOiBbCgkJewoJCQkiY3JlYXRlZCI6ICIyMDIzLTAyLTAxVDA2OjUxOjExWiIsCgkJCSJjcmVhdGVkX2J5IjogImh0dHBzOi8vZ2l0aHViLmNvbS90aWFub24vZG9ja2VyZmlsZXMvdHJlZS9tYXN0ZXIvdHJ1ZSIKCQl9CgldLAoJIm9zIjogImxpbnV4IiwKCSJyb290ZnMiOiB7CgkJImRpZmZfaWRzIjogWwoJCQkic2hhMjU2OjY1YjVhNDU5M2NjNjFkM2VhNmQzNTVmYjk3YzA0MzBkODIwZWUyMWFhODUzNWY1ZGU0NWU3NWMzMTk1NGI3NDMiCgkJXSwKCQkidHlwZSI6ICJsYXllcnMiCgl9Cn0K",
140+
{
141+
"config": {
142+
"data": "ewoJImFyY2hpdGVjdHVyZSI6ICJhbWQ2NCIsCgkiY29uZmlnIjogewoJCSJDbWQiOiBbCgkJCSIvdHJ1ZSIKCQldCgl9LAoJImNyZWF0ZWQiOiAiMjAyMy0wMi0wMVQwNjo1MToxMVoiLAoJImhpc3RvcnkiOiBbCgkJewoJCQkiY3JlYXRlZCI6ICIyMDIzLTAyLTAxVDA2OjUxOjExWiIsCgkJCSJjcmVhdGVkX2J5IjogImh0dHBzOi8vZ2l0aHViLmNvbS90aWFub24vZG9ja2VyZmlsZXMvdHJlZS9tYXN0ZXIvdHJ1ZSIKCQl9CgldLAoJIm9zIjogImxpbnV4IiwKCSJyb290ZnMiOiB7CgkJImRpZmZfaWRzIjogWwoJCQkic2hhMjU2OjY1YjVhNDU5M2NjNjFkM2VhNmQzNTVmYjk3YzA0MzBkODIwZWUyMWFhODUzNWY1ZGU0NWU3NWMzMTk1NGI3NDMiCgkJXSwKCQkidHlwZSI6ICJsYXllcnMiCgl9Cn0K",
143+
"digest": "sha256:25be82253336f0b8c4347bc4ecbbcdc85d0e0f118ccf8dc2e119c0a47a0a486e",
144+
"mediaType": "application/vnd.oci.image.config.v1+json",
145+
"size": 396
146+
},
147+
"layers": [
148+
{
149+
"data": "H4sIAAAAAAACAyspKk1loDEwAAJTU1MwDQTotIGhuQmcDRE3MzM0YlAwYKADKC0uSSxSUGAYoaDe1ceNiZERzmdisGMA8SoYHMB8Byx6HBgsGGA6QDQrmiwyXQPl1cDlIUG9wYaflWEUDDgAAIAGdJIABAAA",
150+
"digest": "sha256:1c51fc286aa95d9413226599576bafa38490b1e292375c90de095855b64caea6",
151+
"mediaType": "application/vnd.oci.image.layer.v1.tar+gzip",
152+
"size": 117
153+
}
154+
],
155+
"mediaType": "application/vnd.oci.image.manifest.v1+json",
156+
"schemaVersion": 2
157+
},
158+
{
159+
"schemaVersion": 2,
160+
"mediaType": "application/vnd.oci.image.index.v1+json",
161+
"manifests": [
162+
{
163+
"mediaType": "application/vnd.oci.image.manifest.v1+json",
164+
"digest": "sha256:9ef42f1d602fb423fad935aac1caa0cfdbce1ad7edce64d080a4eb7b13f7cd9d",
165+
"size": 1165,
166+
"annotations": {
167+
"com.docker.official-images.bashbrew.arch": "amd64",
168+
"org.opencontainers.image.ref.name": "tianon/true:oci@sha256:9ef42f1d602fb423fad935aac1caa0cfdbce1ad7edce64d080a4eb7b13f7cd9d"
169+
},
170+
"platform": {
171+
"architecture": "amd64",
172+
"os": "linux"
173+
}
174+
}
175+
],
176+
"annotations": {
177+
"org.opencontainers.image.ref.name": "tianon/true:oci@sha256:9ef42f1d602fb423fad935aac1caa0cfdbce1ad7edce64d080a4eb7b13f7cd9d"
178+
}
179+
},
180+
{
181+
"mediaType": "application/vnd.oci.image.index.v1+json",
182+
"digest": "sha256:09dd1c0183f992a4507d6e562a8e079b8583d19aaf8d991b0d22711c6b4525d7",
183+
"size": 1265
184+
},
185+
{
186+
"mediaType": "application/vnd.oci.image.index.v1+json",
187+
"digest": "sha256:09dd1c0183f992a4507d6e562a8e079b8583d19aaf8d991b0d22711c6b4525d7",
188+
"size": 1265
189+
},
190+
{
191+
"schemaVersion": 2,
192+
"mediaType": "application/vnd.oci.image.index.v1+json",
193+
"manifests": [
194+
{
195+
"mediaType": "application/vnd.oci.image.manifest.v1+json",
196+
"digest": "sha256:4c3d07b2fed560ab0012452aa8a6f58533ddf2d4a3845fa89b74d9455816b454",
197+
"size": 1998,
198+
"annotations": {
199+
"org.opencontainers.image.revision": "77b9b7833f8dd6be07104b214193788795a320ff",
200+
"org.opencontainers.image.source": "https://github.com/docker/notary-official-images.git#77b9b7833f8dd6be07104b214193788795a320ff:notary-server",
201+
"org.opencontainers.image.url": "https://hub.docker.com/_/notary",
202+
"org.opencontainers.image.version": "server-0.7.0"
203+
},
204+
"platform": {
205+
"architecture": "amd64",
206+
"os": "linux"
207+
}
208+
},
209+
{
210+
"mediaType": "application/vnd.oci.image.manifest.v1+json",
211+
"digest": "sha256:692819af7e57efe94abadb451e05aa5eb042a540a2eae7095d37507dbd66dc94",
212+
"size": 839,
213+
"annotations": {
214+
"vnd.docker.reference.digest": "sha256:4c3d07b2fed560ab0012452aa8a6f58533ddf2d4a3845fa89b74d9455816b454",
215+
"vnd.docker.reference.type": "attestation-manifest"
216+
},
217+
"platform": {
218+
"architecture": "unknown",
219+
"os": "unknown"
220+
}
221+
}
222+
]
223+
},
224+
{
225+
"schemaVersion": 2,
226+
"mediaType": "application/vnd.oci.image.index.v1+json",
227+
"manifests": [
228+
{
229+
"mediaType": "application/vnd.oci.image.manifest.v1+json",
230+
"digest": "sha256:4c3d07b2fed560ab0012452aa8a6f58533ddf2d4a3845fa89b74d9455816b454",
231+
"size": 1998,
232+
"annotations": {
233+
"com.docker.official-images.bashbrew.arch": "amd64",
234+
"org.opencontainers.image.ref.name": "oisupport/staging-amd64:71756dd75e41c4bc5144b64d36b4834a5a960c495470915eb69f96e9f2cb6694@sha256:4c3d07b2fed560ab0012452aa8a6f58533ddf2d4a3845fa89b74d9455816b454",
235+
"org.opencontainers.image.revision": "77b9b7833f8dd6be07104b214193788795a320ff",
236+
"org.opencontainers.image.source": "https://github.com/docker/notary-official-images.git#77b9b7833f8dd6be07104b214193788795a320ff:notary-server",
237+
"org.opencontainers.image.url": "https://hub.docker.com/_/notary",
238+
"org.opencontainers.image.version": "server-0.7.0"
239+
},
240+
"platform": {
241+
"architecture": "amd64",
242+
"os": "linux"
243+
}
244+
},
245+
{
246+
"mediaType": "application/vnd.oci.image.manifest.v1+json",
247+
"digest": "sha256:692819af7e57efe94abadb451e05aa5eb042a540a2eae7095d37507dbd66dc94",
248+
"size": 839,
249+
"annotations": {
250+
"com.docker.official-images.bashbrew.arch": "amd64",
251+
"org.opencontainers.image.ref.name": "oisupport/staging-amd64:71756dd75e41c4bc5144b64d36b4834a5a960c495470915eb69f96e9f2cb6694@sha256:692819af7e57efe94abadb451e05aa5eb042a540a2eae7095d37507dbd66dc94",
252+
"vnd.docker.reference.digest": "sha256:4c3d07b2fed560ab0012452aa8a6f58533ddf2d4a3845fa89b74d9455816b454",
253+
"vnd.docker.reference.type": "attestation-manifest"
254+
},
255+
"platform": {
256+
"architecture": "unknown",
257+
"os": "unknown"
258+
}
259+
}
260+
],
261+
"annotations": {
262+
"org.opencontainers.image.ref.name": "oisupport/staging-amd64:71756dd75e41c4bc5144b64d36b4834a5a960c495470915eb69f96e9f2cb6694@sha256:09dd1c0183f992a4507d6e562a8e079b8583d19aaf8d991b0d22711c6b4525d7"
263+
}
264+
},
265+
null,
266+
null,
267+
null
79268
]

.test/test.sh

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,30 @@ lookup=(
4848
# tianon/test:index-no-platform-smaller - a "broken" index with *zero* platform objects in it (so every manifest requires a platform lookup)
4949
'tianon/test@sha256:347290ddd775c1b85a3e381b09edde95242478eb65153e9b17225356f4c072ac'
5050
# (doing these in the same run means the manifest from above should be cached and exercise more codepaths for better coverage)
51+
52+
--type manifest 'tianon/test@sha256:347290ddd775c1b85a3e381b09edde95242478eb65153e9b17225356f4c072ac' # same manifest again, but without SynthesizeIndex
53+
--type blob 'tianon/test@sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a' # first config blob from the above
54+
# and again, but this time HEADs
55+
--head --type manifest 'tianon/test@sha256:347290ddd775c1b85a3e381b09edde95242478eb65153e9b17225356f4c072ac'
56+
--head --type blob 'tianon/test@sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a'
57+
58+
# again with things that aren't cached yet (tianon/true:oci, specifically)
59+
--head --type blob 'tianon/true@sha256:25be82253336f0b8c4347bc4ecbbcdc85d0e0f118ccf8dc2e119c0a47a0a486e' # config blob
60+
--head --type manifest 'tianon/true:oci@sha256:9ef42f1d602fb423fad935aac1caa0cfdbce1ad7edce64d080a4eb7b13f7cd9d'
61+
--type blob 'tianon/true@sha256:25be82253336f0b8c4347bc4ecbbcdc85d0e0f118ccf8dc2e119c0a47a0a486e' # config blob
62+
--type manifest 'tianon/true:oci@sha256:9ef42f1d602fb423fad935aac1caa0cfdbce1ad7edce64d080a4eb7b13f7cd9d'
63+
'tianon/true:oci@sha256:9ef42f1d602fb423fad935aac1caa0cfdbce1ad7edce64d080a4eb7b13f7cd9d'
64+
65+
# tag lookup! (but with a hopefully stable example tag -- a build of notary:server)
66+
--head 'oisupport/staging-amd64:71756dd75e41c4bc5144b64d36b4834a5a960c495470915eb69f96e9f2cb6694'
67+
--head 'oisupport/staging-amd64:71756dd75e41c4bc5144b64d36b4834a5a960c495470915eb69f96e9f2cb6694' # twice, to exercise "tag is cached" case
68+
--type manifest 'oisupport/staging-amd64:71756dd75e41c4bc5144b64d36b4834a5a960c495470915eb69f96e9f2cb6694'
69+
'oisupport/staging-amd64:71756dd75e41c4bc5144b64d36b4834a5a960c495470915eb69f96e9f2cb6694'
70+
71+
# exercise 404 codepaths
72+
"tianon/this-is-a-repository-that-will-never-ever-exist-$RANDOM-$RANDOM:$RANDOM-$RANDOM"
73+
--head "tianon/this-is-a-repository-that-will-never-ever-exist-$RANDOM-$RANDOM:$RANDOM-$RANDOM"
74+
'tianon/test@sha256:0000000000000000000000000000000000000000000000000000000000000000'
5175
)
5276
"$dir/../bin/lookup" "${lookup[@]}" | jq -s > "$dir/lookup-test.json"
5377

cmd/lookup/main.go

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ package main
55
import (
66
"context"
77
"encoding/json"
8+
"io"
89
"os"
910
"os/signal"
1011

@@ -15,21 +16,79 @@ func main() {
1516
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
1617
defer stop()
1718

18-
for _, img := range os.Args[1:] {
19+
var (
20+
zeroOpts registry.LookupOptions
21+
opts = zeroOpts
22+
)
23+
24+
args := os.Args[1:]
25+
for len(args) > 0 {
26+
img := args[0]
27+
args = args[1:]
28+
switch img {
29+
case "--type":
30+
opts.Type = registry.LookupType(args[0])
31+
args = args[1:]
32+
continue
33+
case "--head":
34+
opts.Head = true
35+
continue
36+
}
37+
1938
ref, err := registry.ParseRef(img)
2039
if err != nil {
2140
panic(err)
2241
}
2342

24-
index, err := registry.SynthesizeIndex(ctx, ref)
25-
if err != nil {
26-
panic(err)
43+
var obj any
44+
if opts == zeroOpts {
45+
// if we have no explicit type and didn't request a HEAD, invoke SynthesizeIndex instead of Lookup
46+
obj, err = registry.SynthesizeIndex(ctx, ref)
47+
if err != nil {
48+
panic(err)
49+
}
50+
} else {
51+
r, err := registry.Lookup(ctx, ref, &opts)
52+
if err != nil {
53+
panic(err)
54+
}
55+
if r != nil {
56+
desc := r.Descriptor()
57+
if opts.Head {
58+
obj = desc
59+
} else {
60+
b, err := io.ReadAll(r)
61+
if err != nil {
62+
r.Close()
63+
panic(err)
64+
}
65+
if opts.Type == registry.LookupTypeManifest {
66+
// if it was a manifest lookup, cast the byte slice to json.RawMessage so we get the actual JSON (not base64)
67+
obj = json.RawMessage(b)
68+
} else {
69+
obj = b
70+
}
71+
}
72+
err = r.Close()
73+
if err != nil {
74+
panic(err)
75+
}
76+
} else {
77+
obj = nil
78+
}
2779
}
2880

2981
e := json.NewEncoder(os.Stdout)
3082
e.SetIndent("", "\t")
31-
if err := e.Encode(index); err != nil {
83+
if err := e.Encode(obj); err != nil {
3284
panic(err)
3385
}
86+
87+
// reset state
88+
opts = zeroOpts
89+
}
90+
91+
if opts != zeroOpts {
92+
panic("dangling --type, --head, etc (without a following reference for it to apply to)")
3493
}
3594
}

0 commit comments

Comments
 (0)