Author:
Hash:
Timestamp:
+7989 -291 +/-26 browse
Kevin Schoon [me@kevinschoon.com]
40dc7e7d832ef744927c0895e4349c20606b5dc7
Sat, 29 Mar 2025 20:40:59 +0000 (1 month ago)
1 | diff --git a/.gitignore b/.gitignore |
2 | index ea8c4bf..57ac264 100644 |
3 | --- a/.gitignore |
4 | +++ b/.gitignore |
5 | @@ -1 +1,2 @@ |
6 | /target |
7 | + registry |
8 | diff --git a/Cargo.lock b/Cargo.lock |
9 | index 8f700ae..e1762b5 100644 |
10 | --- a/Cargo.lock |
11 | +++ b/Cargo.lock |
12 | @@ -38,12 +38,19 @@ dependencies = [ |
13 | ] |
14 | |
15 | [[package]] |
16 | + name = "autocfg" |
17 | + version = "1.4.0" |
18 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
19 | + checksum = "ace50bade8e6234aa140d9a2f552bbee1db4d353f69b8217bc503490fc1a9f26" |
20 | + |
21 | + [[package]] |
22 | name = "axum" |
23 | - version = "0.8.1" |
24 | + version = "0.8.3" |
25 | source = "registry+https://github.com/rust-lang/crates.io-index" |
26 | - checksum = "6d6fd624c75e18b3b4c6b9caf42b1afe24437daaee904069137d8bab077be8b8" |
27 | + checksum = "de45108900e1f9b9242f7f2e254aa3e2c029c921c258fe9e6b4217eeebd54288" |
28 | dependencies = [ |
29 | "axum-core", |
30 | + "axum-macros", |
31 | "bytes", |
32 | "form_urlencoded", |
33 | "futures-util", |
34 | @@ -73,12 +80,12 @@ dependencies = [ |
35 | |
36 | [[package]] |
37 | name = "axum-core" |
38 | - version = "0.5.0" |
39 | + version = "0.5.2" |
40 | source = "registry+https://github.com/rust-lang/crates.io-index" |
41 | - checksum = "df1362f362fd16024ae199c1970ce98f9661bf5ef94b9808fee734bc3698b733" |
42 | + checksum = "68464cd0412f486726fb3373129ef5d2993f90c34bc2bc1c1e9943b2f4fc7ca6" |
43 | dependencies = [ |
44 | "bytes", |
45 | - "futures-util", |
46 | + "futures-core", |
47 | "http", |
48 | "http-body", |
49 | "http-body-util", |
50 | @@ -92,6 +99,17 @@ dependencies = [ |
51 | ] |
52 | |
53 | [[package]] |
54 | + name = "axum-macros" |
55 | + version = "0.5.0" |
56 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
57 | + checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" |
58 | + dependencies = [ |
59 | + "proc-macro2", |
60 | + "quote", |
61 | + "syn", |
62 | + ] |
63 | + |
64 | + [[package]] |
65 | name = "backtrace" |
66 | version = "0.3.74" |
67 | source = "registry+https://github.com/rust-lang/crates.io-index" |
68 | @@ -107,6 +125,33 @@ dependencies = [ |
69 | ] |
70 | |
71 | [[package]] |
72 | + name = "base16ct" |
73 | + version = "0.2.0" |
74 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
75 | + checksum = "4c7f02d4ea65f2c1853089ffd8d2787bdbc63de2f0d29dedbcf8ccdfa0ccd4cf" |
76 | + |
77 | + [[package]] |
78 | + name = "base64" |
79 | + version = "0.22.1" |
80 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
81 | + checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" |
82 | + |
83 | + [[package]] |
84 | + name = "bitflags" |
85 | + version = "2.9.0" |
86 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
87 | + checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" |
88 | + |
89 | + [[package]] |
90 | + name = "block-buffer" |
91 | + version = "0.10.4" |
92 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
93 | + checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" |
94 | + dependencies = [ |
95 | + "generic-array", |
96 | + ] |
97 | + |
98 | + [[package]] |
99 | name = "bytes" |
100 | version = "1.10.1" |
101 | source = "registry+https://github.com/rust-lang/crates.io-index" |
102 | @@ -119,6 +164,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" |
103 | checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" |
104 | |
105 | [[package]] |
106 | + name = "cpufeatures" |
107 | + version = "0.2.17" |
108 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
109 | + checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" |
110 | + dependencies = [ |
111 | + "libc", |
112 | + ] |
113 | + |
114 | + [[package]] |
115 | + name = "crypto-common" |
116 | + version = "0.1.6" |
117 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
118 | + checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" |
119 | + dependencies = [ |
120 | + "generic-array", |
121 | + "typenum", |
122 | + ] |
123 | + |
124 | + [[package]] |
125 | name = "darling" |
126 | version = "0.20.10" |
127 | source = "registry+https://github.com/rust-lang/crates.io-index" |
128 | @@ -185,6 +249,16 @@ dependencies = [ |
129 | ] |
130 | |
131 | [[package]] |
132 | + name = "digest" |
133 | + version = "0.10.7" |
134 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
135 | + checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" |
136 | + dependencies = [ |
137 | + "block-buffer", |
138 | + "crypto-common", |
139 | + ] |
140 | + |
141 | + [[package]] |
142 | name = "fnv" |
143 | version = "1.0.7" |
144 | source = "registry+https://github.com/rust-lang/crates.io-index" |
145 | @@ -200,12 +274,28 @@ dependencies = [ |
146 | ] |
147 | |
148 | [[package]] |
149 | + name = "futures" |
150 | + version = "0.3.31" |
151 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
152 | + checksum = "65bc07b1a8bc7c85c5f2e110c476c7389b4554ba72af57d8445ea63a576b0876" |
153 | + dependencies = [ |
154 | + "futures-channel", |
155 | + "futures-core", |
156 | + "futures-executor", |
157 | + "futures-io", |
158 | + "futures-sink", |
159 | + "futures-task", |
160 | + "futures-util", |
161 | + ] |
162 | + |
163 | + [[package]] |
164 | name = "futures-channel" |
165 | version = "0.3.31" |
166 | source = "registry+https://github.com/rust-lang/crates.io-index" |
167 | checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" |
168 | dependencies = [ |
169 | "futures-core", |
170 | + "futures-sink", |
171 | ] |
172 | |
173 | [[package]] |
174 | @@ -215,6 +305,40 @@ source = "registry+https://github.com/rust-lang/crates.io-index" |
175 | checksum = "05f29059c0c2090612e8d742178b0580d2dc940c837851ad723096f87af6663e" |
176 | |
177 | [[package]] |
178 | + name = "futures-executor" |
179 | + version = "0.3.31" |
180 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
181 | + checksum = "1e28d1d997f585e54aebc3f97d39e72338912123a67330d723fdbb564d646c9f" |
182 | + dependencies = [ |
183 | + "futures-core", |
184 | + "futures-task", |
185 | + "futures-util", |
186 | + ] |
187 | + |
188 | + [[package]] |
189 | + name = "futures-io" |
190 | + version = "0.3.31" |
191 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
192 | + checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" |
193 | + |
194 | + [[package]] |
195 | + name = "futures-macro" |
196 | + version = "0.3.31" |
197 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
198 | + checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" |
199 | + dependencies = [ |
200 | + "proc-macro2", |
201 | + "quote", |
202 | + "syn", |
203 | + ] |
204 | + |
205 | + [[package]] |
206 | + name = "futures-sink" |
207 | + version = "0.3.31" |
208 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
209 | + checksum = "e575fab7d1e0dcb8d0c7bcf9a63ee213816ab51902e6d244a95819acacf1d4f7" |
210 | + |
211 | + [[package]] |
212 | name = "futures-task" |
213 | version = "0.3.31" |
214 | source = "registry+https://github.com/rust-lang/crates.io-index" |
215 | @@ -226,10 +350,38 @@ version = "0.3.31" |
216 | source = "registry+https://github.com/rust-lang/crates.io-index" |
217 | checksum = "9fa08315bb612088cc391249efdc3bc77536f16c91f6cf495e6fbe85b20a4a81" |
218 | dependencies = [ |
219 | + "futures-channel", |
220 | "futures-core", |
221 | + "futures-io", |
222 | + "futures-macro", |
223 | + "futures-sink", |
224 | "futures-task", |
225 | + "memchr", |
226 | "pin-project-lite", |
227 | "pin-utils", |
228 | + "slab", |
229 | + ] |
230 | + |
231 | + [[package]] |
232 | + name = "generic-array" |
233 | + version = "0.14.7" |
234 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
235 | + checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" |
236 | + dependencies = [ |
237 | + "typenum", |
238 | + "version_check", |
239 | + ] |
240 | + |
241 | + [[package]] |
242 | + name = "getrandom" |
243 | + version = "0.3.1" |
244 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
245 | + checksum = "43a49c392881ce6d5c3b8cb70f98717b7c07aabbdff06687b9030dbfbe2725f8" |
246 | + dependencies = [ |
247 | + "cfg-if", |
248 | + "libc", |
249 | + "wasi 0.13.3+wasi-0.2.2", |
250 | + "windows-targets", |
251 | ] |
252 | |
253 | [[package]] |
254 | @@ -257,6 +409,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" |
255 | checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" |
256 | |
257 | [[package]] |
258 | + name = "hex-literal" |
259 | + version = "1.0.0" |
260 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
261 | + checksum = "bcaaec4551594c969335c98c903c1397853d4198408ea609190f420500f6be71" |
262 | + |
263 | + [[package]] |
264 | name = "http" |
265 | version = "1.3.1" |
266 | source = "registry+https://github.com/rust-lang/crates.io-index" |
267 | @@ -350,12 +508,28 @@ source = "registry+https://github.com/rust-lang/crates.io-index" |
268 | checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" |
269 | |
270 | [[package]] |
271 | + name = "lazy_static" |
272 | + version = "1.5.0" |
273 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
274 | + checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" |
275 | + |
276 | + [[package]] |
277 | name = "libc" |
278 | version = "0.2.171" |
279 | source = "registry+https://github.com/rust-lang/crates.io-index" |
280 | checksum = "c19937216e9d3aa9956d9bb8dfc0b0c8beb6058fc4f7a4dc4d850edf86a237d6" |
281 | |
282 | [[package]] |
283 | + name = "lock_api" |
284 | + version = "0.4.12" |
285 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
286 | + checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" |
287 | + dependencies = [ |
288 | + "autocfg", |
289 | + "scopeguard", |
290 | + ] |
291 | + |
292 | + [[package]] |
293 | name = "log" |
294 | version = "0.4.26" |
295 | source = "registry+https://github.com/rust-lang/crates.io-index" |
296 | @@ -395,11 +569,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" |
297 | checksum = "2886843bf800fba2e3377cff24abf6379b4c4d5c6681eaf9ea5b0d15090450bd" |
298 | dependencies = [ |
299 | "libc", |
300 | - "wasi", |
301 | + "wasi 0.11.0+wasi-snapshot-preview1", |
302 | "windows-sys", |
303 | ] |
304 | |
305 | [[package]] |
306 | + name = "nu-ansi-term" |
307 | + version = "0.46.0" |
308 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
309 | + checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" |
310 | + dependencies = [ |
311 | + "overload", |
312 | + "winapi", |
313 | + ] |
314 | + |
315 | + [[package]] |
316 | name = "object" |
317 | version = "0.36.7" |
318 | source = "registry+https://github.com/rust-lang/crates.io-index" |
319 | @@ -431,17 +615,60 @@ source = "registry+https://github.com/rust-lang/crates.io-index" |
320 | checksum = "d75b0bedcc4fe52caa0e03d9f1151a323e4aa5e2d78ba3580400cd3c9e2bc4bc" |
321 | |
322 | [[package]] |
323 | + name = "overload" |
324 | + version = "0.1.1" |
325 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
326 | + checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" |
327 | + |
328 | + [[package]] |
329 | name = "papyri" |
330 | version = "0.1.0" |
331 | dependencies = [ |
332 | "async-trait", |
333 | "axum", |
334 | + "base16ct", |
335 | + "base64", |
336 | + "bytes", |
337 | + "futures", |
338 | + "hex-literal", |
339 | + "http", |
340 | "oci-spec", |
341 | "regex", |
342 | + "relative-path", |
343 | "serde", |
344 | "serde_json", |
345 | + "sha2", |
346 | "thiserror", |
347 | + "tokio", |
348 | + "tokio-util", |
349 | + "tower", |
350 | + "tower-http", |
351 | "tracing", |
352 | + "tracing-subscriber", |
353 | + "uuid", |
354 | + ] |
355 | + |
356 | + [[package]] |
357 | + name = "parking_lot" |
358 | + version = "0.12.3" |
359 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
360 | + checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" |
361 | + dependencies = [ |
362 | + "lock_api", |
363 | + "parking_lot_core", |
364 | + ] |
365 | + |
366 | + [[package]] |
367 | + name = "parking_lot_core" |
368 | + version = "0.9.10" |
369 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
370 | + checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" |
371 | + dependencies = [ |
372 | + "cfg-if", |
373 | + "libc", |
374 | + "redox_syscall", |
375 | + "smallvec", |
376 | + "windows-targets", |
377 | ] |
378 | |
379 | [[package]] |
380 | @@ -503,6 +730,15 @@ dependencies = [ |
381 | ] |
382 | |
383 | [[package]] |
384 | + name = "redox_syscall" |
385 | + version = "0.5.10" |
386 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
387 | + checksum = "0b8c0c260b63a8219631167be35e6a988e9554dbd323f8bd08439c8ed1302bd1" |
388 | + dependencies = [ |
389 | + "bitflags", |
390 | + ] |
391 | + |
392 | + [[package]] |
393 | name = "regex" |
394 | version = "1.11.1" |
395 | source = "registry+https://github.com/rust-lang/crates.io-index" |
396 | @@ -532,6 +768,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" |
397 | checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" |
398 | |
399 | [[package]] |
400 | + name = "relative-path" |
401 | + version = "1.9.3" |
402 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
403 | + checksum = "ba39f3699c378cd8970968dcbff9c43159ea4cfbd88d43c00b22f2ef10a435d2" |
404 | + |
405 | + [[package]] |
406 | name = "rustc-demangle" |
407 | version = "0.1.24" |
408 | source = "registry+https://github.com/rust-lang/crates.io-index" |
409 | @@ -550,6 +792,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" |
410 | checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" |
411 | |
412 | [[package]] |
413 | + name = "scopeguard" |
414 | + version = "1.2.0" |
415 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
416 | + checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" |
417 | + |
418 | + [[package]] |
419 | name = "serde" |
420 | version = "1.0.219" |
421 | source = "registry+https://github.com/rust-lang/crates.io-index" |
422 | @@ -604,6 +852,44 @@ dependencies = [ |
423 | ] |
424 | |
425 | [[package]] |
426 | + name = "sha2" |
427 | + version = "0.10.8" |
428 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
429 | + checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" |
430 | + dependencies = [ |
431 | + "cfg-if", |
432 | + "cpufeatures", |
433 | + "digest", |
434 | + ] |
435 | + |
436 | + [[package]] |
437 | + name = "sharded-slab" |
438 | + version = "0.1.7" |
439 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
440 | + checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" |
441 | + dependencies = [ |
442 | + "lazy_static", |
443 | + ] |
444 | + |
445 | + [[package]] |
446 | + name = "signal-hook-registry" |
447 | + version = "1.4.2" |
448 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
449 | + checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" |
450 | + dependencies = [ |
451 | + "libc", |
452 | + ] |
453 | + |
454 | + [[package]] |
455 | + name = "slab" |
456 | + version = "0.4.9" |
457 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
458 | + checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" |
459 | + dependencies = [ |
460 | + "autocfg", |
461 | + ] |
462 | + |
463 | + [[package]] |
464 | name = "smallvec" |
465 | version = "1.14.0" |
466 | source = "registry+https://github.com/rust-lang/crates.io-index" |
467 | @@ -682,15 +968,28 @@ dependencies = [ |
468 | ] |
469 | |
470 | [[package]] |
471 | + name = "thread_local" |
472 | + version = "1.1.8" |
473 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
474 | + checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" |
475 | + dependencies = [ |
476 | + "cfg-if", |
477 | + "once_cell", |
478 | + ] |
479 | + |
480 | + [[package]] |
481 | name = "tokio" |
482 | version = "1.44.1" |
483 | source = "registry+https://github.com/rust-lang/crates.io-index" |
484 | checksum = "f382da615b842244d4b8738c82ed1275e6c5dd90c459a30941cd07080b06c91a" |
485 | dependencies = [ |
486 | "backtrace", |
487 | + "bytes", |
488 | "libc", |
489 | "mio", |
490 | + "parking_lot", |
491 | "pin-project-lite", |
492 | + "signal-hook-registry", |
493 | "socket2", |
494 | "tokio-macros", |
495 | "windows-sys", |
496 | @@ -708,6 +1007,19 @@ dependencies = [ |
497 | ] |
498 | |
499 | [[package]] |
500 | + name = "tokio-util" |
501 | + version = "0.7.14" |
502 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
503 | + checksum = "6b9590b93e6fcc1739458317cccd391ad3955e2bde8913edf6f95f9e65a8f034" |
504 | + dependencies = [ |
505 | + "bytes", |
506 | + "futures-core", |
507 | + "futures-sink", |
508 | + "pin-project-lite", |
509 | + "tokio", |
510 | + ] |
511 | + |
512 | + [[package]] |
513 | name = "tower" |
514 | version = "0.5.2" |
515 | source = "registry+https://github.com/rust-lang/crates.io-index" |
516 | @@ -724,6 +1036,22 @@ dependencies = [ |
517 | ] |
518 | |
519 | [[package]] |
520 | + name = "tower-http" |
521 | + version = "0.6.2" |
522 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
523 | + checksum = "403fa3b783d4b626a8ad51d766ab03cb6d2dbfc46b1c5d4448395e6628dc9697" |
524 | + dependencies = [ |
525 | + "bitflags", |
526 | + "bytes", |
527 | + "http", |
528 | + "http-body", |
529 | + "pin-project-lite", |
530 | + "tower-layer", |
531 | + "tower-service", |
532 | + "tracing", |
533 | + ] |
534 | + |
535 | + [[package]] |
536 | name = "tower-layer" |
537 | version = "0.3.3" |
538 | source = "registry+https://github.com/rust-lang/crates.io-index" |
539 | @@ -765,21 +1093,105 @@ source = "registry+https://github.com/rust-lang/crates.io-index" |
540 | checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" |
541 | dependencies = [ |
542 | "once_cell", |
543 | + "valuable", |
544 | ] |
545 | |
546 | [[package]] |
547 | + name = "tracing-log" |
548 | + version = "0.2.0" |
549 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
550 | + checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" |
551 | + dependencies = [ |
552 | + "log", |
553 | + "once_cell", |
554 | + "tracing-core", |
555 | + ] |
556 | + |
557 | + [[package]] |
558 | + name = "tracing-subscriber" |
559 | + version = "0.3.19" |
560 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
561 | + checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" |
562 | + dependencies = [ |
563 | + "nu-ansi-term", |
564 | + "sharded-slab", |
565 | + "smallvec", |
566 | + "thread_local", |
567 | + "tracing-core", |
568 | + "tracing-log", |
569 | + ] |
570 | + |
571 | + [[package]] |
572 | + name = "typenum" |
573 | + version = "1.18.0" |
574 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
575 | + checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" |
576 | + |
577 | + [[package]] |
578 | name = "unicode-ident" |
579 | version = "1.0.18" |
580 | source = "registry+https://github.com/rust-lang/crates.io-index" |
581 | checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" |
582 | |
583 | [[package]] |
584 | + name = "uuid" |
585 | + version = "1.16.0" |
586 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
587 | + checksum = "458f7a779bf54acc9f347480ac654f68407d3aab21269a6e3c9f922acd9e2da9" |
588 | + dependencies = [ |
589 | + "getrandom", |
590 | + ] |
591 | + |
592 | + [[package]] |
593 | + name = "valuable" |
594 | + version = "0.1.1" |
595 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
596 | + checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65" |
597 | + |
598 | + [[package]] |
599 | + name = "version_check" |
600 | + version = "0.9.5" |
601 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
602 | + checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" |
603 | + |
604 | + [[package]] |
605 | name = "wasi" |
606 | version = "0.11.0+wasi-snapshot-preview1" |
607 | source = "registry+https://github.com/rust-lang/crates.io-index" |
608 | checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" |
609 | |
610 | [[package]] |
611 | + name = "wasi" |
612 | + version = "0.13.3+wasi-0.2.2" |
613 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
614 | + checksum = "26816d2e1a4a36a2940b96c5296ce403917633dff8f3440e9b236ed6f6bacad2" |
615 | + dependencies = [ |
616 | + "wit-bindgen-rt", |
617 | + ] |
618 | + |
619 | + [[package]] |
620 | + name = "winapi" |
621 | + version = "0.3.9" |
622 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
623 | + checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" |
624 | + dependencies = [ |
625 | + "winapi-i686-pc-windows-gnu", |
626 | + "winapi-x86_64-pc-windows-gnu", |
627 | + ] |
628 | + |
629 | + [[package]] |
630 | + name = "winapi-i686-pc-windows-gnu" |
631 | + version = "0.4.0" |
632 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
633 | + checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" |
634 | + |
635 | + [[package]] |
636 | + name = "winapi-x86_64-pc-windows-gnu" |
637 | + version = "0.4.0" |
638 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
639 | + checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" |
640 | + |
641 | + [[package]] |
642 | name = "windows-sys" |
643 | version = "0.52.0" |
644 | source = "registry+https://github.com/rust-lang/crates.io-index" |
645 | @@ -851,3 +1263,12 @@ name = "windows_x86_64_msvc" |
646 | version = "0.52.6" |
647 | source = "registry+https://github.com/rust-lang/crates.io-index" |
648 | checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" |
649 | + |
650 | + [[package]] |
651 | + name = "wit-bindgen-rt" |
652 | + version = "0.33.0" |
653 | + source = "registry+https://github.com/rust-lang/crates.io-index" |
654 | + checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" |
655 | + dependencies = [ |
656 | + "bitflags", |
657 | + ] |
658 | diff --git a/Cargo.toml b/Cargo.toml |
659 | index 7a6e130..6d7c9c0 100644 |
660 | --- a/Cargo.toml |
661 | +++ b/Cargo.toml |
662 | @@ -4,7 +4,13 @@ version = "0.1.0" |
663 | edition = "2024" |
664 | |
665 | [dependencies] |
666 | - axum = "0.8.1" |
667 | + axum = { version = "0.8.3", features = ["macros", "query", "json"], optional = true } |
668 | + http = { version = "1.3.1", optional = true } |
669 | + tower = { version = "0.5.2", features = ["util"], optional = true } |
670 | + |
671 | + tokio = { version = "1.44.1", features = ["fs"], optional = true } |
672 | + tokio-util = { version = "0.7.14", features = ["io"], optional = true } |
673 | + |
674 | oci-spec = "0.7.1" |
675 | serde = "1.0.219" |
676 | serde_json = "1.0.140" |
677 | @@ -12,3 +18,40 @@ async-trait = "0.1.88" |
678 | regex = "1.11.1" |
679 | tracing = { version = "0.1.41", features = ["log"] } |
680 | thiserror = "2.0.12" |
681 | + futures = "0.3.31" |
682 | + uuid = { version = "1.16.0", features = ["v4"] } |
683 | + bytes = "1.10.1" |
684 | + relative-path = "1.9.3" |
685 | + sha2 = "0.10.8" |
686 | + hex-literal = "1.0.0" |
687 | + base16ct = { version = "0.2.0", features = ["alloc"] } |
688 | + base64 = "0.22.1" |
689 | + |
690 | + [dev-dependencies] |
691 | + tokio = { version = "1.44.1", features = ["full"] } |
692 | + tower-http = { version = "0.6.2", features = ["trace", "normalize-path"] } |
693 | + tracing-subscriber = "0.3.19" |
694 | + |
695 | + [features] |
696 | + default = [] |
697 | + |
698 | + axum-router = [ |
699 | + "axum", |
700 | + "http", |
701 | + "tower" |
702 | + ] |
703 | + |
704 | + storage-fs = [ |
705 | + "tokio", |
706 | + "tokio-util" |
707 | + ] |
708 | + |
709 | + [[example]] |
710 | + name = "server" |
711 | + path = "examples/server.rs" |
712 | + required-features = ["axum-router", "storage-fs"] |
713 | + |
714 | + [[example]] |
715 | + name = "custom" |
716 | + path = "examples/custom.rs" |
717 | + required-features = ["storage-fs"] |
718 | diff --git a/LICENSE b/LICENSE |
719 | new file mode 100644 |
720 | index 0000000..be3f7b2 |
721 | --- /dev/null |
722 | +++ b/LICENSE |
723 | @@ -0,0 +1,661 @@ |
724 | + GNU AFFERO GENERAL PUBLIC LICENSE |
725 | + Version 3, 19 November 2007 |
726 | + |
727 | + Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/> |
728 | + Everyone is permitted to copy and distribute verbatim copies |
729 | + of this license document, but changing it is not allowed. |
730 | + |
731 | + Preamble |
732 | + |
733 | + The GNU Affero General Public License is a free, copyleft license for |
734 | + software and other kinds of works, specifically designed to ensure |
735 | + cooperation with the community in the case of network server software. |
736 | + |
737 | + The licenses for most software and other practical works are designed |
738 | + to take away your freedom to share and change the works. By contrast, |
739 | + our General Public Licenses are intended to guarantee your freedom to |
740 | + share and change all versions of a program--to make sure it remains free |
741 | + software for all its users. |
742 | + |
743 | + When we speak of free software, we are referring to freedom, not |
744 | + price. Our General Public Licenses are designed to make sure that you |
745 | + have the freedom to distribute copies of free software (and charge for |
746 | + them if you wish), that you receive source code or can get it if you |
747 | + want it, that you can change the software or use pieces of it in new |
748 | + free programs, and that you know you can do these things. |
749 | + |
750 | + Developers that use our General Public Licenses protect your rights |
751 | + with two steps: (1) assert copyright on the software, and (2) offer |
752 | + you this License which gives you legal permission to copy, distribute |
753 | + and/or modify the software. |
754 | + |
755 | + A secondary benefit of defending all users' freedom is that |
756 | + improvements made in alternate versions of the program, if they |
757 | + receive widespread use, become available for other developers to |
758 | + incorporate. Many developers of free software are heartened and |
759 | + encouraged by the resulting cooperation. However, in the case of |
760 | + software used on network servers, this result may fail to come about. |
761 | + The GNU General Public License permits making a modified version and |
762 | + letting the public access it on a server without ever releasing its |
763 | + source code to the public. |
764 | + |
765 | + The GNU Affero General Public License is designed specifically to |
766 | + ensure that, in such cases, the modified source code becomes available |
767 | + to the community. It requires the operator of a network server to |
768 | + provide the source code of the modified version running there to the |
769 | + users of that server. Therefore, public use of a modified version, on |
770 | + a publicly accessible server, gives the public access to the source |
771 | + code of the modified version. |
772 | + |
773 | + An older license, called the Affero General Public License and |
774 | + published by Affero, was designed to accomplish similar goals. This is |
775 | + a different license, not a version of the Affero GPL, but Affero has |
776 | + released a new version of the Affero GPL which permits relicensing under |
777 | + this license. |
778 | + |
779 | + The precise terms and conditions for copying, distribution and |
780 | + modification follow. |
781 | + |
782 | + TERMS AND CONDITIONS |
783 | + |
784 | + 0. Definitions. |
785 | + |
786 | + "This License" refers to version 3 of the GNU Affero General Public License. |
787 | + |
788 | + "Copyright" also means copyright-like laws that apply to other kinds of |
789 | + works, such as semiconductor masks. |
790 | + |
791 | + "The Program" refers to any copyrightable work licensed under this |
792 | + License. Each licensee is addressed as "you". "Licensees" and |
793 | + "recipients" may be individuals or organizations. |
794 | + |
795 | + To "modify" a work means to copy from or adapt all or part of the work |
796 | + in a fashion requiring copyright permission, other than the making of an |
797 | + exact copy. The resulting work is called a "modified version" of the |
798 | + earlier work or a work "based on" the earlier work. |
799 | + |
800 | + A "covered work" means either the unmodified Program or a work based |
801 | + on the Program. |
802 | + |
803 | + To "propagate" a work means to do anything with it that, without |
804 | + permission, would make you directly or secondarily liable for |
805 | + infringement under applicable copyright law, except executing it on a |
806 | + computer or modifying a private copy. Propagation includes copying, |
807 | + distribution (with or without modification), making available to the |
808 | + public, and in some countries other activities as well. |
809 | + |
810 | + To "convey" a work means any kind of propagation that enables other |
811 | + parties to make or receive copies. Mere interaction with a user through |
812 | + a computer network, with no transfer of a copy, is not conveying. |
813 | + |
814 | + An interactive user interface displays "Appropriate Legal Notices" |
815 | + to the extent that it includes a convenient and prominently visible |
816 | + feature that (1) displays an appropriate copyright notice, and (2) |
817 | + tells the user that there is no warranty for the work (except to the |
818 | + extent that warranties are provided), that licensees may convey the |
819 | + work under this License, and how to view a copy of this License. If |
820 | + the interface presents a list of user commands or options, such as a |
821 | + menu, a prominent item in the list meets this criterion. |
822 | + |
823 | + 1. Source Code. |
824 | + |
825 | + The "source code" for a work means the preferred form of the work |
826 | + for making modifications to it. "Object code" means any non-source |
827 | + form of a work. |
828 | + |
829 | + A "Standard Interface" means an interface that either is an official |
830 | + standard defined by a recognized standards body, or, in the case of |
831 | + interfaces specified for a particular programming language, one that |
832 | + is widely used among developers working in that language. |
833 | + |
834 | + The "System Libraries" of an executable work include anything, other |
835 | + than the work as a whole, that (a) is included in the normal form of |
836 | + packaging a Major Component, but which is not part of that Major |
837 | + Component, and (b) serves only to enable use of the work with that |
838 | + Major Component, or to implement a Standard Interface for which an |
839 | + implementation is available to the public in source code form. A |
840 | + "Major Component", in this context, means a major essential component |
841 | + (kernel, window system, and so on) of the specific operating system |
842 | + (if any) on which the executable work runs, or a compiler used to |
843 | + produce the work, or an object code interpreter used to run it. |
844 | + |
845 | + The "Corresponding Source" for a work in object code form means all |
846 | + the source code needed to generate, install, and (for an executable |
847 | + work) run the object code and to modify the work, including scripts to |
848 | + control those activities. However, it does not include the work's |
849 | + System Libraries, or general-purpose tools or generally available free |
850 | + programs which are used unmodified in performing those activities but |
851 | + which are not part of the work. For example, Corresponding Source |
852 | + includes interface definition files associated with source files for |
853 | + the work, and the source code for shared libraries and dynamically |
854 | + linked subprograms that the work is specifically designed to require, |
855 | + such as by intimate data communication or control flow between those |
856 | + subprograms and other parts of the work. |
857 | + |
858 | + The Corresponding Source need not include anything that users |
859 | + can regenerate automatically from other parts of the Corresponding |
860 | + Source. |
861 | + |
862 | + The Corresponding Source for a work in source code form is that |
863 | + same work. |
864 | + |
865 | + 2. Basic Permissions. |
866 | + |
867 | + All rights granted under this License are granted for the term of |
868 | + copyright on the Program, and are irrevocable provided the stated |
869 | + conditions are met. This License explicitly affirms your unlimited |
870 | + permission to run the unmodified Program. The output from running a |
871 | + covered work is covered by this License only if the output, given its |
872 | + content, constitutes a covered work. This License acknowledges your |
873 | + rights of fair use or other equivalent, as provided by copyright law. |
874 | + |
875 | + You may make, run and propagate covered works that you do not |
876 | + convey, without conditions so long as your license otherwise remains |
877 | + in force. You may convey covered works to others for the sole purpose |
878 | + of having them make modifications exclusively for you, or provide you |
879 | + with facilities for running those works, provided that you comply with |
880 | + the terms of this License in conveying all material for which you do |
881 | + not control copyright. Those thus making or running the covered works |
882 | + for you must do so exclusively on your behalf, under your direction |
883 | + and control, on terms that prohibit them from making any copies of |
884 | + your copyrighted material outside their relationship with you. |
885 | + |
886 | + Conveying under any other circumstances is permitted solely under |
887 | + the conditions stated below. Sublicensing is not allowed; section 10 |
888 | + makes it unnecessary. |
889 | + |
890 | + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. |
891 | + |
892 | + No covered work shall be deemed part of an effective technological |
893 | + measure under any applicable law fulfilling obligations under article |
894 | + 11 of the WIPO copyright treaty adopted on 20 December 1996, or |
895 | + similar laws prohibiting or restricting circumvention of such |
896 | + measures. |
897 | + |
898 | + When you convey a covered work, you waive any legal power to forbid |
899 | + circumvention of technological measures to the extent such circumvention |
900 | + is effected by exercising rights under this License with respect to |
901 | + the covered work, and you disclaim any intention to limit operation or |
902 | + modification of the work as a means of enforcing, against the work's |
903 | + users, your or third parties' legal rights to forbid circumvention of |
904 | + technological measures. |
905 | + |
906 | + 4. Conveying Verbatim Copies. |
907 | + |
908 | + You may convey verbatim copies of the Program's source code as you |
909 | + receive it, in any medium, provided that you conspicuously and |
910 | + appropriately publish on each copy an appropriate copyright notice; |
911 | + keep intact all notices stating that this License and any |
912 | + non-permissive terms added in accord with section 7 apply to the code; |
913 | + keep intact all notices of the absence of any warranty; and give all |
914 | + recipients a copy of this License along with the Program. |
915 | + |
916 | + You may charge any price or no price for each copy that you convey, |
917 | + and you may offer support or warranty protection for a fee. |
918 | + |
919 | + 5. Conveying Modified Source Versions. |
920 | + |
921 | + You may convey a work based on the Program, or the modifications to |
922 | + produce it from the Program, in the form of source code under the |
923 | + terms of section 4, provided that you also meet all of these conditions: |
924 | + |
925 | + a) The work must carry prominent notices stating that you modified |
926 | + it, and giving a relevant date. |
927 | + |
928 | + b) The work must carry prominent notices stating that it is |
929 | + released under this License and any conditions added under section |
930 | + 7. This requirement modifies the requirement in section 4 to |
931 | + "keep intact all notices". |
932 | + |
933 | + c) You must license the entire work, as a whole, under this |
934 | + License to anyone who comes into possession of a copy. This |
935 | + License will therefore apply, along with any applicable section 7 |
936 | + additional terms, to the whole of the work, and all its parts, |
937 | + regardless of how they are packaged. This License gives no |
938 | + permission to license the work in any other way, but it does not |
939 | + invalidate such permission if you have separately received it. |
940 | + |
941 | + d) If the work has interactive user interfaces, each must display |
942 | + Appropriate Legal Notices; however, if the Program has interactive |
943 | + interfaces that do not display Appropriate Legal Notices, your |
944 | + work need not make them do so. |
945 | + |
946 | + A compilation of a covered work with other separate and independent |
947 | + works, which are not by their nature extensions of the covered work, |
948 | + and which are not combined with it such as to form a larger program, |
949 | + in or on a volume of a storage or distribution medium, is called an |
950 | + "aggregate" if the compilation and its resulting copyright are not |
951 | + used to limit the access or legal rights of the compilation's users |
952 | + beyond what the individual works permit. Inclusion of a covered work |
953 | + in an aggregate does not cause this License to apply to the other |
954 | + parts of the aggregate. |
955 | + |
956 | + 6. Conveying Non-Source Forms. |
957 | + |
958 | + You may convey a covered work in object code form under the terms |
959 | + of sections 4 and 5, provided that you also convey the |
960 | + machine-readable Corresponding Source under the terms of this License, |
961 | + in one of these ways: |
962 | + |
963 | + a) Convey the object code in, or embodied in, a physical product |
964 | + (including a physical distribution medium), accompanied by the |
965 | + Corresponding Source fixed on a durable physical medium |
966 | + customarily used for software interchange. |
967 | + |
968 | + b) Convey the object code in, or embodied in, a physical product |
969 | + (including a physical distribution medium), accompanied by a |
970 | + written offer, valid for at least three years and valid for as |
971 | + long as you offer spare parts or customer support for that product |
972 | + model, to give anyone who possesses the object code either (1) a |
973 | + copy of the Corresponding Source for all the software in the |
974 | + product that is covered by this License, on a durable physical |
975 | + medium customarily used for software interchange, for a price no |
976 | + more than your reasonable cost of physically performing this |
977 | + conveying of source, or (2) access to copy the |
978 | + Corresponding Source from a network server at no charge. |
979 | + |
980 | + c) Convey individual copies of the object code with a copy of the |
981 | + written offer to provide the Corresponding Source. This |
982 | + alternative is allowed only occasionally and noncommercially, and |
983 | + only if you received the object code with such an offer, in accord |
984 | + with subsection 6b. |
985 | + |
986 | + d) Convey the object code by offering access from a designated |
987 | + place (gratis or for a charge), and offer equivalent access to the |
988 | + Corresponding Source in the same way through the same place at no |
989 | + further charge. You need not require recipients to copy the |
990 | + Corresponding Source along with the object code. If the place to |
991 | + copy the object code is a network server, the Corresponding Source |
992 | + may be on a different server (operated by you or a third party) |
993 | + that supports equivalent copying facilities, provided you maintain |
994 | + clear directions next to the object code saying where to find the |
995 | + Corresponding Source. Regardless of what server hosts the |
996 | + Corresponding Source, you remain obligated to ensure that it is |
997 | + available for as long as needed to satisfy these requirements. |
998 | + |
999 | + e) Convey the object code using peer-to-peer transmission, provided |
1000 | + you inform other peers where the object code and Corresponding |
1001 | + Source of the work are being offered to the general public at no |
1002 | + charge under subsection 6d. |
1003 | + |
1004 | + A separable portion of the object code, whose source code is excluded |
1005 | + from the Corresponding Source as a System Library, need not be |
1006 | + included in conveying the object code work. |
1007 | + |
1008 | + A "User Product" is either (1) a "consumer product", which means any |
1009 | + tangible personal property which is normally used for personal, family, |
1010 | + or household purposes, or (2) anything designed or sold for incorporation |
1011 | + into a dwelling. In determining whether a product is a consumer product, |
1012 | + doubtful cases shall be resolved in favor of coverage. For a particular |
1013 | + product received by a particular user, "normally used" refers to a |
1014 | + typical or common use of that class of product, regardless of the status |
1015 | + of the particular user or of the way in which the particular user |
1016 | + actually uses, or expects or is expected to use, the product. A product |
1017 | + is a consumer product regardless of whether the product has substantial |
1018 | + commercial, industrial or non-consumer uses, unless such uses represent |
1019 | + the only significant mode of use of the product. |
1020 | + |
1021 | + "Installation Information" for a User Product means any methods, |
1022 | + procedures, authorization keys, or other information required to install |
1023 | + and execute modified versions of a covered work in that User Product from |
1024 | + a modified version of its Corresponding Source. The information must |
1025 | + suffice to ensure that the continued functioning of the modified object |
1026 | + code is in no case prevented or interfered with solely because |
1027 | + modification has been made. |
1028 | + |
1029 | + If you convey an object code work under this section in, or with, or |
1030 | + specifically for use in, a User Product, and the conveying occurs as |
1031 | + part of a transaction in which the right of possession and use of the |
1032 | + User Product is transferred to the recipient in perpetuity or for a |
1033 | + fixed term (regardless of how the transaction is characterized), the |
1034 | + Corresponding Source conveyed under this section must be accompanied |
1035 | + by the Installation Information. But this requirement does not apply |
1036 | + if neither you nor any third party retains the ability to install |
1037 | + modified object code on the User Product (for example, the work has |
1038 | + been installed in ROM). |
1039 | + |
1040 | + The requirement to provide Installation Information does not include a |
1041 | + requirement to continue to provide support service, warranty, or updates |
1042 | + for a work that has been modified or installed by the recipient, or for |
1043 | + the User Product in which it has been modified or installed. Access to a |
1044 | + network may be denied when the modification itself materially and |
1045 | + adversely affects the operation of the network or violates the rules and |
1046 | + protocols for communication across the network. |
1047 | + |
1048 | + Corresponding Source conveyed, and Installation Information provided, |
1049 | + in accord with this section must be in a format that is publicly |
1050 | + documented (and with an implementation available to the public in |
1051 | + source code form), and must require no special password or key for |
1052 | + unpacking, reading or copying. |
1053 | + |
1054 | + 7. Additional Terms. |
1055 | + |
1056 | + "Additional permissions" are terms that supplement the terms of this |
1057 | + License by making exceptions from one or more of its conditions. |
1058 | + Additional permissions that are applicable to the entire Program shall |
1059 | + be treated as though they were included in this License, to the extent |
1060 | + that they are valid under applicable law. If additional permissions |
1061 | + apply only to part of the Program, that part may be used separately |
1062 | + under those permissions, but the entire Program remains governed by |
1063 | + this License without regard to the additional permissions. |
1064 | + |
1065 | + When you convey a copy of a covered work, you may at your option |
1066 | + remove any additional permissions from that copy, or from any part of |
1067 | + it. (Additional permissions may be written to require their own |
1068 | + removal in certain cases when you modify the work.) You may place |
1069 | + additional permissions on material, added by you to a covered work, |
1070 | + for which you have or can give appropriate copyright permission. |
1071 | + |
1072 | + Notwithstanding any other provision of this License, for material you |
1073 | + add to a covered work, you may (if authorized by the copyright holders of |
1074 | + that material) supplement the terms of this License with terms: |
1075 | + |
1076 | + a) Disclaiming warranty or limiting liability differently from the |
1077 | + terms of sections 15 and 16 of this License; or |
1078 | + |
1079 | + b) Requiring preservation of specified reasonable legal notices or |
1080 | + author attributions in that material or in the Appropriate Legal |
1081 | + Notices displayed by works containing it; or |
1082 | + |
1083 | + c) Prohibiting misrepresentation of the origin of that material, or |
1084 | + requiring that modified versions of such material be marked in |
1085 | + reasonable ways as different from the original version; or |
1086 | + |
1087 | + d) Limiting the use for publicity purposes of names of licensors or |
1088 | + authors of the material; or |
1089 | + |
1090 | + e) Declining to grant rights under trademark law for use of some |
1091 | + trade names, trademarks, or service marks; or |
1092 | + |
1093 | + f) Requiring indemnification of licensors and authors of that |
1094 | + material by anyone who conveys the material (or modified versions of |
1095 | + it) with contractual assumptions of liability to the recipient, for |
1096 | + any liability that these contractual assumptions directly impose on |
1097 | + those licensors and authors. |
1098 | + |
1099 | + All other non-permissive additional terms are considered "further |
1100 | + restrictions" within the meaning of section 10. If the Program as you |
1101 | + received it, or any part of it, contains a notice stating that it is |
1102 | + governed by this License along with a term that is a further |
1103 | + restriction, you may remove that term. If a license document contains |
1104 | + a further restriction but permits relicensing or conveying under this |
1105 | + License, you may add to a covered work material governed by the terms |
1106 | + of that license document, provided that the further restriction does |
1107 | + not survive such relicensing or conveying. |
1108 | + |
1109 | + If you add terms to a covered work in accord with this section, you |
1110 | + must place, in the relevant source files, a statement of the |
1111 | + additional terms that apply to those files, or a notice indicating |
1112 | + where to find the applicable terms. |
1113 | + |
1114 | + Additional terms, permissive or non-permissive, may be stated in the |
1115 | + form of a separately written license, or stated as exceptions; |
1116 | + the above requirements apply either way. |
1117 | + |
1118 | + 8. Termination. |
1119 | + |
1120 | + You may not propagate or modify a covered work except as expressly |
1121 | + provided under this License. Any attempt otherwise to propagate or |
1122 | + modify it is void, and will automatically terminate your rights under |
1123 | + this License (including any patent licenses granted under the third |
1124 | + paragraph of section 11). |
1125 | + |
1126 | + However, if you cease all violation of this License, then your |
1127 | + license from a particular copyright holder is reinstated (a) |
1128 | + provisionally, unless and until the copyright holder explicitly and |
1129 | + finally terminates your license, and (b) permanently, if the copyright |
1130 | + holder fails to notify you of the violation by some reasonable means |
1131 | + prior to 60 days after the cessation. |
1132 | + |
1133 | + Moreover, your license from a particular copyright holder is |
1134 | + reinstated permanently if the copyright holder notifies you of the |
1135 | + violation by some reasonable means, this is the first time you have |
1136 | + received notice of violation of this License (for any work) from that |
1137 | + copyright holder, and you cure the violation prior to 30 days after |
1138 | + your receipt of the notice. |
1139 | + |
1140 | + Termination of your rights under this section does not terminate the |
1141 | + licenses of parties who have received copies or rights from you under |
1142 | + this License. If your rights have been terminated and not permanently |
1143 | + reinstated, you do not qualify to receive new licenses for the same |
1144 | + material under section 10. |
1145 | + |
1146 | + 9. Acceptance Not Required for Having Copies. |
1147 | + |
1148 | + You are not required to accept this License in order to receive or |
1149 | + run a copy of the Program. Ancillary propagation of a covered work |
1150 | + occurring solely as a consequence of using peer-to-peer transmission |
1151 | + to receive a copy likewise does not require acceptance. However, |
1152 | + nothing other than this License grants you permission to propagate or |
1153 | + modify any covered work. These actions infringe copyright if you do |
1154 | + not accept this License. Therefore, by modifying or propagating a |
1155 | + covered work, you indicate your acceptance of this License to do so. |
1156 | + |
1157 | + 10. Automatic Licensing of Downstream Recipients. |
1158 | + |
1159 | + Each time you convey a covered work, the recipient automatically |
1160 | + receives a license from the original licensors, to run, modify and |
1161 | + propagate that work, subject to this License. You are not responsible |
1162 | + for enforcing compliance by third parties with this License. |
1163 | + |
1164 | + An "entity transaction" is a transaction transferring control of an |
1165 | + organization, or substantially all assets of one, or subdividing an |
1166 | + organization, or merging organizations. If propagation of a covered |
1167 | + work results from an entity transaction, each party to that |
1168 | + transaction who receives a copy of the work also receives whatever |
1169 | + licenses to the work the party's predecessor in interest had or could |
1170 | + give under the previous paragraph, plus a right to possession of the |
1171 | + Corresponding Source of the work from the predecessor in interest, if |
1172 | + the predecessor has it or can get it with reasonable efforts. |
1173 | + |
1174 | + You may not impose any further restrictions on the exercise of the |
1175 | + rights granted or affirmed under this License. For example, you may |
1176 | + not impose a license fee, royalty, or other charge for exercise of |
1177 | + rights granted under this License, and you may not initiate litigation |
1178 | + (including a cross-claim or counterclaim in a lawsuit) alleging that |
1179 | + any patent claim is infringed by making, using, selling, offering for |
1180 | + sale, or importing the Program or any portion of it. |
1181 | + |
1182 | + 11. Patents. |
1183 | + |
1184 | + A "contributor" is a copyright holder who authorizes use under this |
1185 | + License of the Program or a work on which the Program is based. The |
1186 | + work thus licensed is called the contributor's "contributor version". |
1187 | + |
1188 | + A contributor's "essential patent claims" are all patent claims |
1189 | + owned or controlled by the contributor, whether already acquired or |
1190 | + hereafter acquired, that would be infringed by some manner, permitted |
1191 | + by this License, of making, using, or selling its contributor version, |
1192 | + but do not include claims that would be infringed only as a |
1193 | + consequence of further modification of the contributor version. For |
1194 | + purposes of this definition, "control" includes the right to grant |
1195 | + patent sublicenses in a manner consistent with the requirements of |
1196 | + this License. |
1197 | + |
1198 | + Each contributor grants you a non-exclusive, worldwide, royalty-free |
1199 | + patent license under the contributor's essential patent claims, to |
1200 | + make, use, sell, offer for sale, import and otherwise run, modify and |
1201 | + propagate the contents of its contributor version. |
1202 | + |
1203 | + In the following three paragraphs, a "patent license" is any express |
1204 | + agreement or commitment, however denominated, not to enforce a patent |
1205 | + (such as an express permission to practice a patent or covenant not to |
1206 | + sue for patent infringement). To "grant" such a patent license to a |
1207 | + party means to make such an agreement or commitment not to enforce a |
1208 | + patent against the party. |
1209 | + |
1210 | + If you convey a covered work, knowingly relying on a patent license, |
1211 | + and the Corresponding Source of the work is not available for anyone |
1212 | + to copy, free of charge and under the terms of this License, through a |
1213 | + publicly available network server or other readily accessible means, |
1214 | + then you must either (1) cause the Corresponding Source to be so |
1215 | + available, or (2) arrange to deprive yourself of the benefit of the |
1216 | + patent license for this particular work, or (3) arrange, in a manner |
1217 | + consistent with the requirements of this License, to extend the patent |
1218 | + license to downstream recipients. "Knowingly relying" means you have |
1219 | + actual knowledge that, but for the patent license, your conveying the |
1220 | + covered work in a country, or your recipient's use of the covered work |
1221 | + in a country, would infringe one or more identifiable patents in that |
1222 | + country that you have reason to believe are valid. |
1223 | + |
1224 | + If, pursuant to or in connection with a single transaction or |
1225 | + arrangement, you convey, or propagate by procuring conveyance of, a |
1226 | + covered work, and grant a patent license to some of the parties |
1227 | + receiving the covered work authorizing them to use, propagate, modify |
1228 | + or convey a specific copy of the covered work, then the patent license |
1229 | + you grant is automatically extended to all recipients of the covered |
1230 | + work and works based on it. |
1231 | + |
1232 | + A patent license is "discriminatory" if it does not include within |
1233 | + the scope of its coverage, prohibits the exercise of, or is |
1234 | + conditioned on the non-exercise of one or more of the rights that are |
1235 | + specifically granted under this License. You may not convey a covered |
1236 | + work if you are a party to an arrangement with a third party that is |
1237 | + in the business of distributing software, under which you make payment |
1238 | + to the third party based on the extent of your activity of conveying |
1239 | + the work, and under which the third party grants, to any of the |
1240 | + parties who would receive the covered work from you, a discriminatory |
1241 | + patent license (a) in connection with copies of the covered work |
1242 | + conveyed by you (or copies made from those copies), or (b) primarily |
1243 | + for and in connection with specific products or compilations that |
1244 | + contain the covered work, unless you entered into that arrangement, |
1245 | + or that patent license was granted, prior to 28 March 2007. |
1246 | + |
1247 | + Nothing in this License shall be construed as excluding or limiting |
1248 | + any implied license or other defenses to infringement that may |
1249 | + otherwise be available to you under applicable patent law. |
1250 | + |
1251 | + 12. No Surrender of Others' Freedom. |
1252 | + |
1253 | + If conditions are imposed on you (whether by court order, agreement or |
1254 | + otherwise) that contradict the conditions of this License, they do not |
1255 | + excuse you from the conditions of this License. If you cannot convey a |
1256 | + covered work so as to satisfy simultaneously your obligations under this |
1257 | + License and any other pertinent obligations, then as a consequence you may |
1258 | + not convey it at all. For example, if you agree to terms that obligate you |
1259 | + to collect a royalty for further conveying from those to whom you convey |
1260 | + the Program, the only way you could satisfy both those terms and this |
1261 | + License would be to refrain entirely from conveying the Program. |
1262 | + |
1263 | + 13. Remote Network Interaction; Use with the GNU General Public License. |
1264 | + |
1265 | + Notwithstanding any other provision of this License, if you modify the |
1266 | + Program, your modified version must prominently offer all users |
1267 | + interacting with it remotely through a computer network (if your version |
1268 | + supports such interaction) an opportunity to receive the Corresponding |
1269 | + Source of your version by providing access to the Corresponding Source |
1270 | + from a network server at no charge, through some standard or customary |
1271 | + means of facilitating copying of software. This Corresponding Source |
1272 | + shall include the Corresponding Source for any work covered by version 3 |
1273 | + of the GNU General Public License that is incorporated pursuant to the |
1274 | + following paragraph. |
1275 | + |
1276 | + Notwithstanding any other provision of this License, you have |
1277 | + permission to link or combine any covered work with a work licensed |
1278 | + under version 3 of the GNU General Public License into a single |
1279 | + combined work, and to convey the resulting work. The terms of this |
1280 | + License will continue to apply to the part which is the covered work, |
1281 | + but the work with which it is combined will remain governed by version |
1282 | + 3 of the GNU General Public License. |
1283 | + |
1284 | + 14. Revised Versions of this License. |
1285 | + |
1286 | + The Free Software Foundation may publish revised and/or new versions of |
1287 | + the GNU Affero General Public License from time to time. Such new versions |
1288 | + will be similar in spirit to the present version, but may differ in detail to |
1289 | + address new problems or concerns. |
1290 | + |
1291 | + Each version is given a distinguishing version number. If the |
1292 | + Program specifies that a certain numbered version of the GNU Affero General |
1293 | + Public License "or any later version" applies to it, you have the |
1294 | + option of following the terms and conditions either of that numbered |
1295 | + version or of any later version published by the Free Software |
1296 | + Foundation. If the Program does not specify a version number of the |
1297 | + GNU Affero General Public License, you may choose any version ever published |
1298 | + by the Free Software Foundation. |
1299 | + |
1300 | + If the Program specifies that a proxy can decide which future |
1301 | + versions of the GNU Affero General Public License can be used, that proxy's |
1302 | + public statement of acceptance of a version permanently authorizes you |
1303 | + to choose that version for the Program. |
1304 | + |
1305 | + Later license versions may give you additional or different |
1306 | + permissions. However, no additional obligations are imposed on any |
1307 | + author or copyright holder as a result of your choosing to follow a |
1308 | + later version. |
1309 | + |
1310 | + 15. Disclaimer of Warranty. |
1311 | + |
1312 | + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY |
1313 | + APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT |
1314 | + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY |
1315 | + OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, |
1316 | + THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
1317 | + PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM |
1318 | + IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF |
1319 | + ALL NECESSARY SERVICING, REPAIR OR CORRECTION. |
1320 | + |
1321 | + 16. Limitation of Liability. |
1322 | + |
1323 | + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING |
1324 | + WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS |
1325 | + THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY |
1326 | + GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE |
1327 | + USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF |
1328 | + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD |
1329 | + PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), |
1330 | + EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF |
1331 | + SUCH DAMAGES. |
1332 | + |
1333 | + 17. Interpretation of Sections 15 and 16. |
1334 | + |
1335 | + If the disclaimer of warranty and limitation of liability provided |
1336 | + above cannot be given local legal effect according to their terms, |
1337 | + reviewing courts shall apply local law that most closely approximates |
1338 | + an absolute waiver of all civil liability in connection with the |
1339 | + Program, unless a warranty or assumption of liability accompanies a |
1340 | + copy of the Program in return for a fee. |
1341 | + |
1342 | + END OF TERMS AND CONDITIONS |
1343 | + |
1344 | + How to Apply These Terms to Your New Programs |
1345 | + |
1346 | + If you develop a new program, and you want it to be of the greatest |
1347 | + possible use to the public, the best way to achieve this is to make it |
1348 | + free software which everyone can redistribute and change under these terms. |
1349 | + |
1350 | + To do so, attach the following notices to the program. It is safest |
1351 | + to attach them to the start of each source file to most effectively |
1352 | + state the exclusion of warranty; and each file should have at least |
1353 | + the "copyright" line and a pointer to where the full notice is found. |
1354 | + |
1355 | + <one line to give the program's name and a brief idea of what it does.> |
1356 | + Copyright (C) <year> <name of author> |
1357 | + |
1358 | + This program is free software: you can redistribute it and/or modify |
1359 | + it under the terms of the GNU Affero General Public License as published by |
1360 | + the Free Software Foundation, either version 3 of the License, or |
1361 | + (at your option) any later version. |
1362 | + |
1363 | + This program is distributed in the hope that it will be useful, |
1364 | + but WITHOUT ANY WARRANTY; without even the implied warranty of |
1365 | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1366 | + GNU Affero General Public License for more details. |
1367 | + |
1368 | + You should have received a copy of the GNU Affero General Public License |
1369 | + along with this program. If not, see <https://www.gnu.org/licenses/>. |
1370 | + |
1371 | + Also add information on how to contact you by electronic and paper mail. |
1372 | + |
1373 | + If your software can interact with users remotely through a computer |
1374 | + network, you should also make sure that it provides a way for users to |
1375 | + get its source. For example, if your program is a web application, its |
1376 | + interface could display a "Source" link that leads users to an archive |
1377 | + of the code. There are many ways you could offer source, and different |
1378 | + solutions will be better for different programs; see section 13 for the |
1379 | + specific requirements. |
1380 | + |
1381 | + You should also get your employer (if you work as a programmer) or school, |
1382 | + if any, to sign a "copyright disclaimer" for the program, if necessary. |
1383 | + For more information on this, and how to apply and follow the GNU AGPL, see |
1384 | + <https://www.gnu.org/licenses/>. |
1385 | diff --git a/README.md b/README.md |
1386 | index 98ba0f3..9b6b5be 100644 |
1387 | --- a/README.md |
1388 | +++ b/README.md |
1389 | @@ -1,5 +1,34 @@ |
1390 | # Papyri |
1391 | |
1392 | Papyri is a [OCI Distribution Spec](https://github.com/opencontainers/distribution-spec) |
1393 | - compliant container registry that is usable as a standalone application or |
1394 | - consumable as a Rust library. |
1395 | + compliant container registry that is consumable as a Rust library for use with |
1396 | + [axum](https://github.com/tokio-rs/axum). An example server is provided for |
1397 | + illistrative purposes and a full-featured standalone container registry might |
1398 | + be implemented in the future. This library is intended to be used in |
1399 | + [Ayllu](https://ayllu-forge.org) but may be useful elsewhere. |
1400 | + |
1401 | + Note that this code has only been tested for use with Podman. |
1402 | + |
1403 | + |
1404 | + ## Running the Example |
1405 | + |
1406 | + First add a new insecure registry to your `/etc/containers/registries.conf`. |
1407 | + |
1408 | + ```toml |
1409 | + [[registry]] |
1410 | + location = "localhost:8700" |
1411 | + insecure = true |
1412 | + ``` |
1413 | + |
1414 | + Then run the example server: |
1415 | + |
1416 | + ```sh |
1417 | + cargo run --example=server |
1418 | + ``` |
1419 | + And finally interact with the dev server: |
1420 | + |
1421 | + ```sh |
1422 | + podman login localhost:8700 |
1423 | + podman tag alpine:3 localhost:8700/alpine:3 |
1424 | + podman push localhost:8700/alpine:3 |
1425 | + ``` |
1426 | diff --git a/examples/custom.rs b/examples/custom.rs |
1427 | new file mode 100644 |
1428 | index 0000000..419f71c |
1429 | --- /dev/null |
1430 | +++ b/examples/custom.rs |
1431 | @@ -0,0 +1,13 @@ |
1432 | + use std::{error::Error, path::Path}; |
1433 | + |
1434 | + use papyri::{oci_interface::OciInterface, storage}; |
1435 | + |
1436 | + #[tokio::main] |
1437 | + async fn main() -> Result<(), Box<dyn Error>> { |
1438 | + let fs = storage::Storage::FileSystem { |
1439 | + base: Path::new("registry").to_path_buf(), |
1440 | + }; |
1441 | + fs.init()?; |
1442 | + let _ = OciInterface {storage: fs}; |
1443 | + Ok(()) |
1444 | + } |
1445 | diff --git a/examples/server.rs b/examples/server.rs |
1446 | new file mode 100644 |
1447 | index 0000000..851913d |
1448 | --- /dev/null |
1449 | +++ b/examples/server.rs |
1450 | @@ -0,0 +1,52 @@ |
1451 | + use std::{collections::HashMap, error::Error, path::Path, str::FromStr}; |
1452 | + |
1453 | + use axum::{Router, extract::Request}; |
1454 | + use papyri::storage::Storage; |
1455 | + use tower::Layer; |
1456 | + use tower_http::{normalize_path::NormalizePathLayer, trace::TraceLayer}; |
1457 | + use tracing::{event, info_span, trace, Level}; |
1458 | + |
1459 | + const ADDRESS: &str = "127.0.0.1:8700"; |
1460 | + |
1461 | + const LEVEL: &str = "DEBUG"; |
1462 | + |
1463 | + #[tokio::main] |
1464 | + async fn main() -> Result<(), Box<dyn Error>> { |
1465 | + tracing_subscriber::fmt() |
1466 | + .compact() |
1467 | + .with_line_number(true) |
1468 | + .with_max_level(Level::from_str(LEVEL).unwrap()) |
1469 | + .init(); |
1470 | + |
1471 | + let listener = tokio::net::TcpListener::bind(ADDRESS).await?; |
1472 | + tracing::info!("listening @ {}", ADDRESS); |
1473 | + |
1474 | + let fs = Storage::FileSystem { |
1475 | + base: Path::new("registry").to_path_buf(), |
1476 | + }; |
1477 | + fs.init()?; |
1478 | + |
1479 | + // Registry middleware must be wrapped with namespace extraction/rewrite. |
1480 | + let registry = papyri::axum::router(&fs); |
1481 | + let middleware = tower::util::MapRequestLayer::new(papyri::axum::extract_namespace); |
1482 | + |
1483 | + let router = |
1484 | + Router::new() |
1485 | + .nest_service("/v2/", middleware.layer(registry)) |
1486 | + .layer(TraceLayer::new_for_http().make_span_with( |
1487 | + |req: &Request<_>| { |
1488 | + let headers: Vec<(String, String)> = req.headers().iter().map(|(key, value)| (key.to_string(), value.to_str().unwrap().to_string())).collect(); |
1489 | + let span = info_span!("http_request", method = ?req.method(), uri = req.uri().to_string()); |
1490 | + span.in_scope(|| { |
1491 | + headers.iter().for_each(|(key, value)| { |
1492 | + event!(Level::DEBUG, key = key, value = value); |
1493 | + }) |
1494 | + }); |
1495 | + span |
1496 | + }, |
1497 | + )) |
1498 | + .layer(NormalizePathLayer::trim_trailing_slash()); |
1499 | + |
1500 | + axum::serve(listener, router).await?; |
1501 | + Ok(()) |
1502 | + } |
1503 | diff --git a/framework b/framework |
1504 | new file mode 100644 |
1505 | index 0000000..acdd265 |
1506 | --- /dev/null |
1507 | +++ b/framework |
1508 | @@ -0,0 +1,2475 @@ |
1509 | + <html> |
1510 | + <head> |
1511 | + <title>OCI Distribution Conformance Tests</title> |
1512 | + <style> |
1513 | + body { |
1514 | + padding: 10px 20px 10px 20px; |
1515 | + font-family: -apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol; |
1516 | + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQYV2Pce7zwv7NlPyMDFMAZGAIwlRgqAFydCAVv5m4UAAAAAElFTkSuQmCC") repeat; |
1517 | + |
1518 | + } |
1519 | + table { |
1520 | + border-collapse: collapse; |
1521 | + width: 100%; |
1522 | + background-color: white; |
1523 | + } |
1524 | + th, td { |
1525 | + padding: 12px; |
1526 | + text-align: left; |
1527 | + border-bottom: 1px solid #ddd; |
1528 | + } |
1529 | + tr:hover { |
1530 | + background-color: #ffe39b; |
1531 | + } |
1532 | + .result { |
1533 | + padding: 1.25em 0 .25em 0.8em; |
1534 | + border: 1px solid #e1e1e1; |
1535 | + border-radius: 5px; |
1536 | + margin-top: 10px; |
1537 | + } |
1538 | + .red { |
1539 | + background: #ffc8c8; |
1540 | + } |
1541 | + pre.fail-message { |
1542 | + background: #f9a5a5; |
1543 | + padding: 20px; |
1544 | + margin-right: 10px; |
1545 | + display: inline-block; |
1546 | + border-radius: 4px; |
1547 | + font-size: 1.25em; |
1548 | + width: 94%; |
1549 | + overflow-x: auto; |
1550 | + max-width: 85%; |
1551 | + } |
1552 | + .green { |
1553 | + background: #c8ffc8; |
1554 | + padding: 1.25em 0 1.25em 0.8em; |
1555 | + } |
1556 | + .grey { |
1557 | + background: lightgrey; |
1558 | + padding: 1.25em 0 1.25em 0.8em; |
1559 | + } |
1560 | + .toggle { |
1561 | + border: 2px solid #3e3e3e; |
1562 | + cursor: pointer; |
1563 | + width: 1em; |
1564 | + text-align: center; |
1565 | + font-weight: bold; |
1566 | + display: inline; |
1567 | + font-family: monospace; |
1568 | + padding: 0 .25em 0 .25em; |
1569 | + margin: 1em 1em 1em 0; |
1570 | + font-size: 12pt; |
1571 | + color: #3e3e3e; |
1572 | + border-radius: 3px; |
1573 | + } |
1574 | + pre.pre-box { |
1575 | + background: #343a40; |
1576 | + color: #fff; |
1577 | + padding: 10px; |
1578 | + border: 1px solid gray; |
1579 | + display: inline-block; |
1580 | + border-radius: 4px; |
1581 | + width: 97%; |
1582 | + font-size: 1.25em; |
1583 | + overflow-x: auto; |
1584 | + max-height: 60em; |
1585 | + overflow-y: auto; |
1586 | + max-width: 85%; |
1587 | + } |
1588 | + .summary { |
1589 | + width: 100%; |
1590 | + height: auto; |
1591 | + padding: 0 0 .5em 0; |
1592 | + border-radius: 6px; |
1593 | + border: 1px solid #cccddd; |
1594 | + background: white; |
1595 | + } |
1596 | + .summary-bullet { |
1597 | + width: 100%; |
1598 | + height: auto; |
1599 | + display: flex; |
1600 | + flex-wrap: wrap; |
1601 | + padding: .5em .1em .1em .5em; |
1602 | + } |
1603 | + .bullet-left { |
1604 | + width: 25%; |
1605 | + font-weight: bold; |
1606 | + font-size: 100%; |
1607 | + } |
1608 | + .bullet-right { |
1609 | + width: auto; |
1610 | + font-family: monospace; |
1611 | + font-size: 110%; |
1612 | + } |
1613 | + .quick-summary { |
1614 | + width: 70%; |
1615 | + display: flex; |
1616 | + margin: 0 auto 0 0; |
1617 | + font-weight: bold; |
1618 | + font-size: 1.2em; |
1619 | + } |
1620 | + .darkgreen { |
1621 | + color: green; |
1622 | + } |
1623 | + .darkred { |
1624 | + color: red; |
1625 | + padding: 0 0 0 2em; |
1626 | + } |
1627 | + .darkgrey { |
1628 | + color: grey; |
1629 | + padding: 0 0 0 2em; |
1630 | + } |
1631 | + .meter { |
1632 | + border: 1px solid black; |
1633 | + margin: 0 .5em 0 auto; |
1634 | + display: flex; |
1635 | + height: 25px; |
1636 | + width: 45%; |
1637 | + } |
1638 | + @media only screen and (max-width: 600px) { |
1639 | + .meter { |
1640 | + display: none; |
1641 | + } |
1642 | + } |
1643 | + .meter-green { |
1644 | + height: 100%; |
1645 | + background: green; |
1646 | + width: 28%; |
1647 | + } |
1648 | + .meter-red { |
1649 | + height: 100%; |
1650 | + background: red; |
1651 | + width: 1%; |
1652 | + } |
1653 | + .meter-grey { |
1654 | + height: 100%; |
1655 | + background: grey; |
1656 | + width: 71%; |
1657 | + } |
1658 | + .subcategory { |
1659 | + background: white; |
1660 | + padding: 0px 20px 20px 20px; |
1661 | + border: 1px solid #cccddd; |
1662 | + border-radius: 6px; |
1663 | + } |
1664 | + h2 { |
1665 | + margin-top: 45px; |
1666 | + } |
1667 | + h4 { |
1668 | + vertical-align: bottom; |
1669 | + cursor: pointer; |
1670 | + } |
1671 | + </style> |
1672 | + <script> |
1673 | + function toggleOutput(id) { |
1674 | + var elem = document.getElementById(id); |
1675 | + var button = document.getElementById(id + "-button"); |
1676 | + if (elem.style['display'] === 'block') { |
1677 | + button.innerHTML = "+"; |
1678 | + elem.style['display'] = 'none'; |
1679 | + } else { |
1680 | + button.innerHTML = "-"; |
1681 | + elem.style['display'] = 'block'; |
1682 | + } |
1683 | + } |
1684 | + </script> |
1685 | + </head> |
1686 | + <body> |
1687 | + <h1>OCI Distribution Conformance Tests</h1> |
1688 | + <table> |
1689 | + <tr> |
1690 | + </tr> |
1691 | + <tr> |
1692 | + <td class="bullet-left">Summary</td> |
1693 | + <td> |
1694 | + <div class="quick-summary"><span class="darkgreen">22 passed</span><span class="darkred">1 failed</span><span class="darkgrey">56 skipped</span><div class="meter"> |
1695 | + <div class="meter-green"></div> |
1696 | + <div class="meter-red"></div> |
1697 | + <div class="meter-grey"></div> |
1698 | + </div> |
1699 | + </div> |
1700 | + </td> |
1701 | + </tr> |
1702 | + <tr> |
1703 | + <td class="bullet-left">Start Time</td> |
1704 | + <td>Apr 13 10:49:52.799 +0000 UTC</td> |
1705 | + </tr> |
1706 | + <tr> |
1707 | + <td class="bullet-left">End Time</td> |
1708 | + <td>Apr 13 10:49:52.968 +0000 UTC</td> |
1709 | + </tr> |
1710 | + <tr> |
1711 | + <td class="bullet-left">Time Elapsed</td> |
1712 | + <td>168.404009ms</td> |
1713 | + </tr> |
1714 | + <tr> |
1715 | + <td class="bullet-left">Test Version</td> |
1716 | + <td>unknown</td> |
1717 | + </tr> |
1718 | + <tr> |
1719 | + <td class="bullet-left">Configuration</td> |
1720 | + <td><div class="bullet-right"> |
1721 | + |
1722 | + OCI_ROOT_URL=http://localhost:5000<br /> |
1723 | + |
1724 | + OCI_NAMESPACE=myorg/myrepo/a<br /> |
1725 | + |
1726 | + OCI_USERNAME=*****<br /> |
1727 | + |
1728 | + OCI_PASSWORD=*****<br /> |
1729 | + |
1730 | + OCI_DEBUG=0<br /> |
1731 | + |
1732 | + OCI_TEST_PULL=1<br /> |
1733 | + |
1734 | + OCI_TEST_PUSH=0<br /> |
1735 | + |
1736 | + OCI_TEST_CONTENT_DISCOVERY=0<br /> |
1737 | + |
1738 | + OCI_TEST_CONTENT_MANAGEMENT=0<br /> |
1739 | + |
1740 | + OCI_HIDE_SKIPPED_WORKFLOWS=0<br /> |
1741 | + |
1742 | + </div></td> |
1743 | + </tr> |
1744 | + </table> |
1745 | + |
1746 | + <div> |
1747 | + |
1748 | + |
1749 | + |
1750 | + |
1751 | + |
1752 | + |
1753 | + <h2>Pull</h2> |
1754 | + <div class="subcategory"> |
1755 | + |
1756 | + |
1757 | + <h3>Setup</h3> |
1758 | + |
1759 | + |
1760 | + |
1761 | + |
1762 | + |
1763 | + |
1764 | + <div class="result green"> |
1765 | + <div id="output-box-1-button" class="toggle" onclick="javascript:toggleOutput('output-box-1')">+</div> |
1766 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-1')">Populate registry with test blob</h4> |
1767 | + <br> |
1768 | + <div id="output-box-1" style="display: none;"> |
1769 | + <pre class="pre-box">DEBUG |
1770 | + ============================================================================== |
1771 | + ~~~ REQUEST ~~~ |
1772 | + POST /v2/myorg/myrepo/a/blobs/uploads/ HTTP/1.1 |
1773 | + HOST : localhost:5000 |
1774 | + HEADERS: |
1775 | + User-Agent: distribution-spec-conformance-tests |
1776 | + BODY : |
1777 | + ***** NO CONTENT ***** |
1778 | + ------------------------------------------------------------------------------ |
1779 | + ~~~ RESPONSE ~~~ |
1780 | + STATUS : 202 Accepted |
1781 | + PROTO : HTTP/1.1 |
1782 | + RECEIVED AT : 2025-04-13T10:49:52.857954489Z |
1783 | + TIME DURATION: 12.910389ms |
1784 | + HEADERS : |
1785 | + Content-Length: 0 |
1786 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
1787 | + Docker-Distribution-Api-Version: registry/2.0 |
1788 | + Docker-Upload-Uuid: 8fc0b397-8d2e-44f5-924f-c841ea801c14 |
1789 | + Location: http://localhost:5000/v2/myorg/myrepo/a/blobs/uploads/8fc0b397-8d2e-44f5-924f-c841ea801c14?_state=***** |
1790 | + Range: 0-0 |
1791 | + X-Content-Type-Options: nosniff |
1792 | + BODY : |
1793 | + |
1794 | + ============================================================================== |
1795 | + |
1796 | + DEBUG |
1797 | + ============================================================================== |
1798 | + ~~~ REQUEST ~~~ |
1799 | + PUT /v2/myorg/myrepo/a/blobs/uploads/8fc0b397-8d2e-44f5-924f-c841ea801c14?_state=*****&digest=sha256%3Ab3a6fe88600709014374f837673294ff2b0890d8ce591f77c2c2824a3391e1bf HTTP/1.1 |
1800 | + HOST : localhost:5000 |
1801 | + HEADERS: |
1802 | + Content-Length: 129 |
1803 | + Content-Type: application/octet-stream |
1804 | + User-Agent: distribution-spec-conformance-tests |
1805 | + BODY : |
1806 | + ***** BODY IS byte(s) (size - 129) ***** |
1807 | + ------------------------------------------------------------------------------ |
1808 | + ~~~ RESPONSE ~~~ |
1809 | + STATUS : 201 Created |
1810 | + PROTO : HTTP/1.1 |
1811 | + RECEIVED AT : 2025-04-13T10:49:52.877569064Z |
1812 | + TIME DURATION: 19.457485ms |
1813 | + HEADERS : |
1814 | + Content-Length: 0 |
1815 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
1816 | + Docker-Content-Digest: sha256:b3a6fe88600709014374f837673294ff2b0890d8ce591f77c2c2824a3391e1bf |
1817 | + Docker-Distribution-Api-Version: registry/2.0 |
1818 | + Location: http://localhost:5000/v2/myorg/myrepo/a/blobs/sha256:b3a6fe88600709014374f837673294ff2b0890d8ce591f77c2c2824a3391e1bf |
1819 | + X-Content-Type-Options: nosniff |
1820 | + BODY : |
1821 | + |
1822 | + ============================================================================== |
1823 | + |
1824 | + </pre> |
1825 | + </div> |
1826 | + </div> |
1827 | + |
1828 | + |
1829 | + |
1830 | + |
1831 | + <div class="result green"> |
1832 | + <div id="output-box-1-button" class="toggle" onclick="javascript:toggleOutput('output-box-1')">+</div> |
1833 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-1')">Populate registry with test blob</h4> |
1834 | + <br> |
1835 | + <div id="output-box-1" style="display: none;"> |
1836 | + <pre class="pre-box">DEBUG |
1837 | + ============================================================================== |
1838 | + ~~~ REQUEST ~~~ |
1839 | + POST /v2/myorg/myrepo/a/blobs/uploads/ HTTP/1.1 |
1840 | + HOST : localhost:5000 |
1841 | + HEADERS: |
1842 | + User-Agent: distribution-spec-conformance-tests |
1843 | + BODY : |
1844 | + ***** NO CONTENT ***** |
1845 | + ------------------------------------------------------------------------------ |
1846 | + ~~~ RESPONSE ~~~ |
1847 | + STATUS : 202 Accepted |
1848 | + PROTO : HTTP/1.1 |
1849 | + RECEIVED AT : 2025-04-13T10:49:52.857954489Z |
1850 | + TIME DURATION: 12.910389ms |
1851 | + HEADERS : |
1852 | + Content-Length: 0 |
1853 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
1854 | + Docker-Distribution-Api-Version: registry/2.0 |
1855 | + Docker-Upload-Uuid: 8fc0b397-8d2e-44f5-924f-c841ea801c14 |
1856 | + Location: http://localhost:5000/v2/myorg/myrepo/a/blobs/uploads/8fc0b397-8d2e-44f5-924f-c841ea801c14?_state=***** |
1857 | + Range: 0-0 |
1858 | + X-Content-Type-Options: nosniff |
1859 | + BODY : |
1860 | + |
1861 | + ============================================================================== |
1862 | + |
1863 | + DEBUG |
1864 | + ============================================================================== |
1865 | + ~~~ REQUEST ~~~ |
1866 | + PUT /v2/myorg/myrepo/a/blobs/uploads/8fc0b397-8d2e-44f5-924f-c841ea801c14?_state=*****&digest=sha256%3Ab3a6fe88600709014374f837673294ff2b0890d8ce591f77c2c2824a3391e1bf HTTP/1.1 |
1867 | + HOST : localhost:5000 |
1868 | + HEADERS: |
1869 | + Content-Length: 129 |
1870 | + Content-Type: application/octet-stream |
1871 | + User-Agent: distribution-spec-conformance-tests |
1872 | + BODY : |
1873 | + ***** BODY IS byte(s) (size - 129) ***** |
1874 | + ------------------------------------------------------------------------------ |
1875 | + ~~~ RESPONSE ~~~ |
1876 | + STATUS : 201 Created |
1877 | + PROTO : HTTP/1.1 |
1878 | + RECEIVED AT : 2025-04-13T10:49:52.877569064Z |
1879 | + TIME DURATION: 19.457485ms |
1880 | + HEADERS : |
1881 | + Content-Length: 0 |
1882 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
1883 | + Docker-Content-Digest: sha256:b3a6fe88600709014374f837673294ff2b0890d8ce591f77c2c2824a3391e1bf |
1884 | + Docker-Distribution-Api-Version: registry/2.0 |
1885 | + Location: http://localhost:5000/v2/myorg/myrepo/a/blobs/sha256:b3a6fe88600709014374f837673294ff2b0890d8ce591f77c2c2824a3391e1bf |
1886 | + X-Content-Type-Options: nosniff |
1887 | + BODY : |
1888 | + |
1889 | + ============================================================================== |
1890 | + |
1891 | + </pre> |
1892 | + </div> |
1893 | + </div> |
1894 | + |
1895 | + |
1896 | + |
1897 | + |
1898 | + <div class="result green"> |
1899 | + <div id="output-box-2-button" class="toggle" onclick="javascript:toggleOutput('output-box-2')">+</div> |
1900 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-2')">Populate registry with test layer</h4> |
1901 | + <br> |
1902 | + <div id="output-box-2" style="display: none;"> |
1903 | + <pre class="pre-box">DEBUG |
1904 | + ============================================================================== |
1905 | + ~~~ REQUEST ~~~ |
1906 | + POST /v2/myorg/myrepo/a/blobs/uploads/ HTTP/1.1 |
1907 | + HOST : localhost:5000 |
1908 | + HEADERS: |
1909 | + User-Agent: distribution-spec-conformance-tests |
1910 | + BODY : |
1911 | + ***** NO CONTENT ***** |
1912 | + ------------------------------------------------------------------------------ |
1913 | + ~~~ RESPONSE ~~~ |
1914 | + STATUS : 202 Accepted |
1915 | + PROTO : HTTP/1.1 |
1916 | + RECEIVED AT : 2025-04-13T10:49:52.89087901Z |
1917 | + TIME DURATION: 12.98874ms |
1918 | + HEADERS : |
1919 | + Content-Length: 0 |
1920 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
1921 | + Docker-Distribution-Api-Version: registry/2.0 |
1922 | + Docker-Upload-Uuid: 4a5b6be7-6c6d-47f7-9c4b-4242723e9540 |
1923 | + Location: http://localhost:5000/v2/myorg/myrepo/a/blobs/uploads/4a5b6be7-6c6d-47f7-9c4b-4242723e9540?_state=***** |
1924 | + Range: 0-0 |
1925 | + X-Content-Type-Options: nosniff |
1926 | + BODY : |
1927 | + |
1928 | + ============================================================================== |
1929 | + |
1930 | + DEBUG |
1931 | + ============================================================================== |
1932 | + ~~~ REQUEST ~~~ |
1933 | + PUT /v2/myorg/myrepo/a/blobs/uploads/4a5b6be7-6c6d-47f7-9c4b-4242723e9540?_state=*****&digest=sha256%3A48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183 HTTP/1.1 |
1934 | + HOST : localhost:5000 |
1935 | + HEADERS: |
1936 | + Content-Length: 168 |
1937 | + Content-Type: application/octet-stream |
1938 | + User-Agent: distribution-spec-conformance-tests |
1939 | + BODY : |
1940 | + ***** BODY IS byte(s) (size - 168) ***** |
1941 | + ------------------------------------------------------------------------------ |
1942 | + ~~~ RESPONSE ~~~ |
1943 | + STATUS : 201 Created |
1944 | + PROTO : HTTP/1.1 |
1945 | + RECEIVED AT : 2025-04-13T10:49:52.910012408Z |
1946 | + TIME DURATION: 18.985691ms |
1947 | + HEADERS : |
1948 | + Content-Length: 0 |
1949 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
1950 | + Docker-Content-Digest: sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183 |
1951 | + Docker-Distribution-Api-Version: registry/2.0 |
1952 | + Location: http://localhost:5000/v2/myorg/myrepo/a/blobs/sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183 |
1953 | + X-Content-Type-Options: nosniff |
1954 | + BODY : |
1955 | + |
1956 | + ============================================================================== |
1957 | + |
1958 | + </pre> |
1959 | + </div> |
1960 | + </div> |
1961 | + |
1962 | + |
1963 | + |
1964 | + |
1965 | + <div class="result green"> |
1966 | + <div id="output-box-4-button" class="toggle" onclick="javascript:toggleOutput('output-box-4')">+</div> |
1967 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-4')">Populate registry with test manifest</h4> |
1968 | + <br> |
1969 | + <div id="output-box-4" style="display: none;"> |
1970 | + <pre class="pre-box">DEBUG |
1971 | + ============================================================================== |
1972 | + ~~~ REQUEST ~~~ |
1973 | + PUT /v2/myorg/myrepo/a/manifests/sha256:34baedb2fd45ee2a83db57722eaece9be6f5b02c61e3fbc2d2812128d080bfc0 HTTP/1.1 |
1974 | + HOST : localhost:5000 |
1975 | + HEADERS: |
1976 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
1977 | + User-Agent: distribution-spec-conformance-tests |
1978 | + BODY : |
1979 | + "ewoJInNjaGVtYVZlcnNpb24iOiAyLAoJIm1lZGlhVHlwZSI6ICJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLm1hbmlmZXN0LnYxK2pzb24iLAoJImNvbmZpZyI6IHsKCQkibWVkaWFUeXBlIjogImFwcGxpY2F0aW9uL3ZuZC5vY2kuaW1hZ2UuY29uZmlnLnYxK2pzb24iLAoJCSJkaWdlc3QiOiAic2hhMjU2OmIzYTZmZTg4NjAwNzA5MDE0Mzc0ZjgzNzY3MzI5NGZmMmIwODkwZDhjZTU5MWY3N2MyYzI4MjRhMzM5MWUxYmYiLAoJCSJzaXplIjogMTI5LAoJCSJkYXRhIjogImV3b0pJbUYxZEdodmNpSTZJQ0p2UkhsWFEyOWlNVWRvU1VjM1VIYzBJaXdLQ1NKaGNtTm9hWFJsWTNSMWNtVWlPaUFpWVcxa05qUWlMQW9KSW05eklqb2dJbXhwYm5WNElpd0tDU0p5YjI5MFpuTWlPaUI3Q2drSkluUjVjR1VpT2lBaWJHRjVaWEp6SWl3S0NRa2laR2xtWmw5cFpITWlPaUJiWFFvSmZRcDkiLAoJCSJuZXdVbnNwZWNpZmllZEZpZWxkIjogImFHVnNiRzhnZDI5eWJHUT0iCgl9LAoJImxheWVycyI6IFsKCQl7CgkJCSJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLm9jaS5pbWFnZS5sYXllci52MS50YXIrZ3ppcCIsCgkJCSJkaWdlc3QiOiAic2hhMjU2OjQ4YWNmZjFkOTE3NTJlOTU3NTI3YzFiNTQxNmU3Mzc2ZDkxMGJjYWNmMDFiOTQ0MTE3NWY4YzI3MGUzNWMxODMiLAoJCQkic2l6ZSI6IDE2OCwKCQkJIm5ld1Vuc3BlY2lmaWVkRmllbGQiOiBudWxsCgkJfQoJXQp9" |
1980 | + ------------------------------------------------------------------------------ |
1981 | + ~~~ RESPONSE ~~~ |
1982 | + STATUS : 201 Created |
1983 | + PROTO : HTTP/1.1 |
1984 | + RECEIVED AT : 2025-04-13T10:49:52.94799338Z |
1985 | + TIME DURATION: 12.786291ms |
1986 | + HEADERS : |
1987 | + Content-Length: 0 |
1988 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
1989 | + Docker-Content-Digest: sha256:34baedb2fd45ee2a83db57722eaece9be6f5b02c61e3fbc2d2812128d080bfc0 |
1990 | + Docker-Distribution-Api-Version: registry/2.0 |
1991 | + Location: http://localhost:5000/v2/myorg/myrepo/a/manifests/sha256:34baedb2fd45ee2a83db57722eaece9be6f5b02c61e3fbc2d2812128d080bfc0 |
1992 | + X-Content-Type-Options: nosniff |
1993 | + BODY : |
1994 | + |
1995 | + ============================================================================== |
1996 | + |
1997 | + </pre> |
1998 | + </div> |
1999 | + </div> |
2000 | + |
2001 | + |
2002 | + |
2003 | + |
2004 | + <div class="result green"> |
2005 | + <div id="output-box-4-button" class="toggle" onclick="javascript:toggleOutput('output-box-4')">+</div> |
2006 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-4')">Populate registry with test manifest</h4> |
2007 | + <br> |
2008 | + <div id="output-box-4" style="display: none;"> |
2009 | + <pre class="pre-box">DEBUG |
2010 | + ============================================================================== |
2011 | + ~~~ REQUEST ~~~ |
2012 | + PUT /v2/myorg/myrepo/a/manifests/sha256:34baedb2fd45ee2a83db57722eaece9be6f5b02c61e3fbc2d2812128d080bfc0 HTTP/1.1 |
2013 | + HOST : localhost:5000 |
2014 | + HEADERS: |
2015 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
2016 | + User-Agent: distribution-spec-conformance-tests |
2017 | + BODY : |
2018 | + "ewoJInNjaGVtYVZlcnNpb24iOiAyLAoJIm1lZGlhVHlwZSI6ICJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLm1hbmlmZXN0LnYxK2pzb24iLAoJImNvbmZpZyI6IHsKCQkibWVkaWFUeXBlIjogImFwcGxpY2F0aW9uL3ZuZC5vY2kuaW1hZ2UuY29uZmlnLnYxK2pzb24iLAoJCSJkaWdlc3QiOiAic2hhMjU2OmIzYTZmZTg4NjAwNzA5MDE0Mzc0ZjgzNzY3MzI5NGZmMmIwODkwZDhjZTU5MWY3N2MyYzI4MjRhMzM5MWUxYmYiLAoJCSJzaXplIjogMTI5LAoJCSJkYXRhIjogImV3b0pJbUYxZEdodmNpSTZJQ0p2UkhsWFEyOWlNVWRvU1VjM1VIYzBJaXdLQ1NKaGNtTm9hWFJsWTNSMWNtVWlPaUFpWVcxa05qUWlMQW9KSW05eklqb2dJbXhwYm5WNElpd0tDU0p5YjI5MFpuTWlPaUI3Q2drSkluUjVjR1VpT2lBaWJHRjVaWEp6SWl3S0NRa2laR2xtWmw5cFpITWlPaUJiWFFvSmZRcDkiLAoJCSJuZXdVbnNwZWNpZmllZEZpZWxkIjogImFHVnNiRzhnZDI5eWJHUT0iCgl9LAoJImxheWVycyI6IFsKCQl7CgkJCSJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLm9jaS5pbWFnZS5sYXllci52MS50YXIrZ3ppcCIsCgkJCSJkaWdlc3QiOiAic2hhMjU2OjQ4YWNmZjFkOTE3NTJlOTU3NTI3YzFiNTQxNmU3Mzc2ZDkxMGJjYWNmMDFiOTQ0MTE3NWY4YzI3MGUzNWMxODMiLAoJCQkic2l6ZSI6IDE2OCwKCQkJIm5ld1Vuc3BlY2lmaWVkRmllbGQiOiBudWxsCgkJfQoJXQp9" |
2019 | + ------------------------------------------------------------------------------ |
2020 | + ~~~ RESPONSE ~~~ |
2021 | + STATUS : 201 Created |
2022 | + PROTO : HTTP/1.1 |
2023 | + RECEIVED AT : 2025-04-13T10:49:52.94799338Z |
2024 | + TIME DURATION: 12.786291ms |
2025 | + HEADERS : |
2026 | + Content-Length: 0 |
2027 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2028 | + Docker-Content-Digest: sha256:34baedb2fd45ee2a83db57722eaece9be6f5b02c61e3fbc2d2812128d080bfc0 |
2029 | + Docker-Distribution-Api-Version: registry/2.0 |
2030 | + Location: http://localhost:5000/v2/myorg/myrepo/a/manifests/sha256:34baedb2fd45ee2a83db57722eaece9be6f5b02c61e3fbc2d2812128d080bfc0 |
2031 | + X-Content-Type-Options: nosniff |
2032 | + BODY : |
2033 | + |
2034 | + ============================================================================== |
2035 | + |
2036 | + </pre> |
2037 | + </div> |
2038 | + </div> |
2039 | + |
2040 | + |
2041 | + |
2042 | + |
2043 | + <div class="result grey"> |
2044 | + <div id="output-box-5-button" class="toggle" onclick="javascript:toggleOutput('output-box-5')">+</div> |
2045 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-5')">Get tag name from environment</h4> |
2046 | + <br> |
2047 | + <div id="output-box-5" style="display: none;"> |
2048 | + <pre class="pre-box">you have skipped this test.</pre> |
2049 | + </div> |
2050 | + </div> |
2051 | + |
2052 | + <br> |
2053 | + |
2054 | + |
2055 | + <h3>Pull blobs</h3> |
2056 | + |
2057 | + |
2058 | + |
2059 | + |
2060 | + |
2061 | + |
2062 | + <div class="result green"> |
2063 | + <div id="output-box-6-button" class="toggle" onclick="javascript:toggleOutput('output-box-6')">+</div> |
2064 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-6')">HEAD request to nonexistent blob should result in 404 response</h4> |
2065 | + <br> |
2066 | + <div id="output-box-6" style="display: none;"> |
2067 | + <pre class="pre-box">DEBUG |
2068 | + ============================================================================== |
2069 | + ~~~ REQUEST ~~~ |
2070 | + HEAD /v2/myorg/myrepo/a/blobs/sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 HTTP/1.1 |
2071 | + HOST : localhost:5000 |
2072 | + HEADERS: |
2073 | + User-Agent: distribution-spec-conformance-tests |
2074 | + BODY : |
2075 | + ***** NO CONTENT ***** |
2076 | + ------------------------------------------------------------------------------ |
2077 | + ~~~ RESPONSE ~~~ |
2078 | + STATUS : 404 Not Found |
2079 | + PROTO : HTTP/1.1 |
2080 | + RECEIVED AT : 2025-04-13T10:49:52.949403031Z |
2081 | + TIME DURATION: 1.007217ms |
2082 | + HEADERS : |
2083 | + Content-Length: 157 |
2084 | + Content-Type: application/json; charset=utf-8 |
2085 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2086 | + Docker-Distribution-Api-Version: registry/2.0 |
2087 | + X-Content-Type-Options: nosniff |
2088 | + BODY : |
2089 | + *** Error: Unable to format response body - "unexpected end of JSON input" *** |
2090 | + |
2091 | + Log Body as-is: |
2092 | + |
2093 | + ============================================================================== |
2094 | + |
2095 | + </pre> |
2096 | + </div> |
2097 | + </div> |
2098 | + |
2099 | + |
2100 | + |
2101 | + |
2102 | + <div class="result green"> |
2103 | + <div id="output-box-7-button" class="toggle" onclick="javascript:toggleOutput('output-box-7')">+</div> |
2104 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-7')">HEAD request to existing blob should yield 200</h4> |
2105 | + <br> |
2106 | + <div id="output-box-7" style="display: none;"> |
2107 | + <pre class="pre-box">DEBUG |
2108 | + ============================================================================== |
2109 | + ~~~ REQUEST ~~~ |
2110 | + HEAD /v2/myorg/myrepo/a/blobs/sha256:13b7ad8050af00074dc5511427cced4f3ca332c05d6a14044a8be80966c6148b HTTP/1.1 |
2111 | + HOST : localhost:5000 |
2112 | + HEADERS: |
2113 | + User-Agent: distribution-spec-conformance-tests |
2114 | + BODY : |
2115 | + ***** NO CONTENT ***** |
2116 | + ------------------------------------------------------------------------------ |
2117 | + ~~~ RESPONSE ~~~ |
2118 | + STATUS : 200 OK |
2119 | + PROTO : HTTP/1.1 |
2120 | + RECEIVED AT : 2025-04-13T10:49:52.950143361Z |
2121 | + TIME DURATION: 567.386µs |
2122 | + HEADERS : |
2123 | + Accept-Ranges: bytes |
2124 | + Cache-Control: max-age=31536000 |
2125 | + Content-Length: 129 |
2126 | + Content-Type: application/octet-stream |
2127 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2128 | + Docker-Content-Digest: sha256:13b7ad8050af00074dc5511427cced4f3ca332c05d6a14044a8be80966c6148b |
2129 | + Docker-Distribution-Api-Version: registry/2.0 |
2130 | + Etag: "sha256:13b7ad8050af00074dc5511427cced4f3ca332c05d6a14044a8be80966c6148b" |
2131 | + X-Content-Type-Options: nosniff |
2132 | + BODY : |
2133 | + |
2134 | + ============================================================================== |
2135 | + |
2136 | + </pre> |
2137 | + </div> |
2138 | + </div> |
2139 | + |
2140 | + |
2141 | + |
2142 | + |
2143 | + <div class="result green"> |
2144 | + <div id="output-box-8-button" class="toggle" onclick="javascript:toggleOutput('output-box-8')">+</div> |
2145 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-8')">GET nonexistent blob should result in 404 response</h4> |
2146 | + <br> |
2147 | + <div id="output-box-8" style="display: none;"> |
2148 | + <pre class="pre-box">DEBUG |
2149 | + ============================================================================== |
2150 | + ~~~ REQUEST ~~~ |
2151 | + GET /v2/myorg/myrepo/a/blobs/sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 HTTP/1.1 |
2152 | + HOST : localhost:5000 |
2153 | + HEADERS: |
2154 | + User-Agent: distribution-spec-conformance-tests |
2155 | + BODY : |
2156 | + ***** NO CONTENT ***** |
2157 | + ------------------------------------------------------------------------------ |
2158 | + ~~~ RESPONSE ~~~ |
2159 | + STATUS : 404 Not Found |
2160 | + PROTO : HTTP/1.1 |
2161 | + RECEIVED AT : 2025-04-13T10:49:52.950889669Z |
2162 | + TIME DURATION: 552.541µs |
2163 | + HEADERS : |
2164 | + Content-Length: 157 |
2165 | + Content-Type: application/json; charset=utf-8 |
2166 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2167 | + Docker-Distribution-Api-Version: registry/2.0 |
2168 | + X-Content-Type-Options: nosniff |
2169 | + BODY : |
2170 | + { |
2171 | + "errors": [ |
2172 | + { |
2173 | + "code": "BLOB_UNKNOWN", |
2174 | + "message": "blob unknown to registry", |
2175 | + "detail": "sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9" |
2176 | + } |
2177 | + ] |
2178 | + } |
2179 | + |
2180 | + ============================================================================== |
2181 | + |
2182 | + </pre> |
2183 | + </div> |
2184 | + </div> |
2185 | + |
2186 | + |
2187 | + |
2188 | + |
2189 | + <div class="result green"> |
2190 | + <div id="output-box-9-button" class="toggle" onclick="javascript:toggleOutput('output-box-9')">+</div> |
2191 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-9')">GET request to existing blob URL should yield 200</h4> |
2192 | + <br> |
2193 | + <div id="output-box-9" style="display: none;"> |
2194 | + <pre class="pre-box">DEBUG |
2195 | + ============================================================================== |
2196 | + ~~~ REQUEST ~~~ |
2197 | + GET /v2/myorg/myrepo/a/blobs/sha256:13b7ad8050af00074dc5511427cced4f3ca332c05d6a14044a8be80966c6148b HTTP/1.1 |
2198 | + HOST : localhost:5000 |
2199 | + HEADERS: |
2200 | + User-Agent: distribution-spec-conformance-tests |
2201 | + BODY : |
2202 | + ***** NO CONTENT ***** |
2203 | + ------------------------------------------------------------------------------ |
2204 | + ~~~ RESPONSE ~~~ |
2205 | + STATUS : 200 OK |
2206 | + PROTO : HTTP/1.1 |
2207 | + RECEIVED AT : 2025-04-13T10:49:52.952908912Z |
2208 | + TIME DURATION: 1.424852ms |
2209 | + HEADERS : |
2210 | + Accept-Ranges: bytes |
2211 | + Cache-Control: max-age=31536000 |
2212 | + Content-Length: 129 |
2213 | + Content-Type: application/octet-stream |
2214 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2215 | + Docker-Content-Digest: sha256:13b7ad8050af00074dc5511427cced4f3ca332c05d6a14044a8be80966c6148b |
2216 | + Docker-Distribution-Api-Version: registry/2.0 |
2217 | + Etag: "sha256:13b7ad8050af00074dc5511427cced4f3ca332c05d6a14044a8be80966c6148b" |
2218 | + X-Content-Type-Options: nosniff |
2219 | + BODY : |
2220 | + { |
2221 | + "author": "XsgewaAE1n-nuS1n", |
2222 | + "architecture": "amd64", |
2223 | + "os": "linux", |
2224 | + "rootfs": { |
2225 | + "type": "layers", |
2226 | + "diff_ids": [] |
2227 | + } |
2228 | + } |
2229 | + ============================================================================== |
2230 | + |
2231 | + </pre> |
2232 | + </div> |
2233 | + </div> |
2234 | + |
2235 | + <br> |
2236 | + |
2237 | + |
2238 | + <h3>Pull manifests</h3> |
2239 | + |
2240 | + |
2241 | + |
2242 | + |
2243 | + |
2244 | + |
2245 | + <div class="result green"> |
2246 | + <div id="output-box-10-button" class="toggle" onclick="javascript:toggleOutput('output-box-10')">+</div> |
2247 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-10')">HEAD request to nonexistent manifest should return 404</h4> |
2248 | + <br> |
2249 | + <div id="output-box-10" style="display: none;"> |
2250 | + <pre class="pre-box">DEBUG |
2251 | + ============================================================================== |
2252 | + ~~~ REQUEST ~~~ |
2253 | + HEAD /v2/myorg/myrepo/a/manifests/.INVALID_MANIFEST_NAME HTTP/1.1 |
2254 | + HOST : localhost:5000 |
2255 | + HEADERS: |
2256 | + User-Agent: distribution-spec-conformance-tests |
2257 | + BODY : |
2258 | + ***** NO CONTENT ***** |
2259 | + ------------------------------------------------------------------------------ |
2260 | + ~~~ RESPONSE ~~~ |
2261 | + STATUS : 404 Not Found |
2262 | + PROTO : HTTP/1.1 |
2263 | + RECEIVED AT : 2025-04-13T10:49:52.953307301Z |
2264 | + TIME DURATION: 134.056µs |
2265 | + HEADERS : |
2266 | + Content-Length: 19 |
2267 | + Content-Type: text/plain; charset=utf-8 |
2268 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2269 | + Docker-Distribution-Api-Version: registry/2.0 |
2270 | + X-Content-Type-Options: nosniff |
2271 | + BODY : |
2272 | + |
2273 | + ============================================================================== |
2274 | + |
2275 | + </pre> |
2276 | + </div> |
2277 | + </div> |
2278 | + |
2279 | + |
2280 | + |
2281 | + |
2282 | + <div class="result green"> |
2283 | + <div id="output-box-11-button" class="toggle" onclick="javascript:toggleOutput('output-box-11')">+</div> |
2284 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-11')">HEAD request to manifest[0] path (digest) should yield 200 response</h4> |
2285 | + <br> |
2286 | + <div id="output-box-11" style="display: none;"> |
2287 | + <pre class="pre-box">DEBUG |
2288 | + ============================================================================== |
2289 | + ~~~ REQUEST ~~~ |
2290 | + HEAD /v2/myorg/myrepo/a/manifests/sha256:0d3190494f1b2b9db0a27d31e1a7a9cfd5cfd24e1c99ecb373b0306082e29896 HTTP/1.1 |
2291 | + HOST : localhost:5000 |
2292 | + HEADERS: |
2293 | + Accept: application/vnd.oci.image.manifest.v1+json |
2294 | + User-Agent: distribution-spec-conformance-tests |
2295 | + BODY : |
2296 | + ***** NO CONTENT ***** |
2297 | + ------------------------------------------------------------------------------ |
2298 | + ~~~ RESPONSE ~~~ |
2299 | + STATUS : 200 OK |
2300 | + PROTO : HTTP/1.1 |
2301 | + RECEIVED AT : 2025-04-13T10:49:52.954106123Z |
2302 | + TIME DURATION: 620.998µs |
2303 | + HEADERS : |
2304 | + Content-Length: 714 |
2305 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
2306 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2307 | + Docker-Content-Digest: sha256:0d3190494f1b2b9db0a27d31e1a7a9cfd5cfd24e1c99ecb373b0306082e29896 |
2308 | + Docker-Distribution-Api-Version: registry/2.0 |
2309 | + Etag: "sha256:0d3190494f1b2b9db0a27d31e1a7a9cfd5cfd24e1c99ecb373b0306082e29896" |
2310 | + X-Content-Type-Options: nosniff |
2311 | + BODY : |
2312 | + *** Error: Unable to format response body - "unexpected end of JSON input" *** |
2313 | + |
2314 | + Log Body as-is: |
2315 | + |
2316 | + ============================================================================== |
2317 | + |
2318 | + </pre> |
2319 | + </div> |
2320 | + </div> |
2321 | + |
2322 | + |
2323 | + |
2324 | + |
2325 | + <div class="result green"> |
2326 | + <div id="output-box-12-button" class="toggle" onclick="javascript:toggleOutput('output-box-12')">+</div> |
2327 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-12')">HEAD request to manifest[1] path (digest) should yield 200 response</h4> |
2328 | + <br> |
2329 | + <div id="output-box-12" style="display: none;"> |
2330 | + <pre class="pre-box">DEBUG |
2331 | + ============================================================================== |
2332 | + ~~~ REQUEST ~~~ |
2333 | + HEAD /v2/myorg/myrepo/a/manifests/sha256:34baedb2fd45ee2a83db57722eaece9be6f5b02c61e3fbc2d2812128d080bfc0 HTTP/1.1 |
2334 | + HOST : localhost:5000 |
2335 | + HEADERS: |
2336 | + Accept: application/vnd.oci.image.manifest.v1+json |
2337 | + User-Agent: distribution-spec-conformance-tests |
2338 | + BODY : |
2339 | + ***** NO CONTENT ***** |
2340 | + ------------------------------------------------------------------------------ |
2341 | + ~~~ RESPONSE ~~~ |
2342 | + STATUS : 200 OK |
2343 | + PROTO : HTTP/1.1 |
2344 | + RECEIVED AT : 2025-04-13T10:49:52.95487287Z |
2345 | + TIME DURATION: 576.497µs |
2346 | + HEADERS : |
2347 | + Content-Length: 714 |
2348 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
2349 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2350 | + Docker-Content-Digest: sha256:34baedb2fd45ee2a83db57722eaece9be6f5b02c61e3fbc2d2812128d080bfc0 |
2351 | + Docker-Distribution-Api-Version: registry/2.0 |
2352 | + Etag: "sha256:34baedb2fd45ee2a83db57722eaece9be6f5b02c61e3fbc2d2812128d080bfc0" |
2353 | + X-Content-Type-Options: nosniff |
2354 | + BODY : |
2355 | + *** Error: Unable to format response body - "unexpected end of JSON input" *** |
2356 | + |
2357 | + Log Body as-is: |
2358 | + |
2359 | + ============================================================================== |
2360 | + |
2361 | + </pre> |
2362 | + </div> |
2363 | + </div> |
2364 | + |
2365 | + |
2366 | + |
2367 | + |
2368 | + <div class="result green"> |
2369 | + <div id="output-box-13-button" class="toggle" onclick="javascript:toggleOutput('output-box-13')">+</div> |
2370 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-13')">HEAD request to manifest path (tag) should yield 200 response</h4> |
2371 | + <br> |
2372 | + <div id="output-box-13" style="display: none;"> |
2373 | + <pre class="pre-box">DEBUG |
2374 | + ============================================================================== |
2375 | + ~~~ REQUEST ~~~ |
2376 | + HEAD /v2/myorg/myrepo/a/manifests/tagtest0 HTTP/1.1 |
2377 | + HOST : localhost:5000 |
2378 | + HEADERS: |
2379 | + Accept: application/vnd.oci.image.manifest.v1+json |
2380 | + User-Agent: distribution-spec-conformance-tests |
2381 | + BODY : |
2382 | + ***** NO CONTENT ***** |
2383 | + ------------------------------------------------------------------------------ |
2384 | + ~~~ RESPONSE ~~~ |
2385 | + STATUS : 200 OK |
2386 | + PROTO : HTTP/1.1 |
2387 | + RECEIVED AT : 2025-04-13T10:49:52.95567204Z |
2388 | + TIME DURATION: 615.656µs |
2389 | + HEADERS : |
2390 | + Content-Length: 714 |
2391 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
2392 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2393 | + Docker-Content-Digest: sha256:0d3190494f1b2b9db0a27d31e1a7a9cfd5cfd24e1c99ecb373b0306082e29896 |
2394 | + Docker-Distribution-Api-Version: registry/2.0 |
2395 | + Etag: "sha256:0d3190494f1b2b9db0a27d31e1a7a9cfd5cfd24e1c99ecb373b0306082e29896" |
2396 | + X-Content-Type-Options: nosniff |
2397 | + BODY : |
2398 | + *** Error: Unable to format response body - "unexpected end of JSON input" *** |
2399 | + |
2400 | + Log Body as-is: |
2401 | + |
2402 | + ============================================================================== |
2403 | + |
2404 | + </pre> |
2405 | + </div> |
2406 | + </div> |
2407 | + |
2408 | + |
2409 | + |
2410 | + |
2411 | + <div class="result green"> |
2412 | + <div id="output-box-14-button" class="toggle" onclick="javascript:toggleOutput('output-box-14')">+</div> |
2413 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-14')">GET nonexistent manifest should return 404</h4> |
2414 | + <br> |
2415 | + <div id="output-box-14" style="display: none;"> |
2416 | + <pre class="pre-box">DEBUG |
2417 | + ============================================================================== |
2418 | + ~~~ REQUEST ~~~ |
2419 | + GET /v2/myorg/myrepo/a/manifests/.INVALID_MANIFEST_NAME HTTP/1.1 |
2420 | + HOST : localhost:5000 |
2421 | + HEADERS: |
2422 | + User-Agent: distribution-spec-conformance-tests |
2423 | + BODY : |
2424 | + ***** NO CONTENT ***** |
2425 | + ------------------------------------------------------------------------------ |
2426 | + ~~~ RESPONSE ~~~ |
2427 | + STATUS : 404 Not Found |
2428 | + PROTO : HTTP/1.1 |
2429 | + RECEIVED AT : 2025-04-13T10:49:52.955981367Z |
2430 | + TIME DURATION: 121.869µs |
2431 | + HEADERS : |
2432 | + Content-Length: 19 |
2433 | + Content-Type: text/plain; charset=utf-8 |
2434 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2435 | + Docker-Distribution-Api-Version: registry/2.0 |
2436 | + X-Content-Type-Options: nosniff |
2437 | + BODY : |
2438 | + 404 page not found |
2439 | + ============================================================================== |
2440 | + |
2441 | + </pre> |
2442 | + </div> |
2443 | + </div> |
2444 | + |
2445 | + |
2446 | + |
2447 | + |
2448 | + <div class="result green"> |
2449 | + <div id="output-box-15-button" class="toggle" onclick="javascript:toggleOutput('output-box-15')">+</div> |
2450 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-15')">GET request to manifest[0] path (digest) should yield 200 response</h4> |
2451 | + <br> |
2452 | + <div id="output-box-15" style="display: none;"> |
2453 | + <pre class="pre-box">DEBUG |
2454 | + ============================================================================== |
2455 | + ~~~ REQUEST ~~~ |
2456 | + GET /v2/myorg/myrepo/a/manifests/sha256:0d3190494f1b2b9db0a27d31e1a7a9cfd5cfd24e1c99ecb373b0306082e29896 HTTP/1.1 |
2457 | + HOST : localhost:5000 |
2458 | + HEADERS: |
2459 | + Accept: application/vnd.oci.image.manifest.v1+json |
2460 | + User-Agent: distribution-spec-conformance-tests |
2461 | + BODY : |
2462 | + ***** NO CONTENT ***** |
2463 | + ------------------------------------------------------------------------------ |
2464 | + ~~~ RESPONSE ~~~ |
2465 | + STATUS : 200 OK |
2466 | + PROTO : HTTP/1.1 |
2467 | + RECEIVED AT : 2025-04-13T10:49:52.956748392Z |
2468 | + TIME DURATION: 607.981µs |
2469 | + HEADERS : |
2470 | + Content-Length: 714 |
2471 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
2472 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2473 | + Docker-Content-Digest: sha256:0d3190494f1b2b9db0a27d31e1a7a9cfd5cfd24e1c99ecb373b0306082e29896 |
2474 | + Docker-Distribution-Api-Version: registry/2.0 |
2475 | + Etag: "sha256:0d3190494f1b2b9db0a27d31e1a7a9cfd5cfd24e1c99ecb373b0306082e29896" |
2476 | + X-Content-Type-Options: nosniff |
2477 | + BODY : |
2478 | + { |
2479 | + "schemaVersion": 2, |
2480 | + "mediaType": "application/vnd.oci.image.manifest.v1+json", |
2481 | + "config": { |
2482 | + "mediaType": "application/vnd.oci.image.config.v1+json", |
2483 | + "digest": "sha256:13b7ad8050af00074dc5511427cced4f3ca332c05d6a14044a8be80966c6148b", |
2484 | + "size": 129, |
2485 | + "data": "ewoJImF1dGhvciI6ICJYc2dld2FBRTFuLW51UzFuIiwKCSJhcmNoaXRlY3R1cmUiOiAiYW1kNjQiLAoJIm9zIjogImxpbnV4IiwKCSJyb290ZnMiOiB7CgkJInR5cGUiOiAibGF5ZXJzIiwKCQkiZGlmZl9pZHMiOiBbXQoJfQp9", |
2486 | + "newUnspecifiedField": "aGVsbG8gd29ybGQ=" |
2487 | + }, |
2488 | + "layers": [ |
2489 | + { |
2490 | + "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", |
2491 | + "digest": "sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183", |
2492 | + "size": 168, |
2493 | + "newUnspecifiedField": null |
2494 | + } |
2495 | + ] |
2496 | + } |
2497 | + ============================================================================== |
2498 | + |
2499 | + </pre> |
2500 | + </div> |
2501 | + </div> |
2502 | + |
2503 | + |
2504 | + |
2505 | + |
2506 | + <div class="result green"> |
2507 | + <div id="output-box-16-button" class="toggle" onclick="javascript:toggleOutput('output-box-16')">+</div> |
2508 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-16')">GET request to manifest[1] path (digest) should yield 200 response</h4> |
2509 | + <br> |
2510 | + <div id="output-box-16" style="display: none;"> |
2511 | + <pre class="pre-box">DEBUG |
2512 | + ============================================================================== |
2513 | + ~~~ REQUEST ~~~ |
2514 | + GET /v2/myorg/myrepo/a/manifests/sha256:34baedb2fd45ee2a83db57722eaece9be6f5b02c61e3fbc2d2812128d080bfc0 HTTP/1.1 |
2515 | + HOST : localhost:5000 |
2516 | + HEADERS: |
2517 | + Accept: application/vnd.oci.image.manifest.v1+json |
2518 | + User-Agent: distribution-spec-conformance-tests |
2519 | + BODY : |
2520 | + ***** NO CONTENT ***** |
2521 | + ------------------------------------------------------------------------------ |
2522 | + ~~~ RESPONSE ~~~ |
2523 | + STATUS : 200 OK |
2524 | + PROTO : HTTP/1.1 |
2525 | + RECEIVED AT : 2025-04-13T10:49:52.957666304Z |
2526 | + TIME DURATION: 618.218µs |
2527 | + HEADERS : |
2528 | + Content-Length: 714 |
2529 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
2530 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2531 | + Docker-Content-Digest: sha256:34baedb2fd45ee2a83db57722eaece9be6f5b02c61e3fbc2d2812128d080bfc0 |
2532 | + Docker-Distribution-Api-Version: registry/2.0 |
2533 | + Etag: "sha256:34baedb2fd45ee2a83db57722eaece9be6f5b02c61e3fbc2d2812128d080bfc0" |
2534 | + X-Content-Type-Options: nosniff |
2535 | + BODY : |
2536 | + { |
2537 | + "schemaVersion": 2, |
2538 | + "mediaType": "application/vnd.oci.image.manifest.v1+json", |
2539 | + "config": { |
2540 | + "mediaType": "application/vnd.oci.image.config.v1+json", |
2541 | + "digest": "sha256:b3a6fe88600709014374f837673294ff2b0890d8ce591f77c2c2824a3391e1bf", |
2542 | + "size": 129, |
2543 | + "data": "ewoJImF1dGhvciI6ICJvRHlXQ29iMUdoSUc3UHc0IiwKCSJhcmNoaXRlY3R1cmUiOiAiYW1kNjQiLAoJIm9zIjogImxpbnV4IiwKCSJyb290ZnMiOiB7CgkJInR5cGUiOiAibGF5ZXJzIiwKCQkiZGlmZl9pZHMiOiBbXQoJfQp9", |
2544 | + "newUnspecifiedField": "aGVsbG8gd29ybGQ=" |
2545 | + }, |
2546 | + "layers": [ |
2547 | + { |
2548 | + "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", |
2549 | + "digest": "sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183", |
2550 | + "size": 168, |
2551 | + "newUnspecifiedField": null |
2552 | + } |
2553 | + ] |
2554 | + } |
2555 | + ============================================================================== |
2556 | + |
2557 | + </pre> |
2558 | + </div> |
2559 | + </div> |
2560 | + |
2561 | + |
2562 | + |
2563 | + |
2564 | + <div class="result green"> |
2565 | + <div id="output-box-17-button" class="toggle" onclick="javascript:toggleOutput('output-box-17')">+</div> |
2566 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-17')">GET request to manifest path (tag) should yield 200 response</h4> |
2567 | + <br> |
2568 | + <div id="output-box-17" style="display: none;"> |
2569 | + <pre class="pre-box">DEBUG |
2570 | + ============================================================================== |
2571 | + ~~~ REQUEST ~~~ |
2572 | + GET /v2/myorg/myrepo/a/manifests/tagtest0 HTTP/1.1 |
2573 | + HOST : localhost:5000 |
2574 | + HEADERS: |
2575 | + Accept: application/vnd.oci.image.manifest.v1+json |
2576 | + User-Agent: distribution-spec-conformance-tests |
2577 | + BODY : |
2578 | + ***** NO CONTENT ***** |
2579 | + ------------------------------------------------------------------------------ |
2580 | + ~~~ RESPONSE ~~~ |
2581 | + STATUS : 200 OK |
2582 | + PROTO : HTTP/1.1 |
2583 | + RECEIVED AT : 2025-04-13T10:49:52.958468578Z |
2584 | + TIME DURATION: 537.533µs |
2585 | + HEADERS : |
2586 | + Content-Length: 714 |
2587 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
2588 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2589 | + Docker-Content-Digest: sha256:0d3190494f1b2b9db0a27d31e1a7a9cfd5cfd24e1c99ecb373b0306082e29896 |
2590 | + Docker-Distribution-Api-Version: registry/2.0 |
2591 | + Etag: "sha256:0d3190494f1b2b9db0a27d31e1a7a9cfd5cfd24e1c99ecb373b0306082e29896" |
2592 | + X-Content-Type-Options: nosniff |
2593 | + BODY : |
2594 | + { |
2595 | + "schemaVersion": 2, |
2596 | + "mediaType": "application/vnd.oci.image.manifest.v1+json", |
2597 | + "config": { |
2598 | + "mediaType": "application/vnd.oci.image.config.v1+json", |
2599 | + "digest": "sha256:13b7ad8050af00074dc5511427cced4f3ca332c05d6a14044a8be80966c6148b", |
2600 | + "size": 129, |
2601 | + "data": "ewoJImF1dGhvciI6ICJYc2dld2FBRTFuLW51UzFuIiwKCSJhcmNoaXRlY3R1cmUiOiAiYW1kNjQiLAoJIm9zIjogImxpbnV4IiwKCSJyb290ZnMiOiB7CgkJInR5cGUiOiAibGF5ZXJzIiwKCQkiZGlmZl9pZHMiOiBbXQoJfQp9", |
2602 | + "newUnspecifiedField": "aGVsbG8gd29ybGQ=" |
2603 | + }, |
2604 | + "layers": [ |
2605 | + { |
2606 | + "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", |
2607 | + "digest": "sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183", |
2608 | + "size": 168, |
2609 | + "newUnspecifiedField": null |
2610 | + } |
2611 | + ] |
2612 | + } |
2613 | + ============================================================================== |
2614 | + |
2615 | + </pre> |
2616 | + </div> |
2617 | + </div> |
2618 | + |
2619 | + <br> |
2620 | + |
2621 | + |
2622 | + <h3>Error codes</h3> |
2623 | + |
2624 | + |
2625 | + |
2626 | + |
2627 | + |
2628 | + |
2629 | + <div class="result red"> |
2630 | + <div id="output-box-18-button" class="toggle" onclick="javascript:toggleOutput('output-box-18')">+</div> |
2631 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-18')">400 response body should contain OCI-conforming JSON message</h4> |
2632 | + <br> |
2633 | + <div> |
2634 | + <div id="output-box-18" style="display: none;"> |
2635 | + <pre class="pre-box">DEBUG |
2636 | + ============================================================================== |
2637 | + ~~~ REQUEST ~~~ |
2638 | + GET /v2/myorg/myrepo/a/manifests/sha256:totallywrong HTTP/1.1 |
2639 | + HOST : localhost:5000 |
2640 | + HEADERS: |
2641 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
2642 | + User-Agent: distribution-spec-conformance-tests |
2643 | + BODY : |
2644 | + ***** NO CONTENT ***** |
2645 | + ------------------------------------------------------------------------------ |
2646 | + ~~~ RESPONSE ~~~ |
2647 | + STATUS : 500 Internal Server Error |
2648 | + PROTO : HTTP/1.1 |
2649 | + RECEIVED AT : 2025-04-13T10:49:52.959279296Z |
2650 | + TIME DURATION: 545.865µs |
2651 | + HEADERS : |
2652 | + Content-Length: 201 |
2653 | + Content-Type: application/json; charset=utf-8 |
2654 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2655 | + Docker-Distribution-Api-Version: registry/2.0 |
2656 | + X-Content-Type-Options: nosniff |
2657 | + BODY : |
2658 | + { |
2659 | + "errors": [ |
2660 | + { |
2661 | + "code": "UNKNOWN", |
2662 | + "message": "unknown error", |
2663 | + "detail": { |
2664 | + "Path": "/docker/registry/v2/repositories/myorg/myrepo/a/_manifests/tags/sha256:totallywrong/current/link", |
2665 | + "DriverName": "filesystem" |
2666 | + } |
2667 | + } |
2668 | + ] |
2669 | + } |
2670 | + |
2671 | + ============================================================================== |
2672 | + |
2673 | + </pre> |
2674 | + </div> |
2675 | + </div> |
2676 | + <pre class="fail-message">Expected |
2677 | + <int>: 500 |
2678 | + To satisfy at least one of these matchers: [%!s(*matchers.EqualMatcher=&{400}) %!s(*matchers.EqualMatcher=&{404})]</pre> |
2679 | + <br> |
2680 | + </div> |
2681 | + |
2682 | + <br> |
2683 | + |
2684 | + |
2685 | + <h3>Teardown</h3> |
2686 | + |
2687 | + |
2688 | + |
2689 | + |
2690 | + |
2691 | + |
2692 | + <div class="result green"> |
2693 | + <div id="output-box-19-button" class="toggle" onclick="javascript:toggleOutput('output-box-19')">+</div> |
2694 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-19')">Delete config[0] blob created in setup</h4> |
2695 | + <br> |
2696 | + <div id="output-box-19" style="display: none;"> |
2697 | + <pre class="pre-box">DEBUG |
2698 | + ============================================================================== |
2699 | + ~~~ REQUEST ~~~ |
2700 | + DELETE /v2/myorg/myrepo/a/blobs/sha256:13b7ad8050af00074dc5511427cced4f3ca332c05d6a14044a8be80966c6148b HTTP/1.1 |
2701 | + HOST : localhost:5000 |
2702 | + HEADERS: |
2703 | + User-Agent: distribution-spec-conformance-tests |
2704 | + BODY : |
2705 | + ***** NO CONTENT ***** |
2706 | + ------------------------------------------------------------------------------ |
2707 | + ~~~ RESPONSE ~~~ |
2708 | + STATUS : 405 Method Not Allowed |
2709 | + PROTO : HTTP/1.1 |
2710 | + RECEIVED AT : 2025-04-13T10:49:52.960047618Z |
2711 | + TIME DURATION: 439.82µs |
2712 | + HEADERS : |
2713 | + Content-Length: 78 |
2714 | + Content-Type: application/json; charset=utf-8 |
2715 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2716 | + Docker-Distribution-Api-Version: registry/2.0 |
2717 | + X-Content-Type-Options: nosniff |
2718 | + BODY : |
2719 | + { |
2720 | + "errors": [ |
2721 | + { |
2722 | + "code": "UNSUPPORTED", |
2723 | + "message": "The operation is unsupported." |
2724 | + } |
2725 | + ] |
2726 | + } |
2727 | + |
2728 | + ============================================================================== |
2729 | + |
2730 | + </pre> |
2731 | + </div> |
2732 | + </div> |
2733 | + |
2734 | + |
2735 | + |
2736 | + |
2737 | + <div class="result green"> |
2738 | + <div id="output-box-20-button" class="toggle" onclick="javascript:toggleOutput('output-box-20')">+</div> |
2739 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-20')">Delete config[1] blob created in setup</h4> |
2740 | + <br> |
2741 | + <div id="output-box-20" style="display: none;"> |
2742 | + <pre class="pre-box">DEBUG |
2743 | + ============================================================================== |
2744 | + ~~~ REQUEST ~~~ |
2745 | + DELETE /v2/myorg/myrepo/a/blobs/sha256:b3a6fe88600709014374f837673294ff2b0890d8ce591f77c2c2824a3391e1bf HTTP/1.1 |
2746 | + HOST : localhost:5000 |
2747 | + HEADERS: |
2748 | + User-Agent: distribution-spec-conformance-tests |
2749 | + BODY : |
2750 | + ***** NO CONTENT ***** |
2751 | + ------------------------------------------------------------------------------ |
2752 | + ~~~ RESPONSE ~~~ |
2753 | + STATUS : 405 Method Not Allowed |
2754 | + PROTO : HTTP/1.1 |
2755 | + RECEIVED AT : 2025-04-13T10:49:52.960663143Z |
2756 | + TIME DURATION: 446.135µs |
2757 | + HEADERS : |
2758 | + Content-Length: 78 |
2759 | + Content-Type: application/json; charset=utf-8 |
2760 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2761 | + Docker-Distribution-Api-Version: registry/2.0 |
2762 | + X-Content-Type-Options: nosniff |
2763 | + BODY : |
2764 | + { |
2765 | + "errors": [ |
2766 | + { |
2767 | + "code": "UNSUPPORTED", |
2768 | + "message": "The operation is unsupported." |
2769 | + } |
2770 | + ] |
2771 | + } |
2772 | + |
2773 | + ============================================================================== |
2774 | + |
2775 | + </pre> |
2776 | + </div> |
2777 | + </div> |
2778 | + |
2779 | + |
2780 | + |
2781 | + |
2782 | + <div class="result green"> |
2783 | + <div id="output-box-21-button" class="toggle" onclick="javascript:toggleOutput('output-box-21')">+</div> |
2784 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-21')">Delete layer blob created in setup</h4> |
2785 | + <br> |
2786 | + <div id="output-box-21" style="display: none;"> |
2787 | + <pre class="pre-box">DEBUG |
2788 | + ============================================================================== |
2789 | + ~~~ REQUEST ~~~ |
2790 | + DELETE /v2/myorg/myrepo/a/blobs/sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183 HTTP/1.1 |
2791 | + HOST : localhost:5000 |
2792 | + HEADERS: |
2793 | + User-Agent: distribution-spec-conformance-tests |
2794 | + BODY : |
2795 | + ***** NO CONTENT ***** |
2796 | + ------------------------------------------------------------------------------ |
2797 | + ~~~ RESPONSE ~~~ |
2798 | + STATUS : 405 Method Not Allowed |
2799 | + PROTO : HTTP/1.1 |
2800 | + RECEIVED AT : 2025-04-13T10:49:52.961605544Z |
2801 | + TIME DURATION: 784.721µs |
2802 | + HEADERS : |
2803 | + Content-Length: 78 |
2804 | + Content-Type: application/json; charset=utf-8 |
2805 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2806 | + Docker-Distribution-Api-Version: registry/2.0 |
2807 | + X-Content-Type-Options: nosniff |
2808 | + BODY : |
2809 | + { |
2810 | + "errors": [ |
2811 | + { |
2812 | + "code": "UNSUPPORTED", |
2813 | + "message": "The operation is unsupported." |
2814 | + } |
2815 | + ] |
2816 | + } |
2817 | + |
2818 | + ============================================================================== |
2819 | + |
2820 | + </pre> |
2821 | + </div> |
2822 | + </div> |
2823 | + |
2824 | + |
2825 | + |
2826 | + |
2827 | + <div class="result green"> |
2828 | + <div id="output-box-22-button" class="toggle" onclick="javascript:toggleOutput('output-box-22')">+</div> |
2829 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-22')">Delete manifest[0] created in setup</h4> |
2830 | + <br> |
2831 | + <div id="output-box-22" style="display: none;"> |
2832 | + <pre class="pre-box">DEBUG |
2833 | + ============================================================================== |
2834 | + ~~~ REQUEST ~~~ |
2835 | + DELETE /v2/myorg/myrepo/a/manifests/sha256:0d3190494f1b2b9db0a27d31e1a7a9cfd5cfd24e1c99ecb373b0306082e29896 HTTP/1.1 |
2836 | + HOST : localhost:5000 |
2837 | + HEADERS: |
2838 | + User-Agent: distribution-spec-conformance-tests |
2839 | + BODY : |
2840 | + ***** NO CONTENT ***** |
2841 | + ------------------------------------------------------------------------------ |
2842 | + ~~~ RESPONSE ~~~ |
2843 | + STATUS : 405 Method Not Allowed |
2844 | + PROTO : HTTP/1.1 |
2845 | + RECEIVED AT : 2025-04-13T10:49:52.962271415Z |
2846 | + TIME DURATION: 479.065µs |
2847 | + HEADERS : |
2848 | + Content-Length: 78 |
2849 | + Content-Type: application/json; charset=utf-8 |
2850 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2851 | + Docker-Distribution-Api-Version: registry/2.0 |
2852 | + X-Content-Type-Options: nosniff |
2853 | + BODY : |
2854 | + { |
2855 | + "errors": [ |
2856 | + { |
2857 | + "code": "UNSUPPORTED", |
2858 | + "message": "The operation is unsupported." |
2859 | + } |
2860 | + ] |
2861 | + } |
2862 | + |
2863 | + ============================================================================== |
2864 | + |
2865 | + </pre> |
2866 | + </div> |
2867 | + </div> |
2868 | + |
2869 | + |
2870 | + |
2871 | + |
2872 | + <div class="result green"> |
2873 | + <div id="output-box-23-button" class="toggle" onclick="javascript:toggleOutput('output-box-23')">+</div> |
2874 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-23')">Delete manifest[1] created in setup</h4> |
2875 | + <br> |
2876 | + <div id="output-box-23" style="display: none;"> |
2877 | + <pre class="pre-box">DEBUG |
2878 | + ============================================================================== |
2879 | + ~~~ REQUEST ~~~ |
2880 | + DELETE /v2/myorg/myrepo/a/manifests/sha256:34baedb2fd45ee2a83db57722eaece9be6f5b02c61e3fbc2d2812128d080bfc0 HTTP/1.1 |
2881 | + HOST : localhost:5000 |
2882 | + HEADERS: |
2883 | + User-Agent: distribution-spec-conformance-tests |
2884 | + BODY : |
2885 | + ***** NO CONTENT ***** |
2886 | + ------------------------------------------------------------------------------ |
2887 | + ~~~ RESPONSE ~~~ |
2888 | + STATUS : 405 Method Not Allowed |
2889 | + PROTO : HTTP/1.1 |
2890 | + RECEIVED AT : 2025-04-13T10:49:52.962899073Z |
2891 | + TIME DURATION: 443.018µs |
2892 | + HEADERS : |
2893 | + Content-Length: 78 |
2894 | + Content-Type: application/json; charset=utf-8 |
2895 | + Date: Sun, 13 Apr 2025 10:49:52 GMT |
2896 | + Docker-Distribution-Api-Version: registry/2.0 |
2897 | + X-Content-Type-Options: nosniff |
2898 | + BODY : |
2899 | + { |
2900 | + "errors": [ |
2901 | + { |
2902 | + "code": "UNSUPPORTED", |
2903 | + "message": "The operation is unsupported." |
2904 | + } |
2905 | + ] |
2906 | + } |
2907 | + |
2908 | + ============================================================================== |
2909 | + |
2910 | + </pre> |
2911 | + </div> |
2912 | + </div> |
2913 | + |
2914 | + <br> |
2915 | + |
2916 | + |
2917 | + |
2918 | + |
2919 | + </div> |
2920 | + |
2921 | + |
2922 | + |
2923 | + |
2924 | + <h2>Push</h2> |
2925 | + <div class="subcategory"> |
2926 | + |
2927 | + |
2928 | + <h3>Blob Upload Streamed</h3> |
2929 | + |
2930 | + |
2931 | + |
2932 | + |
2933 | + |
2934 | + |
2935 | + <div class="result grey"> |
2936 | + <div id="output-box-24-button" class="toggle" onclick="javascript:toggleOutput('output-box-24')">+</div> |
2937 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-24')">PATCH request with blob in body should yield 202 response</h4> |
2938 | + <br> |
2939 | + <div id="output-box-24" style="display: none;"> |
2940 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
2941 | + OCI_TEST_PUSH=0 |
2942 | + OCI_TEST_CONTENT_DISCOVERY=0 |
2943 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
2944 | + OCI_TEST_PULL=1 |
2945 | + </pre> |
2946 | + </div> |
2947 | + </div> |
2948 | + |
2949 | + |
2950 | + |
2951 | + |
2952 | + <div class="result grey"> |
2953 | + <div id="output-box-25-button" class="toggle" onclick="javascript:toggleOutput('output-box-25')">+</div> |
2954 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-25')">PUT request to session URL with digest should yield 201 response</h4> |
2955 | + <br> |
2956 | + <div id="output-box-25" style="display: none;"> |
2957 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
2958 | + OCI_TEST_PULL=1 |
2959 | + OCI_TEST_PUSH=0 |
2960 | + OCI_TEST_CONTENT_DISCOVERY=0 |
2961 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
2962 | + </pre> |
2963 | + </div> |
2964 | + </div> |
2965 | + |
2966 | + <br> |
2967 | + |
2968 | + |
2969 | + <h3>Blob Upload Monolithic</h3> |
2970 | + |
2971 | + |
2972 | + |
2973 | + |
2974 | + |
2975 | + |
2976 | + <div class="result grey"> |
2977 | + <div id="output-box-26-button" class="toggle" onclick="javascript:toggleOutput('output-box-26')">+</div> |
2978 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-26')">GET nonexistent blob should result in 404 response</h4> |
2979 | + <br> |
2980 | + <div id="output-box-26" style="display: none;"> |
2981 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
2982 | + OCI_TEST_PUSH=0 |
2983 | + OCI_TEST_CONTENT_DISCOVERY=0 |
2984 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
2985 | + OCI_TEST_PULL=1 |
2986 | + </pre> |
2987 | + </div> |
2988 | + </div> |
2989 | + |
2990 | + |
2991 | + |
2992 | + |
2993 | + <div class="result grey"> |
2994 | + <div id="output-box-27-button" class="toggle" onclick="javascript:toggleOutput('output-box-27')">+</div> |
2995 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-27')">POST request with digest and blob should yield a 201 or 202</h4> |
2996 | + <br> |
2997 | + <div id="output-box-27" style="display: none;"> |
2998 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
2999 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3000 | + OCI_TEST_PULL=1 |
3001 | + OCI_TEST_PUSH=0 |
3002 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3003 | + </pre> |
3004 | + </div> |
3005 | + </div> |
3006 | + |
3007 | + |
3008 | + |
3009 | + |
3010 | + <div class="result grey"> |
3011 | + <div id="output-box-28-button" class="toggle" onclick="javascript:toggleOutput('output-box-28')">+</div> |
3012 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-28')">GET request to blob URL from prior request should yield 200 or 404 based on response code</h4> |
3013 | + <br> |
3014 | + <div id="output-box-28" style="display: none;"> |
3015 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3016 | + OCI_TEST_PULL=1 |
3017 | + OCI_TEST_PUSH=0 |
3018 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3019 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3020 | + </pre> |
3021 | + </div> |
3022 | + </div> |
3023 | + |
3024 | + |
3025 | + |
3026 | + |
3027 | + <div class="result grey"> |
3028 | + <div id="output-box-29-button" class="toggle" onclick="javascript:toggleOutput('output-box-29')">+</div> |
3029 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-29')">POST request should yield a session ID</h4> |
3030 | + <br> |
3031 | + <div id="output-box-29" style="display: none;"> |
3032 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3033 | + OCI_TEST_PUSH=0 |
3034 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3035 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3036 | + OCI_TEST_PULL=1 |
3037 | + </pre> |
3038 | + </div> |
3039 | + </div> |
3040 | + |
3041 | + |
3042 | + |
3043 | + |
3044 | + <div class="result grey"> |
3045 | + <div id="output-box-30-button" class="toggle" onclick="javascript:toggleOutput('output-box-30')">+</div> |
3046 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-30')">PUT upload of a blob should yield a 201 Response</h4> |
3047 | + <br> |
3048 | + <div id="output-box-30" style="display: none;"> |
3049 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3050 | + OCI_TEST_PULL=1 |
3051 | + OCI_TEST_PUSH=0 |
3052 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3053 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3054 | + </pre> |
3055 | + </div> |
3056 | + </div> |
3057 | + |
3058 | + |
3059 | + |
3060 | + |
3061 | + <div class="result grey"> |
3062 | + <div id="output-box-31-button" class="toggle" onclick="javascript:toggleOutput('output-box-31')">+</div> |
3063 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-31')">GET request to existing blob should yield 200 response</h4> |
3064 | + <br> |
3065 | + <div id="output-box-31" style="display: none;"> |
3066 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3067 | + OCI_TEST_PULL=1 |
3068 | + OCI_TEST_PUSH=0 |
3069 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3070 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3071 | + </pre> |
3072 | + </div> |
3073 | + </div> |
3074 | + |
3075 | + |
3076 | + |
3077 | + |
3078 | + <div class="result grey"> |
3079 | + <div id="output-box-32-button" class="toggle" onclick="javascript:toggleOutput('output-box-32')">+</div> |
3080 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-32')">PUT upload of a layer blob should yield a 201 Response</h4> |
3081 | + <br> |
3082 | + <div id="output-box-32" style="display: none;"> |
3083 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3084 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3085 | + OCI_TEST_PULL=1 |
3086 | + OCI_TEST_PUSH=0 |
3087 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3088 | + </pre> |
3089 | + </div> |
3090 | + </div> |
3091 | + |
3092 | + |
3093 | + |
3094 | + |
3095 | + <div class="result grey"> |
3096 | + <div id="output-box-33-button" class="toggle" onclick="javascript:toggleOutput('output-box-33')">+</div> |
3097 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-33')">GET request to existing layer should yield 200 response</h4> |
3098 | + <br> |
3099 | + <div id="output-box-33" style="display: none;"> |
3100 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3101 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3102 | + OCI_TEST_PULL=1 |
3103 | + OCI_TEST_PUSH=0 |
3104 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3105 | + </pre> |
3106 | + </div> |
3107 | + </div> |
3108 | + |
3109 | + <br> |
3110 | + |
3111 | + |
3112 | + <h3>Blob Upload Chunked</h3> |
3113 | + |
3114 | + |
3115 | + |
3116 | + |
3117 | + |
3118 | + |
3119 | + <div class="result grey"> |
3120 | + <div id="output-box-34-button" class="toggle" onclick="javascript:toggleOutput('output-box-34')">+</div> |
3121 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-34')">Out-of-order blob upload should return 416</h4> |
3122 | + <br> |
3123 | + <div id="output-box-34" style="display: none;"> |
3124 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3125 | + OCI_TEST_PULL=1 |
3126 | + OCI_TEST_PUSH=0 |
3127 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3128 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3129 | + </pre> |
3130 | + </div> |
3131 | + </div> |
3132 | + |
3133 | + |
3134 | + |
3135 | + |
3136 | + <div class="result grey"> |
3137 | + <div id="output-box-35-button" class="toggle" onclick="javascript:toggleOutput('output-box-35')">+</div> |
3138 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-35')">PATCH request with first chunk should return 202</h4> |
3139 | + <br> |
3140 | + <div id="output-box-35" style="display: none;"> |
3141 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3142 | + OCI_TEST_PULL=1 |
3143 | + OCI_TEST_PUSH=0 |
3144 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3145 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3146 | + </pre> |
3147 | + </div> |
3148 | + </div> |
3149 | + |
3150 | + |
3151 | + |
3152 | + |
3153 | + <div class="result grey"> |
3154 | + <div id="output-box-36-button" class="toggle" onclick="javascript:toggleOutput('output-box-36')">+</div> |
3155 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-36')">Retry previous blob chunk should return 416</h4> |
3156 | + <br> |
3157 | + <div id="output-box-36" style="display: none;"> |
3158 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3159 | + OCI_TEST_PULL=1 |
3160 | + OCI_TEST_PUSH=0 |
3161 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3162 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3163 | + </pre> |
3164 | + </div> |
3165 | + </div> |
3166 | + |
3167 | + |
3168 | + |
3169 | + |
3170 | + <div class="result grey"> |
3171 | + <div id="output-box-37-button" class="toggle" onclick="javascript:toggleOutput('output-box-37')">+</div> |
3172 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-37')">Get on stale blob upload should return 204 with a range and location</h4> |
3173 | + <br> |
3174 | + <div id="output-box-37" style="display: none;"> |
3175 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3176 | + OCI_TEST_PULL=1 |
3177 | + OCI_TEST_PUSH=0 |
3178 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3179 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3180 | + </pre> |
3181 | + </div> |
3182 | + </div> |
3183 | + |
3184 | + |
3185 | + |
3186 | + |
3187 | + <div class="result grey"> |
3188 | + <div id="output-box-38-button" class="toggle" onclick="javascript:toggleOutput('output-box-38')">+</div> |
3189 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-38')">PATCH request with second chunk should return 202</h4> |
3190 | + <br> |
3191 | + <div id="output-box-38" style="display: none;"> |
3192 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3193 | + OCI_TEST_PULL=1 |
3194 | + OCI_TEST_PUSH=0 |
3195 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3196 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3197 | + </pre> |
3198 | + </div> |
3199 | + </div> |
3200 | + |
3201 | + |
3202 | + |
3203 | + |
3204 | + <div class="result grey"> |
3205 | + <div id="output-box-39-button" class="toggle" onclick="javascript:toggleOutput('output-box-39')">+</div> |
3206 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-39')">PUT request with digest should return 201</h4> |
3207 | + <br> |
3208 | + <div id="output-box-39" style="display: none;"> |
3209 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3210 | + OCI_TEST_PULL=1 |
3211 | + OCI_TEST_PUSH=0 |
3212 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3213 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3214 | + </pre> |
3215 | + </div> |
3216 | + </div> |
3217 | + |
3218 | + <br> |
3219 | + |
3220 | + |
3221 | + <h3>Cross-Repository Blob Mount</h3> |
3222 | + |
3223 | + |
3224 | + |
3225 | + |
3226 | + |
3227 | + |
3228 | + <div class="result grey"> |
3229 | + <div id="output-box-40-button" class="toggle" onclick="javascript:toggleOutput('output-box-40')">+</div> |
3230 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-40')">Cross-mounting of a blob without the from argument should yield session id</h4> |
3231 | + <br> |
3232 | + <div id="output-box-40" style="display: none;"> |
3233 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3234 | + OCI_TEST_PULL=1 |
3235 | + OCI_TEST_PUSH=0 |
3236 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3237 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3238 | + </pre> |
3239 | + </div> |
3240 | + </div> |
3241 | + |
3242 | + |
3243 | + |
3244 | + |
3245 | + <div class="result grey"> |
3246 | + <div id="output-box-41-button" class="toggle" onclick="javascript:toggleOutput('output-box-41')">+</div> |
3247 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-41')">POST request to mount another repository's blob should return 201 or 202</h4> |
3248 | + <br> |
3249 | + <div id="output-box-41" style="display: none;"> |
3250 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3251 | + OCI_TEST_PULL=1 |
3252 | + OCI_TEST_PUSH=0 |
3253 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3254 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3255 | + </pre> |
3256 | + </div> |
3257 | + </div> |
3258 | + |
3259 | + |
3260 | + |
3261 | + |
3262 | + <div class="result grey"> |
3263 | + <div id="output-box-42-button" class="toggle" onclick="javascript:toggleOutput('output-box-42')">+</div> |
3264 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-42')">GET request to test digest within cross-mount namespace should return 200</h4> |
3265 | + <br> |
3266 | + <div id="output-box-42" style="display: none;"> |
3267 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3268 | + OCI_TEST_PULL=1 |
3269 | + OCI_TEST_PUSH=0 |
3270 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3271 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3272 | + </pre> |
3273 | + </div> |
3274 | + </div> |
3275 | + |
3276 | + |
3277 | + |
3278 | + |
3279 | + <div class="result grey"> |
3280 | + <div id="output-box-43-button" class="toggle" onclick="javascript:toggleOutput('output-box-43')">+</div> |
3281 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-43')">Cross-mounting of nonexistent blob should yield session id</h4> |
3282 | + <br> |
3283 | + <div id="output-box-43" style="display: none;"> |
3284 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3285 | + OCI_TEST_PULL=1 |
3286 | + OCI_TEST_PUSH=0 |
3287 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3288 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3289 | + </pre> |
3290 | + </div> |
3291 | + </div> |
3292 | + |
3293 | + |
3294 | + |
3295 | + |
3296 | + <div class="result grey"> |
3297 | + <div id="output-box-44-button" class="toggle" onclick="javascript:toggleOutput('output-box-44')">+</div> |
3298 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-44')">Cross-mounting without from, and automatic content discovery enabled should return a 201</h4> |
3299 | + <br> |
3300 | + <div id="output-box-44" style="display: none;"> |
3301 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3302 | + OCI_TEST_PULL=1 |
3303 | + OCI_TEST_PUSH=0 |
3304 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3305 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3306 | + </pre> |
3307 | + </div> |
3308 | + </div> |
3309 | + |
3310 | + |
3311 | + |
3312 | + |
3313 | + <div class="result grey"> |
3314 | + <div id="output-box-45-button" class="toggle" onclick="javascript:toggleOutput('output-box-45')">+</div> |
3315 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-45')">Cross-mounting without from, and automatic content discovery disabled should return a 202</h4> |
3316 | + <br> |
3317 | + <div id="output-box-45" style="display: none;"> |
3318 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3319 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3320 | + OCI_TEST_PULL=1 |
3321 | + OCI_TEST_PUSH=0 |
3322 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3323 | + </pre> |
3324 | + </div> |
3325 | + </div> |
3326 | + |
3327 | + <br> |
3328 | + |
3329 | + |
3330 | + <h3>Manifest Upload</h3> |
3331 | + |
3332 | + |
3333 | + |
3334 | + |
3335 | + |
3336 | + |
3337 | + <div class="result grey"> |
3338 | + <div id="output-box-46-button" class="toggle" onclick="javascript:toggleOutput('output-box-46')">+</div> |
3339 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-46')">GET nonexistent manifest should return 404</h4> |
3340 | + <br> |
3341 | + <div id="output-box-46" style="display: none;"> |
3342 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3343 | + OCI_TEST_PULL=1 |
3344 | + OCI_TEST_PUSH=0 |
3345 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3346 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3347 | + </pre> |
3348 | + </div> |
3349 | + </div> |
3350 | + |
3351 | + |
3352 | + |
3353 | + |
3354 | + <div class="result grey"> |
3355 | + <div id="output-box-47-button" class="toggle" onclick="javascript:toggleOutput('output-box-47')">+</div> |
3356 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-47')">PUT should accept a manifest upload</h4> |
3357 | + <br> |
3358 | + <div id="output-box-47" style="display: none;"> |
3359 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3360 | + OCI_TEST_PULL=1 |
3361 | + OCI_TEST_PUSH=0 |
3362 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3363 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3364 | + </pre> |
3365 | + </div> |
3366 | + </div> |
3367 | + |
3368 | + |
3369 | + |
3370 | + |
3371 | + <div class="result grey"> |
3372 | + <div id="output-box-48-button" class="toggle" onclick="javascript:toggleOutput('output-box-48')">+</div> |
3373 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-48')">Registry should accept a manifest upload with no layers</h4> |
3374 | + <br> |
3375 | + <div id="output-box-48" style="display: none;"> |
3376 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3377 | + OCI_TEST_PULL=1 |
3378 | + OCI_TEST_PUSH=0 |
3379 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3380 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3381 | + </pre> |
3382 | + </div> |
3383 | + </div> |
3384 | + |
3385 | + |
3386 | + |
3387 | + |
3388 | + <div class="result grey"> |
3389 | + <div id="output-box-49-button" class="toggle" onclick="javascript:toggleOutput('output-box-49')">+</div> |
3390 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-49')">GET request to manifest URL (digest) should yield 200 response</h4> |
3391 | + <br> |
3392 | + <div id="output-box-49" style="display: none;"> |
3393 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3394 | + OCI_TEST_PULL=1 |
3395 | + OCI_TEST_PUSH=0 |
3396 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3397 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3398 | + </pre> |
3399 | + </div> |
3400 | + </div> |
3401 | + |
3402 | + <br> |
3403 | + |
3404 | + |
3405 | + <h3>Teardown</h3> |
3406 | + |
3407 | + |
3408 | + |
3409 | + |
3410 | + |
3411 | + |
3412 | + <div class="result grey"> |
3413 | + <div id="output-box-50-button" class="toggle" onclick="javascript:toggleOutput('output-box-50')">+</div> |
3414 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-50')">Delete config blob created in tests</h4> |
3415 | + <br> |
3416 | + <div id="output-box-50" style="display: none;"> |
3417 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3418 | + OCI_TEST_PULL=1 |
3419 | + OCI_TEST_PUSH=0 |
3420 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3421 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3422 | + </pre> |
3423 | + </div> |
3424 | + </div> |
3425 | + |
3426 | + |
3427 | + |
3428 | + |
3429 | + <div class="result grey"> |
3430 | + <div id="output-box-51-button" class="toggle" onclick="javascript:toggleOutput('output-box-51')">+</div> |
3431 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-51')">Delete layer blob created in setup</h4> |
3432 | + <br> |
3433 | + <div id="output-box-51" style="display: none;"> |
3434 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3435 | + OCI_TEST_PUSH=0 |
3436 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3437 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3438 | + OCI_TEST_PULL=1 |
3439 | + </pre> |
3440 | + </div> |
3441 | + </div> |
3442 | + |
3443 | + |
3444 | + |
3445 | + |
3446 | + <div class="result grey"> |
3447 | + <div id="output-box-52-button" class="toggle" onclick="javascript:toggleOutput('output-box-52')">+</div> |
3448 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-52')">Delete manifest created in tests</h4> |
3449 | + <br> |
3450 | + <div id="output-box-52" style="display: none;"> |
3451 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3452 | + OCI_TEST_PUSH=0 |
3453 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3454 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3455 | + OCI_TEST_PULL=1 |
3456 | + </pre> |
3457 | + </div> |
3458 | + </div> |
3459 | + |
3460 | + <br> |
3461 | + |
3462 | + |
3463 | + |
3464 | + |
3465 | + </div> |
3466 | + |
3467 | + |
3468 | + |
3469 | + |
3470 | + <h2>Content Discovery</h2> |
3471 | + <div class="subcategory"> |
3472 | + |
3473 | + |
3474 | + <h3>Setup</h3> |
3475 | + |
3476 | + |
3477 | + |
3478 | + |
3479 | + |
3480 | + |
3481 | + <div class="result grey"> |
3482 | + <div id="output-box-53-button" class="toggle" onclick="javascript:toggleOutput('output-box-53')">+</div> |
3483 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-53')">Populate registry with test blob</h4> |
3484 | + <br> |
3485 | + <div id="output-box-53" style="display: none;"> |
3486 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3487 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3488 | + OCI_TEST_PULL=1 |
3489 | + OCI_TEST_PUSH=0 |
3490 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3491 | + </pre> |
3492 | + </div> |
3493 | + </div> |
3494 | + |
3495 | + |
3496 | + |
3497 | + |
3498 | + <div class="result grey"> |
3499 | + <div id="output-box-54-button" class="toggle" onclick="javascript:toggleOutput('output-box-54')">+</div> |
3500 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-54')">Populate registry with test layer</h4> |
3501 | + <br> |
3502 | + <div id="output-box-54" style="display: none;"> |
3503 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3504 | + OCI_TEST_PULL=1 |
3505 | + OCI_TEST_PUSH=0 |
3506 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3507 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3508 | + </pre> |
3509 | + </div> |
3510 | + </div> |
3511 | + |
3512 | + |
3513 | + |
3514 | + |
3515 | + <div class="result grey"> |
3516 | + <div id="output-box-55-button" class="toggle" onclick="javascript:toggleOutput('output-box-55')">+</div> |
3517 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-55')">Populate registry with test tags</h4> |
3518 | + <br> |
3519 | + <div id="output-box-55" style="display: none;"> |
3520 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3521 | + OCI_TEST_PULL=1 |
3522 | + OCI_TEST_PUSH=0 |
3523 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3524 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3525 | + </pre> |
3526 | + </div> |
3527 | + </div> |
3528 | + |
3529 | + |
3530 | + |
3531 | + |
3532 | + <div class="result grey"> |
3533 | + <div id="output-box-56-button" class="toggle" onclick="javascript:toggleOutput('output-box-56')">+</div> |
3534 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-56')">Populate registry with test tags (no push)</h4> |
3535 | + <br> |
3536 | + <div id="output-box-56" style="display: none;"> |
3537 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3538 | + OCI_TEST_PULL=1 |
3539 | + OCI_TEST_PUSH=0 |
3540 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3541 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3542 | + </pre> |
3543 | + </div> |
3544 | + </div> |
3545 | + |
3546 | + |
3547 | + |
3548 | + |
3549 | + <div class="result grey"> |
3550 | + <div id="output-box-57-button" class="toggle" onclick="javascript:toggleOutput('output-box-57')">+</div> |
3551 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-57')">References setup</h4> |
3552 | + <br> |
3553 | + <div id="output-box-57" style="display: none;"> |
3554 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3555 | + OCI_TEST_PUSH=0 |
3556 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3557 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3558 | + OCI_TEST_PULL=1 |
3559 | + </pre> |
3560 | + </div> |
3561 | + </div> |
3562 | + |
3563 | + <br> |
3564 | + |
3565 | + |
3566 | + <h3>Test content discovery endpoints (listing tags)</h3> |
3567 | + |
3568 | + |
3569 | + |
3570 | + |
3571 | + |
3572 | + |
3573 | + <div class="result grey"> |
3574 | + <div id="output-box-58-button" class="toggle" onclick="javascript:toggleOutput('output-box-58')">+</div> |
3575 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-58')">GET request to list tags should yield 200 response</h4> |
3576 | + <br> |
3577 | + <div id="output-box-58" style="display: none;"> |
3578 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3579 | + OCI_TEST_PUSH=0 |
3580 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3581 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3582 | + OCI_TEST_PULL=1 |
3583 | + </pre> |
3584 | + </div> |
3585 | + </div> |
3586 | + |
3587 | + |
3588 | + |
3589 | + |
3590 | + <div class="result grey"> |
3591 | + <div id="output-box-59-button" class="toggle" onclick="javascript:toggleOutput('output-box-59')">+</div> |
3592 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-59')">GET number of tags should be limitable by `n` query parameter</h4> |
3593 | + <br> |
3594 | + <div id="output-box-59" style="display: none;"> |
3595 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3596 | + OCI_TEST_PULL=1 |
3597 | + OCI_TEST_PUSH=0 |
3598 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3599 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3600 | + </pre> |
3601 | + </div> |
3602 | + </div> |
3603 | + |
3604 | + |
3605 | + |
3606 | + |
3607 | + <div class="result grey"> |
3608 | + <div id="output-box-60-button" class="toggle" onclick="javascript:toggleOutput('output-box-60')">+</div> |
3609 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-60')">GET start of tag is set by `last` query parameter</h4> |
3610 | + <br> |
3611 | + <div id="output-box-60" style="display: none;"> |
3612 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3613 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3614 | + OCI_TEST_PULL=1 |
3615 | + OCI_TEST_PUSH=0 |
3616 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3617 | + </pre> |
3618 | + </div> |
3619 | + </div> |
3620 | + |
3621 | + <br> |
3622 | + |
3623 | + |
3624 | + <h3>Test content discovery endpoints (listing references)</h3> |
3625 | + |
3626 | + |
3627 | + |
3628 | + |
3629 | + |
3630 | + |
3631 | + <div class="result grey"> |
3632 | + <div id="output-box-61-button" class="toggle" onclick="javascript:toggleOutput('output-box-61')">+</div> |
3633 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-61')">GET request to nonexistent blob should result in empty 200 response</h4> |
3634 | + <br> |
3635 | + <div id="output-box-61" style="display: none;"> |
3636 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3637 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3638 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3639 | + OCI_TEST_PULL=1 |
3640 | + OCI_TEST_PUSH=0 |
3641 | + </pre> |
3642 | + </div> |
3643 | + </div> |
3644 | + |
3645 | + |
3646 | + |
3647 | + |
3648 | + <div class="result grey"> |
3649 | + <div id="output-box-62-button" class="toggle" onclick="javascript:toggleOutput('output-box-62')">+</div> |
3650 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-62')">GET request to existing blob should yield 200</h4> |
3651 | + <br> |
3652 | + <div id="output-box-62" style="display: none;"> |
3653 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3654 | + OCI_TEST_PULL=1 |
3655 | + OCI_TEST_PUSH=0 |
3656 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3657 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3658 | + </pre> |
3659 | + </div> |
3660 | + </div> |
3661 | + |
3662 | + |
3663 | + |
3664 | + |
3665 | + <div class="result grey"> |
3666 | + <div id="output-box-63-button" class="toggle" onclick="javascript:toggleOutput('output-box-63')">+</div> |
3667 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-63')">GET request to existing blob with filter should yield 200</h4> |
3668 | + <br> |
3669 | + <div id="output-box-63" style="display: none;"> |
3670 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3671 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3672 | + OCI_TEST_PULL=1 |
3673 | + OCI_TEST_PUSH=0 |
3674 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3675 | + </pre> |
3676 | + </div> |
3677 | + </div> |
3678 | + |
3679 | + |
3680 | + |
3681 | + |
3682 | + <div class="result grey"> |
3683 | + <div id="output-box-64-button" class="toggle" onclick="javascript:toggleOutput('output-box-64')">+</div> |
3684 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-64')">GET request to missing manifest should yield 200</h4> |
3685 | + <br> |
3686 | + <div id="output-box-64" style="display: none;"> |
3687 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3688 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3689 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3690 | + OCI_TEST_PULL=1 |
3691 | + OCI_TEST_PUSH=0 |
3692 | + </pre> |
3693 | + </div> |
3694 | + </div> |
3695 | + |
3696 | + <br> |
3697 | + |
3698 | + |
3699 | + <h3>Teardown</h3> |
3700 | + |
3701 | + |
3702 | + |
3703 | + |
3704 | + |
3705 | + |
3706 | + <div class="result grey"> |
3707 | + <div id="output-box-65-button" class="toggle" onclick="javascript:toggleOutput('output-box-65')">+</div> |
3708 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-65')">Delete config blob created in tests</h4> |
3709 | + <br> |
3710 | + <div id="output-box-65" style="display: none;"> |
3711 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3712 | + OCI_TEST_PULL=1 |
3713 | + OCI_TEST_PUSH=0 |
3714 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3715 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3716 | + </pre> |
3717 | + </div> |
3718 | + </div> |
3719 | + |
3720 | + |
3721 | + |
3722 | + |
3723 | + <div class="result grey"> |
3724 | + <div id="output-box-66-button" class="toggle" onclick="javascript:toggleOutput('output-box-66')">+</div> |
3725 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-66')">Delete layer blob created in setup</h4> |
3726 | + <br> |
3727 | + <div id="output-box-66" style="display: none;"> |
3728 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3729 | + OCI_TEST_PULL=1 |
3730 | + OCI_TEST_PUSH=0 |
3731 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3732 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3733 | + </pre> |
3734 | + </div> |
3735 | + </div> |
3736 | + |
3737 | + |
3738 | + |
3739 | + |
3740 | + <div class="result grey"> |
3741 | + <div id="output-box-67-button" class="toggle" onclick="javascript:toggleOutput('output-box-67')">+</div> |
3742 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-67')">Delete created manifest & associated tags</h4> |
3743 | + <br> |
3744 | + <div id="output-box-67" style="display: none;"> |
3745 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3746 | + OCI_TEST_PUSH=0 |
3747 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3748 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3749 | + OCI_TEST_PULL=1 |
3750 | + </pre> |
3751 | + </div> |
3752 | + </div> |
3753 | + |
3754 | + |
3755 | + |
3756 | + |
3757 | + <div class="result grey"> |
3758 | + <div id="output-box-68-button" class="toggle" onclick="javascript:toggleOutput('output-box-68')">+</div> |
3759 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-68')">References teardown</h4> |
3760 | + <br> |
3761 | + <div id="output-box-68" style="display: none;"> |
3762 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3763 | + OCI_TEST_PULL=1 |
3764 | + OCI_TEST_PUSH=0 |
3765 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3766 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3767 | + </pre> |
3768 | + </div> |
3769 | + </div> |
3770 | + |
3771 | + <br> |
3772 | + |
3773 | + |
3774 | + |
3775 | + |
3776 | + </div> |
3777 | + |
3778 | + |
3779 | + |
3780 | + |
3781 | + <h2>Content Management</h2> |
3782 | + <div class="subcategory"> |
3783 | + |
3784 | + |
3785 | + <h3>Setup</h3> |
3786 | + |
3787 | + |
3788 | + |
3789 | + |
3790 | + |
3791 | + |
3792 | + <div class="result grey"> |
3793 | + <div id="output-box-69-button" class="toggle" onclick="javascript:toggleOutput('output-box-69')">+</div> |
3794 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-69')">Populate registry with test config blob</h4> |
3795 | + <br> |
3796 | + <div id="output-box-69" style="display: none;"> |
3797 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3798 | + OCI_TEST_PUSH=0 |
3799 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3800 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3801 | + OCI_TEST_PULL=1 |
3802 | + </pre> |
3803 | + </div> |
3804 | + </div> |
3805 | + |
3806 | + |
3807 | + |
3808 | + |
3809 | + <div class="result grey"> |
3810 | + <div id="output-box-70-button" class="toggle" onclick="javascript:toggleOutput('output-box-70')">+</div> |
3811 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-70')">Populate registry with test layer</h4> |
3812 | + <br> |
3813 | + <div id="output-box-70" style="display: none;"> |
3814 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3815 | + OCI_TEST_PUSH=0 |
3816 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3817 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3818 | + OCI_TEST_PULL=1 |
3819 | + </pre> |
3820 | + </div> |
3821 | + </div> |
3822 | + |
3823 | + |
3824 | + |
3825 | + |
3826 | + <div class="result grey"> |
3827 | + <div id="output-box-71-button" class="toggle" onclick="javascript:toggleOutput('output-box-71')">+</div> |
3828 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-71')">Populate registry with test tag</h4> |
3829 | + <br> |
3830 | + <div id="output-box-71" style="display: none;"> |
3831 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3832 | + OCI_TEST_PULL=1 |
3833 | + OCI_TEST_PUSH=0 |
3834 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3835 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3836 | + </pre> |
3837 | + </div> |
3838 | + </div> |
3839 | + |
3840 | + |
3841 | + |
3842 | + |
3843 | + <div class="result grey"> |
3844 | + <div id="output-box-72-button" class="toggle" onclick="javascript:toggleOutput('output-box-72')">+</div> |
3845 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-72')">Check how many tags there are before anything gets deleted</h4> |
3846 | + <br> |
3847 | + <div id="output-box-72" style="display: none;"> |
3848 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3849 | + OCI_TEST_PULL=1 |
3850 | + OCI_TEST_PUSH=0 |
3851 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3852 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3853 | + </pre> |
3854 | + </div> |
3855 | + </div> |
3856 | + |
3857 | + <br> |
3858 | + |
3859 | + |
3860 | + <h3>Manifest delete</h3> |
3861 | + |
3862 | + |
3863 | + |
3864 | + |
3865 | + |
3866 | + |
3867 | + <div class="result grey"> |
3868 | + <div id="output-box-73-button" class="toggle" onclick="javascript:toggleOutput('output-box-73')">+</div> |
3869 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-73')">DELETE request to manifest tag should return 202, unless tag deletion is disallowed (400/405)</h4> |
3870 | + <br> |
3871 | + <div id="output-box-73" style="display: none;"> |
3872 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3873 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3874 | + OCI_TEST_PULL=1 |
3875 | + OCI_TEST_PUSH=0 |
3876 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3877 | + </pre> |
3878 | + </div> |
3879 | + </div> |
3880 | + |
3881 | + |
3882 | + |
3883 | + |
3884 | + <div class="result grey"> |
3885 | + <div id="output-box-74-button" class="toggle" onclick="javascript:toggleOutput('output-box-74')">+</div> |
3886 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-74')">DELETE request to manifest (digest) should yield 202 response unless already deleted</h4> |
3887 | + <br> |
3888 | + <div id="output-box-74" style="display: none;"> |
3889 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3890 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3891 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3892 | + OCI_TEST_PULL=1 |
3893 | + OCI_TEST_PUSH=0 |
3894 | + </pre> |
3895 | + </div> |
3896 | + </div> |
3897 | + |
3898 | + |
3899 | + |
3900 | + |
3901 | + <div class="result grey"> |
3902 | + <div id="output-box-75-button" class="toggle" onclick="javascript:toggleOutput('output-box-75')">+</div> |
3903 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-75')">GET request to deleted manifest URL should yield 404 response, unless delete is disallowed</h4> |
3904 | + <br> |
3905 | + <div id="output-box-75" style="display: none;"> |
3906 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3907 | + OCI_TEST_PULL=1 |
3908 | + OCI_TEST_PUSH=0 |
3909 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3910 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3911 | + </pre> |
3912 | + </div> |
3913 | + </div> |
3914 | + |
3915 | + |
3916 | + |
3917 | + |
3918 | + <div class="result grey"> |
3919 | + <div id="output-box-76-button" class="toggle" onclick="javascript:toggleOutput('output-box-76')">+</div> |
3920 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-76')">GET request to tags list should reflect manifest deletion</h4> |
3921 | + <br> |
3922 | + <div id="output-box-76" style="display: none;"> |
3923 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3924 | + OCI_TEST_PULL=1 |
3925 | + OCI_TEST_PUSH=0 |
3926 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3927 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3928 | + </pre> |
3929 | + </div> |
3930 | + </div> |
3931 | + |
3932 | + <br> |
3933 | + |
3934 | + |
3935 | + <h3>Blob delete</h3> |
3936 | + |
3937 | + |
3938 | + |
3939 | + |
3940 | + |
3941 | + |
3942 | + <div class="result grey"> |
3943 | + <div id="output-box-77-button" class="toggle" onclick="javascript:toggleOutput('output-box-77')">+</div> |
3944 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-77')">DELETE request to blob URL should yield 202 response</h4> |
3945 | + <br> |
3946 | + <div id="output-box-77" style="display: none;"> |
3947 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3948 | + OCI_TEST_PULL=1 |
3949 | + OCI_TEST_PUSH=0 |
3950 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3951 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3952 | + </pre> |
3953 | + </div> |
3954 | + </div> |
3955 | + |
3956 | + |
3957 | + |
3958 | + |
3959 | + <div class="result grey"> |
3960 | + <div id="output-box-78-button" class="toggle" onclick="javascript:toggleOutput('output-box-78')">+</div> |
3961 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-78')">GET request to deleted blob URL should yield 404 response</h4> |
3962 | + <br> |
3963 | + <div id="output-box-78" style="display: none;"> |
3964 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
3965 | + OCI_TEST_PULL=1 |
3966 | + OCI_TEST_PUSH=0 |
3967 | + OCI_TEST_CONTENT_DISCOVERY=0 |
3968 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
3969 | + </pre> |
3970 | + </div> |
3971 | + </div> |
3972 | + |
3973 | + <br> |
3974 | + |
3975 | + |
3976 | + |
3977 | + |
3978 | + </div> |
3979 | + |
3980 | + |
3981 | + </div> |
3982 | + </body> |
3983 | + </html> |
3984 | diff --git a/manifest.json b/manifest.json |
3985 | new file mode 100644 |
3986 | index 0000000..9061278 |
3987 | --- /dev/null |
3988 | +++ b/manifest.json |
3989 | @@ -0,0 +1,19 @@ |
3990 | + { |
3991 | + "schemaVersion": 2, |
3992 | + "mediaType": "application/vnd.oci.image.manifest.v1+json", |
3993 | + "config": { |
3994 | + "mediaType": "application/vnd.oci.image.config.v1+json", |
3995 | + "digest": "sha256:04d09c568ab48c342d9c33fbd598bfeb0fb4fcdb16527154ea8a23f7685f35d1", |
3996 | + "size": 129, |
3997 | + "data": "ewoJImF1dGhvciI6ICJ4VmFlQWc0V05jOENTZ2NJIiwKCSJhcmNoaXRlY3R1cmUiOiAiYW1kNjQiLAoJIm9zIjogImxpbnV4IiwKCSJyb290ZnMiOiB7CgkJInR5cGUiOiAibGF5ZXJzIiwKCQkiZGlmZl9pZHMiOiBbXQoJfQp9", |
3998 | + "newUnspecifiedField": "aGVsbG8gd29ybGQ=" |
3999 | + }, |
4000 | + "layers": [ |
4001 | + { |
4002 | + "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", |
4003 | + "digest": "sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183", |
4004 | + "size": 168, |
4005 | + "newUnspecifiedField": null |
4006 | + } |
4007 | + ] |
4008 | + } |
4009 | \ No newline at end of file |
4010 | diff --git a/results/junit.xml b/results/junit.xml |
4011 | new file mode 100644 |
4012 | index 0000000..b3af104 |
4013 | --- /dev/null |
4014 | +++ b/results/junit.xml |
4015 | @@ -0,0 +1,321 @@ |
4016 | + <?xml version="1.0" encoding="UTF-8"?> |
4017 | + <testsuites tests="80" disabled="56" errors="0" failures="1" time="0.169447691"> |
4018 | + <testsuite name="conformance tests" package="/results" tests="80" disabled="0" skipped="56" errors="0" failures="1" time="0.169447691" timestamp="2025-04-13T12:25:02"> |
4019 | + <properties> |
4020 | + <property name="SuiteSucceeded" value="false"></property> |
4021 | + <property name="SuiteHasProgrammaticFocus" value="false"></property> |
4022 | + <property name="SpecialSuiteFailureReason" value=""></property> |
4023 | + <property name="SuiteLabels" value="[]"></property> |
4024 | + <property name="RandomSeed" value="1744547102"></property> |
4025 | + <property name="RandomizeAllSpecs" value="false"></property> |
4026 | + <property name="LabelFilter" value=""></property> |
4027 | + <property name="FocusStrings" value=""></property> |
4028 | + <property name="SkipStrings" value=""></property> |
4029 | + <property name="FocusFiles" value=""></property> |
4030 | + <property name="SkipFiles" value=""></property> |
4031 | + <property name="FailOnPending" value="false"></property> |
4032 | + <property name="FailFast" value="false"></property> |
4033 | + <property name="FlakeAttempts" value="0"></property> |
4034 | + <property name="DryRun" value="false"></property> |
4035 | + <property name="ParallelTotal" value="1"></property> |
4036 | + <property name="OutputInterceptorMode" value=""></property> |
4037 | + </properties> |
4038 | + <testcase name="OCI Distribution Conformance Tests Pull Setup Populate registry with test blob" classname="conformance tests" status="passed" time="0.045084284"> |
4039 | + <system-err>> Enter [It] Populate registry with test blob - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:18 @ 04/13/25 12:25:02.902
< Exit [It] Populate registry with test blob - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:18 @ 04/13/25 12:25:02.946 (45ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:02.946
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:02.946 (0s)
</system-err> |
4040 | + </testcase> |
4041 | + <testcase name="OCI Distribution Conformance Tests Pull Setup Populate registry with test blob" classname="conformance tests" status="passed" time="0.032417102"> |
4042 | + <system-err>> Enter [It] Populate registry with test blob - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:36 @ 04/13/25 12:25:02.946
< Exit [It] Populate registry with test blob - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:36 @ 04/13/25 12:25:02.979 (32ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:02.979
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:02.979 (0s)
</system-err> |
4043 | + </testcase> |
4044 | + <testcase name="OCI Distribution Conformance Tests Pull Setup Populate registry with test layer" classname="conformance tests" status="passed" time="0.03232161"> |
4045 | + <system-err>> Enter [It] Populate registry with test layer - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:54 @ 04/13/25 12:25:02.979
< Exit [It] Populate registry with test layer - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:54 @ 04/13/25 12:25:03.011 (32ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.011
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.011 (0s)
</system-err> |
4046 | + </testcase> |
4047 | + <testcase name="OCI Distribution Conformance Tests Pull Setup Populate registry with test manifest" classname="conformance tests" status="passed" time="0.024845792"> |
4048 | + <system-err>> Enter [It] Populate registry with test manifest - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:72 @ 04/13/25 12:25:03.011
< Exit [It] Populate registry with test manifest - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:72 @ 04/13/25 12:25:03.036 (25ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.036
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.036 (0s)
</system-err> |
4049 | + </testcase> |
4050 | + <testcase name="OCI Distribution Conformance Tests Pull Setup Populate registry with test manifest" classname="conformance tests" status="passed" time="0.013175274"> |
4051 | + <system-err>> Enter [It] Populate registry with test manifest - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:87 @ 04/13/25 12:25:03.036
< Exit [It] Populate registry with test manifest - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:87 @ 04/13/25 12:25:03.049 (13ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.049
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.049 (0s)
</system-err> |
4052 | + </testcase> |
4053 | + <testcase name="OCI Distribution Conformance Tests Pull Setup Get tag name from environment" classname="conformance tests" status="skipped" time="9.807e-05"> |
4054 | + <skipped message="skipped - you have skipped this test."></skipped> |
4055 | + <system-err>> Enter [It] Get tag name from environment - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:101 @ 04/13/25 12:25:03.049
[SKIPPED] you have skipped this test.
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:591 @ 04/13/25 12:25:03.049
< Exit [It] Get tag name from environment - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:101 @ 04/13/25 12:25:03.049 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.049
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.049 (0s)
</system-err> |
4056 | + </testcase> |
4057 | + <testcase name="OCI Distribution Conformance Tests Pull Pull blobs HEAD request to nonexistent blob should result in 404 response" classname="conformance tests" status="passed" time="0.00112071"> |
4058 | + <system-err>> Enter [It] HEAD request to nonexistent blob should result in 404 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:112 @ 04/13/25 12:25:03.049
< Exit [It] HEAD request to nonexistent blob should result in 404 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:112 @ 04/13/25 12:25:03.051 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.051
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.051 (0s)
</system-err> |
4059 | + </testcase> |
4060 | + <testcase name="OCI Distribution Conformance Tests Pull Pull blobs HEAD request to existing blob should yield 200" classname="conformance tests" status="passed" time="0.000762485"> |
4061 | + <system-err>> Enter [It] HEAD request to existing blob should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:121 @ 04/13/25 12:25:03.051
< Exit [It] HEAD request to existing blob should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:121 @ 04/13/25 12:25:03.051 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.051
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.051 (0s)
</system-err> |
4062 | + </testcase> |
4063 | + <testcase name="OCI Distribution Conformance Tests Pull Pull blobs GET nonexistent blob should result in 404 response" classname="conformance tests" status="passed" time="0.000966695"> |
4064 | + <system-err>> Enter [It] GET nonexistent blob should result in 404 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:133 @ 04/13/25 12:25:03.051
< Exit [It] GET nonexistent blob should result in 404 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:133 @ 04/13/25 12:25:03.052 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.052
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.052 (0s)
</system-err> |
4065 | + </testcase> |
4066 | + <testcase name="OCI Distribution Conformance Tests Pull Pull blobs GET request to existing blob URL should yield 200" classname="conformance tests" status="passed" time="0.001268844"> |
4067 | + <system-err>> Enter [It] GET request to existing blob URL should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:142 @ 04/13/25 12:25:03.052
< Exit [It] GET request to existing blob URL should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:142 @ 04/13/25 12:25:03.054 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.054
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.054 (0s)
</system-err> |
4068 | + </testcase> |
4069 | + <testcase name="OCI Distribution Conformance Tests Pull Pull manifests HEAD request to nonexistent manifest should return 404" classname="conformance tests" status="passed" time="0.000344243"> |
4070 | + <system-err>> Enter [It] HEAD request to nonexistent manifest should return 404 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:152 @ 04/13/25 12:25:03.054
< Exit [It] HEAD request to nonexistent manifest should return 404 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:152 @ 04/13/25 12:25:03.054 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.054
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.054 (0s)
</system-err> |
4071 | + </testcase> |
4072 | + <testcase name="OCI Distribution Conformance Tests Pull Pull manifests HEAD request to manifest[0] path (digest) should yield 200 response" classname="conformance tests" status="passed" time="0.000827058"> |
4073 | + <system-err>> Enter [It] HEAD request to manifest[0] path (digest) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:161 @ 04/13/25 12:25:03.054
< Exit [It] HEAD request to manifest[0] path (digest) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:161 @ 04/13/25 12:25:03.055 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.055
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.055 (0s)
</system-err> |
4074 | + </testcase> |
4075 | + <testcase name="OCI Distribution Conformance Tests Pull Pull manifests HEAD request to manifest[1] path (digest) should yield 200 response" classname="conformance tests" status="passed" time="0.000841226"> |
4076 | + <system-err>> Enter [It] HEAD request to manifest[1] path (digest) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:173 @ 04/13/25 12:25:03.055
< Exit [It] HEAD request to manifest[1] path (digest) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:173 @ 04/13/25 12:25:03.056 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.056
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.056 (0s)
</system-err> |
4077 | + </testcase> |
4078 | + <testcase name="OCI Distribution Conformance Tests Pull Pull manifests HEAD request to manifest path (tag) should yield 200 response" classname="conformance tests" status="passed" time="0.000785109"> |
4079 | + <system-err>> Enter [It] HEAD request to manifest path (tag) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:185 @ 04/13/25 12:25:03.056
< Exit [It] HEAD request to manifest path (tag) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:185 @ 04/13/25 12:25:03.057 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.057
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.057 (0s)
</system-err> |
4080 | + </testcase> |
4081 | + <testcase name="OCI Distribution Conformance Tests Pull Pull manifests GET nonexistent manifest should return 404" classname="conformance tests" status="passed" time="0.000236652"> |
4082 | + <system-err>> Enter [It] GET nonexistent manifest should return 404 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:198 @ 04/13/25 12:25:03.057
< Exit [It] GET nonexistent manifest should return 404 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:198 @ 04/13/25 12:25:03.057 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.057
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.057 (0s)
</system-err> |
4083 | + </testcase> |
4084 | + <testcase name="OCI Distribution Conformance Tests Pull Pull manifests GET request to manifest[0] path (digest) should yield 200 response" classname="conformance tests" status="passed" time="0.000830533"> |
4085 | + <system-err>> Enter [It] GET request to manifest[0] path (digest) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:207 @ 04/13/25 12:25:03.057
< Exit [It] GET request to manifest[0] path (digest) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:207 @ 04/13/25 12:25:03.058 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.058
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.058 (0s)
</system-err> |
4086 | + </testcase> |
4087 | + <testcase name="OCI Distribution Conformance Tests Pull Pull manifests GET request to manifest[1] path (digest) should yield 200 response" classname="conformance tests" status="passed" time="0.000876693"> |
4088 | + <system-err>> Enter [It] GET request to manifest[1] path (digest) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:216 @ 04/13/25 12:25:03.058
< Exit [It] GET request to manifest[1] path (digest) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:216 @ 04/13/25 12:25:03.059 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.059
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.059 (0s)
</system-err> |
4089 | + </testcase> |
4090 | + <testcase name="OCI Distribution Conformance Tests Pull Pull manifests GET request to manifest path (tag) should yield 200 response" classname="conformance tests" status="passed" time="0.001180002"> |
4091 | + <system-err>> Enter [It] GET request to manifest path (tag) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:225 @ 04/13/25 12:25:03.059
< Exit [It] GET request to manifest path (tag) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:225 @ 04/13/25 12:25:03.06 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.06
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.06 (0s)
</system-err> |
4092 | + </testcase> |
4093 | + <testcase name="OCI Distribution Conformance Tests Pull Error codes 400 response body should contain OCI-conforming JSON message" classname="conformance tests" status="failed" time="0.000880432"> |
4094 | + <failure message="Expected
 <int>: 500
To satisfy at least one of these matchers: [%!s(*matchers.EqualMatcher=&{400}) %!s(*matchers.EqualMatcher=&{404})]" type="failed">[FAILED] Expected
 <int>: 500
To satisfy at least one of these matchers: [%!s(*matchers.EqualMatcher=&{400}) %!s(*matchers.EqualMatcher=&{404})]
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:245 @ 04/13/25 12:25:03.061
</failure> |
4095 | + <system-err>> Enter [It] 400 response body should contain OCI-conforming JSON message - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:237 @ 04/13/25 12:25:03.06
[FAILED] Expected
 <int>: 500
To satisfy at least one of these matchers: [%!s(*matchers.EqualMatcher=&{400}) %!s(*matchers.EqualMatcher=&{404})]
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:245 @ 04/13/25 12:25:03.061
< Exit [It] 400 response body should contain OCI-conforming JSON message - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:237 @ 04/13/25 12:25:03.061 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.061
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.061 (0s)
</system-err> |
4096 | + </testcase> |
4097 | + <testcase name="OCI Distribution Conformance Tests Pull Teardown Delete config[0] blob created in setup" classname="conformance tests" status="passed" time="0.000750107"> |
4098 | + <system-err>> Enter [It] Delete config[0] blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:290 @ 04/13/25 12:25:03.061
< Exit [It] Delete config[0] blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:290 @ 04/13/25 12:25:03.062 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.062
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.062 (0s)
</system-err> |
4099 | + </testcase> |
4100 | + <testcase name="OCI Distribution Conformance Tests Pull Teardown Delete config[1] blob created in setup" classname="conformance tests" status="passed" time="0.000708235"> |
4101 | + <system-err>> Enter [It] Delete config[1] blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:305 @ 04/13/25 12:25:03.062
< Exit [It] Delete config[1] blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:305 @ 04/13/25 12:25:03.062 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.062
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.062 (0s)
</system-err> |
4102 | + </testcase> |
4103 | + <testcase name="OCI Distribution Conformance Tests Pull Teardown Delete layer blob created in setup" classname="conformance tests" status="passed" time="0.000684584"> |
4104 | + <system-err>> Enter [It] Delete layer blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:321 @ 04/13/25 12:25:03.062
< Exit [It] Delete layer blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:321 @ 04/13/25 12:25:03.063 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.063
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.063 (0s)
</system-err> |
4105 | + </testcase> |
4106 | + <testcase name="OCI Distribution Conformance Tests Pull Teardown Delete manifest[0] created in setup" classname="conformance tests" status="passed" time="0.000715913"> |
4107 | + <system-err>> Enter [It] Delete manifest[0] created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:338 @ 04/13/25 12:25:03.063
< Exit [It] Delete manifest[0] created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:338 @ 04/13/25 12:25:03.064 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.064
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.064 (0s)
</system-err> |
4108 | + </testcase> |
4109 | + <testcase name="OCI Distribution Conformance Tests Pull Teardown Delete manifest[1] created in setup" classname="conformance tests" status="passed" time="0.001148443"> |
4110 | + <system-err>> Enter [It] Delete manifest[1] created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:352 @ 04/13/25 12:25:03.064
< Exit [It] Delete manifest[1] created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:352 @ 04/13/25 12:25:03.065 (1ms)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065 (0s)
</system-err> |
4111 | + </testcase> |
4112 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Streamed PATCH request with blob in body should yield 202 response" classname="conformance tests" status="skipped" time="9.266e-05"> |
4113 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4114 | + <system-err>> Enter [It] PATCH request with blob in body should yield 202 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:25 @ 04/13/25 12:25:03.065
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.065
< Exit [It] PATCH request with blob in body should yield 202 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:25 @ 04/13/25 12:25:03.065 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065 (0s)
</system-err> |
4115 | + </testcase> |
4116 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Streamed PUT request to session URL with digest should yield 201 response" classname="conformance tests" status="skipped" time="8.7901e-05"> |
4117 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4118 | + <system-err>> Enter [It] PUT request to session URL with digest should yield 201 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:42 @ 04/13/25 12:25:03.065
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.065
< Exit [It] PUT request to session URL with digest should yield 201 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:42 @ 04/13/25 12:25:03.065 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065 (0s)
</system-err> |
4119 | + </testcase> |
4120 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Monolithic GET nonexistent blob should result in 404 response" classname="conformance tests" status="skipped" time="7.6757e-05"> |
4121 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4122 | + <system-err>> Enter [It] GET nonexistent blob should result in 404 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:58 @ 04/13/25 12:25:03.065
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.065
< Exit [It] GET nonexistent blob should result in 404 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:58 @ 04/13/25 12:25:03.065 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065 (0s)
</system-err> |
4123 | + </testcase> |
4124 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Monolithic POST request with digest and blob should yield a 201 or 202" classname="conformance tests" status="skipped" time="8.0309e-05"> |
4125 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4126 | + <system-err>> Enter [It] POST request with digest and blob should yield a 201 or 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:67 @ 04/13/25 12:25:03.065
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.065
< Exit [It] POST request with digest and blob should yield a 201 or 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:67 @ 04/13/25 12:25:03.065 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065 (0s)
</system-err> |
4127 | + </testcase> |
4128 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Monolithic GET request to blob URL from prior request should yield 200 or 404 based on response code" classname="conformance tests" status="skipped" time="8.85e-05"> |
4129 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
"></skipped> |
4130 | + <system-err>> Enter [It] GET request to blob URL from prior request should yield 200 or 404 based on response code - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:85 @ 04/13/25 12:25:03.065
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.065
< Exit [It] GET request to blob URL from prior request should yield 200 or 404 based on response code - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:85 @ 04/13/25 12:25:03.065 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065 (0s)
</system-err> |
4131 | + </testcase> |
4132 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Monolithic POST request should yield a session ID" classname="conformance tests" status="skipped" time="7.9208e-05"> |
4133 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4134 | + <system-err>> Enter [It] POST request should yield a session ID - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:98 @ 04/13/25 12:25:03.065
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.065
< Exit [It] POST request should yield a session ID - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:98 @ 04/13/25 12:25:03.065 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.065 (0s)
</system-err> |
4135 | + </testcase> |
4136 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Monolithic PUT upload of a blob should yield a 201 Response" classname="conformance tests" status="skipped" time="7.5334e-05"> |
4137 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
"></skipped> |
4138 | + <system-err>> Enter [It] PUT upload of a blob should yield a 201 Response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:107 @ 04/13/25 12:25:03.065
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.066
< Exit [It] PUT upload of a blob should yield a 201 Response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:107 @ 04/13/25 12:25:03.066 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066 (0s)
</system-err> |
4139 | + </testcase> |
4140 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Monolithic GET request to existing blob should yield 200 response" classname="conformance tests" status="skipped" time="7.5369e-05"> |
4141 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
"></skipped> |
4142 | + <system-err>> Enter [It] GET request to existing blob should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:121 @ 04/13/25 12:25:03.066
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.066
< Exit [It] GET request to existing blob should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:121 @ 04/13/25 12:25:03.066 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066 (0s)
</system-err> |
4143 | + </testcase> |
4144 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Monolithic PUT upload of a layer blob should yield a 201 Response" classname="conformance tests" status="skipped" time="8.6792e-05"> |
4145 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4146 | + <system-err>> Enter [It] PUT upload of a layer blob should yield a 201 Response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:129 @ 04/13/25 12:25:03.066
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.066
< Exit [It] PUT upload of a layer blob should yield a 201 Response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:129 @ 04/13/25 12:25:03.066 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066 (0s)
</system-err> |
4147 | + </testcase> |
4148 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Monolithic GET request to existing layer should yield 200 response" classname="conformance tests" status="skipped" time="8.6753e-05"> |
4149 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
"></skipped> |
4150 | + <system-err>> Enter [It] GET request to existing layer should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:146 @ 04/13/25 12:25:03.066
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.066
< Exit [It] GET request to existing layer should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:146 @ 04/13/25 12:25:03.066 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066 (0s)
</system-err> |
4151 | + </testcase> |
4152 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Chunked Out-of-order blob upload should return 416" classname="conformance tests" status="skipped" time="8.2734e-05"> |
4153 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4154 | + <system-err>> Enter [It] Out-of-order blob upload should return 416 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:156 @ 04/13/25 12:25:03.066
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.066
< Exit [It] Out-of-order blob upload should return 416 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:156 @ 04/13/25 12:25:03.066 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066 (0s)
</system-err> |
4155 | + </testcase> |
4156 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Chunked PATCH request with first chunk should return 202" classname="conformance tests" status="skipped" time="7.4307e-05"> |
4157 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4158 | + <system-err>> Enter [It] PATCH request with first chunk should return 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:185 @ 04/13/25 12:25:03.066
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.066
< Exit [It] PATCH request with first chunk should return 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:185 @ 04/13/25 12:25:03.066 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066 (0s)
</system-err> |
4159 | + </testcase> |
4160 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Chunked Retry previous blob chunk should return 416" classname="conformance tests" status="skipped" time="7.4338e-05"> |
4161 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4162 | + <system-err>> Enter [It] Retry previous blob chunk should return 416 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:206 @ 04/13/25 12:25:03.066
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.066
< Exit [It] Retry previous blob chunk should return 416 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:206 @ 04/13/25 12:25:03.066 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066 (0s)
</system-err> |
4163 | + </testcase> |
4164 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Chunked Get on stale blob upload should return 204 with a range and location" classname="conformance tests" status="skipped" time="7.831e-05"> |
4165 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
"></skipped> |
4166 | + <system-err>> Enter [It] Get on stale blob upload should return 204 with a range and location - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:218 @ 04/13/25 12:25:03.066
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.066
< Exit [It] Get on stale blob upload should return 204 with a range and location - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:218 @ 04/13/25 12:25:03.066 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066 (0s)
</system-err> |
4167 | + </testcase> |
4168 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Chunked PATCH request with second chunk should return 202" classname="conformance tests" status="skipped" time="7.4689e-05"> |
4169 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4170 | + <system-err>> Enter [It] PATCH request with second chunk should return 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:229 @ 04/13/25 12:25:03.066
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.066
< Exit [It] PATCH request with second chunk should return 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:229 @ 04/13/25 12:25:03.066 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066 (0s)
</system-err> |
4171 | + </testcase> |
4172 | + <testcase name="OCI Distribution Conformance Tests Push Blob Upload Chunked PUT request with digest should return 201" classname="conformance tests" status="skipped" time="7.3663e-05"> |
4173 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4174 | + <system-err>> Enter [It] PUT request with digest should return 201 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:244 @ 04/13/25 12:25:03.066
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.066
< Exit [It] PUT request with digest should return 201 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:244 @ 04/13/25 12:25:03.066 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066 (0s)
</system-err> |
4175 | + </testcase> |
4176 | + <testcase name="OCI Distribution Conformance Tests Push Cross-Repository Blob Mount Cross-mounting of a blob without the from argument should yield session id" classname="conformance tests" status="skipped" time="7.3666e-05"> |
4177 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4178 | + <system-err>> Enter [It] Cross-mounting of a blob without the from argument should yield session id - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:259 @ 04/13/25 12:25:03.066
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.066
< Exit [It] Cross-mounting of a blob without the from argument should yield session id - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:259 @ 04/13/25 12:25:03.066 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.066 (0s)
</system-err> |
4179 | + </testcase> |
4180 | + <testcase name="OCI Distribution Conformance Tests Push Cross-Repository Blob Mount POST request to mount another repository's blob should return 201 or 202" classname="conformance tests" status="skipped" time="7.4594e-05"> |
4181 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4182 | + <system-err>> Enter [It] POST request to mount another repository's blob should return 201 or 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:270 @ 04/13/25 12:25:03.066
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.067
< Exit [It] POST request to mount another repository's blob should return 201 or 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:270 @ 04/13/25 12:25:03.067 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067 (0s)
</system-err> |
4183 | + </testcase> |
4184 | + <testcase name="OCI Distribution Conformance Tests Push Cross-Repository Blob Mount GET request to test digest within cross-mount namespace should return 200" classname="conformance tests" status="skipped" time="7.8032e-05"> |
4185 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4186 | + <system-err>> Enter [It] GET request to test digest within cross-mount namespace should return 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:285 @ 04/13/25 12:25:03.067
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.067
< Exit [It] GET request to test digest within cross-mount namespace should return 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:285 @ 04/13/25 12:25:03.067 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067 (0s)
</system-err> |
4187 | + </testcase> |
4188 | + <testcase name="OCI Distribution Conformance Tests Push Cross-Repository Blob Mount Cross-mounting of nonexistent blob should yield session id" classname="conformance tests" status="skipped" time="7.422e-05"> |
4189 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
"></skipped> |
4190 | + <system-err>> Enter [It] Cross-mounting of nonexistent blob should yield session id - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:295 @ 04/13/25 12:25:03.067
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.067
< Exit [It] Cross-mounting of nonexistent blob should yield session id - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:295 @ 04/13/25 12:25:03.067 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067 (0s)
</system-err> |
4191 | + </testcase> |
4192 | + <testcase name="OCI Distribution Conformance Tests Push Cross-Repository Blob Mount Cross-mounting without from, and automatic content discovery enabled should return a 201" classname="conformance tests" status="skipped" time="7.6628e-05"> |
4193 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4194 | + <system-err>> Enter [It] Cross-mounting without from, and automatic content discovery enabled should return a 201 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:301 @ 04/13/25 12:25:03.067
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.067
< Exit [It] Cross-mounting without from, and automatic content discovery enabled should return a 201 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:301 @ 04/13/25 12:25:03.067 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067 (0s)
</system-err> |
4195 | + </testcase> |
4196 | + <testcase name="OCI Distribution Conformance Tests Push Cross-Repository Blob Mount Cross-mounting without from, and automatic content discovery disabled should return a 202" classname="conformance tests" status="skipped" time="8.1477e-05"> |
4197 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4198 | + <system-err>> Enter [It] Cross-mounting without from, and automatic content discovery disabled should return a 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:314 @ 04/13/25 12:25:03.067
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.067
< Exit [It] Cross-mounting without from, and automatic content discovery disabled should return a 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:314 @ 04/13/25 12:25:03.067 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067 (0s)
</system-err> |
4199 | + </testcase> |
4200 | + <testcase name="OCI Distribution Conformance Tests Push Manifest Upload GET nonexistent manifest should return 404" classname="conformance tests" status="skipped" time="7.5157e-05"> |
4201 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
"></skipped> |
4202 | + <system-err>> Enter [It] GET nonexistent manifest should return 404 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:329 @ 04/13/25 12:25:03.067
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.067
< Exit [It] GET nonexistent manifest should return 404 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:329 @ 04/13/25 12:25:03.067 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067 (0s)
</system-err> |
4203 | + </testcase> |
4204 | + <testcase name="OCI Distribution Conformance Tests Push Manifest Upload PUT should accept a manifest upload" classname="conformance tests" status="skipped" time="7.7056e-05"> |
4205 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
"></skipped> |
4206 | + <system-err>> Enter [It] PUT should accept a manifest upload - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:338 @ 04/13/25 12:25:03.067
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.067
< Exit [It] PUT should accept a manifest upload - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:338 @ 04/13/25 12:25:03.067 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067 (0s)
</system-err> |
4207 | + </testcase> |
4208 | + <testcase name="OCI Distribution Conformance Tests Push Manifest Upload Registry should accept a manifest upload with no layers" classname="conformance tests" status="skipped" time="7.3088e-05"> |
4209 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4210 | + <system-err>> Enter [It] Registry should accept a manifest upload with no layers - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:354 @ 04/13/25 12:25:03.067
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.067
< Exit [It] Registry should accept a manifest upload with no layers - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:354 @ 04/13/25 12:25:03.067 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067 (0s)
</system-err> |
4211 | + </testcase> |
4212 | + <testcase name="OCI Distribution Conformance Tests Push Manifest Upload GET request to manifest URL (digest) should yield 200 response" classname="conformance tests" status="skipped" time="7.4208e-05"> |
4213 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4214 | + <system-err>> Enter [It] GET request to manifest URL (digest) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:372 @ 04/13/25 12:25:03.067
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.067
< Exit [It] GET request to manifest URL (digest) should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:372 @ 04/13/25 12:25:03.067 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067 (0s)
</system-err> |
4215 | + </testcase> |
4216 | + <testcase name="OCI Distribution Conformance Tests Push Teardown Delete config blob created in tests" classname="conformance tests" status="skipped" time="7.352e-05"> |
4217 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4218 | + <system-err>> Enter [It] Delete config blob created in tests - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:412 @ 04/13/25 12:25:03.067
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.067
< Exit [It] Delete config blob created in tests - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:412 @ 04/13/25 12:25:03.067 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067 (0s)
</system-err> |
4219 | + </testcase> |
4220 | + <testcase name="OCI Distribution Conformance Tests Push Teardown Delete layer blob created in setup" classname="conformance tests" status="skipped" time="7.2372e-05"> |
4221 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4222 | + <system-err>> Enter [It] Delete layer blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:428 @ 04/13/25 12:25:03.067
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.067
< Exit [It] Delete layer blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:428 @ 04/13/25 12:25:03.067 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.067 (0s)
</system-err> |
4223 | + </testcase> |
4224 | + <testcase name="OCI Distribution Conformance Tests Push Teardown Delete manifest created in tests" classname="conformance tests" status="skipped" time="7.6509e-05"> |
4225 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
"></skipped> |
4226 | + <system-err>> Enter [It] Delete manifest created in tests - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:445 @ 04/13/25 12:25:03.067
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.068
< Exit [It] Delete manifest created in tests - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:445 @ 04/13/25 12:25:03.068 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068 (0s)
</system-err> |
4227 | + </testcase> |
4228 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Setup Populate registry with test blob" classname="conformance tests" status="skipped" time="7.602e-05"> |
4229 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4230 | + <system-err>> Enter [It] Populate registry with test blob - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:24 @ 04/13/25 12:25:03.068
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.068
< Exit [It] Populate registry with test blob - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:24 @ 04/13/25 12:25:03.068 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068 (0s)
</system-err> |
4231 | + </testcase> |
4232 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Setup Populate registry with test layer" classname="conformance tests" status="skipped" time="7.4066e-05"> |
4233 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4234 | + <system-err>> Enter [It] Populate registry with test layer - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:42 @ 04/13/25 12:25:03.068
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.068
< Exit [It] Populate registry with test layer - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:42 @ 04/13/25 12:25:03.068 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068 (0s)
</system-err> |
4235 | + </testcase> |
4236 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Setup Populate registry with test tags" classname="conformance tests" status="skipped" time="7.4151e-05"> |
4237 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
"></skipped> |
4238 | + <system-err>> Enter [It] Populate registry with test tags - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:60 @ 04/13/25 12:25:03.068
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.068
< Exit [It] Populate registry with test tags - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:60 @ 04/13/25 12:25:03.068 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068 (0s)
</system-err> |
4239 | + </testcase> |
4240 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Setup Populate registry with test tags (no push)" classname="conformance tests" status="skipped" time="8.1358e-05"> |
4241 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4242 | + <system-err>> Enter [It] Populate registry with test tags (no push) - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:82 @ 04/13/25 12:25:03.068
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.068
< Exit [It] Populate registry with test tags (no push) - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:82 @ 04/13/25 12:25:03.068 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068 (0s)
</system-err> |
4243 | + </testcase> |
4244 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Setup References setup" classname="conformance tests" status="skipped" time="7.0082e-05"> |
4245 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4246 | + <system-err>> Enter [It] References setup - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:88 @ 04/13/25 12:25:03.068
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.068
< Exit [It] References setup - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:88 @ 04/13/25 12:25:03.068 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068 (0s)
</system-err> |
4247 | + </testcase> |
4248 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Test content discovery endpoints (listing tags) GET request to list tags should yield 200 response" classname="conformance tests" status="skipped" time="0.000171825"> |
4249 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4250 | + <system-err>> Enter [It] GET request to list tags should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:256 @ 04/13/25 12:25:03.068
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.068
< Exit [It] GET request to list tags should yield 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:256 @ 04/13/25 12:25:03.068 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068 (0s)
</system-err> |
4251 | + </testcase> |
4252 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Test content discovery endpoints (listing tags) GET number of tags should be limitable by `n` query parameter" classname="conformance tests" status="skipped" time="0.000215793"> |
4253 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4254 | + <system-err>> Enter [It] GET number of tags should be limitable by `n` query parameter - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:266 @ 04/13/25 12:25:03.068
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.068
< Exit [It] GET number of tags should be limitable by `n` query parameter - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:266 @ 04/13/25 12:25:03.068 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.068 (0s)
</system-err> |
4255 | + </testcase> |
4256 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Test content discovery endpoints (listing tags) GET start of tag is set by `last` query parameter" classname="conformance tests" status="skipped" time="8.5116e-05"> |
4257 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
"></skipped> |
4258 | + <system-err>> Enter [It] GET start of tag is set by `last` query parameter - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:279 @ 04/13/25 12:25:03.068
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.069
< Exit [It] GET start of tag is set by `last` query parameter - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:279 @ 04/13/25 12:25:03.069 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069 (0s)
</system-err> |
4259 | + </testcase> |
4260 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Test content discovery endpoints (listing references) GET request to nonexistent blob should result in empty 200 response" classname="conformance tests" status="skipped" time="7.9876e-05"> |
4261 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4262 | + <system-err>> Enter [It] GET request to nonexistent blob should result in empty 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:300 @ 04/13/25 12:25:03.069
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.069
< Exit [It] GET request to nonexistent blob should result in empty 200 response - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:300 @ 04/13/25 12:25:03.069 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069 (0s)
</system-err> |
4263 | + </testcase> |
4264 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Test content discovery endpoints (listing references) GET request to existing blob should yield 200" classname="conformance tests" status="skipped" time="7.7027e-05"> |
4265 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4266 | + <system-err>> Enter [It] GET request to existing blob should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:315 @ 04/13/25 12:25:03.069
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.069
< Exit [It] GET request to existing blob should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:315 @ 04/13/25 12:25:03.069 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069 (0s)
</system-err> |
4267 | + </testcase> |
4268 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Test content discovery endpoints (listing references) GET request to existing blob with filter should yield 200" classname="conformance tests" status="skipped" time="7.4983e-05"> |
4269 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4270 | + <system-err>> Enter [It] GET request to existing blob with filter should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:335 @ 04/13/25 12:25:03.069
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.069
< Exit [It] GET request to existing blob with filter should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:335 @ 04/13/25 12:25:03.069 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069 (0s)
</system-err> |
4271 | + </testcase> |
4272 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Test content discovery endpoints (listing references) GET request to missing manifest should yield 200" classname="conformance tests" status="skipped" time="8.3686e-05"> |
4273 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4274 | + <system-err>> Enter [It] GET request to missing manifest should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:367 @ 04/13/25 12:25:03.069
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.069
< Exit [It] GET request to missing manifest should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:367 @ 04/13/25 12:25:03.069 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069 (0s)
</system-err> |
4275 | + </testcase> |
4276 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Teardown Delete config blob created in tests" classname="conformance tests" status="skipped" time="7.6191e-05"> |
4277 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4278 | + <system-err>> Enter [It] Delete config blob created in tests - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:415 @ 04/13/25 12:25:03.069
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.069
< Exit [It] Delete config blob created in tests - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:415 @ 04/13/25 12:25:03.069 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069 (0s)
</system-err> |
4279 | + </testcase> |
4280 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Teardown Delete layer blob created in setup" classname="conformance tests" status="skipped" time="7.5933e-05"> |
4281 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4282 | + <system-err>> Enter [It] Delete layer blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:431 @ 04/13/25 12:25:03.069
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.069
< Exit [It] Delete layer blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:431 @ 04/13/25 12:25:03.069 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069 (0s)
</system-err> |
4283 | + </testcase> |
4284 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Teardown Delete created manifest & associated tags" classname="conformance tests" status="skipped" time="7.6856e-05"> |
4285 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4286 | + <system-err>> Enter [It] Delete created manifest & associated tags - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:448 @ 04/13/25 12:25:03.069
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.069
< Exit [It] Delete created manifest & associated tags - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:448 @ 04/13/25 12:25:03.069 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069 (0s)
</system-err> |
4287 | + </testcase> |
4288 | + <testcase name="OCI Distribution Conformance Tests Content Discovery Teardown References teardown" classname="conformance tests" status="skipped" time="8.2358e-05"> |
4289 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4290 | + <system-err>> Enter [It] References teardown - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:477 @ 04/13/25 12:25:03.069
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.069
< Exit [It] References teardown - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:477 @ 04/13/25 12:25:03.069 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069 (0s)
</system-err> |
4291 | + </testcase> |
4292 | + <testcase name="OCI Distribution Conformance Tests Content Management Setup Populate registry with test config blob" classname="conformance tests" status="skipped" time="8.6666e-05"> |
4293 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4294 | + <system-err>> Enter [It] Populate registry with test config blob - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:21 @ 04/13/25 12:25:03.069
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.069
< Exit [It] Populate registry with test config blob - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:21 @ 04/13/25 12:25:03.069 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069 (0s)
</system-err> |
4295 | + </testcase> |
4296 | + <testcase name="OCI Distribution Conformance Tests Content Management Setup Populate registry with test layer" classname="conformance tests" status="skipped" time="7.811e-05"> |
4297 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4298 | + <system-err>> Enter [It] Populate registry with test layer - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:39 @ 04/13/25 12:25:03.069
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.069
< Exit [It] Populate registry with test layer - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:39 @ 04/13/25 12:25:03.069 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.069 (0s)
</system-err> |
4299 | + </testcase> |
4300 | + <testcase name="OCI Distribution Conformance Tests Content Management Setup Populate registry with test tag" classname="conformance tests" status="skipped" time="8.2355e-05"> |
4301 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
"></skipped> |
4302 | + <system-err>> Enter [It] Populate registry with test tag - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:57 @ 04/13/25 12:25:03.069
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.07
< Exit [It] Populate registry with test tag - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:57 @ 04/13/25 12:25:03.07 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07 (0s)
</system-err> |
4303 | + </testcase> |
4304 | + <testcase name="OCI Distribution Conformance Tests Content Management Setup Check how many tags there are before anything gets deleted" classname="conformance tests" status="skipped" time="7.7407e-05"> |
4305 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4306 | + <system-err>> Enter [It] Check how many tags there are before anything gets deleted - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:72 @ 04/13/25 12:25:03.07
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.07
< Exit [It] Check how many tags there are before anything gets deleted - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:72 @ 04/13/25 12:25:03.07 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07 (0s)
</system-err> |
4307 | + </testcase> |
4308 | + <testcase name="OCI Distribution Conformance Tests Content Management Manifest delete DELETE request to manifest tag should return 202, unless tag deletion is disallowed (400/405)" classname="conformance tests" status="skipped" time="8.1127e-05"> |
4309 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
"></skipped> |
4310 | + <system-err>> Enter [It] DELETE request to manifest tag should return 202, unless tag deletion is disallowed (400/405) - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:88 @ 04/13/25 12:25:03.07
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.07
< Exit [It] DELETE request to manifest tag should return 202, unless tag deletion is disallowed (400/405) - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:88 @ 04/13/25 12:25:03.07 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07 (0s)
</system-err> |
4311 | + </testcase> |
4312 | + <testcase name="OCI Distribution Conformance Tests Content Management Manifest delete DELETE request to manifest (digest) should yield 202 response unless already deleted" classname="conformance tests" status="skipped" time="7.6632e-05"> |
4313 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
"></skipped> |
4314 | + <system-err>> Enter [It] DELETE request to manifest (digest) should yield 202 response unless already deleted - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:106 @ 04/13/25 12:25:03.07
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
	OCI_TEST_PULL=1
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.07
< Exit [It] DELETE request to manifest (digest) should yield 202 response unless already deleted - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:106 @ 04/13/25 12:25:03.07 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07 (0s)
</system-err> |
4315 | + </testcase> |
4316 | + <testcase name="OCI Distribution Conformance Tests Content Management Manifest delete GET request to deleted manifest URL should yield 404 response, unless delete is disallowed" classname="conformance tests" status="skipped" time="8.0156e-05"> |
4317 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4318 | + <system-err>> Enter [It] GET request to deleted manifest URL should yield 404 response, unless delete is disallowed - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:118 @ 04/13/25 12:25:03.07
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.07
< Exit [It] GET request to deleted manifest URL should yield 404 response, unless delete is disallowed - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:118 @ 04/13/25 12:25:03.07 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07 (0s)
</system-err> |
4319 | + </testcase> |
4320 | + <testcase name="OCI Distribution Conformance Tests Content Management Manifest delete GET request to tags list should reflect manifest deletion" classname="conformance tests" status="skipped" time="7.5152e-05"> |
4321 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4322 | + <system-err>> Enter [It] GET request to tags list should reflect manifest deletion - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:129 @ 04/13/25 12:25:03.07
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.07
< Exit [It] GET request to tags list should reflect manifest deletion - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:129 @ 04/13/25 12:25:03.07 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07 (0s)
</system-err> |
4323 | + </testcase> |
4324 | + <testcase name="OCI Distribution Conformance Tests Content Management Blob delete DELETE request to blob URL should yield 202 response" classname="conformance tests" status="skipped" time="8.1684e-05"> |
4325 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4326 | + <system-err>> Enter [It] DELETE request to blob URL should yield 202 response - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:153 @ 04/13/25 12:25:03.07
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.07
< Exit [It] DELETE request to blob URL should yield 202 response - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:153 @ 04/13/25 12:25:03.07 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07 (0s)
</system-err> |
4327 | + </testcase> |
4328 | + <testcase name="OCI Distribution Conformance Tests Content Management Blob delete GET request to deleted blob URL should yield 404 response" classname="conformance tests" status="skipped" time="7.5496e-05"> |
4329 | + <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
"></skipped> |
4330 | + <system-err>> Enter [It] GET request to deleted blob URL should yield 404 response - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:180 @ 04/13/25 12:25:03.07
[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:
	OCI_TEST_PULL=1
	OCI_TEST_PUSH=0
	OCI_TEST_CONTENT_DISCOVERY=0
	OCI_TEST_CONTENT_MANAGEMENT=0
In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/13/25 12:25:03.07
< Exit [It] GET request to deleted blob URL should yield 404 response - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:180 @ 04/13/25 12:25:03.07 (0s)
> Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07
< Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/13/25 12:25:03.07 (0s)
</system-err> |
4331 | + </testcase> |
4332 | + <testcase name="html custom reporter" classname="conformance tests" status="passed" time="0.004703533"> |
4333 | + <system-err>> Enter [ReportAfterSuite] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:24 @ 04/13/25 12:25:03.07
< Exit [ReportAfterSuite] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:24 @ 04/13/25 12:25:03.075 (5ms)
</system-err> |
4334 | + </testcase> |
4335 | + </testsuite> |
4336 | + </testsuites> |
4337 | \ No newline at end of file |
4338 | diff --git a/results/report.html b/results/report.html |
4339 | new file mode 100644 |
4340 | index 0000000..45dfcb5 |
4341 | --- /dev/null |
4342 | +++ b/results/report.html |
4343 | @@ -0,0 +1,2475 @@ |
4344 | + <html> |
4345 | + <head> |
4346 | + <title>OCI Distribution Conformance Tests</title> |
4347 | + <style> |
4348 | + body { |
4349 | + padding: 10px 20px 10px 20px; |
4350 | + font-family: -apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,Hiragino Sans GB,Microsoft YaHei,Helvetica Neue,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol; |
4351 | + background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQYV2Pce7zwv7NlPyMDFMAZGAIwlRgqAFydCAVv5m4UAAAAAElFTkSuQmCC") repeat; |
4352 | + |
4353 | + } |
4354 | + table { |
4355 | + border-collapse: collapse; |
4356 | + width: 100%; |
4357 | + background-color: white; |
4358 | + } |
4359 | + th, td { |
4360 | + padding: 12px; |
4361 | + text-align: left; |
4362 | + border-bottom: 1px solid #ddd; |
4363 | + } |
4364 | + tr:hover { |
4365 | + background-color: #ffe39b; |
4366 | + } |
4367 | + .result { |
4368 | + padding: 1.25em 0 .25em 0.8em; |
4369 | + border: 1px solid #e1e1e1; |
4370 | + border-radius: 5px; |
4371 | + margin-top: 10px; |
4372 | + } |
4373 | + .red { |
4374 | + background: #ffc8c8; |
4375 | + } |
4376 | + pre.fail-message { |
4377 | + background: #f9a5a5; |
4378 | + padding: 20px; |
4379 | + margin-right: 10px; |
4380 | + display: inline-block; |
4381 | + border-radius: 4px; |
4382 | + font-size: 1.25em; |
4383 | + width: 94%; |
4384 | + overflow-x: auto; |
4385 | + max-width: 85%; |
4386 | + } |
4387 | + .green { |
4388 | + background: #c8ffc8; |
4389 | + padding: 1.25em 0 1.25em 0.8em; |
4390 | + } |
4391 | + .grey { |
4392 | + background: lightgrey; |
4393 | + padding: 1.25em 0 1.25em 0.8em; |
4394 | + } |
4395 | + .toggle { |
4396 | + border: 2px solid #3e3e3e; |
4397 | + cursor: pointer; |
4398 | + width: 1em; |
4399 | + text-align: center; |
4400 | + font-weight: bold; |
4401 | + display: inline; |
4402 | + font-family: monospace; |
4403 | + padding: 0 .25em 0 .25em; |
4404 | + margin: 1em 1em 1em 0; |
4405 | + font-size: 12pt; |
4406 | + color: #3e3e3e; |
4407 | + border-radius: 3px; |
4408 | + } |
4409 | + pre.pre-box { |
4410 | + background: #343a40; |
4411 | + color: #fff; |
4412 | + padding: 10px; |
4413 | + border: 1px solid gray; |
4414 | + display: inline-block; |
4415 | + border-radius: 4px; |
4416 | + width: 97%; |
4417 | + font-size: 1.25em; |
4418 | + overflow-x: auto; |
4419 | + max-height: 60em; |
4420 | + overflow-y: auto; |
4421 | + max-width: 85%; |
4422 | + } |
4423 | + .summary { |
4424 | + width: 100%; |
4425 | + height: auto; |
4426 | + padding: 0 0 .5em 0; |
4427 | + border-radius: 6px; |
4428 | + border: 1px solid #cccddd; |
4429 | + background: white; |
4430 | + } |
4431 | + .summary-bullet { |
4432 | + width: 100%; |
4433 | + height: auto; |
4434 | + display: flex; |
4435 | + flex-wrap: wrap; |
4436 | + padding: .5em .1em .1em .5em; |
4437 | + } |
4438 | + .bullet-left { |
4439 | + width: 25%; |
4440 | + font-weight: bold; |
4441 | + font-size: 100%; |
4442 | + } |
4443 | + .bullet-right { |
4444 | + width: auto; |
4445 | + font-family: monospace; |
4446 | + font-size: 110%; |
4447 | + } |
4448 | + .quick-summary { |
4449 | + width: 70%; |
4450 | + display: flex; |
4451 | + margin: 0 auto 0 0; |
4452 | + font-weight: bold; |
4453 | + font-size: 1.2em; |
4454 | + } |
4455 | + .darkgreen { |
4456 | + color: green; |
4457 | + } |
4458 | + .darkred { |
4459 | + color: red; |
4460 | + padding: 0 0 0 2em; |
4461 | + } |
4462 | + .darkgrey { |
4463 | + color: grey; |
4464 | + padding: 0 0 0 2em; |
4465 | + } |
4466 | + .meter { |
4467 | + border: 1px solid black; |
4468 | + margin: 0 .5em 0 auto; |
4469 | + display: flex; |
4470 | + height: 25px; |
4471 | + width: 45%; |
4472 | + } |
4473 | + @media only screen and (max-width: 600px) { |
4474 | + .meter { |
4475 | + display: none; |
4476 | + } |
4477 | + } |
4478 | + .meter-green { |
4479 | + height: 100%; |
4480 | + background: green; |
4481 | + width: 28%; |
4482 | + } |
4483 | + .meter-red { |
4484 | + height: 100%; |
4485 | + background: red; |
4486 | + width: 1%; |
4487 | + } |
4488 | + .meter-grey { |
4489 | + height: 100%; |
4490 | + background: grey; |
4491 | + width: 71%; |
4492 | + } |
4493 | + .subcategory { |
4494 | + background: white; |
4495 | + padding: 0px 20px 20px 20px; |
4496 | + border: 1px solid #cccddd; |
4497 | + border-radius: 6px; |
4498 | + } |
4499 | + h2 { |
4500 | + margin-top: 45px; |
4501 | + } |
4502 | + h4 { |
4503 | + vertical-align: bottom; |
4504 | + cursor: pointer; |
4505 | + } |
4506 | + </style> |
4507 | + <script> |
4508 | + function toggleOutput(id) { |
4509 | + var elem = document.getElementById(id); |
4510 | + var button = document.getElementById(id + "-button"); |
4511 | + if (elem.style['display'] === 'block') { |
4512 | + button.innerHTML = "+"; |
4513 | + elem.style['display'] = 'none'; |
4514 | + } else { |
4515 | + button.innerHTML = "-"; |
4516 | + elem.style['display'] = 'block'; |
4517 | + } |
4518 | + } |
4519 | + </script> |
4520 | + </head> |
4521 | + <body> |
4522 | + <h1>OCI Distribution Conformance Tests</h1> |
4523 | + <table> |
4524 | + <tr> |
4525 | + </tr> |
4526 | + <tr> |
4527 | + <td class="bullet-left">Summary</td> |
4528 | + <td> |
4529 | + <div class="quick-summary"><span class="darkgreen">22 passed</span><span class="darkred">1 failed</span><span class="darkgrey">56 skipped</span><div class="meter"> |
4530 | + <div class="meter-green"></div> |
4531 | + <div class="meter-red"></div> |
4532 | + <div class="meter-grey"></div> |
4533 | + </div> |
4534 | + </div> |
4535 | + </td> |
4536 | + </tr> |
4537 | + <tr> |
4538 | + <td class="bullet-left">Start Time</td> |
4539 | + <td>Apr 13 12:25:02.900 +0000 UTC</td> |
4540 | + </tr> |
4541 | + <tr> |
4542 | + <td class="bullet-left">End Time</td> |
4543 | + <td>Apr 13 12:25:03.070 +0000 UTC</td> |
4544 | + </tr> |
4545 | + <tr> |
4546 | + <td class="bullet-left">Time Elapsed</td> |
4547 | + <td>169.993402ms</td> |
4548 | + </tr> |
4549 | + <tr> |
4550 | + <td class="bullet-left">Test Version</td> |
4551 | + <td>unknown</td> |
4552 | + </tr> |
4553 | + <tr> |
4554 | + <td class="bullet-left">Configuration</td> |
4555 | + <td><div class="bullet-right"> |
4556 | + |
4557 | + OCI_ROOT_URL=http://localhost:5000<br /> |
4558 | + |
4559 | + OCI_NAMESPACE=myorg/myrepo/a<br /> |
4560 | + |
4561 | + OCI_USERNAME=*****<br /> |
4562 | + |
4563 | + OCI_PASSWORD=*****<br /> |
4564 | + |
4565 | + OCI_DEBUG=0<br /> |
4566 | + |
4567 | + OCI_TEST_PULL=1<br /> |
4568 | + |
4569 | + OCI_TEST_PUSH=0<br /> |
4570 | + |
4571 | + OCI_TEST_CONTENT_DISCOVERY=0<br /> |
4572 | + |
4573 | + OCI_TEST_CONTENT_MANAGEMENT=0<br /> |
4574 | + |
4575 | + OCI_HIDE_SKIPPED_WORKFLOWS=0<br /> |
4576 | + |
4577 | + </div></td> |
4578 | + </tr> |
4579 | + </table> |
4580 | + |
4581 | + <div> |
4582 | + |
4583 | + |
4584 | + |
4585 | + |
4586 | + |
4587 | + |
4588 | + <h2>Pull</h2> |
4589 | + <div class="subcategory"> |
4590 | + |
4591 | + |
4592 | + <h3>Setup</h3> |
4593 | + |
4594 | + |
4595 | + |
4596 | + |
4597 | + |
4598 | + |
4599 | + <div class="result green"> |
4600 | + <div id="output-box-1-button" class="toggle" onclick="javascript:toggleOutput('output-box-1')">+</div> |
4601 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-1')">Populate registry with test blob</h4> |
4602 | + <br> |
4603 | + <div id="output-box-1" style="display: none;"> |
4604 | + <pre class="pre-box">DEBUG |
4605 | + ============================================================================== |
4606 | + ~~~ REQUEST ~~~ |
4607 | + POST /v2/myorg/myrepo/a/blobs/uploads/ HTTP/1.1 |
4608 | + HOST : localhost:5000 |
4609 | + HEADERS: |
4610 | + User-Agent: distribution-spec-conformance-tests |
4611 | + BODY : |
4612 | + ***** NO CONTENT ***** |
4613 | + ------------------------------------------------------------------------------ |
4614 | + ~~~ RESPONSE ~~~ |
4615 | + STATUS : 202 Accepted |
4616 | + PROTO : HTTP/1.1 |
4617 | + RECEIVED AT : 2025-04-13T12:25:02.960113525Z |
4618 | + TIME DURATION: 13.109557ms |
4619 | + HEADERS : |
4620 | + Content-Length: 0 |
4621 | + Date: Sun, 13 Apr 2025 12:25:02 GMT |
4622 | + Docker-Distribution-Api-Version: registry/2.0 |
4623 | + Docker-Upload-Uuid: 0884ac30-9538-4d0b-8ed9-99548c0b901a |
4624 | + Location: http://localhost:5000/v2/myorg/myrepo/a/blobs/uploads/0884ac30-9538-4d0b-8ed9-99548c0b901a?_state=***** |
4625 | + Range: 0-0 |
4626 | + X-Content-Type-Options: nosniff |
4627 | + BODY : |
4628 | + |
4629 | + ============================================================================== |
4630 | + |
4631 | + DEBUG |
4632 | + ============================================================================== |
4633 | + ~~~ REQUEST ~~~ |
4634 | + PUT /v2/myorg/myrepo/a/blobs/uploads/0884ac30-9538-4d0b-8ed9-99548c0b901a?_state=*****&digest=sha256%3A91ebe32a31a708da89e098c1053ba39ce65b98bc33542e5a588e7bf5b2693ef5 HTTP/1.1 |
4635 | + HOST : localhost:5000 |
4636 | + HEADERS: |
4637 | + Content-Length: 129 |
4638 | + Content-Type: application/octet-stream |
4639 | + User-Agent: distribution-spec-conformance-tests |
4640 | + BODY : |
4641 | + ***** BODY IS byte(s) (size - 129) ***** |
4642 | + ------------------------------------------------------------------------------ |
4643 | + ~~~ RESPONSE ~~~ |
4644 | + STATUS : 201 Created |
4645 | + PROTO : HTTP/1.1 |
4646 | + RECEIVED AT : 2025-04-13T12:25:02.979243777Z |
4647 | + TIME DURATION: 18.98139ms |
4648 | + HEADERS : |
4649 | + Content-Length: 0 |
4650 | + Date: Sun, 13 Apr 2025 12:25:02 GMT |
4651 | + Docker-Content-Digest: sha256:91ebe32a31a708da89e098c1053ba39ce65b98bc33542e5a588e7bf5b2693ef5 |
4652 | + Docker-Distribution-Api-Version: registry/2.0 |
4653 | + Location: http://localhost:5000/v2/myorg/myrepo/a/blobs/sha256:91ebe32a31a708da89e098c1053ba39ce65b98bc33542e5a588e7bf5b2693ef5 |
4654 | + X-Content-Type-Options: nosniff |
4655 | + BODY : |
4656 | + |
4657 | + ============================================================================== |
4658 | + |
4659 | + </pre> |
4660 | + </div> |
4661 | + </div> |
4662 | + |
4663 | + |
4664 | + |
4665 | + |
4666 | + <div class="result green"> |
4667 | + <div id="output-box-1-button" class="toggle" onclick="javascript:toggleOutput('output-box-1')">+</div> |
4668 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-1')">Populate registry with test blob</h4> |
4669 | + <br> |
4670 | + <div id="output-box-1" style="display: none;"> |
4671 | + <pre class="pre-box">DEBUG |
4672 | + ============================================================================== |
4673 | + ~~~ REQUEST ~~~ |
4674 | + POST /v2/myorg/myrepo/a/blobs/uploads/ HTTP/1.1 |
4675 | + HOST : localhost:5000 |
4676 | + HEADERS: |
4677 | + User-Agent: distribution-spec-conformance-tests |
4678 | + BODY : |
4679 | + ***** NO CONTENT ***** |
4680 | + ------------------------------------------------------------------------------ |
4681 | + ~~~ RESPONSE ~~~ |
4682 | + STATUS : 202 Accepted |
4683 | + PROTO : HTTP/1.1 |
4684 | + RECEIVED AT : 2025-04-13T12:25:02.960113525Z |
4685 | + TIME DURATION: 13.109557ms |
4686 | + HEADERS : |
4687 | + Content-Length: 0 |
4688 | + Date: Sun, 13 Apr 2025 12:25:02 GMT |
4689 | + Docker-Distribution-Api-Version: registry/2.0 |
4690 | + Docker-Upload-Uuid: 0884ac30-9538-4d0b-8ed9-99548c0b901a |
4691 | + Location: http://localhost:5000/v2/myorg/myrepo/a/blobs/uploads/0884ac30-9538-4d0b-8ed9-99548c0b901a?_state=***** |
4692 | + Range: 0-0 |
4693 | + X-Content-Type-Options: nosniff |
4694 | + BODY : |
4695 | + |
4696 | + ============================================================================== |
4697 | + |
4698 | + DEBUG |
4699 | + ============================================================================== |
4700 | + ~~~ REQUEST ~~~ |
4701 | + PUT /v2/myorg/myrepo/a/blobs/uploads/0884ac30-9538-4d0b-8ed9-99548c0b901a?_state=*****&digest=sha256%3A91ebe32a31a708da89e098c1053ba39ce65b98bc33542e5a588e7bf5b2693ef5 HTTP/1.1 |
4702 | + HOST : localhost:5000 |
4703 | + HEADERS: |
4704 | + Content-Length: 129 |
4705 | + Content-Type: application/octet-stream |
4706 | + User-Agent: distribution-spec-conformance-tests |
4707 | + BODY : |
4708 | + ***** BODY IS byte(s) (size - 129) ***** |
4709 | + ------------------------------------------------------------------------------ |
4710 | + ~~~ RESPONSE ~~~ |
4711 | + STATUS : 201 Created |
4712 | + PROTO : HTTP/1.1 |
4713 | + RECEIVED AT : 2025-04-13T12:25:02.979243777Z |
4714 | + TIME DURATION: 18.98139ms |
4715 | + HEADERS : |
4716 | + Content-Length: 0 |
4717 | + Date: Sun, 13 Apr 2025 12:25:02 GMT |
4718 | + Docker-Content-Digest: sha256:91ebe32a31a708da89e098c1053ba39ce65b98bc33542e5a588e7bf5b2693ef5 |
4719 | + Docker-Distribution-Api-Version: registry/2.0 |
4720 | + Location: http://localhost:5000/v2/myorg/myrepo/a/blobs/sha256:91ebe32a31a708da89e098c1053ba39ce65b98bc33542e5a588e7bf5b2693ef5 |
4721 | + X-Content-Type-Options: nosniff |
4722 | + BODY : |
4723 | + |
4724 | + ============================================================================== |
4725 | + |
4726 | + </pre> |
4727 | + </div> |
4728 | + </div> |
4729 | + |
4730 | + |
4731 | + |
4732 | + |
4733 | + <div class="result green"> |
4734 | + <div id="output-box-2-button" class="toggle" onclick="javascript:toggleOutput('output-box-2')">+</div> |
4735 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-2')">Populate registry with test layer</h4> |
4736 | + <br> |
4737 | + <div id="output-box-2" style="display: none;"> |
4738 | + <pre class="pre-box">DEBUG |
4739 | + ============================================================================== |
4740 | + ~~~ REQUEST ~~~ |
4741 | + POST /v2/myorg/myrepo/a/blobs/uploads/ HTTP/1.1 |
4742 | + HOST : localhost:5000 |
4743 | + HEADERS: |
4744 | + User-Agent: distribution-spec-conformance-tests |
4745 | + BODY : |
4746 | + ***** NO CONTENT ***** |
4747 | + ------------------------------------------------------------------------------ |
4748 | + ~~~ RESPONSE ~~~ |
4749 | + STATUS : 202 Accepted |
4750 | + PROTO : HTTP/1.1 |
4751 | + RECEIVED AT : 2025-04-13T12:25:02.992416017Z |
4752 | + TIME DURATION: 12.970237ms |
4753 | + HEADERS : |
4754 | + Content-Length: 0 |
4755 | + Date: Sun, 13 Apr 2025 12:25:02 GMT |
4756 | + Docker-Distribution-Api-Version: registry/2.0 |
4757 | + Docker-Upload-Uuid: 0295b7cf-e728-47c0-b8a2-81bd70d0dfd9 |
4758 | + Location: http://localhost:5000/v2/myorg/myrepo/a/blobs/uploads/0295b7cf-e728-47c0-b8a2-81bd70d0dfd9?_state=***** |
4759 | + Range: 0-0 |
4760 | + X-Content-Type-Options: nosniff |
4761 | + BODY : |
4762 | + |
4763 | + ============================================================================== |
4764 | + |
4765 | + DEBUG |
4766 | + ============================================================================== |
4767 | + ~~~ REQUEST ~~~ |
4768 | + PUT /v2/myorg/myrepo/a/blobs/uploads/0295b7cf-e728-47c0-b8a2-81bd70d0dfd9?_state=*****&digest=sha256%3A48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183 HTTP/1.1 |
4769 | + HOST : localhost:5000 |
4770 | + HEADERS: |
4771 | + Content-Length: 168 |
4772 | + Content-Type: application/octet-stream |
4773 | + User-Agent: distribution-spec-conformance-tests |
4774 | + BODY : |
4775 | + ***** BODY IS byte(s) (size - 168) ***** |
4776 | + ------------------------------------------------------------------------------ |
4777 | + ~~~ RESPONSE ~~~ |
4778 | + STATUS : 201 Created |
4779 | + PROTO : HTTP/1.1 |
4780 | + RECEIVED AT : 2025-04-13T12:25:03.011600451Z |
4781 | + TIME DURATION: 18.992823ms |
4782 | + HEADERS : |
4783 | + Content-Length: 0 |
4784 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
4785 | + Docker-Content-Digest: sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183 |
4786 | + Docker-Distribution-Api-Version: registry/2.0 |
4787 | + Location: http://localhost:5000/v2/myorg/myrepo/a/blobs/sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183 |
4788 | + X-Content-Type-Options: nosniff |
4789 | + BODY : |
4790 | + |
4791 | + ============================================================================== |
4792 | + |
4793 | + </pre> |
4794 | + </div> |
4795 | + </div> |
4796 | + |
4797 | + |
4798 | + |
4799 | + |
4800 | + <div class="result green"> |
4801 | + <div id="output-box-4-button" class="toggle" onclick="javascript:toggleOutput('output-box-4')">+</div> |
4802 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-4')">Populate registry with test manifest</h4> |
4803 | + <br> |
4804 | + <div id="output-box-4" style="display: none;"> |
4805 | + <pre class="pre-box">DEBUG |
4806 | + ============================================================================== |
4807 | + ~~~ REQUEST ~~~ |
4808 | + PUT /v2/myorg/myrepo/a/manifests/sha256:0b10c41d8ddd03ca72c3cbe84912f8262908325bd5efae9fb8d61c3221751ce9 HTTP/1.1 |
4809 | + HOST : localhost:5000 |
4810 | + HEADERS: |
4811 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
4812 | + User-Agent: distribution-spec-conformance-tests |
4813 | + BODY : |
4814 | + "ewoJInNjaGVtYVZlcnNpb24iOiAyLAoJIm1lZGlhVHlwZSI6ICJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLm1hbmlmZXN0LnYxK2pzb24iLAoJImNvbmZpZyI6IHsKCQkibWVkaWFUeXBlIjogImFwcGxpY2F0aW9uL3ZuZC5vY2kuaW1hZ2UuY29uZmlnLnYxK2pzb24iLAoJCSJkaWdlc3QiOiAic2hhMjU2OjkxZWJlMzJhMzFhNzA4ZGE4OWUwOThjMTA1M2JhMzljZTY1Yjk4YmMzMzU0MmU1YTU4OGU3YmY1YjI2OTNlZjUiLAoJCSJzaXplIjogMTI5LAoJCSJkYXRhIjogImV3b0pJbUYxZEdodmNpSTZJQ0owUkdSeVZFSndVelJIVERFM05sVkhJaXdLQ1NKaGNtTm9hWFJsWTNSMWNtVWlPaUFpWVcxa05qUWlMQW9KSW05eklqb2dJbXhwYm5WNElpd0tDU0p5YjI5MFpuTWlPaUI3Q2drSkluUjVjR1VpT2lBaWJHRjVaWEp6SWl3S0NRa2laR2xtWmw5cFpITWlPaUJiWFFvSmZRcDkiLAoJCSJuZXdVbnNwZWNpZmllZEZpZWxkIjogImFHVnNiRzhnZDI5eWJHUT0iCgl9LAoJImxheWVycyI6IFsKCQl7CgkJCSJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLm9jaS5pbWFnZS5sYXllci52MS50YXIrZ3ppcCIsCgkJCSJkaWdlc3QiOiAic2hhMjU2OjQ4YWNmZjFkOTE3NTJlOTU3NTI3YzFiNTQxNmU3Mzc2ZDkxMGJjYWNmMDFiOTQ0MTE3NWY4YzI3MGUzNWMxODMiLAoJCQkic2l6ZSI6IDE2OCwKCQkJIm5ld1Vuc3BlY2lmaWVkRmllbGQiOiBudWxsCgkJfQoJXQp9" |
4815 | + ------------------------------------------------------------------------------ |
4816 | + ~~~ RESPONSE ~~~ |
4817 | + STATUS : 201 Created |
4818 | + PROTO : HTTP/1.1 |
4819 | + RECEIVED AT : 2025-04-13T12:25:03.049599671Z |
4820 | + TIME DURATION: 12.901323ms |
4821 | + HEADERS : |
4822 | + Content-Length: 0 |
4823 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
4824 | + Docker-Content-Digest: sha256:0b10c41d8ddd03ca72c3cbe84912f8262908325bd5efae9fb8d61c3221751ce9 |
4825 | + Docker-Distribution-Api-Version: registry/2.0 |
4826 | + Location: http://localhost:5000/v2/myorg/myrepo/a/manifests/sha256:0b10c41d8ddd03ca72c3cbe84912f8262908325bd5efae9fb8d61c3221751ce9 |
4827 | + X-Content-Type-Options: nosniff |
4828 | + BODY : |
4829 | + |
4830 | + ============================================================================== |
4831 | + |
4832 | + </pre> |
4833 | + </div> |
4834 | + </div> |
4835 | + |
4836 | + |
4837 | + |
4838 | + |
4839 | + <div class="result green"> |
4840 | + <div id="output-box-4-button" class="toggle" onclick="javascript:toggleOutput('output-box-4')">+</div> |
4841 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-4')">Populate registry with test manifest</h4> |
4842 | + <br> |
4843 | + <div id="output-box-4" style="display: none;"> |
4844 | + <pre class="pre-box">DEBUG |
4845 | + ============================================================================== |
4846 | + ~~~ REQUEST ~~~ |
4847 | + PUT /v2/myorg/myrepo/a/manifests/sha256:0b10c41d8ddd03ca72c3cbe84912f8262908325bd5efae9fb8d61c3221751ce9 HTTP/1.1 |
4848 | + HOST : localhost:5000 |
4849 | + HEADERS: |
4850 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
4851 | + User-Agent: distribution-spec-conformance-tests |
4852 | + BODY : |
4853 | + "ewoJInNjaGVtYVZlcnNpb24iOiAyLAoJIm1lZGlhVHlwZSI6ICJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLm1hbmlmZXN0LnYxK2pzb24iLAoJImNvbmZpZyI6IHsKCQkibWVkaWFUeXBlIjogImFwcGxpY2F0aW9uL3ZuZC5vY2kuaW1hZ2UuY29uZmlnLnYxK2pzb24iLAoJCSJkaWdlc3QiOiAic2hhMjU2OjkxZWJlMzJhMzFhNzA4ZGE4OWUwOThjMTA1M2JhMzljZTY1Yjk4YmMzMzU0MmU1YTU4OGU3YmY1YjI2OTNlZjUiLAoJCSJzaXplIjogMTI5LAoJCSJkYXRhIjogImV3b0pJbUYxZEdodmNpSTZJQ0owUkdSeVZFSndVelJIVERFM05sVkhJaXdLQ1NKaGNtTm9hWFJsWTNSMWNtVWlPaUFpWVcxa05qUWlMQW9KSW05eklqb2dJbXhwYm5WNElpd0tDU0p5YjI5MFpuTWlPaUI3Q2drSkluUjVjR1VpT2lBaWJHRjVaWEp6SWl3S0NRa2laR2xtWmw5cFpITWlPaUJiWFFvSmZRcDkiLAoJCSJuZXdVbnNwZWNpZmllZEZpZWxkIjogImFHVnNiRzhnZDI5eWJHUT0iCgl9LAoJImxheWVycyI6IFsKCQl7CgkJCSJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLm9jaS5pbWFnZS5sYXllci52MS50YXIrZ3ppcCIsCgkJCSJkaWdlc3QiOiAic2hhMjU2OjQ4YWNmZjFkOTE3NTJlOTU3NTI3YzFiNTQxNmU3Mzc2ZDkxMGJjYWNmMDFiOTQ0MTE3NWY4YzI3MGUzNWMxODMiLAoJCQkic2l6ZSI6IDE2OCwKCQkJIm5ld1Vuc3BlY2lmaWVkRmllbGQiOiBudWxsCgkJfQoJXQp9" |
4854 | + ------------------------------------------------------------------------------ |
4855 | + ~~~ RESPONSE ~~~ |
4856 | + STATUS : 201 Created |
4857 | + PROTO : HTTP/1.1 |
4858 | + RECEIVED AT : 2025-04-13T12:25:03.049599671Z |
4859 | + TIME DURATION: 12.901323ms |
4860 | + HEADERS : |
4861 | + Content-Length: 0 |
4862 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
4863 | + Docker-Content-Digest: sha256:0b10c41d8ddd03ca72c3cbe84912f8262908325bd5efae9fb8d61c3221751ce9 |
4864 | + Docker-Distribution-Api-Version: registry/2.0 |
4865 | + Location: http://localhost:5000/v2/myorg/myrepo/a/manifests/sha256:0b10c41d8ddd03ca72c3cbe84912f8262908325bd5efae9fb8d61c3221751ce9 |
4866 | + X-Content-Type-Options: nosniff |
4867 | + BODY : |
4868 | + |
4869 | + ============================================================================== |
4870 | + |
4871 | + </pre> |
4872 | + </div> |
4873 | + </div> |
4874 | + |
4875 | + |
4876 | + |
4877 | + |
4878 | + <div class="result grey"> |
4879 | + <div id="output-box-5-button" class="toggle" onclick="javascript:toggleOutput('output-box-5')">+</div> |
4880 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-5')">Get tag name from environment</h4> |
4881 | + <br> |
4882 | + <div id="output-box-5" style="display: none;"> |
4883 | + <pre class="pre-box">you have skipped this test.</pre> |
4884 | + </div> |
4885 | + </div> |
4886 | + |
4887 | + <br> |
4888 | + |
4889 | + |
4890 | + <h3>Pull blobs</h3> |
4891 | + |
4892 | + |
4893 | + |
4894 | + |
4895 | + |
4896 | + |
4897 | + <div class="result green"> |
4898 | + <div id="output-box-6-button" class="toggle" onclick="javascript:toggleOutput('output-box-6')">+</div> |
4899 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-6')">HEAD request to nonexistent blob should result in 404 response</h4> |
4900 | + <br> |
4901 | + <div id="output-box-6" style="display: none;"> |
4902 | + <pre class="pre-box">DEBUG |
4903 | + ============================================================================== |
4904 | + ~~~ REQUEST ~~~ |
4905 | + HEAD /v2/myorg/myrepo/a/blobs/sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 HTTP/1.1 |
4906 | + HOST : localhost:5000 |
4907 | + HEADERS: |
4908 | + User-Agent: distribution-spec-conformance-tests |
4909 | + BODY : |
4910 | + ***** NO CONTENT ***** |
4911 | + ------------------------------------------------------------------------------ |
4912 | + ~~~ RESPONSE ~~~ |
4913 | + STATUS : 404 Not Found |
4914 | + PROTO : HTTP/1.1 |
4915 | + RECEIVED AT : 2025-04-13T12:25:03.05095233Z |
4916 | + TIME DURATION: 955.473µs |
4917 | + HEADERS : |
4918 | + Content-Length: 157 |
4919 | + Content-Type: application/json; charset=utf-8 |
4920 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
4921 | + Docker-Distribution-Api-Version: registry/2.0 |
4922 | + X-Content-Type-Options: nosniff |
4923 | + BODY : |
4924 | + *** Error: Unable to format response body - "unexpected end of JSON input" *** |
4925 | + |
4926 | + Log Body as-is: |
4927 | + |
4928 | + ============================================================================== |
4929 | + |
4930 | + </pre> |
4931 | + </div> |
4932 | + </div> |
4933 | + |
4934 | + |
4935 | + |
4936 | + |
4937 | + <div class="result green"> |
4938 | + <div id="output-box-7-button" class="toggle" onclick="javascript:toggleOutput('output-box-7')">+</div> |
4939 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-7')">HEAD request to existing blob should yield 200</h4> |
4940 | + <br> |
4941 | + <div id="output-box-7" style="display: none;"> |
4942 | + <pre class="pre-box">DEBUG |
4943 | + ============================================================================== |
4944 | + ~~~ REQUEST ~~~ |
4945 | + HEAD /v2/myorg/myrepo/a/blobs/sha256:4ff4c7e8f8cd0ece3cd6a91d2e8eb83d06b1d0f9f1caa06a82d7fe1d6acde544 HTTP/1.1 |
4946 | + HOST : localhost:5000 |
4947 | + HEADERS: |
4948 | + User-Agent: distribution-spec-conformance-tests |
4949 | + BODY : |
4950 | + ***** NO CONTENT ***** |
4951 | + ------------------------------------------------------------------------------ |
4952 | + ~~~ RESPONSE ~~~ |
4953 | + STATUS : 200 OK |
4954 | + PROTO : HTTP/1.1 |
4955 | + RECEIVED AT : 2025-04-13T12:25:03.051732952Z |
4956 | + TIME DURATION: 600.012µs |
4957 | + HEADERS : |
4958 | + Accept-Ranges: bytes |
4959 | + Cache-Control: max-age=31536000 |
4960 | + Content-Length: 129 |
4961 | + Content-Type: application/octet-stream |
4962 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
4963 | + Docker-Content-Digest: sha256:4ff4c7e8f8cd0ece3cd6a91d2e8eb83d06b1d0f9f1caa06a82d7fe1d6acde544 |
4964 | + Docker-Distribution-Api-Version: registry/2.0 |
4965 | + Etag: "sha256:4ff4c7e8f8cd0ece3cd6a91d2e8eb83d06b1d0f9f1caa06a82d7fe1d6acde544" |
4966 | + X-Content-Type-Options: nosniff |
4967 | + BODY : |
4968 | + |
4969 | + ============================================================================== |
4970 | + |
4971 | + </pre> |
4972 | + </div> |
4973 | + </div> |
4974 | + |
4975 | + |
4976 | + |
4977 | + |
4978 | + <div class="result green"> |
4979 | + <div id="output-box-8-button" class="toggle" onclick="javascript:toggleOutput('output-box-8')">+</div> |
4980 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-8')">GET nonexistent blob should result in 404 response</h4> |
4981 | + <br> |
4982 | + <div id="output-box-8" style="display: none;"> |
4983 | + <pre class="pre-box">DEBUG |
4984 | + ============================================================================== |
4985 | + ~~~ REQUEST ~~~ |
4986 | + GET /v2/myorg/myrepo/a/blobs/sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 HTTP/1.1 |
4987 | + HOST : localhost:5000 |
4988 | + HEADERS: |
4989 | + User-Agent: distribution-spec-conformance-tests |
4990 | + BODY : |
4991 | + ***** NO CONTENT ***** |
4992 | + ------------------------------------------------------------------------------ |
4993 | + ~~~ RESPONSE ~~~ |
4994 | + STATUS : 404 Not Found |
4995 | + PROTO : HTTP/1.1 |
4996 | + RECEIVED AT : 2025-04-13T12:25:03.052717209Z |
4997 | + TIME DURATION: 799.041µs |
4998 | + HEADERS : |
4999 | + Content-Length: 157 |
5000 | + Content-Type: application/json; charset=utf-8 |
5001 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5002 | + Docker-Distribution-Api-Version: registry/2.0 |
5003 | + X-Content-Type-Options: nosniff |
5004 | + BODY : |
5005 | + { |
5006 | + "errors": [ |
5007 | + { |
5008 | + "code": "BLOB_UNKNOWN", |
5009 | + "message": "blob unknown to registry", |
5010 | + "detail": "sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9" |
5011 | + } |
5012 | + ] |
5013 | + } |
5014 | + |
5015 | + ============================================================================== |
5016 | + |
5017 | + </pre> |
5018 | + </div> |
5019 | + </div> |
5020 | + |
5021 | + |
5022 | + |
5023 | + |
5024 | + <div class="result green"> |
5025 | + <div id="output-box-9-button" class="toggle" onclick="javascript:toggleOutput('output-box-9')">+</div> |
5026 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-9')">GET request to existing blob URL should yield 200</h4> |
5027 | + <br> |
5028 | + <div id="output-box-9" style="display: none;"> |
5029 | + <pre class="pre-box">DEBUG |
5030 | + ============================================================================== |
5031 | + ~~~ REQUEST ~~~ |
5032 | + GET /v2/myorg/myrepo/a/blobs/sha256:4ff4c7e8f8cd0ece3cd6a91d2e8eb83d06b1d0f9f1caa06a82d7fe1d6acde544 HTTP/1.1 |
5033 | + HOST : localhost:5000 |
5034 | + HEADERS: |
5035 | + User-Agent: distribution-spec-conformance-tests |
5036 | + BODY : |
5037 | + ***** NO CONTENT ***** |
5038 | + ------------------------------------------------------------------------------ |
5039 | + ~~~ RESPONSE ~~~ |
5040 | + STATUS : 200 OK |
5041 | + PROTO : HTTP/1.1 |
5042 | + RECEIVED AT : 2025-04-13T12:25:03.053997891Z |
5043 | + TIME DURATION: 1.092002ms |
5044 | + HEADERS : |
5045 | + Accept-Ranges: bytes |
5046 | + Cache-Control: max-age=31536000 |
5047 | + Content-Length: 129 |
5048 | + Content-Type: application/octet-stream |
5049 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5050 | + Docker-Content-Digest: sha256:4ff4c7e8f8cd0ece3cd6a91d2e8eb83d06b1d0f9f1caa06a82d7fe1d6acde544 |
5051 | + Docker-Distribution-Api-Version: registry/2.0 |
5052 | + Etag: "sha256:4ff4c7e8f8cd0ece3cd6a91d2e8eb83d06b1d0f9f1caa06a82d7fe1d6acde544" |
5053 | + X-Content-Type-Options: nosniff |
5054 | + BODY : |
5055 | + { |
5056 | + "author": "HMjYvZz4L8VkAAjl", |
5057 | + "architecture": "amd64", |
5058 | + "os": "linux", |
5059 | + "rootfs": { |
5060 | + "type": "layers", |
5061 | + "diff_ids": [] |
5062 | + } |
5063 | + } |
5064 | + ============================================================================== |
5065 | + |
5066 | + </pre> |
5067 | + </div> |
5068 | + </div> |
5069 | + |
5070 | + <br> |
5071 | + |
5072 | + |
5073 | + <h3>Pull manifests</h3> |
5074 | + |
5075 | + |
5076 | + |
5077 | + |
5078 | + |
5079 | + |
5080 | + <div class="result green"> |
5081 | + <div id="output-box-10-button" class="toggle" onclick="javascript:toggleOutput('output-box-10')">+</div> |
5082 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-10')">HEAD request to nonexistent manifest should return 404</h4> |
5083 | + <br> |
5084 | + <div id="output-box-10" style="display: none;"> |
5085 | + <pre class="pre-box">DEBUG |
5086 | + ============================================================================== |
5087 | + ~~~ REQUEST ~~~ |
5088 | + HEAD /v2/myorg/myrepo/a/manifests/.INVALID_MANIFEST_NAME HTTP/1.1 |
5089 | + HOST : localhost:5000 |
5090 | + HEADERS: |
5091 | + User-Agent: distribution-spec-conformance-tests |
5092 | + BODY : |
5093 | + ***** NO CONTENT ***** |
5094 | + ------------------------------------------------------------------------------ |
5095 | + ~~~ RESPONSE ~~~ |
5096 | + STATUS : 404 Not Found |
5097 | + PROTO : HTTP/1.1 |
5098 | + RECEIVED AT : 2025-04-13T12:25:03.054407305Z |
5099 | + TIME DURATION: 206.948µs |
5100 | + HEADERS : |
5101 | + Content-Length: 19 |
5102 | + Content-Type: text/plain; charset=utf-8 |
5103 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5104 | + Docker-Distribution-Api-Version: registry/2.0 |
5105 | + X-Content-Type-Options: nosniff |
5106 | + BODY : |
5107 | + |
5108 | + ============================================================================== |
5109 | + |
5110 | + </pre> |
5111 | + </div> |
5112 | + </div> |
5113 | + |
5114 | + |
5115 | + |
5116 | + |
5117 | + <div class="result green"> |
5118 | + <div id="output-box-11-button" class="toggle" onclick="javascript:toggleOutput('output-box-11')">+</div> |
5119 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-11')">HEAD request to manifest[0] path (digest) should yield 200 response</h4> |
5120 | + <br> |
5121 | + <div id="output-box-11" style="display: none;"> |
5122 | + <pre class="pre-box">DEBUG |
5123 | + ============================================================================== |
5124 | + ~~~ REQUEST ~~~ |
5125 | + HEAD /v2/myorg/myrepo/a/manifests/sha256:d0154f9c047c63a137a3827d30c53c5a09d50c3ce8385f1eb543603ab5271590 HTTP/1.1 |
5126 | + HOST : localhost:5000 |
5127 | + HEADERS: |
5128 | + Accept: application/vnd.oci.image.manifest.v1+json |
5129 | + User-Agent: distribution-spec-conformance-tests |
5130 | + BODY : |
5131 | + ***** NO CONTENT ***** |
5132 | + ------------------------------------------------------------------------------ |
5133 | + ~~~ RESPONSE ~~~ |
5134 | + STATUS : 200 OK |
5135 | + PROTO : HTTP/1.1 |
5136 | + RECEIVED AT : 2025-04-13T12:25:03.055219281Z |
5137 | + TIME DURATION: 645.464µs |
5138 | + HEADERS : |
5139 | + Content-Length: 714 |
5140 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
5141 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5142 | + Docker-Content-Digest: sha256:d0154f9c047c63a137a3827d30c53c5a09d50c3ce8385f1eb543603ab5271590 |
5143 | + Docker-Distribution-Api-Version: registry/2.0 |
5144 | + Etag: "sha256:d0154f9c047c63a137a3827d30c53c5a09d50c3ce8385f1eb543603ab5271590" |
5145 | + X-Content-Type-Options: nosniff |
5146 | + BODY : |
5147 | + *** Error: Unable to format response body - "unexpected end of JSON input" *** |
5148 | + |
5149 | + Log Body as-is: |
5150 | + |
5151 | + ============================================================================== |
5152 | + |
5153 | + </pre> |
5154 | + </div> |
5155 | + </div> |
5156 | + |
5157 | + |
5158 | + |
5159 | + |
5160 | + <div class="result green"> |
5161 | + <div id="output-box-12-button" class="toggle" onclick="javascript:toggleOutput('output-box-12')">+</div> |
5162 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-12')">HEAD request to manifest[1] path (digest) should yield 200 response</h4> |
5163 | + <br> |
5164 | + <div id="output-box-12" style="display: none;"> |
5165 | + <pre class="pre-box">DEBUG |
5166 | + ============================================================================== |
5167 | + ~~~ REQUEST ~~~ |
5168 | + HEAD /v2/myorg/myrepo/a/manifests/sha256:0b10c41d8ddd03ca72c3cbe84912f8262908325bd5efae9fb8d61c3221751ce9 HTTP/1.1 |
5169 | + HOST : localhost:5000 |
5170 | + HEADERS: |
5171 | + Accept: application/vnd.oci.image.manifest.v1+json |
5172 | + User-Agent: distribution-spec-conformance-tests |
5173 | + BODY : |
5174 | + ***** NO CONTENT ***** |
5175 | + ------------------------------------------------------------------------------ |
5176 | + ~~~ RESPONSE ~~~ |
5177 | + STATUS : 200 OK |
5178 | + PROTO : HTTP/1.1 |
5179 | + RECEIVED AT : 2025-04-13T12:25:03.05608927Z |
5180 | + TIME DURATION: 661.816µs |
5181 | + HEADERS : |
5182 | + Content-Length: 714 |
5183 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
5184 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5185 | + Docker-Content-Digest: sha256:0b10c41d8ddd03ca72c3cbe84912f8262908325bd5efae9fb8d61c3221751ce9 |
5186 | + Docker-Distribution-Api-Version: registry/2.0 |
5187 | + Etag: "sha256:0b10c41d8ddd03ca72c3cbe84912f8262908325bd5efae9fb8d61c3221751ce9" |
5188 | + X-Content-Type-Options: nosniff |
5189 | + BODY : |
5190 | + *** Error: Unable to format response body - "unexpected end of JSON input" *** |
5191 | + |
5192 | + Log Body as-is: |
5193 | + |
5194 | + ============================================================================== |
5195 | + |
5196 | + </pre> |
5197 | + </div> |
5198 | + </div> |
5199 | + |
5200 | + |
5201 | + |
5202 | + |
5203 | + <div class="result green"> |
5204 | + <div id="output-box-13-button" class="toggle" onclick="javascript:toggleOutput('output-box-13')">+</div> |
5205 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-13')">HEAD request to manifest path (tag) should yield 200 response</h4> |
5206 | + <br> |
5207 | + <div id="output-box-13" style="display: none;"> |
5208 | + <pre class="pre-box">DEBUG |
5209 | + ============================================================================== |
5210 | + ~~~ REQUEST ~~~ |
5211 | + HEAD /v2/myorg/myrepo/a/manifests/tagtest0 HTTP/1.1 |
5212 | + HOST : localhost:5000 |
5213 | + HEADERS: |
5214 | + Accept: application/vnd.oci.image.manifest.v1+json |
5215 | + User-Agent: distribution-spec-conformance-tests |
5216 | + BODY : |
5217 | + ***** NO CONTENT ***** |
5218 | + ------------------------------------------------------------------------------ |
5219 | + ~~~ RESPONSE ~~~ |
5220 | + STATUS : 200 OK |
5221 | + PROTO : HTTP/1.1 |
5222 | + RECEIVED AT : 2025-04-13T12:25:03.056902383Z |
5223 | + TIME DURATION: 622.226µs |
5224 | + HEADERS : |
5225 | + Content-Length: 714 |
5226 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
5227 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5228 | + Docker-Content-Digest: sha256:d0154f9c047c63a137a3827d30c53c5a09d50c3ce8385f1eb543603ab5271590 |
5229 | + Docker-Distribution-Api-Version: registry/2.0 |
5230 | + Etag: "sha256:d0154f9c047c63a137a3827d30c53c5a09d50c3ce8385f1eb543603ab5271590" |
5231 | + X-Content-Type-Options: nosniff |
5232 | + BODY : |
5233 | + *** Error: Unable to format response body - "unexpected end of JSON input" *** |
5234 | + |
5235 | + Log Body as-is: |
5236 | + |
5237 | + ============================================================================== |
5238 | + |
5239 | + </pre> |
5240 | + </div> |
5241 | + </div> |
5242 | + |
5243 | + |
5244 | + |
5245 | + |
5246 | + <div class="result green"> |
5247 | + <div id="output-box-14-button" class="toggle" onclick="javascript:toggleOutput('output-box-14')">+</div> |
5248 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-14')">GET nonexistent manifest should return 404</h4> |
5249 | + <br> |
5250 | + <div id="output-box-14" style="display: none;"> |
5251 | + <pre class="pre-box">DEBUG |
5252 | + ============================================================================== |
5253 | + ~~~ REQUEST ~~~ |
5254 | + GET /v2/myorg/myrepo/a/manifests/.INVALID_MANIFEST_NAME HTTP/1.1 |
5255 | + HOST : localhost:5000 |
5256 | + HEADERS: |
5257 | + User-Agent: distribution-spec-conformance-tests |
5258 | + BODY : |
5259 | + ***** NO CONTENT ***** |
5260 | + ------------------------------------------------------------------------------ |
5261 | + ~~~ RESPONSE ~~~ |
5262 | + STATUS : 404 Not Found |
5263 | + PROTO : HTTP/1.1 |
5264 | + RECEIVED AT : 2025-04-13T12:25:03.057189187Z |
5265 | + TIME DURATION: 106.368µs |
5266 | + HEADERS : |
5267 | + Content-Length: 19 |
5268 | + Content-Type: text/plain; charset=utf-8 |
5269 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5270 | + Docker-Distribution-Api-Version: registry/2.0 |
5271 | + X-Content-Type-Options: nosniff |
5272 | + BODY : |
5273 | + 404 page not found |
5274 | + ============================================================================== |
5275 | + |
5276 | + </pre> |
5277 | + </div> |
5278 | + </div> |
5279 | + |
5280 | + |
5281 | + |
5282 | + |
5283 | + <div class="result green"> |
5284 | + <div id="output-box-15-button" class="toggle" onclick="javascript:toggleOutput('output-box-15')">+</div> |
5285 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-15')">GET request to manifest[0] path (digest) should yield 200 response</h4> |
5286 | + <br> |
5287 | + <div id="output-box-15" style="display: none;"> |
5288 | + <pre class="pre-box">DEBUG |
5289 | + ============================================================================== |
5290 | + ~~~ REQUEST ~~~ |
5291 | + GET /v2/myorg/myrepo/a/manifests/sha256:d0154f9c047c63a137a3827d30c53c5a09d50c3ce8385f1eb543603ab5271590 HTTP/1.1 |
5292 | + HOST : localhost:5000 |
5293 | + HEADERS: |
5294 | + Accept: application/vnd.oci.image.manifest.v1+json |
5295 | + User-Agent: distribution-spec-conformance-tests |
5296 | + BODY : |
5297 | + ***** NO CONTENT ***** |
5298 | + ------------------------------------------------------------------------------ |
5299 | + ~~~ RESPONSE ~~~ |
5300 | + STATUS : 200 OK |
5301 | + PROTO : HTTP/1.1 |
5302 | + RECEIVED AT : 2025-04-13T12:25:03.0579284Z |
5303 | + TIME DURATION: 581.057µs |
5304 | + HEADERS : |
5305 | + Content-Length: 714 |
5306 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
5307 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5308 | + Docker-Content-Digest: sha256:d0154f9c047c63a137a3827d30c53c5a09d50c3ce8385f1eb543603ab5271590 |
5309 | + Docker-Distribution-Api-Version: registry/2.0 |
5310 | + Etag: "sha256:d0154f9c047c63a137a3827d30c53c5a09d50c3ce8385f1eb543603ab5271590" |
5311 | + X-Content-Type-Options: nosniff |
5312 | + BODY : |
5313 | + { |
5314 | + "schemaVersion": 2, |
5315 | + "mediaType": "application/vnd.oci.image.manifest.v1+json", |
5316 | + "config": { |
5317 | + "mediaType": "application/vnd.oci.image.config.v1+json", |
5318 | + "digest": "sha256:4ff4c7e8f8cd0ece3cd6a91d2e8eb83d06b1d0f9f1caa06a82d7fe1d6acde544", |
5319 | + "size": 129, |
5320 | + "data": "ewoJImF1dGhvciI6ICJITWpZdlp6NEw4VmtBQWpsIiwKCSJhcmNoaXRlY3R1cmUiOiAiYW1kNjQiLAoJIm9zIjogImxpbnV4IiwKCSJyb290ZnMiOiB7CgkJInR5cGUiOiAibGF5ZXJzIiwKCQkiZGlmZl9pZHMiOiBbXQoJfQp9", |
5321 | + "newUnspecifiedField": "aGVsbG8gd29ybGQ=" |
5322 | + }, |
5323 | + "layers": [ |
5324 | + { |
5325 | + "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", |
5326 | + "digest": "sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183", |
5327 | + "size": 168, |
5328 | + "newUnspecifiedField": null |
5329 | + } |
5330 | + ] |
5331 | + } |
5332 | + ============================================================================== |
5333 | + |
5334 | + </pre> |
5335 | + </div> |
5336 | + </div> |
5337 | + |
5338 | + |
5339 | + |
5340 | + |
5341 | + <div class="result green"> |
5342 | + <div id="output-box-16-button" class="toggle" onclick="javascript:toggleOutput('output-box-16')">+</div> |
5343 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-16')">GET request to manifest[1] path (digest) should yield 200 response</h4> |
5344 | + <br> |
5345 | + <div id="output-box-16" style="display: none;"> |
5346 | + <pre class="pre-box">DEBUG |
5347 | + ============================================================================== |
5348 | + ~~~ REQUEST ~~~ |
5349 | + GET /v2/myorg/myrepo/a/manifests/sha256:0b10c41d8ddd03ca72c3cbe84912f8262908325bd5efae9fb8d61c3221751ce9 HTTP/1.1 |
5350 | + HOST : localhost:5000 |
5351 | + HEADERS: |
5352 | + Accept: application/vnd.oci.image.manifest.v1+json |
5353 | + User-Agent: distribution-spec-conformance-tests |
5354 | + BODY : |
5355 | + ***** NO CONTENT ***** |
5356 | + ------------------------------------------------------------------------------ |
5357 | + ~~~ RESPONSE ~~~ |
5358 | + STATUS : 200 OK |
5359 | + PROTO : HTTP/1.1 |
5360 | + RECEIVED AT : 2025-04-13T12:25:03.058825064Z |
5361 | + TIME DURATION: 635.452µs |
5362 | + HEADERS : |
5363 | + Content-Length: 714 |
5364 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
5365 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5366 | + Docker-Content-Digest: sha256:0b10c41d8ddd03ca72c3cbe84912f8262908325bd5efae9fb8d61c3221751ce9 |
5367 | + Docker-Distribution-Api-Version: registry/2.0 |
5368 | + Etag: "sha256:0b10c41d8ddd03ca72c3cbe84912f8262908325bd5efae9fb8d61c3221751ce9" |
5369 | + X-Content-Type-Options: nosniff |
5370 | + BODY : |
5371 | + { |
5372 | + "schemaVersion": 2, |
5373 | + "mediaType": "application/vnd.oci.image.manifest.v1+json", |
5374 | + "config": { |
5375 | + "mediaType": "application/vnd.oci.image.config.v1+json", |
5376 | + "digest": "sha256:91ebe32a31a708da89e098c1053ba39ce65b98bc33542e5a588e7bf5b2693ef5", |
5377 | + "size": 129, |
5378 | + "data": "ewoJImF1dGhvciI6ICJ0RGRyVEJwUzRHTDE3NlVHIiwKCSJhcmNoaXRlY3R1cmUiOiAiYW1kNjQiLAoJIm9zIjogImxpbnV4IiwKCSJyb290ZnMiOiB7CgkJInR5cGUiOiAibGF5ZXJzIiwKCQkiZGlmZl9pZHMiOiBbXQoJfQp9", |
5379 | + "newUnspecifiedField": "aGVsbG8gd29ybGQ=" |
5380 | + }, |
5381 | + "layers": [ |
5382 | + { |
5383 | + "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", |
5384 | + "digest": "sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183", |
5385 | + "size": 168, |
5386 | + "newUnspecifiedField": null |
5387 | + } |
5388 | + ] |
5389 | + } |
5390 | + ============================================================================== |
5391 | + |
5392 | + </pre> |
5393 | + </div> |
5394 | + </div> |
5395 | + |
5396 | + |
5397 | + |
5398 | + |
5399 | + <div class="result green"> |
5400 | + <div id="output-box-17-button" class="toggle" onclick="javascript:toggleOutput('output-box-17')">+</div> |
5401 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-17')">GET request to manifest path (tag) should yield 200 response</h4> |
5402 | + <br> |
5403 | + <div id="output-box-17" style="display: none;"> |
5404 | + <pre class="pre-box">DEBUG |
5405 | + ============================================================================== |
5406 | + ~~~ REQUEST ~~~ |
5407 | + GET /v2/myorg/myrepo/a/manifests/tagtest0 HTTP/1.1 |
5408 | + HOST : localhost:5000 |
5409 | + HEADERS: |
5410 | + Accept: application/vnd.oci.image.manifest.v1+json |
5411 | + User-Agent: distribution-spec-conformance-tests |
5412 | + BODY : |
5413 | + ***** NO CONTENT ***** |
5414 | + ------------------------------------------------------------------------------ |
5415 | + ~~~ RESPONSE ~~~ |
5416 | + STATUS : 200 OK |
5417 | + PROTO : HTTP/1.1 |
5418 | + RECEIVED AT : 2025-04-13T12:25:03.060105139Z |
5419 | + TIME DURATION: 660.603µs |
5420 | + HEADERS : |
5421 | + Content-Length: 714 |
5422 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
5423 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5424 | + Docker-Content-Digest: sha256:d0154f9c047c63a137a3827d30c53c5a09d50c3ce8385f1eb543603ab5271590 |
5425 | + Docker-Distribution-Api-Version: registry/2.0 |
5426 | + Etag: "sha256:d0154f9c047c63a137a3827d30c53c5a09d50c3ce8385f1eb543603ab5271590" |
5427 | + X-Content-Type-Options: nosniff |
5428 | + BODY : |
5429 | + { |
5430 | + "schemaVersion": 2, |
5431 | + "mediaType": "application/vnd.oci.image.manifest.v1+json", |
5432 | + "config": { |
5433 | + "mediaType": "application/vnd.oci.image.config.v1+json", |
5434 | + "digest": "sha256:4ff4c7e8f8cd0ece3cd6a91d2e8eb83d06b1d0f9f1caa06a82d7fe1d6acde544", |
5435 | + "size": 129, |
5436 | + "data": "ewoJImF1dGhvciI6ICJITWpZdlp6NEw4VmtBQWpsIiwKCSJhcmNoaXRlY3R1cmUiOiAiYW1kNjQiLAoJIm9zIjogImxpbnV4IiwKCSJyb290ZnMiOiB7CgkJInR5cGUiOiAibGF5ZXJzIiwKCQkiZGlmZl9pZHMiOiBbXQoJfQp9", |
5437 | + "newUnspecifiedField": "aGVsbG8gd29ybGQ=" |
5438 | + }, |
5439 | + "layers": [ |
5440 | + { |
5441 | + "mediaType": "application/vnd.oci.image.layer.v1.tar+gzip", |
5442 | + "digest": "sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183", |
5443 | + "size": 168, |
5444 | + "newUnspecifiedField": null |
5445 | + } |
5446 | + ] |
5447 | + } |
5448 | + ============================================================================== |
5449 | + |
5450 | + </pre> |
5451 | + </div> |
5452 | + </div> |
5453 | + |
5454 | + <br> |
5455 | + |
5456 | + |
5457 | + <h3>Error codes</h3> |
5458 | + |
5459 | + |
5460 | + |
5461 | + |
5462 | + |
5463 | + |
5464 | + <div class="result red"> |
5465 | + <div id="output-box-18-button" class="toggle" onclick="javascript:toggleOutput('output-box-18')">+</div> |
5466 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-18')">400 response body should contain OCI-conforming JSON message</h4> |
5467 | + <br> |
5468 | + <div> |
5469 | + <div id="output-box-18" style="display: none;"> |
5470 | + <pre class="pre-box">DEBUG |
5471 | + ============================================================================== |
5472 | + ~~~ REQUEST ~~~ |
5473 | + GET /v2/myorg/myrepo/a/manifests/sha256:totallywrong HTTP/1.1 |
5474 | + HOST : localhost:5000 |
5475 | + HEADERS: |
5476 | + Content-Type: application/vnd.oci.image.manifest.v1+json |
5477 | + User-Agent: distribution-spec-conformance-tests |
5478 | + BODY : |
5479 | + ***** NO CONTENT ***** |
5480 | + ------------------------------------------------------------------------------ |
5481 | + ~~~ RESPONSE ~~~ |
5482 | + STATUS : 500 Internal Server Error |
5483 | + PROTO : HTTP/1.1 |
5484 | + RECEIVED AT : 2025-04-13T12:25:03.060978042Z |
5485 | + TIME DURATION: 609.932µs |
5486 | + HEADERS : |
5487 | + Content-Length: 201 |
5488 | + Content-Type: application/json; charset=utf-8 |
5489 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5490 | + Docker-Distribution-Api-Version: registry/2.0 |
5491 | + X-Content-Type-Options: nosniff |
5492 | + BODY : |
5493 | + { |
5494 | + "errors": [ |
5495 | + { |
5496 | + "code": "UNKNOWN", |
5497 | + "message": "unknown error", |
5498 | + "detail": { |
5499 | + "Path": "/docker/registry/v2/repositories/myorg/myrepo/a/_manifests/tags/sha256:totallywrong/current/link", |
5500 | + "DriverName": "filesystem" |
5501 | + } |
5502 | + } |
5503 | + ] |
5504 | + } |
5505 | + |
5506 | + ============================================================================== |
5507 | + |
5508 | + </pre> |
5509 | + </div> |
5510 | + </div> |
5511 | + <pre class="fail-message">Expected |
5512 | + <int>: 500 |
5513 | + To satisfy at least one of these matchers: [%!s(*matchers.EqualMatcher=&{400}) %!s(*matchers.EqualMatcher=&{404})]</pre> |
5514 | + <br> |
5515 | + </div> |
5516 | + |
5517 | + <br> |
5518 | + |
5519 | + |
5520 | + <h3>Teardown</h3> |
5521 | + |
5522 | + |
5523 | + |
5524 | + |
5525 | + |
5526 | + |
5527 | + <div class="result green"> |
5528 | + <div id="output-box-19-button" class="toggle" onclick="javascript:toggleOutput('output-box-19')">+</div> |
5529 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-19')">Delete config[0] blob created in setup</h4> |
5530 | + <br> |
5531 | + <div id="output-box-19" style="display: none;"> |
5532 | + <pre class="pre-box">DEBUG |
5533 | + ============================================================================== |
5534 | + ~~~ REQUEST ~~~ |
5535 | + DELETE /v2/myorg/myrepo/a/blobs/sha256:4ff4c7e8f8cd0ece3cd6a91d2e8eb83d06b1d0f9f1caa06a82d7fe1d6acde544 HTTP/1.1 |
5536 | + HOST : localhost:5000 |
5537 | + HEADERS: |
5538 | + User-Agent: distribution-spec-conformance-tests |
5539 | + BODY : |
5540 | + ***** NO CONTENT ***** |
5541 | + ------------------------------------------------------------------------------ |
5542 | + ~~~ RESPONSE ~~~ |
5543 | + STATUS : 405 Method Not Allowed |
5544 | + PROTO : HTTP/1.1 |
5545 | + RECEIVED AT : 2025-04-13T12:25:03.06184978Z |
5546 | + TIME DURATION: 550.29µs |
5547 | + HEADERS : |
5548 | + Content-Length: 78 |
5549 | + Content-Type: application/json; charset=utf-8 |
5550 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5551 | + Docker-Distribution-Api-Version: registry/2.0 |
5552 | + X-Content-Type-Options: nosniff |
5553 | + BODY : |
5554 | + { |
5555 | + "errors": [ |
5556 | + { |
5557 | + "code": "UNSUPPORTED", |
5558 | + "message": "The operation is unsupported." |
5559 | + } |
5560 | + ] |
5561 | + } |
5562 | + |
5563 | + ============================================================================== |
5564 | + |
5565 | + </pre> |
5566 | + </div> |
5567 | + </div> |
5568 | + |
5569 | + |
5570 | + |
5571 | + |
5572 | + <div class="result green"> |
5573 | + <div id="output-box-20-button" class="toggle" onclick="javascript:toggleOutput('output-box-20')">+</div> |
5574 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-20')">Delete config[1] blob created in setup</h4> |
5575 | + <br> |
5576 | + <div id="output-box-20" style="display: none;"> |
5577 | + <pre class="pre-box">DEBUG |
5578 | + ============================================================================== |
5579 | + ~~~ REQUEST ~~~ |
5580 | + DELETE /v2/myorg/myrepo/a/blobs/sha256:91ebe32a31a708da89e098c1053ba39ce65b98bc33542e5a588e7bf5b2693ef5 HTTP/1.1 |
5581 | + HOST : localhost:5000 |
5582 | + HEADERS: |
5583 | + User-Agent: distribution-spec-conformance-tests |
5584 | + BODY : |
5585 | + ***** NO CONTENT ***** |
5586 | + ------------------------------------------------------------------------------ |
5587 | + ~~~ RESPONSE ~~~ |
5588 | + STATUS : 405 Method Not Allowed |
5589 | + PROTO : HTTP/1.1 |
5590 | + RECEIVED AT : 2025-04-13T12:25:03.062620919Z |
5591 | + TIME DURATION: 554.119µs |
5592 | + HEADERS : |
5593 | + Content-Length: 78 |
5594 | + Content-Type: application/json; charset=utf-8 |
5595 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5596 | + Docker-Distribution-Api-Version: registry/2.0 |
5597 | + X-Content-Type-Options: nosniff |
5598 | + BODY : |
5599 | + { |
5600 | + "errors": [ |
5601 | + { |
5602 | + "code": "UNSUPPORTED", |
5603 | + "message": "The operation is unsupported." |
5604 | + } |
5605 | + ] |
5606 | + } |
5607 | + |
5608 | + ============================================================================== |
5609 | + |
5610 | + </pre> |
5611 | + </div> |
5612 | + </div> |
5613 | + |
5614 | + |
5615 | + |
5616 | + |
5617 | + <div class="result green"> |
5618 | + <div id="output-box-21-button" class="toggle" onclick="javascript:toggleOutput('output-box-21')">+</div> |
5619 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-21')">Delete layer blob created in setup</h4> |
5620 | + <br> |
5621 | + <div id="output-box-21" style="display: none;"> |
5622 | + <pre class="pre-box">DEBUG |
5623 | + ============================================================================== |
5624 | + ~~~ REQUEST ~~~ |
5625 | + DELETE /v2/myorg/myrepo/a/blobs/sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183 HTTP/1.1 |
5626 | + HOST : localhost:5000 |
5627 | + HEADERS: |
5628 | + User-Agent: distribution-spec-conformance-tests |
5629 | + BODY : |
5630 | + ***** NO CONTENT ***** |
5631 | + ------------------------------------------------------------------------------ |
5632 | + ~~~ RESPONSE ~~~ |
5633 | + STATUS : 405 Method Not Allowed |
5634 | + PROTO : HTTP/1.1 |
5635 | + RECEIVED AT : 2025-04-13T12:25:03.063325816Z |
5636 | + TIME DURATION: 530.477µs |
5637 | + HEADERS : |
5638 | + Content-Length: 78 |
5639 | + Content-Type: application/json; charset=utf-8 |
5640 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5641 | + Docker-Distribution-Api-Version: registry/2.0 |
5642 | + X-Content-Type-Options: nosniff |
5643 | + BODY : |
5644 | + { |
5645 | + "errors": [ |
5646 | + { |
5647 | + "code": "UNSUPPORTED", |
5648 | + "message": "The operation is unsupported." |
5649 | + } |
5650 | + ] |
5651 | + } |
5652 | + |
5653 | + ============================================================================== |
5654 | + |
5655 | + </pre> |
5656 | + </div> |
5657 | + </div> |
5658 | + |
5659 | + |
5660 | + |
5661 | + |
5662 | + <div class="result green"> |
5663 | + <div id="output-box-22-button" class="toggle" onclick="javascript:toggleOutput('output-box-22')">+</div> |
5664 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-22')">Delete manifest[0] created in setup</h4> |
5665 | + <br> |
5666 | + <div id="output-box-22" style="display: none;"> |
5667 | + <pre class="pre-box">DEBUG |
5668 | + ============================================================================== |
5669 | + ~~~ REQUEST ~~~ |
5670 | + DELETE /v2/myorg/myrepo/a/manifests/sha256:d0154f9c047c63a137a3827d30c53c5a09d50c3ce8385f1eb543603ab5271590 HTTP/1.1 |
5671 | + HOST : localhost:5000 |
5672 | + HEADERS: |
5673 | + User-Agent: distribution-spec-conformance-tests |
5674 | + BODY : |
5675 | + ***** NO CONTENT ***** |
5676 | + ------------------------------------------------------------------------------ |
5677 | + ~~~ RESPONSE ~~~ |
5678 | + STATUS : 405 Method Not Allowed |
5679 | + PROTO : HTTP/1.1 |
5680 | + RECEIVED AT : 2025-04-13T12:25:03.0640344Z |
5681 | + TIME DURATION: 535.02µs |
5682 | + HEADERS : |
5683 | + Content-Length: 78 |
5684 | + Content-Type: application/json; charset=utf-8 |
5685 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5686 | + Docker-Distribution-Api-Version: registry/2.0 |
5687 | + X-Content-Type-Options: nosniff |
5688 | + BODY : |
5689 | + { |
5690 | + "errors": [ |
5691 | + { |
5692 | + "code": "UNSUPPORTED", |
5693 | + "message": "The operation is unsupported." |
5694 | + } |
5695 | + ] |
5696 | + } |
5697 | + |
5698 | + ============================================================================== |
5699 | + |
5700 | + </pre> |
5701 | + </div> |
5702 | + </div> |
5703 | + |
5704 | + |
5705 | + |
5706 | + |
5707 | + <div class="result green"> |
5708 | + <div id="output-box-23-button" class="toggle" onclick="javascript:toggleOutput('output-box-23')">+</div> |
5709 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-23')">Delete manifest[1] created in setup</h4> |
5710 | + <br> |
5711 | + <div id="output-box-23" style="display: none;"> |
5712 | + <pre class="pre-box">DEBUG |
5713 | + ============================================================================== |
5714 | + ~~~ REQUEST ~~~ |
5715 | + DELETE /v2/myorg/myrepo/a/manifests/sha256:0b10c41d8ddd03ca72c3cbe84912f8262908325bd5efae9fb8d61c3221751ce9 HTTP/1.1 |
5716 | + HOST : localhost:5000 |
5717 | + HEADERS: |
5718 | + User-Agent: distribution-spec-conformance-tests |
5719 | + BODY : |
5720 | + ***** NO CONTENT ***** |
5721 | + ------------------------------------------------------------------------------ |
5722 | + ~~~ RESPONSE ~~~ |
5723 | + STATUS : 405 Method Not Allowed |
5724 | + PROTO : HTTP/1.1 |
5725 | + RECEIVED AT : 2025-04-13T12:25:03.065226499Z |
5726 | + TIME DURATION: 984.506µs |
5727 | + HEADERS : |
5728 | + Content-Length: 78 |
5729 | + Content-Type: application/json; charset=utf-8 |
5730 | + Date: Sun, 13 Apr 2025 12:25:03 GMT |
5731 | + Docker-Distribution-Api-Version: registry/2.0 |
5732 | + X-Content-Type-Options: nosniff |
5733 | + BODY : |
5734 | + { |
5735 | + "errors": [ |
5736 | + { |
5737 | + "code": "UNSUPPORTED", |
5738 | + "message": "The operation is unsupported." |
5739 | + } |
5740 | + ] |
5741 | + } |
5742 | + |
5743 | + ============================================================================== |
5744 | + |
5745 | + </pre> |
5746 | + </div> |
5747 | + </div> |
5748 | + |
5749 | + <br> |
5750 | + |
5751 | + |
5752 | + |
5753 | + |
5754 | + </div> |
5755 | + |
5756 | + |
5757 | + |
5758 | + |
5759 | + <h2>Push</h2> |
5760 | + <div class="subcategory"> |
5761 | + |
5762 | + |
5763 | + <h3>Blob Upload Streamed</h3> |
5764 | + |
5765 | + |
5766 | + |
5767 | + |
5768 | + |
5769 | + |
5770 | + <div class="result grey"> |
5771 | + <div id="output-box-24-button" class="toggle" onclick="javascript:toggleOutput('output-box-24')">+</div> |
5772 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-24')">PATCH request with blob in body should yield 202 response</h4> |
5773 | + <br> |
5774 | + <div id="output-box-24" style="display: none;"> |
5775 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
5776 | + OCI_TEST_PULL=1 |
5777 | + OCI_TEST_PUSH=0 |
5778 | + OCI_TEST_CONTENT_DISCOVERY=0 |
5779 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
5780 | + </pre> |
5781 | + </div> |
5782 | + </div> |
5783 | + |
5784 | + |
5785 | + |
5786 | + |
5787 | + <div class="result grey"> |
5788 | + <div id="output-box-25-button" class="toggle" onclick="javascript:toggleOutput('output-box-25')">+</div> |
5789 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-25')">PUT request to session URL with digest should yield 201 response</h4> |
5790 | + <br> |
5791 | + <div id="output-box-25" style="display: none;"> |
5792 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
5793 | + OCI_TEST_PULL=1 |
5794 | + OCI_TEST_PUSH=0 |
5795 | + OCI_TEST_CONTENT_DISCOVERY=0 |
5796 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
5797 | + </pre> |
5798 | + </div> |
5799 | + </div> |
5800 | + |
5801 | + <br> |
5802 | + |
5803 | + |
5804 | + <h3>Blob Upload Monolithic</h3> |
5805 | + |
5806 | + |
5807 | + |
5808 | + |
5809 | + |
5810 | + |
5811 | + <div class="result grey"> |
5812 | + <div id="output-box-26-button" class="toggle" onclick="javascript:toggleOutput('output-box-26')">+</div> |
5813 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-26')">GET nonexistent blob should result in 404 response</h4> |
5814 | + <br> |
5815 | + <div id="output-box-26" style="display: none;"> |
5816 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
5817 | + OCI_TEST_PULL=1 |
5818 | + OCI_TEST_PUSH=0 |
5819 | + OCI_TEST_CONTENT_DISCOVERY=0 |
5820 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
5821 | + </pre> |
5822 | + </div> |
5823 | + </div> |
5824 | + |
5825 | + |
5826 | + |
5827 | + |
5828 | + <div class="result grey"> |
5829 | + <div id="output-box-27-button" class="toggle" onclick="javascript:toggleOutput('output-box-27')">+</div> |
5830 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-27')">POST request with digest and blob should yield a 201 or 202</h4> |
5831 | + <br> |
5832 | + <div id="output-box-27" style="display: none;"> |
5833 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
5834 | + OCI_TEST_PULL=1 |
5835 | + OCI_TEST_PUSH=0 |
5836 | + OCI_TEST_CONTENT_DISCOVERY=0 |
5837 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
5838 | + </pre> |
5839 | + </div> |
5840 | + </div> |
5841 | + |
5842 | + |
5843 | + |
5844 | + |
5845 | + <div class="result grey"> |
5846 | + <div id="output-box-28-button" class="toggle" onclick="javascript:toggleOutput('output-box-28')">+</div> |
5847 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-28')">GET request to blob URL from prior request should yield 200 or 404 based on response code</h4> |
5848 | + <br> |
5849 | + <div id="output-box-28" style="display: none;"> |
5850 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
5851 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
5852 | + OCI_TEST_PULL=1 |
5853 | + OCI_TEST_PUSH=0 |
5854 | + OCI_TEST_CONTENT_DISCOVERY=0 |
5855 | + </pre> |
5856 | + </div> |
5857 | + </div> |
5858 | + |
5859 | + |
5860 | + |
5861 | + |
5862 | + <div class="result grey"> |
5863 | + <div id="output-box-29-button" class="toggle" onclick="javascript:toggleOutput('output-box-29')">+</div> |
5864 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-29')">POST request should yield a session ID</h4> |
5865 | + <br> |
5866 | + <div id="output-box-29" style="display: none;"> |
5867 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
5868 | + OCI_TEST_PULL=1 |
5869 | + OCI_TEST_PUSH=0 |
5870 | + OCI_TEST_CONTENT_DISCOVERY=0 |
5871 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
5872 | + </pre> |
5873 | + </div> |
5874 | + </div> |
5875 | + |
5876 | + |
5877 | + |
5878 | + |
5879 | + <div class="result grey"> |
5880 | + <div id="output-box-30-button" class="toggle" onclick="javascript:toggleOutput('output-box-30')">+</div> |
5881 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-30')">PUT upload of a blob should yield a 201 Response</h4> |
5882 | + <br> |
5883 | + <div id="output-box-30" style="display: none;"> |
5884 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
5885 | + OCI_TEST_CONTENT_DISCOVERY=0 |
5886 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
5887 | + OCI_TEST_PULL=1 |
5888 | + OCI_TEST_PUSH=0 |
5889 | + </pre> |
5890 | + </div> |
5891 | + </div> |
5892 | + |
5893 | + |
5894 | + |
5895 | + |
5896 | + <div class="result grey"> |
5897 | + <div id="output-box-31-button" class="toggle" onclick="javascript:toggleOutput('output-box-31')">+</div> |
5898 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-31')">GET request to existing blob should yield 200 response</h4> |
5899 | + <br> |
5900 | + <div id="output-box-31" style="display: none;"> |
5901 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
5902 | + OCI_TEST_CONTENT_DISCOVERY=0 |
5903 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
5904 | + OCI_TEST_PULL=1 |
5905 | + OCI_TEST_PUSH=0 |
5906 | + </pre> |
5907 | + </div> |
5908 | + </div> |
5909 | + |
5910 | + |
5911 | + |
5912 | + |
5913 | + <div class="result grey"> |
5914 | + <div id="output-box-32-button" class="toggle" onclick="javascript:toggleOutput('output-box-32')">+</div> |
5915 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-32')">PUT upload of a layer blob should yield a 201 Response</h4> |
5916 | + <br> |
5917 | + <div id="output-box-32" style="display: none;"> |
5918 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
5919 | + OCI_TEST_PULL=1 |
5920 | + OCI_TEST_PUSH=0 |
5921 | + OCI_TEST_CONTENT_DISCOVERY=0 |
5922 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
5923 | + </pre> |
5924 | + </div> |
5925 | + </div> |
5926 | + |
5927 | + |
5928 | + |
5929 | + |
5930 | + <div class="result grey"> |
5931 | + <div id="output-box-33-button" class="toggle" onclick="javascript:toggleOutput('output-box-33')">+</div> |
5932 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-33')">GET request to existing layer should yield 200 response</h4> |
5933 | + <br> |
5934 | + <div id="output-box-33" style="display: none;"> |
5935 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
5936 | + OCI_TEST_CONTENT_DISCOVERY=0 |
5937 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
5938 | + OCI_TEST_PULL=1 |
5939 | + OCI_TEST_PUSH=0 |
5940 | + </pre> |
5941 | + </div> |
5942 | + </div> |
5943 | + |
5944 | + <br> |
5945 | + |
5946 | + |
5947 | + <h3>Blob Upload Chunked</h3> |
5948 | + |
5949 | + |
5950 | + |
5951 | + |
5952 | + |
5953 | + |
5954 | + <div class="result grey"> |
5955 | + <div id="output-box-34-button" class="toggle" onclick="javascript:toggleOutput('output-box-34')">+</div> |
5956 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-34')">Out-of-order blob upload should return 416</h4> |
5957 | + <br> |
5958 | + <div id="output-box-34" style="display: none;"> |
5959 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
5960 | + OCI_TEST_PULL=1 |
5961 | + OCI_TEST_PUSH=0 |
5962 | + OCI_TEST_CONTENT_DISCOVERY=0 |
5963 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
5964 | + </pre> |
5965 | + </div> |
5966 | + </div> |
5967 | + |
5968 | + |
5969 | + |
5970 | + |
5971 | + <div class="result grey"> |
5972 | + <div id="output-box-35-button" class="toggle" onclick="javascript:toggleOutput('output-box-35')">+</div> |
5973 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-35')">PATCH request with first chunk should return 202</h4> |
5974 | + <br> |
5975 | + <div id="output-box-35" style="display: none;"> |
5976 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
5977 | + OCI_TEST_PULL=1 |
5978 | + OCI_TEST_PUSH=0 |
5979 | + OCI_TEST_CONTENT_DISCOVERY=0 |
5980 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
5981 | + </pre> |
5982 | + </div> |
5983 | + </div> |
5984 | + |
5985 | + |
5986 | + |
5987 | + |
5988 | + <div class="result grey"> |
5989 | + <div id="output-box-36-button" class="toggle" onclick="javascript:toggleOutput('output-box-36')">+</div> |
5990 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-36')">Retry previous blob chunk should return 416</h4> |
5991 | + <br> |
5992 | + <div id="output-box-36" style="display: none;"> |
5993 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
5994 | + OCI_TEST_PULL=1 |
5995 | + OCI_TEST_PUSH=0 |
5996 | + OCI_TEST_CONTENT_DISCOVERY=0 |
5997 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
5998 | + </pre> |
5999 | + </div> |
6000 | + </div> |
6001 | + |
6002 | + |
6003 | + |
6004 | + |
6005 | + <div class="result grey"> |
6006 | + <div id="output-box-37-button" class="toggle" onclick="javascript:toggleOutput('output-box-37')">+</div> |
6007 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-37')">Get on stale blob upload should return 204 with a range and location</h4> |
6008 | + <br> |
6009 | + <div id="output-box-37" style="display: none;"> |
6010 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6011 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6012 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6013 | + OCI_TEST_PULL=1 |
6014 | + OCI_TEST_PUSH=0 |
6015 | + </pre> |
6016 | + </div> |
6017 | + </div> |
6018 | + |
6019 | + |
6020 | + |
6021 | + |
6022 | + <div class="result grey"> |
6023 | + <div id="output-box-38-button" class="toggle" onclick="javascript:toggleOutput('output-box-38')">+</div> |
6024 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-38')">PATCH request with second chunk should return 202</h4> |
6025 | + <br> |
6026 | + <div id="output-box-38" style="display: none;"> |
6027 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6028 | + OCI_TEST_PULL=1 |
6029 | + OCI_TEST_PUSH=0 |
6030 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6031 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6032 | + </pre> |
6033 | + </div> |
6034 | + </div> |
6035 | + |
6036 | + |
6037 | + |
6038 | + |
6039 | + <div class="result grey"> |
6040 | + <div id="output-box-39-button" class="toggle" onclick="javascript:toggleOutput('output-box-39')">+</div> |
6041 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-39')">PUT request with digest should return 201</h4> |
6042 | + <br> |
6043 | + <div id="output-box-39" style="display: none;"> |
6044 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6045 | + OCI_TEST_PULL=1 |
6046 | + OCI_TEST_PUSH=0 |
6047 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6048 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6049 | + </pre> |
6050 | + </div> |
6051 | + </div> |
6052 | + |
6053 | + <br> |
6054 | + |
6055 | + |
6056 | + <h3>Cross-Repository Blob Mount</h3> |
6057 | + |
6058 | + |
6059 | + |
6060 | + |
6061 | + |
6062 | + |
6063 | + <div class="result grey"> |
6064 | + <div id="output-box-40-button" class="toggle" onclick="javascript:toggleOutput('output-box-40')">+</div> |
6065 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-40')">Cross-mounting of a blob without the from argument should yield session id</h4> |
6066 | + <br> |
6067 | + <div id="output-box-40" style="display: none;"> |
6068 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6069 | + OCI_TEST_PULL=1 |
6070 | + OCI_TEST_PUSH=0 |
6071 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6072 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6073 | + </pre> |
6074 | + </div> |
6075 | + </div> |
6076 | + |
6077 | + |
6078 | + |
6079 | + |
6080 | + <div class="result grey"> |
6081 | + <div id="output-box-41-button" class="toggle" onclick="javascript:toggleOutput('output-box-41')">+</div> |
6082 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-41')">POST request to mount another repository's blob should return 201 or 202</h4> |
6083 | + <br> |
6084 | + <div id="output-box-41" style="display: none;"> |
6085 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6086 | + OCI_TEST_PULL=1 |
6087 | + OCI_TEST_PUSH=0 |
6088 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6089 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6090 | + </pre> |
6091 | + </div> |
6092 | + </div> |
6093 | + |
6094 | + |
6095 | + |
6096 | + |
6097 | + <div class="result grey"> |
6098 | + <div id="output-box-42-button" class="toggle" onclick="javascript:toggleOutput('output-box-42')">+</div> |
6099 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-42')">GET request to test digest within cross-mount namespace should return 200</h4> |
6100 | + <br> |
6101 | + <div id="output-box-42" style="display: none;"> |
6102 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6103 | + OCI_TEST_PULL=1 |
6104 | + OCI_TEST_PUSH=0 |
6105 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6106 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6107 | + </pre> |
6108 | + </div> |
6109 | + </div> |
6110 | + |
6111 | + |
6112 | + |
6113 | + |
6114 | + <div class="result grey"> |
6115 | + <div id="output-box-43-button" class="toggle" onclick="javascript:toggleOutput('output-box-43')">+</div> |
6116 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-43')">Cross-mounting of nonexistent blob should yield session id</h4> |
6117 | + <br> |
6118 | + <div id="output-box-43" style="display: none;"> |
6119 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6120 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6121 | + OCI_TEST_PULL=1 |
6122 | + OCI_TEST_PUSH=0 |
6123 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6124 | + </pre> |
6125 | + </div> |
6126 | + </div> |
6127 | + |
6128 | + |
6129 | + |
6130 | + |
6131 | + <div class="result grey"> |
6132 | + <div id="output-box-44-button" class="toggle" onclick="javascript:toggleOutput('output-box-44')">+</div> |
6133 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-44')">Cross-mounting without from, and automatic content discovery enabled should return a 201</h4> |
6134 | + <br> |
6135 | + <div id="output-box-44" style="display: none;"> |
6136 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6137 | + OCI_TEST_PULL=1 |
6138 | + OCI_TEST_PUSH=0 |
6139 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6140 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6141 | + </pre> |
6142 | + </div> |
6143 | + </div> |
6144 | + |
6145 | + |
6146 | + |
6147 | + |
6148 | + <div class="result grey"> |
6149 | + <div id="output-box-45-button" class="toggle" onclick="javascript:toggleOutput('output-box-45')">+</div> |
6150 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-45')">Cross-mounting without from, and automatic content discovery disabled should return a 202</h4> |
6151 | + <br> |
6152 | + <div id="output-box-45" style="display: none;"> |
6153 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6154 | + OCI_TEST_PULL=1 |
6155 | + OCI_TEST_PUSH=0 |
6156 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6157 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6158 | + </pre> |
6159 | + </div> |
6160 | + </div> |
6161 | + |
6162 | + <br> |
6163 | + |
6164 | + |
6165 | + <h3>Manifest Upload</h3> |
6166 | + |
6167 | + |
6168 | + |
6169 | + |
6170 | + |
6171 | + |
6172 | + <div class="result grey"> |
6173 | + <div id="output-box-46-button" class="toggle" onclick="javascript:toggleOutput('output-box-46')">+</div> |
6174 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-46')">GET nonexistent manifest should return 404</h4> |
6175 | + <br> |
6176 | + <div id="output-box-46" style="display: none;"> |
6177 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6178 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6179 | + OCI_TEST_PULL=1 |
6180 | + OCI_TEST_PUSH=0 |
6181 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6182 | + </pre> |
6183 | + </div> |
6184 | + </div> |
6185 | + |
6186 | + |
6187 | + |
6188 | + |
6189 | + <div class="result grey"> |
6190 | + <div id="output-box-47-button" class="toggle" onclick="javascript:toggleOutput('output-box-47')">+</div> |
6191 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-47')">PUT should accept a manifest upload</h4> |
6192 | + <br> |
6193 | + <div id="output-box-47" style="display: none;"> |
6194 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6195 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6196 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6197 | + OCI_TEST_PULL=1 |
6198 | + OCI_TEST_PUSH=0 |
6199 | + </pre> |
6200 | + </div> |
6201 | + </div> |
6202 | + |
6203 | + |
6204 | + |
6205 | + |
6206 | + <div class="result grey"> |
6207 | + <div id="output-box-48-button" class="toggle" onclick="javascript:toggleOutput('output-box-48')">+</div> |
6208 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-48')">Registry should accept a manifest upload with no layers</h4> |
6209 | + <br> |
6210 | + <div id="output-box-48" style="display: none;"> |
6211 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6212 | + OCI_TEST_PULL=1 |
6213 | + OCI_TEST_PUSH=0 |
6214 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6215 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6216 | + </pre> |
6217 | + </div> |
6218 | + </div> |
6219 | + |
6220 | + |
6221 | + |
6222 | + |
6223 | + <div class="result grey"> |
6224 | + <div id="output-box-49-button" class="toggle" onclick="javascript:toggleOutput('output-box-49')">+</div> |
6225 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-49')">GET request to manifest URL (digest) should yield 200 response</h4> |
6226 | + <br> |
6227 | + <div id="output-box-49" style="display: none;"> |
6228 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6229 | + OCI_TEST_PULL=1 |
6230 | + OCI_TEST_PUSH=0 |
6231 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6232 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6233 | + </pre> |
6234 | + </div> |
6235 | + </div> |
6236 | + |
6237 | + <br> |
6238 | + |
6239 | + |
6240 | + <h3>Teardown</h3> |
6241 | + |
6242 | + |
6243 | + |
6244 | + |
6245 | + |
6246 | + |
6247 | + <div class="result grey"> |
6248 | + <div id="output-box-50-button" class="toggle" onclick="javascript:toggleOutput('output-box-50')">+</div> |
6249 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-50')">Delete config blob created in tests</h4> |
6250 | + <br> |
6251 | + <div id="output-box-50" style="display: none;"> |
6252 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6253 | + OCI_TEST_PULL=1 |
6254 | + OCI_TEST_PUSH=0 |
6255 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6256 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6257 | + </pre> |
6258 | + </div> |
6259 | + </div> |
6260 | + |
6261 | + |
6262 | + |
6263 | + |
6264 | + <div class="result grey"> |
6265 | + <div id="output-box-51-button" class="toggle" onclick="javascript:toggleOutput('output-box-51')">+</div> |
6266 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-51')">Delete layer blob created in setup</h4> |
6267 | + <br> |
6268 | + <div id="output-box-51" style="display: none;"> |
6269 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6270 | + OCI_TEST_PULL=1 |
6271 | + OCI_TEST_PUSH=0 |
6272 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6273 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6274 | + </pre> |
6275 | + </div> |
6276 | + </div> |
6277 | + |
6278 | + |
6279 | + |
6280 | + |
6281 | + <div class="result grey"> |
6282 | + <div id="output-box-52-button" class="toggle" onclick="javascript:toggleOutput('output-box-52')">+</div> |
6283 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-52')">Delete manifest created in tests</h4> |
6284 | + <br> |
6285 | + <div id="output-box-52" style="display: none;"> |
6286 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6287 | + OCI_TEST_PUSH=0 |
6288 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6289 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6290 | + OCI_TEST_PULL=1 |
6291 | + </pre> |
6292 | + </div> |
6293 | + </div> |
6294 | + |
6295 | + <br> |
6296 | + |
6297 | + |
6298 | + |
6299 | + |
6300 | + </div> |
6301 | + |
6302 | + |
6303 | + |
6304 | + |
6305 | + <h2>Content Discovery</h2> |
6306 | + <div class="subcategory"> |
6307 | + |
6308 | + |
6309 | + <h3>Setup</h3> |
6310 | + |
6311 | + |
6312 | + |
6313 | + |
6314 | + |
6315 | + |
6316 | + <div class="result grey"> |
6317 | + <div id="output-box-53-button" class="toggle" onclick="javascript:toggleOutput('output-box-53')">+</div> |
6318 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-53')">Populate registry with test blob</h4> |
6319 | + <br> |
6320 | + <div id="output-box-53" style="display: none;"> |
6321 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6322 | + OCI_TEST_PULL=1 |
6323 | + OCI_TEST_PUSH=0 |
6324 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6325 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6326 | + </pre> |
6327 | + </div> |
6328 | + </div> |
6329 | + |
6330 | + |
6331 | + |
6332 | + |
6333 | + <div class="result grey"> |
6334 | + <div id="output-box-54-button" class="toggle" onclick="javascript:toggleOutput('output-box-54')">+</div> |
6335 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-54')">Populate registry with test layer</h4> |
6336 | + <br> |
6337 | + <div id="output-box-54" style="display: none;"> |
6338 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6339 | + OCI_TEST_PULL=1 |
6340 | + OCI_TEST_PUSH=0 |
6341 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6342 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6343 | + </pre> |
6344 | + </div> |
6345 | + </div> |
6346 | + |
6347 | + |
6348 | + |
6349 | + |
6350 | + <div class="result grey"> |
6351 | + <div id="output-box-55-button" class="toggle" onclick="javascript:toggleOutput('output-box-55')">+</div> |
6352 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-55')">Populate registry with test tags</h4> |
6353 | + <br> |
6354 | + <div id="output-box-55" style="display: none;"> |
6355 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6356 | + OCI_TEST_PUSH=0 |
6357 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6358 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6359 | + OCI_TEST_PULL=1 |
6360 | + </pre> |
6361 | + </div> |
6362 | + </div> |
6363 | + |
6364 | + |
6365 | + |
6366 | + |
6367 | + <div class="result grey"> |
6368 | + <div id="output-box-56-button" class="toggle" onclick="javascript:toggleOutput('output-box-56')">+</div> |
6369 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-56')">Populate registry with test tags (no push)</h4> |
6370 | + <br> |
6371 | + <div id="output-box-56" style="display: none;"> |
6372 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6373 | + OCI_TEST_PULL=1 |
6374 | + OCI_TEST_PUSH=0 |
6375 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6376 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6377 | + </pre> |
6378 | + </div> |
6379 | + </div> |
6380 | + |
6381 | + |
6382 | + |
6383 | + |
6384 | + <div class="result grey"> |
6385 | + <div id="output-box-57-button" class="toggle" onclick="javascript:toggleOutput('output-box-57')">+</div> |
6386 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-57')">References setup</h4> |
6387 | + <br> |
6388 | + <div id="output-box-57" style="display: none;"> |
6389 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6390 | + OCI_TEST_PULL=1 |
6391 | + OCI_TEST_PUSH=0 |
6392 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6393 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6394 | + </pre> |
6395 | + </div> |
6396 | + </div> |
6397 | + |
6398 | + <br> |
6399 | + |
6400 | + |
6401 | + <h3>Test content discovery endpoints (listing tags)</h3> |
6402 | + |
6403 | + |
6404 | + |
6405 | + |
6406 | + |
6407 | + |
6408 | + <div class="result grey"> |
6409 | + <div id="output-box-58-button" class="toggle" onclick="javascript:toggleOutput('output-box-58')">+</div> |
6410 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-58')">GET request to list tags should yield 200 response</h4> |
6411 | + <br> |
6412 | + <div id="output-box-58" style="display: none;"> |
6413 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6414 | + OCI_TEST_PULL=1 |
6415 | + OCI_TEST_PUSH=0 |
6416 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6417 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6418 | + </pre> |
6419 | + </div> |
6420 | + </div> |
6421 | + |
6422 | + |
6423 | + |
6424 | + |
6425 | + <div class="result grey"> |
6426 | + <div id="output-box-59-button" class="toggle" onclick="javascript:toggleOutput('output-box-59')">+</div> |
6427 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-59')">GET number of tags should be limitable by `n` query parameter</h4> |
6428 | + <br> |
6429 | + <div id="output-box-59" style="display: none;"> |
6430 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6431 | + OCI_TEST_PULL=1 |
6432 | + OCI_TEST_PUSH=0 |
6433 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6434 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6435 | + </pre> |
6436 | + </div> |
6437 | + </div> |
6438 | + |
6439 | + |
6440 | + |
6441 | + |
6442 | + <div class="result grey"> |
6443 | + <div id="output-box-60-button" class="toggle" onclick="javascript:toggleOutput('output-box-60')">+</div> |
6444 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-60')">GET start of tag is set by `last` query parameter</h4> |
6445 | + <br> |
6446 | + <div id="output-box-60" style="display: none;"> |
6447 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6448 | + OCI_TEST_PUSH=0 |
6449 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6450 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6451 | + OCI_TEST_PULL=1 |
6452 | + </pre> |
6453 | + </div> |
6454 | + </div> |
6455 | + |
6456 | + <br> |
6457 | + |
6458 | + |
6459 | + <h3>Test content discovery endpoints (listing references)</h3> |
6460 | + |
6461 | + |
6462 | + |
6463 | + |
6464 | + |
6465 | + |
6466 | + <div class="result grey"> |
6467 | + <div id="output-box-61-button" class="toggle" onclick="javascript:toggleOutput('output-box-61')">+</div> |
6468 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-61')">GET request to nonexistent blob should result in empty 200 response</h4> |
6469 | + <br> |
6470 | + <div id="output-box-61" style="display: none;"> |
6471 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6472 | + OCI_TEST_PULL=1 |
6473 | + OCI_TEST_PUSH=0 |
6474 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6475 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6476 | + </pre> |
6477 | + </div> |
6478 | + </div> |
6479 | + |
6480 | + |
6481 | + |
6482 | + |
6483 | + <div class="result grey"> |
6484 | + <div id="output-box-62-button" class="toggle" onclick="javascript:toggleOutput('output-box-62')">+</div> |
6485 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-62')">GET request to existing blob should yield 200</h4> |
6486 | + <br> |
6487 | + <div id="output-box-62" style="display: none;"> |
6488 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6489 | + OCI_TEST_PULL=1 |
6490 | + OCI_TEST_PUSH=0 |
6491 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6492 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6493 | + </pre> |
6494 | + </div> |
6495 | + </div> |
6496 | + |
6497 | + |
6498 | + |
6499 | + |
6500 | + <div class="result grey"> |
6501 | + <div id="output-box-63-button" class="toggle" onclick="javascript:toggleOutput('output-box-63')">+</div> |
6502 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-63')">GET request to existing blob with filter should yield 200</h4> |
6503 | + <br> |
6504 | + <div id="output-box-63" style="display: none;"> |
6505 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6506 | + OCI_TEST_PULL=1 |
6507 | + OCI_TEST_PUSH=0 |
6508 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6509 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6510 | + </pre> |
6511 | + </div> |
6512 | + </div> |
6513 | + |
6514 | + |
6515 | + |
6516 | + |
6517 | + <div class="result grey"> |
6518 | + <div id="output-box-64-button" class="toggle" onclick="javascript:toggleOutput('output-box-64')">+</div> |
6519 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-64')">GET request to missing manifest should yield 200</h4> |
6520 | + <br> |
6521 | + <div id="output-box-64" style="display: none;"> |
6522 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6523 | + OCI_TEST_PULL=1 |
6524 | + OCI_TEST_PUSH=0 |
6525 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6526 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6527 | + </pre> |
6528 | + </div> |
6529 | + </div> |
6530 | + |
6531 | + <br> |
6532 | + |
6533 | + |
6534 | + <h3>Teardown</h3> |
6535 | + |
6536 | + |
6537 | + |
6538 | + |
6539 | + |
6540 | + |
6541 | + <div class="result grey"> |
6542 | + <div id="output-box-65-button" class="toggle" onclick="javascript:toggleOutput('output-box-65')">+</div> |
6543 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-65')">Delete config blob created in tests</h4> |
6544 | + <br> |
6545 | + <div id="output-box-65" style="display: none;"> |
6546 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6547 | + OCI_TEST_PULL=1 |
6548 | + OCI_TEST_PUSH=0 |
6549 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6550 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6551 | + </pre> |
6552 | + </div> |
6553 | + </div> |
6554 | + |
6555 | + |
6556 | + |
6557 | + |
6558 | + <div class="result grey"> |
6559 | + <div id="output-box-66-button" class="toggle" onclick="javascript:toggleOutput('output-box-66')">+</div> |
6560 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-66')">Delete layer blob created in setup</h4> |
6561 | + <br> |
6562 | + <div id="output-box-66" style="display: none;"> |
6563 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6564 | + OCI_TEST_PULL=1 |
6565 | + OCI_TEST_PUSH=0 |
6566 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6567 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6568 | + </pre> |
6569 | + </div> |
6570 | + </div> |
6571 | + |
6572 | + |
6573 | + |
6574 | + |
6575 | + <div class="result grey"> |
6576 | + <div id="output-box-67-button" class="toggle" onclick="javascript:toggleOutput('output-box-67')">+</div> |
6577 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-67')">Delete created manifest & associated tags</h4> |
6578 | + <br> |
6579 | + <div id="output-box-67" style="display: none;"> |
6580 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6581 | + OCI_TEST_PULL=1 |
6582 | + OCI_TEST_PUSH=0 |
6583 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6584 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6585 | + </pre> |
6586 | + </div> |
6587 | + </div> |
6588 | + |
6589 | + |
6590 | + |
6591 | + |
6592 | + <div class="result grey"> |
6593 | + <div id="output-box-68-button" class="toggle" onclick="javascript:toggleOutput('output-box-68')">+</div> |
6594 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-68')">References teardown</h4> |
6595 | + <br> |
6596 | + <div id="output-box-68" style="display: none;"> |
6597 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6598 | + OCI_TEST_PULL=1 |
6599 | + OCI_TEST_PUSH=0 |
6600 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6601 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6602 | + </pre> |
6603 | + </div> |
6604 | + </div> |
6605 | + |
6606 | + <br> |
6607 | + |
6608 | + |
6609 | + |
6610 | + |
6611 | + </div> |
6612 | + |
6613 | + |
6614 | + |
6615 | + |
6616 | + <h2>Content Management</h2> |
6617 | + <div class="subcategory"> |
6618 | + |
6619 | + |
6620 | + <h3>Setup</h3> |
6621 | + |
6622 | + |
6623 | + |
6624 | + |
6625 | + |
6626 | + |
6627 | + <div class="result grey"> |
6628 | + <div id="output-box-69-button" class="toggle" onclick="javascript:toggleOutput('output-box-69')">+</div> |
6629 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-69')">Populate registry with test config blob</h4> |
6630 | + <br> |
6631 | + <div id="output-box-69" style="display: none;"> |
6632 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6633 | + OCI_TEST_PULL=1 |
6634 | + OCI_TEST_PUSH=0 |
6635 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6636 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6637 | + </pre> |
6638 | + </div> |
6639 | + </div> |
6640 | + |
6641 | + |
6642 | + |
6643 | + |
6644 | + <div class="result grey"> |
6645 | + <div id="output-box-70-button" class="toggle" onclick="javascript:toggleOutput('output-box-70')">+</div> |
6646 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-70')">Populate registry with test layer</h4> |
6647 | + <br> |
6648 | + <div id="output-box-70" style="display: none;"> |
6649 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6650 | + OCI_TEST_PULL=1 |
6651 | + OCI_TEST_PUSH=0 |
6652 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6653 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6654 | + </pre> |
6655 | + </div> |
6656 | + </div> |
6657 | + |
6658 | + |
6659 | + |
6660 | + |
6661 | + <div class="result grey"> |
6662 | + <div id="output-box-71-button" class="toggle" onclick="javascript:toggleOutput('output-box-71')">+</div> |
6663 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-71')">Populate registry with test tag</h4> |
6664 | + <br> |
6665 | + <div id="output-box-71" style="display: none;"> |
6666 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6667 | + OCI_TEST_PUSH=0 |
6668 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6669 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6670 | + OCI_TEST_PULL=1 |
6671 | + </pre> |
6672 | + </div> |
6673 | + </div> |
6674 | + |
6675 | + |
6676 | + |
6677 | + |
6678 | + <div class="result grey"> |
6679 | + <div id="output-box-72-button" class="toggle" onclick="javascript:toggleOutput('output-box-72')">+</div> |
6680 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-72')">Check how many tags there are before anything gets deleted</h4> |
6681 | + <br> |
6682 | + <div id="output-box-72" style="display: none;"> |
6683 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6684 | + OCI_TEST_PULL=1 |
6685 | + OCI_TEST_PUSH=0 |
6686 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6687 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6688 | + </pre> |
6689 | + </div> |
6690 | + </div> |
6691 | + |
6692 | + <br> |
6693 | + |
6694 | + |
6695 | + <h3>Manifest delete</h3> |
6696 | + |
6697 | + |
6698 | + |
6699 | + |
6700 | + |
6701 | + |
6702 | + <div class="result grey"> |
6703 | + <div id="output-box-73-button" class="toggle" onclick="javascript:toggleOutput('output-box-73')">+</div> |
6704 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-73')">DELETE request to manifest tag should return 202, unless tag deletion is disallowed (400/405)</h4> |
6705 | + <br> |
6706 | + <div id="output-box-73" style="display: none;"> |
6707 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6708 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6709 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6710 | + OCI_TEST_PULL=1 |
6711 | + OCI_TEST_PUSH=0 |
6712 | + </pre> |
6713 | + </div> |
6714 | + </div> |
6715 | + |
6716 | + |
6717 | + |
6718 | + |
6719 | + <div class="result grey"> |
6720 | + <div id="output-box-74-button" class="toggle" onclick="javascript:toggleOutput('output-box-74')">+</div> |
6721 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-74')">DELETE request to manifest (digest) should yield 202 response unless already deleted</h4> |
6722 | + <br> |
6723 | + <div id="output-box-74" style="display: none;"> |
6724 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6725 | + OCI_TEST_PUSH=0 |
6726 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6727 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6728 | + OCI_TEST_PULL=1 |
6729 | + </pre> |
6730 | + </div> |
6731 | + </div> |
6732 | + |
6733 | + |
6734 | + |
6735 | + |
6736 | + <div class="result grey"> |
6737 | + <div id="output-box-75-button" class="toggle" onclick="javascript:toggleOutput('output-box-75')">+</div> |
6738 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-75')">GET request to deleted manifest URL should yield 404 response, unless delete is disallowed</h4> |
6739 | + <br> |
6740 | + <div id="output-box-75" style="display: none;"> |
6741 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6742 | + OCI_TEST_PULL=1 |
6743 | + OCI_TEST_PUSH=0 |
6744 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6745 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6746 | + </pre> |
6747 | + </div> |
6748 | + </div> |
6749 | + |
6750 | + |
6751 | + |
6752 | + |
6753 | + <div class="result grey"> |
6754 | + <div id="output-box-76-button" class="toggle" onclick="javascript:toggleOutput('output-box-76')">+</div> |
6755 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-76')">GET request to tags list should reflect manifest deletion</h4> |
6756 | + <br> |
6757 | + <div id="output-box-76" style="display: none;"> |
6758 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6759 | + OCI_TEST_PULL=1 |
6760 | + OCI_TEST_PUSH=0 |
6761 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6762 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6763 | + </pre> |
6764 | + </div> |
6765 | + </div> |
6766 | + |
6767 | + <br> |
6768 | + |
6769 | + |
6770 | + <h3>Blob delete</h3> |
6771 | + |
6772 | + |
6773 | + |
6774 | + |
6775 | + |
6776 | + |
6777 | + <div class="result grey"> |
6778 | + <div id="output-box-77-button" class="toggle" onclick="javascript:toggleOutput('output-box-77')">+</div> |
6779 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-77')">DELETE request to blob URL should yield 202 response</h4> |
6780 | + <br> |
6781 | + <div id="output-box-77" style="display: none;"> |
6782 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6783 | + OCI_TEST_PULL=1 |
6784 | + OCI_TEST_PUSH=0 |
6785 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6786 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6787 | + </pre> |
6788 | + </div> |
6789 | + </div> |
6790 | + |
6791 | + |
6792 | + |
6793 | + |
6794 | + <div class="result grey"> |
6795 | + <div id="output-box-78-button" class="toggle" onclick="javascript:toggleOutput('output-box-78')">+</div> |
6796 | + <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-78')">GET request to deleted blob URL should yield 404 response</h4> |
6797 | + <br> |
6798 | + <div id="output-box-78" style="display: none;"> |
6799 | + <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings: |
6800 | + OCI_TEST_PULL=1 |
6801 | + OCI_TEST_PUSH=0 |
6802 | + OCI_TEST_CONTENT_DISCOVERY=0 |
6803 | + OCI_TEST_CONTENT_MANAGEMENT=0 |
6804 | + </pre> |
6805 | + </div> |
6806 | + </div> |
6807 | + |
6808 | + <br> |
6809 | + |
6810 | + |
6811 | + |
6812 | + |
6813 | + </div> |
6814 | + |
6815 | + |
6816 | + </div> |
6817 | + </body> |
6818 | + </html> |
6819 | diff --git a/scripts/conformance_test.sh b/scripts/conformance_test.sh |
6820 | new file mode 100755 |
6821 | index 0000000..edcc388 |
6822 | --- /dev/null |
6823 | +++ b/scripts/conformance_test.sh |
6824 | @@ -0,0 +1,24 @@ |
6825 | + #!/bin/sh |
6826 | + # Build a container from https://github.com/opencontainers/distribution-spec/tree/main/conformance first |
6827 | + |
6828 | + IMAGE_NAME="conformance:latest" |
6829 | + HOSTNAME="http://localhost:8700" |
6830 | + |
6831 | + mkdir -p results |
6832 | + |
6833 | + podman run --rm \ |
6834 | + --net=host \ |
6835 | + -v $(pwd)/results:/results \ |
6836 | + -w /results \ |
6837 | + -e OCI_ROOT_URL="$HOSTNAME" \ |
6838 | + -e OCI_NAMESPACE="myorg/myrepo/a" \ |
6839 | + -e OCI_USERNAME="myuser" \ |
6840 | + -e OCI_PASSWORD="mypass" \ |
6841 | + -e OCI_TEST_PULL=1 \ |
6842 | + -e OCI_TEST_PUSH=0 \ |
6843 | + -e OCI_TEST_CONTENT_DISCOVERY=0 \ |
6844 | + -e OCI_TEST_CONTENT_MANAGEMENT=0 \ |
6845 | + -e OCI_HIDE_SKIPPED_WORKFLOWS=0 \ |
6846 | + -e OCI_DEBUG=0 \ |
6847 | + -e OCI_DELETE_MANIFEST_BEFORE_BLOBS=0 \ |
6848 | + "$IMAGE_NAME" |
6849 | diff --git a/src/address.rs b/src/address.rs |
6850 | new file mode 100644 |
6851 | index 0000000..bd34217 |
6852 | --- /dev/null |
6853 | +++ b/src/address.rs |
6854 | @@ -0,0 +1,258 @@ |
6855 | + use std::{ |
6856 | + fmt::Display, |
6857 | + path::{Path, PathBuf}, |
6858 | + }; |
6859 | + |
6860 | + use oci_spec::image::Digest; |
6861 | + use relative_path::RelativePath; |
6862 | + use uuid::Uuid; |
6863 | + |
6864 | + use crate::Namespace; |
6865 | + |
6866 | + const SEPARATOR: &str = "/"; |
6867 | + |
6868 | + fn digest_prefix(digest: &Digest) -> &str { |
6869 | + match digest.algorithm() { |
6870 | + oci_spec::image::DigestAlgorithm::Sha256 => "sha256", |
6871 | + oci_spec::image::DigestAlgorithm::Sha384 => "sha384", |
6872 | + oci_spec::image::DigestAlgorithm::Sha512 => "sha512", |
6873 | + oci_spec::image::DigestAlgorithm::Other(_) => todo!(), |
6874 | + _ => todo!(), |
6875 | + } |
6876 | + } |
6877 | + |
6878 | + pub trait Addressable { |
6879 | + fn address(&self) -> Address; |
6880 | + } |
6881 | + |
6882 | + /// Address is a path-like object for addressing OCI objects. The design of |
6883 | + /// this basically copies the file system layout used by the Docker |
6884 | + /// distribution registry. https://github.com/distribution/distribution |
6885 | + #[derive(Debug, Clone)] |
6886 | + pub struct Address { |
6887 | + parts: Vec<String>, |
6888 | + } |
6889 | + |
6890 | + impl Address { |
6891 | + pub fn as_path(&self, base_dir: &Path) -> PathBuf { |
6892 | + let parts = self.parts.join(SEPARATOR); |
6893 | + RelativePath::new(&parts).to_path(base_dir) |
6894 | + } |
6895 | + |
6896 | + pub fn is_link(&self) -> bool { |
6897 | + self.parts.last().is_some_and(|part| part == "link") |
6898 | + } |
6899 | + |
6900 | + pub fn is_data(&self) -> bool { |
6901 | + self.parts.last().is_some_and(|part| part == "data") |
6902 | + } |
6903 | + |
6904 | + pub fn name(&self) -> String { |
6905 | + self.parts.last().cloned().unwrap() |
6906 | + } |
6907 | + |
6908 | + // /// Create an addressable link |
6909 | + // pub fn link(addr: &impl Addressable) -> Self { |
6910 | + // let mut parts = addr.parts(); |
6911 | + // parts.push(String::from("link")); |
6912 | + // Address { parts } |
6913 | + // } |
6914 | + |
6915 | + // /// create an addressable data path |
6916 | + // pub fn data(addr: &impl Addressable) -> Self { |
6917 | + // let mut parts = addr.parts(); |
6918 | + // parts.push(String::from("data")); |
6919 | + // Address { parts } |
6920 | + // } |
6921 | + } |
6922 | + |
6923 | + impl Display for Address { |
6924 | + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
6925 | + f.write_str(&self.parts.join(SEPARATOR)) |
6926 | + } |
6927 | + } |
6928 | + |
6929 | + impl Addressable for Address { |
6930 | + fn address(&self) -> Address { |
6931 | + self.clone() |
6932 | + } |
6933 | + } |
6934 | + |
6935 | + impl From<&Vec<&str>> for Address { |
6936 | + fn from(value: &Vec<&str>) -> Self { |
6937 | + Address { |
6938 | + parts: value.iter().map(|part| part.to_string()).collect(), |
6939 | + } |
6940 | + } |
6941 | + } |
6942 | + |
6943 | + /// The directory that contains all tags for a certian namespace |
6944 | + pub struct TagDirectory<'a> { |
6945 | + pub namespace: &'a Namespace, |
6946 | + } |
6947 | + |
6948 | + impl<'a> From<&'a Namespace> for TagDirectory<'a> { |
6949 | + fn from(value: &'a Namespace) -> Self { |
6950 | + TagDirectory { namespace: value } |
6951 | + } |
6952 | + } |
6953 | + |
6954 | + impl Addressable for TagDirectory<'_> { |
6955 | + fn address(&self) -> Address { |
6956 | + (&vec![&self.namespace.as_ref(), "tags"]).into() |
6957 | + } |
6958 | + } |
6959 | + |
6960 | + /// Path to a tag within a repository namespace |
6961 | + pub struct Tag<'a> { |
6962 | + pub namespace: &'a Namespace, |
6963 | + pub name: &'a str, |
6964 | + } |
6965 | + |
6966 | + impl Addressable for Tag<'_> { |
6967 | + fn address(&self) -> Address { |
6968 | + (&vec![ |
6969 | + "repositories", |
6970 | + &self.namespace.as_ref(), |
6971 | + "tags", |
6972 | + self.name, |
6973 | + "current", |
6974 | + "link", |
6975 | + ]) |
6976 | + .into() |
6977 | + } |
6978 | + } |
6979 | + |
6980 | + pub struct Reference<'a> { |
6981 | + pub namespace: &'a Namespace, |
6982 | + pub digest: &'a Digest, |
6983 | + } |
6984 | + |
6985 | + impl Addressable for Reference<'_> { |
6986 | + fn address(&self) -> Address { |
6987 | + (&vec![ |
6988 | + "repositories", |
6989 | + &self.namespace.as_ref(), |
6990 | + "manifests", |
6991 | + "revisions", |
6992 | + digest_prefix(self.digest), |
6993 | + self.digest.digest(), |
6994 | + "link", |
6995 | + ]) |
6996 | + .into() |
6997 | + } |
6998 | + } |
6999 | + |
7000 | + /// Path to a temporary blob used during uploads |
7001 | + pub struct TempBlob<'a> { |
7002 | + pub uuid: &'a Uuid, |
7003 | + pub namespace: &'a Namespace, |
7004 | + } |
7005 | + |
7006 | + impl Addressable for TempBlob<'_> { |
7007 | + fn address(&self) -> Address { |
7008 | + (&vec!["repositories", &self.namespace.as_ref(), "tmp", &self.uuid.to_string()]).into() |
7009 | + } |
7010 | + } |
7011 | + |
7012 | + /// Path to a blob file on disk |
7013 | + pub struct Blob<'a> { |
7014 | + pub digest: &'a Digest, |
7015 | + } |
7016 | + |
7017 | + impl<'a> From<&'a Digest> for Blob<'a> { |
7018 | + fn from(value: &'a Digest) -> Self { |
7019 | + Blob { digest: value } |
7020 | + } |
7021 | + } |
7022 | + |
7023 | + impl Addressable for Blob<'_> { |
7024 | + fn address(&self) -> Address { |
7025 | + let digest_str = self.digest.digest(); |
7026 | + let first_two: String = digest_str.chars().take(2).collect(); |
7027 | + (&vec!["blobs", digest_prefix(self.digest), &first_two, digest_str]).into() |
7028 | + } |
7029 | + } |
7030 | + |
7031 | + /// ManifestRevision is a link to a blob on disk |
7032 | + pub struct ManifestRevision<'a> { |
7033 | + pub namespace: &'a Namespace, |
7034 | + pub digest: &'a Digest, |
7035 | + } |
7036 | + |
7037 | + impl Addressable for ManifestRevision<'_> { |
7038 | + fn address(&self) -> Address { |
7039 | + let digest_str = self.digest.digest(); |
7040 | + (&vec![ |
7041 | + "repositories", |
7042 | + &self.namespace.as_ref(), |
7043 | + "manifests", |
7044 | + "revisions", |
7045 | + digest_prefix(self.digest), |
7046 | + &digest_str, |
7047 | + "link", |
7048 | + ]) |
7049 | + .into() |
7050 | + } |
7051 | + } |
7052 | + |
7053 | + pub struct LayerLink<'a> { |
7054 | + pub namespace: &'a Namespace, |
7055 | + pub digest: &'a Digest, |
7056 | + } |
7057 | + |
7058 | + impl Addressable for LayerLink<'_> { |
7059 | + fn address(&self) -> Address { |
7060 | + let digest_str = self.digest.digest(); |
7061 | + (&vec![ |
7062 | + "repositories", |
7063 | + self.namespace.as_ref(), |
7064 | + "layers", |
7065 | + digest_prefix(self.digest), |
7066 | + &digest_str, |
7067 | + "link", |
7068 | + ]) |
7069 | + .into() |
7070 | + } |
7071 | + } |
7072 | + |
7073 | + #[cfg(test)] |
7074 | + mod test { |
7075 | + use std::str::FromStr; |
7076 | + |
7077 | + use super::*; |
7078 | + |
7079 | + #[test] |
7080 | + pub fn addresses() { |
7081 | + let namespace = Namespace::from_str("hello/world").unwrap(); |
7082 | + assert!(&TagDirectory::from(&namespace).address().to_string() == "hello/world/tags"); |
7083 | + assert!( |
7084 | + &Tag { |
7085 | + namespace: &namespace, |
7086 | + name: "latest" |
7087 | + } |
7088 | + .address() |
7089 | + .to_string() |
7090 | + == "repositories/hello/world/tags/latest/current/link" |
7091 | + ); |
7092 | + let uuid = Uuid::new_v4(); |
7093 | + assert!(TempBlob{uuid: &uuid, namespace: &namespace}.address().to_string() == format!("repositories/hello/world/tmp/{}", uuid)); |
7094 | + let digest = Digest::from_str( |
7095 | + "sha256:57f2ae062b76cff6f5a511fe6f907decfdefd6495e6afa31c44e0a6a1eca146f", |
7096 | + ) |
7097 | + .unwrap(); |
7098 | + assert!( |
7099 | + Blob { digest: &digest }.address().to_string() |
7100 | + == "blobs/sha256/57/57f2ae062b76cff6f5a511fe6f907decfdefd6495e6afa31c44e0a6a1eca146f" |
7101 | + ); |
7102 | + assert!( |
7103 | + ManifestRevision { |
7104 | + namespace: &namespace, |
7105 | + digest: &digest |
7106 | + } |
7107 | + .address() |
7108 | + .to_string() |
7109 | + == "repositories/hello/world/manifests/revisions/sha256/57f2ae062b76cff6f5a511fe6f907decfdefd6495e6afa31c44e0a6a1eca146f/link" |
7110 | + ) |
7111 | + } |
7112 | + } |
7113 | diff --git a/src/axum/error.rs b/src/axum/error.rs |
7114 | new file mode 100644 |
7115 | index 0000000..3c137e8 |
7116 | --- /dev/null |
7117 | +++ b/src/axum/error.rs |
7118 | @@ -0,0 +1,161 @@ |
7119 | + use std::fmt::Display; |
7120 | + |
7121 | + use axum::{ |
7122 | + Json, |
7123 | + extract::rejection::BytesRejection, |
7124 | + response::{IntoResponse, Response}, |
7125 | + }; |
7126 | + use http::StatusCode; |
7127 | + |
7128 | + use crate::error::Error as PapyriError; |
7129 | + |
7130 | + const INTERNAL_SERVER_ERROR: &str = "INTERNAL_SERVER_ERROR"; |
7131 | + |
7132 | + #[derive(thiserror::Error, Debug)] |
7133 | + pub enum Error { |
7134 | + #[error("Papyri: {0}")] |
7135 | + Papyri(#[from] PapyriError), |
7136 | + #[error("Connection: {0}")] |
7137 | + Connection(#[from] BytesRejection), |
7138 | + #[error("Distribution Error: {{0:?}}")] |
7139 | + Code(Code, Option<String>), |
7140 | + #[error("Cannot parse UUID: {0}")] |
7141 | + Uuid(#[from] uuid::Error), |
7142 | + #[error("OCI Parsing: {0}")] |
7143 | + OciParsing(#[from] oci_spec::OciSpecError), |
7144 | + } |
7145 | + |
7146 | + #[derive(serde::Serialize, Debug)] |
7147 | + pub struct Message { |
7148 | + pub code: String, |
7149 | + pub message: String, |
7150 | + pub detail: Option<String>, |
7151 | + } |
7152 | + |
7153 | + impl From<&Error> for Message { |
7154 | + fn from(value: &Error) -> Self { |
7155 | + match value { |
7156 | + Error::Papyri(error) => Message { |
7157 | + code: INTERNAL_SERVER_ERROR.to_string(), |
7158 | + message: String::from("papyri internal error"), |
7159 | + detail: Some(error.to_string()), |
7160 | + }, |
7161 | + Error::Connection(bytes_rejection) => Message { |
7162 | + code: INTERNAL_SERVER_ERROR.to_string(), |
7163 | + message: String::from("could not read message"), |
7164 | + detail: Some(bytes_rejection.to_string()), |
7165 | + }, |
7166 | + Error::Code(code, details) => { |
7167 | + let (code_str, message) = match code { |
7168 | + Code::BlobUnknown => ("BLOB_UNKNOWN", "blob unknown to registry"), |
7169 | + Code::BlobUploadInvalid => ("BLOB_UPLOAD_INVALID", "blob upload invalid"), |
7170 | + Code::BlobUploadUnknown => { |
7171 | + ("BLOB_UPLOAD_UNKNOWN", "blob upload unknown to registry") |
7172 | + } |
7173 | + Code::DigestInvalid => ( |
7174 | + "DIGEST_INVALID", |
7175 | + "provided digest did not match uploaded content", |
7176 | + ), |
7177 | + Code::ManifestBlobUnknown => ( |
7178 | + "MANIFEST_BLOB_UNKNOWN", |
7179 | + "manifest references a manifest or blob unknown to registry", |
7180 | + ), |
7181 | + Code::ManifestInvalid => ("MANIFEST_INVALID", "manifest invalid"), |
7182 | + Code::ManifestUnknown => ("MANIFEST_UNKNOWN", "manifest unknown to registry"), |
7183 | + Code::NameInvalid => ("NAME_INVALID", "invalid repository name"), |
7184 | + Code::NameUnknown => ("NAME_UNKNOWN", "repository name not known to registry"), |
7185 | + Code::SizeInvalid => ( |
7186 | + "SIZE_INVALID", |
7187 | + "provided length did not match content length", |
7188 | + ), |
7189 | + Code::Unathorized => ("UNAUTHORIZED", "authorization required"), |
7190 | + Code::Denied => ("DENIED", "requested access to the resource is denied"), |
7191 | + Code::Unsupported => ("UNSUPPORTED", "the operation is unsupported"), |
7192 | + Code::TooManyRequests => ("TOO_MANY_REQUESTS", "too many reuqests"), |
7193 | + }; |
7194 | + Message { |
7195 | + code: code_str.to_string(), |
7196 | + message: message.to_string(), |
7197 | + detail: details.clone(), |
7198 | + } |
7199 | + } |
7200 | + Error::Uuid(error) => Message { |
7201 | + code: INTERNAL_SERVER_ERROR.to_string(), |
7202 | + message: String::from("Cannot parse UUID"), |
7203 | + detail: Some(error.to_string()), |
7204 | + }, |
7205 | + Error::OciParsing(oci_spec_error) => Message { |
7206 | + code: INTERNAL_SERVER_ERROR.to_string(), |
7207 | + message: String::from("Failed to parse OCI specification"), |
7208 | + detail: Some(oci_spec_error.to_string()), |
7209 | + }, |
7210 | + } |
7211 | + } |
7212 | + } |
7213 | + |
7214 | + // | ID | Code | Description | |
7215 | + // |-------- | ------------------------|------------------------------------------------------------| |
7216 | + // | code-1 | `BLOB_UNKNOWN` | blob unknown to registry | |
7217 | + // | code-2 | `BLOB_UPLOAD_INVALID` | blob upload invalid | |
7218 | + // | code-3 | `BLOB_UPLOAD_UNKNOWN` | blob upload unknown to registry | |
7219 | + // | code-4 | `DIGEST_INVALID` | provided digest did not match uploaded content | |
7220 | + // | code-5 | `MANIFEST_BLOB_UNKNOWN` | manifest references a manifest or blob unknown to registry | |
7221 | + // | code-6 | `MANIFEST_INVALID` | manifest invalid | |
7222 | + // | code-7 | `MANIFEST_UNKNOWN` | manifest unknown to registry | |
7223 | + // | code-8 | `NAME_INVALID` | invalid repository name | |
7224 | + // | code-9 | `NAME_UNKNOWN` | repository name not known to registry | |
7225 | + // | code-10 | `SIZE_INVALID` | provided length did not match content length | |
7226 | + // | code-11 | `UNAUTHORIZED` | authentication required | |
7227 | + // | code-12 | `DENIED` | requested access to the resource is denied | |
7228 | + // | code-13 | `UNSUPPORTED` | the operation is unsupported | |
7229 | + // | code-14 | `TOOMANYREQUESTS` | too many requests | |
7230 | + #[derive(Debug)] |
7231 | + pub enum Code { |
7232 | + BlobUnknown, |
7233 | + BlobUploadInvalid, |
7234 | + BlobUploadUnknown, |
7235 | + DigestInvalid, |
7236 | + ManifestBlobUnknown, |
7237 | + ManifestInvalid, |
7238 | + ManifestUnknown, |
7239 | + NameInvalid, |
7240 | + NameUnknown, |
7241 | + SizeInvalid, |
7242 | + Unathorized, |
7243 | + Denied, |
7244 | + Unsupported, |
7245 | + TooManyRequests, |
7246 | + } |
7247 | + |
7248 | + impl Display for Code { |
7249 | + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
7250 | + write!(f, "{:?}", self) |
7251 | + } |
7252 | + } |
7253 | + |
7254 | + impl std::error::Error for Code {} |
7255 | + |
7256 | + impl IntoResponse for Error { |
7257 | + fn into_response(self) -> Response { |
7258 | + let message = Message::from(&self); |
7259 | + let message = Json(message); |
7260 | + let mut res = message.into_response(); |
7261 | + let status_code = res.status_mut(); |
7262 | + if status_code.as_u16() < 400 { |
7263 | + *status_code = StatusCode::INTERNAL_SERVER_ERROR; |
7264 | + } |
7265 | + if let Error::Papyri(PapyriError::Storage(crate::storage::Error::NotFound)) = self { |
7266 | + *status_code = StatusCode::NOT_FOUND |
7267 | + } |
7268 | + if let Error::Code(Code::BlobUnknown, _) = self { |
7269 | + *status_code = StatusCode::NOT_FOUND |
7270 | + } |
7271 | + if let Error::Code(Code::ManifestUnknown, _) = self { |
7272 | + *status_code = StatusCode::NOT_FOUND |
7273 | + } |
7274 | + if let Error::Code(Code::NameUnknown, _) = self { |
7275 | + *status_code = StatusCode::NOT_FOUND |
7276 | + } |
7277 | + res |
7278 | + } |
7279 | + } |
7280 | diff --git a/src/axum/extractors.rs b/src/axum/extractors.rs |
7281 | new file mode 100644 |
7282 | index 0000000..8b13789 |
7283 | --- /dev/null |
7284 | +++ b/src/axum/extractors.rs |
7285 | @@ -0,0 +1 @@ |
7286 | + |
7287 | diff --git a/src/axum/handlers.rs b/src/axum/handlers.rs |
7288 | new file mode 100644 |
7289 | index 0000000..3fa69bc |
7290 | --- /dev/null |
7291 | +++ b/src/axum/handlers.rs |
7292 | @@ -0,0 +1,34 @@ |
7293 | + // use std::{str::FromStr, sync::Arc}; |
7294 | + // |
7295 | + // use super::{AppState, error::Error}; |
7296 | + // use crate::Namespace; |
7297 | + // use axum::{ |
7298 | + // Extension, Json, |
7299 | + // body::HttpBody, |
7300 | + // extract::{FromRequest, Path, Query, Request, State}, |
7301 | + // http::StatusCode, |
7302 | + // response::{IntoResponse, Response}, |
7303 | + // }; |
7304 | + // use bytes::{Buf, Bytes}; |
7305 | + // use futures::TryStreamExt; |
7306 | + // use oci_spec::distribution::TagList; |
7307 | + // use serde_json::json; |
7308 | + // |
7309 | + // pub async fn index() -> Result<Json<serde_json::Value>, Error> { |
7310 | + // Ok(Json(json!({}))) |
7311 | + // } |
7312 | + // |
7313 | + // pub(crate) async fn read_tags( |
7314 | + // State(state): State<Arc<AppState>>, |
7315 | + // Path(name): Path<String>, |
7316 | + // ) -> Result<Json<TagList>, Error> { |
7317 | + // let namespace = Namespace::from_str(&name)?; |
7318 | + // let tags = state.oci.list_tags(&namespace).await?; |
7319 | + // Ok(Json(tags)) |
7320 | + // } |
7321 | + // |
7322 | + // pub async fn read_referrers() {} |
7323 | + // |
7324 | + // pub async fn delete_manifest() {} |
7325 | + // pub async fn delete_tag() {} |
7326 | + // pub async fn delete_blob() {} |
7327 | diff --git a/src/axum/handlers_blob.rs b/src/axum/handlers_blob.rs |
7328 | new file mode 100644 |
7329 | index 0000000..53732e2 |
7330 | --- /dev/null |
7331 | +++ b/src/axum/handlers_blob.rs |
7332 | @@ -0,0 +1,158 @@ |
7333 | + use std::{str::FromStr, sync::Arc}; |
7334 | + |
7335 | + use axum::{ |
7336 | + Extension, |
7337 | + extract::{Path, Query, Request, State}, |
7338 | + response::Response, |
7339 | + }; |
7340 | + use futures::TryStreamExt; |
7341 | + use http::{HeaderValue, StatusCode, header::CONTENT_LENGTH}; |
7342 | + use oci_spec::image::Digest; |
7343 | + use serde::Deserialize; |
7344 | + use uuid::Uuid; |
7345 | + |
7346 | + use crate::Namespace; |
7347 | + |
7348 | + use super::{AppState, error::Error, paths::DigestPath}; |
7349 | + |
7350 | + const OCI_CHUNK_MIN_LENGTH: usize = 10_000_000; |
7351 | + |
7352 | + fn upload_path(namespace: &Namespace, uuid: &Uuid) -> String { |
7353 | + format!( |
7354 | + "/v2/{}/blobs/uploads/{}", |
7355 | + namespace.to_string().trim_start_matches("/"), |
7356 | + uuid |
7357 | + ) |
7358 | + } |
7359 | + |
7360 | + #[derive(Deserialize)] |
7361 | + pub struct UploadQuery { |
7362 | + pub digest: Digest, |
7363 | + } |
7364 | + |
7365 | + /// Initiate a blob upload |
7366 | + /// FIXME: Per the spec for chunked uploads a header of Content-Length: 0 |
7367 | + /// MUST be present (for some reason). |
7368 | + pub async fn initiate( |
7369 | + State(state): State<Arc<AppState>>, |
7370 | + Extension(namespace): Extension<Namespace>, |
7371 | + ) -> Result<Response, Error> { |
7372 | + let uuid = state.oci.new_blob(&namespace).await?; |
7373 | + let mut res = Response::new(axum::body::Body::empty()); |
7374 | + let status = res.status_mut(); |
7375 | + *status = StatusCode::ACCEPTED; |
7376 | + let headers = res.headers_mut(); |
7377 | + headers.insert("Location", upload_path(&namespace, &uuid).parse().unwrap()); |
7378 | + // FIXME: make configurable |
7379 | + headers.insert( |
7380 | + "OCI-Chunk-Min-Length", |
7381 | + HeaderValue::from_str(&OCI_CHUNK_MIN_LENGTH.to_string()).unwrap(), |
7382 | + ); |
7383 | + Ok(res) |
7384 | + } |
7385 | + |
7386 | + pub async fn read( |
7387 | + State(state): State<Arc<AppState>>, |
7388 | + Extension(_namespace): Extension<Namespace>, |
7389 | + DigestPath(digest): DigestPath, |
7390 | + ) -> Result<Response, Error> { |
7391 | + let handle = state.oci.read_blob(&digest).await.map_err(|e| { |
7392 | + if let crate::error::Error::Storage(crate::storage::Error::NotFound) = e { |
7393 | + return Error::Code( |
7394 | + super::error::Code::BlobUnknown, |
7395 | + Some(format!("No blob with digest {} exists", digest)), |
7396 | + ); |
7397 | + }; |
7398 | + Error::Papyri(e) |
7399 | + })?; |
7400 | + let body = axum::body::Body::from_stream(handle); |
7401 | + let res = Response::new(body); |
7402 | + Ok(res) |
7403 | + } |
7404 | + |
7405 | + pub async fn stat( |
7406 | + State(state): State<Arc<AppState>>, |
7407 | + DigestPath(digest): DigestPath, |
7408 | + ) -> Result<StatusCode, Error> { |
7409 | + if !state.oci.has_blob(&digest).await? { |
7410 | + Err(Error::Code(super::error::Code::BlobUnknown, None)) |
7411 | + } else { |
7412 | + Ok(StatusCode::OK) |
7413 | + } |
7414 | + } |
7415 | + |
7416 | + pub async fn write_chunk( |
7417 | + State(state): State<Arc<AppState>>, |
7418 | + Path(upload_uuid): Path<String>, |
7419 | + Extension(namespace): Extension<Namespace>, |
7420 | + req: Request, |
7421 | + ) -> Result<Response, Error> { |
7422 | + let uuid = Uuid::from_str(&upload_uuid)?; |
7423 | + let stream = req.into_body().into_data_stream(); |
7424 | + let stream = stream.map_err(|e| crate::Error::Stream(e.to_string())); |
7425 | + state |
7426 | + .oci |
7427 | + .write_chunk(Box::pin(stream), &namespace, &uuid) |
7428 | + .await?; |
7429 | + let mut res = Response::new(axum::body::Body::empty()); |
7430 | + let status = res.status_mut(); |
7431 | + *status = StatusCode::ACCEPTED; |
7432 | + let headers = res.headers_mut(); |
7433 | + headers.insert("Location", upload_path(&namespace, &uuid).parse().unwrap()); |
7434 | + Ok(res) |
7435 | + } |
7436 | + |
7437 | + /// Write a complete blob in one request |
7438 | + pub async fn write( |
7439 | + State(state): State<Arc<AppState>>, |
7440 | + Path(upload_uuid): Path<String>, |
7441 | + Extension(namespace): Extension<Namespace>, |
7442 | + Query(query): Query<UploadQuery>, |
7443 | + req: Request, |
7444 | + ) -> Result<StatusCode, Error> { |
7445 | + let uuid = Uuid::from_str(&upload_uuid)?; |
7446 | + let stream = req.into_body().into_data_stream(); |
7447 | + let stream = stream.map_err(|e| crate::error::Error::Stream(e.to_string())); |
7448 | + state |
7449 | + .oci |
7450 | + .write_chunk(Box::pin(stream), &namespace, &uuid) |
7451 | + .await?; |
7452 | + state |
7453 | + .oci |
7454 | + .commit_blob(&namespace, &uuid, &query.digest) |
7455 | + .await?; |
7456 | + Ok(StatusCode::OK) |
7457 | + } |
7458 | + |
7459 | + pub async fn close( |
7460 | + State(state): State<Arc<AppState>>, |
7461 | + Path(upload_uuid): Path<String>, |
7462 | + Extension(namespace): Extension<Namespace>, |
7463 | + Query(query): Query<UploadQuery>, |
7464 | + req: Request, |
7465 | + ) -> Result<StatusCode, Error> { |
7466 | + let uuid = Uuid::from_str(&upload_uuid)?; |
7467 | + let headers = req.headers(); |
7468 | + if headers.get(CONTENT_LENGTH).is_some() { |
7469 | + let stream = req.into_body().into_data_stream(); |
7470 | + let stream = stream.map_err(|e| crate::error::Error::Stream(e.to_string())); |
7471 | + state |
7472 | + .oci |
7473 | + .write_chunk(Box::pin(stream), &namespace, &uuid) |
7474 | + .await?; |
7475 | + } |
7476 | + state |
7477 | + .oci |
7478 | + .commit_blob(&namespace, &uuid, &query.digest) |
7479 | + .await?; |
7480 | + Ok(StatusCode::CREATED) |
7481 | + } |
7482 | + |
7483 | + pub async fn delete( |
7484 | + State(state): State<Arc<AppState>>, |
7485 | + Extension(namespace): Extension<Namespace>, |
7486 | + DigestPath(digest): DigestPath, |
7487 | + ) -> Result<(), Error> { |
7488 | + state.oci.delete_blob(&namespace, &digest).await?; |
7489 | + Ok(()) |
7490 | + } |
7491 | diff --git a/src/axum/handlers_manifest.rs b/src/axum/handlers_manifest.rs |
7492 | new file mode 100644 |
7493 | index 0000000..13fefb5 |
7494 | --- /dev/null |
7495 | +++ b/src/axum/handlers_manifest.rs |
7496 | @@ -0,0 +1,97 @@ |
7497 | + use std::{str::FromStr, sync::Arc}; |
7498 | + |
7499 | + use axum::{ |
7500 | + Extension, Json, |
7501 | + extract::{FromRequest, Path, Request, State}, |
7502 | + response::{IntoResponse, Response}, |
7503 | + }; |
7504 | + use bytes::{Buf, Bytes}; |
7505 | + use http::{StatusCode, header::CONTENT_TYPE}; |
7506 | + use oci_spec::{ |
7507 | + distribution::Reference, |
7508 | + image::{ImageManifest, MediaType}, |
7509 | + }; |
7510 | + |
7511 | + use crate::Namespace; |
7512 | + |
7513 | + use super::{AppState, error::Error, paths::TagPath}; |
7514 | + |
7515 | + /// Extracts the manifest but also retains the exact byte specification of the |
7516 | + /// client manifest input. |
7517 | + pub struct ManifestExtractor((Bytes, ImageManifest)); |
7518 | + |
7519 | + impl<S> FromRequest<S> for ManifestExtractor |
7520 | + where |
7521 | + S: Send + Sync, |
7522 | + { |
7523 | + type Rejection = super::error::Error; |
7524 | + |
7525 | + async fn from_request(req: Request, state: &S) -> Result<Self, Self::Rejection> { |
7526 | + let headers = req.headers(); |
7527 | + let Some(content_type) = headers.get(CONTENT_TYPE) else { |
7528 | + todo!() |
7529 | + }; |
7530 | + let content_type_str = content_type.to_str().unwrap(); |
7531 | + let media_type = MediaType::from(content_type_str); |
7532 | + if !matches!(media_type, MediaType::ImageManifest) { |
7533 | + todo!() |
7534 | + } |
7535 | + let body = Bytes::from_request(req, state).await?; |
7536 | + |
7537 | + let buf = body.as_ref().reader(); |
7538 | + let manifest = ImageManifest::from_reader(buf)?; |
7539 | + Ok(ManifestExtractor((body, manifest))) |
7540 | + } |
7541 | + } |
7542 | + |
7543 | + pub async fn stat( |
7544 | + State(state): State<Arc<AppState>>, |
7545 | + Extension(namespace): Extension<Namespace>, |
7546 | + TagPath(tag_or_digest): TagPath, |
7547 | + ) -> Result<StatusCode, Error> { |
7548 | + println!("start"); |
7549 | + if !state.oci.has_manifest(&namespace, &tag_or_digest).await? { |
7550 | + Err(Error::Code(super::error::Code::ManifestUnknown, None)) |
7551 | + } else { |
7552 | + Ok(StatusCode::OK) |
7553 | + } |
7554 | + } |
7555 | + |
7556 | + pub async fn read( |
7557 | + State(state): State<Arc<AppState>>, |
7558 | + Extension(namespace): Extension<Namespace>, |
7559 | + TagPath(tag_or_digest): TagPath, |
7560 | + ) -> Result<Response, Error> { |
7561 | + let manifest = state |
7562 | + .oci |
7563 | + .read_manifest(&namespace, &tag_or_digest) |
7564 | + .await |
7565 | + .map_err(|e| { |
7566 | + if let crate::error::Error::Storage(crate::storage::Error::NotFound) = e { |
7567 | + return Error::Code(super::error::Code::ManifestUnknown, None); |
7568 | + }; |
7569 | + Error::Papyri(e) |
7570 | + })?; |
7571 | + let media_type = manifest |
7572 | + .media_type() |
7573 | + .as_ref() |
7574 | + .map(|mt| mt.to_string()) |
7575 | + .unwrap(); |
7576 | + let mut res = Json(manifest).into_response(); |
7577 | + res.headers_mut() |
7578 | + .insert(CONTENT_TYPE, media_type.parse().unwrap()); |
7579 | + Ok(res) |
7580 | + } |
7581 | + |
7582 | + pub async fn write( |
7583 | + Extension(namespace): Extension<Namespace>, |
7584 | + State(state): State<Arc<AppState>>, |
7585 | + TagPath(tag_or_digest): TagPath, |
7586 | + ManifestExtractor((manifest_bytes, manifest)): ManifestExtractor, |
7587 | + ) -> Result<StatusCode, Error> { |
7588 | + state |
7589 | + .oci |
7590 | + .write_manifest(&namespace, &tag_or_digest, &manifest, &manifest_bytes) |
7591 | + .await?; |
7592 | + Ok(StatusCode::OK) |
7593 | + } |
7594 | diff --git a/src/axum/mod.rs b/src/axum/mod.rs |
7595 | new file mode 100644 |
7596 | index 0000000..3ef0c9a |
7597 | --- /dev/null |
7598 | +++ b/src/axum/mod.rs |
7599 | @@ -0,0 +1,137 @@ |
7600 | + use std::str::FromStr; |
7601 | + use std::sync::Arc; |
7602 | + |
7603 | + use axum::Json; |
7604 | + use axum::extract::{DefaultBodyLimit, Request}; |
7605 | + use axum::middleware::{Next, from_fn}; |
7606 | + use axum::response::Response; |
7607 | + use axum::routing::{delete, head, patch, post, put}; |
7608 | + use axum::{Router, routing::get}; |
7609 | + use http::Uri; |
7610 | + use serde_json::json; |
7611 | + |
7612 | + use crate::Namespace; |
7613 | + use crate::oci_interface::OciInterface; |
7614 | + use crate::storage::Storage; |
7615 | + |
7616 | + mod error; |
7617 | + mod extractors; |
7618 | + mod handlers; |
7619 | + mod handlers_blob; |
7620 | + mod handlers_manifest; |
7621 | + mod paths; |
7622 | + |
7623 | + #[derive(Clone)] |
7624 | + pub(crate) struct AppState { |
7625 | + pub oci: OciInterface, |
7626 | + } |
7627 | + |
7628 | + pub fn read_ns(uri: &str) -> Option<(Namespace, String)> { |
7629 | + let mut components: Vec<String> = uri.split("/").map(|cmp| cmp.to_string()).collect(); |
7630 | + components.reverse(); |
7631 | + let stop = components.iter().enumerate().find_map(|(i, entry)| { |
7632 | + if *entry == "blobs" || *entry == "manifests" || *entry == "tags" { |
7633 | + Some(i + 1) |
7634 | + } else { |
7635 | + None |
7636 | + } |
7637 | + }); |
7638 | + if let Some(stop) = stop { |
7639 | + let (route, ns) = components.split_at(stop); |
7640 | + let mut ns: Vec<String> = ns.iter().map(String::from).collect(); |
7641 | + ns.reverse(); |
7642 | + let ns = ns.join("/"); |
7643 | + let mut route: Vec<String> = route.iter().map(String::from).collect(); |
7644 | + route.reverse(); |
7645 | + let route = format!("/{}", route.join("/")); |
7646 | + Some((Namespace::from_str(&ns).unwrap(), route)) |
7647 | + } else { |
7648 | + None |
7649 | + } |
7650 | + } |
7651 | + |
7652 | + /// Due to the registry spec allowing "namespacing", e.g. fuu/bar/baz/blobs/... |
7653 | + /// it is required that we rewrite the URI extacting any namespace if it is |
7654 | + /// specified. |
7655 | + pub fn extract_namespace(mut req: Request<axum::body::Body>) -> Request<axum::body::Body> { |
7656 | + let uri_str = req.uri().to_string(); |
7657 | + if let Some((namespace, route)) = read_ns(&uri_str) { |
7658 | + let extensions = req.extensions_mut(); |
7659 | + extensions.insert(namespace); |
7660 | + let uri = req.uri_mut(); |
7661 | + *uri = Uri::from_str(&route).unwrap(); |
7662 | + } |
7663 | + req |
7664 | + } |
7665 | + |
7666 | + // async fn propagate_header<B>(req: Request<B>, next: Next<B>) -> Response { |
7667 | + async fn global_headers(req: Request, next: Next) -> Response { |
7668 | + let mut res = next.run(req).await; |
7669 | + // Docker-Distribution-Api-Version: registry/2.0 |
7670 | + res.headers_mut().insert( |
7671 | + "Docker-Distribution-Api-Version", |
7672 | + "registry/2.0".try_into().unwrap(), |
7673 | + ); |
7674 | + res |
7675 | + } |
7676 | + |
7677 | + #[axum::debug_handler] |
7678 | + pub async fn index() -> Result<Json<serde_json::Value>, error::Error> { |
7679 | + Ok(Json(json!({}))) |
7680 | + } |
7681 | + |
7682 | + const MAXIMUM_MANIFEST_SIZE: usize = 5_000_000; |
7683 | + |
7684 | + pub fn router(storage: &Storage) -> Router { |
7685 | + Router::new() |
7686 | + .route("/v2", get(index)) |
7687 | + .route( |
7688 | + "/blobs/uploads/{reference}", |
7689 | + patch(handlers_blob::write_chunk), |
7690 | + ) |
7691 | + .route("/blobs/uploads/{reference}", post(handlers_blob::write)) |
7692 | + .route("/blobs/uploads/{reference}", put(handlers_blob::close)) |
7693 | + .route("/blobs/uploads", post(handlers_blob::initiate)) |
7694 | + .route("/blobs/{digest}", head(handlers_blob::stat)) |
7695 | + .route("/blobs/{digest}", get(handlers_blob::read)) |
7696 | + .route("/blobs/{digest}", delete(handlers_blob::delete)) |
7697 | + .route( |
7698 | + "/manifests/{digest_or_tag}", |
7699 | + put(handlers_manifest::write).layer(DefaultBodyLimit::max(MAXIMUM_MANIFEST_SIZE)), |
7700 | + ) |
7701 | + .route("/manifests/{digest_or_tag}", get(handlers_manifest::read)) |
7702 | + .route("/manifests/{digest_or_tag}", head(handlers_manifest::stat)) |
7703 | + // // .route("/{name}/blobs/{digest}", head(crate::handlers::stat_blob)) |
7704 | + // // .route( |
7705 | + // // "/{name}/manifests/{reference}", |
7706 | + // // get(crate::handlers::read_manifest), |
7707 | + // // ) |
7708 | + // // .route( |
7709 | + // // "/{name}/manifests/{reference}", |
7710 | + // // head(crate::handlers::read_manifest), |
7711 | + // // ) |
7712 | + // // .route("/{name}/blobs/uploads", post(crate::handlers::initiate_blob)) |
7713 | + // // .route( |
7714 | + // // "/{name}/blobs/uploads/{reference}", |
7715 | + // // patch(crate::handlers::write_blob), |
7716 | + // // ) |
7717 | + // // .route( |
7718 | + // // "/{name}/manifests/{reference}", |
7719 | + // // put(crate::handlers::write_manifest), |
7720 | + // // ) |
7721 | + // // .route("/{name}/tags/list", get(crate::handlers::read_tags)) |
7722 | + // // .route( |
7723 | + // // "/{name}/manifests/{reference}", |
7724 | + // // delete(crate::handlers::delete_manifest), |
7725 | + // // ) |
7726 | + // // .route( |
7727 | + // // "/{name}/blobs/{digest}", |
7728 | + // // delete(crate::handlers::delete_blob), |
7729 | + // // ) |
7730 | + .layer(from_fn(global_headers)) |
7731 | + .with_state(Arc::new(AppState { |
7732 | + oci: OciInterface { |
7733 | + storage: storage.clone(), |
7734 | + }, |
7735 | + })) |
7736 | + } |
7737 | diff --git a/src/axum/paths.rs b/src/axum/paths.rs |
7738 | new file mode 100644 |
7739 | index 0000000..da82db5 |
7740 | --- /dev/null |
7741 | +++ b/src/axum/paths.rs |
7742 | @@ -0,0 +1,47 @@ |
7743 | + use std::str::FromStr; |
7744 | + |
7745 | + use axum::extract::FromRequestParts; |
7746 | + use http::request::Parts; |
7747 | + use oci_spec::image::Digest; |
7748 | + |
7749 | + use crate::TagOrDigest; |
7750 | + |
7751 | + use super::error::{Code, Error}; |
7752 | + |
7753 | + pub struct DigestPath(pub Digest); |
7754 | + |
7755 | + impl<S> FromRequestParts<S> for DigestPath |
7756 | + where |
7757 | + S: Send + Sync, |
7758 | + { |
7759 | + type Rejection = Error; |
7760 | + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> { |
7761 | + match axum::extract::Path::<Digest>::from_request_parts(parts, state).await { |
7762 | + Ok(value) => Ok(Self(value.0)), |
7763 | + Err(_) => Err(Error::Code(Code::DigestInvalid, None)), |
7764 | + } |
7765 | + } |
7766 | + } |
7767 | + |
7768 | + pub struct TagPath(pub TagOrDigest); |
7769 | + |
7770 | + impl<S> FromRequestParts<S> for TagPath |
7771 | + where |
7772 | + S: Send + Sync, |
7773 | + { |
7774 | + type Rejection = Error; |
7775 | + |
7776 | + async fn from_request_parts(parts: &mut Parts, state: &S) -> Result<Self, Self::Rejection> { |
7777 | + match axum::extract::Path::<String>::from_request_parts(parts, state).await { |
7778 | + Ok(value) => { |
7779 | + if let Ok(digest) = Digest::from_str(&value.0) { |
7780 | + Ok(Self(TagOrDigest::Digest(digest))) |
7781 | + } else { |
7782 | + // TODO: We can't use Reference here and I'm unsure what a valid tag is |
7783 | + Ok(Self(TagOrDigest::Tag(value.0.clone()))) |
7784 | + } |
7785 | + } |
7786 | + Err(_) => todo!(), |
7787 | + } |
7788 | + } |
7789 | + } |
7790 | diff --git a/src/error.rs b/src/error.rs |
7791 | index 45f1daa..9f746eb 100644 |
7792 | --- a/src/error.rs |
7793 | +++ b/src/error.rs |
7794 | @@ -1,98 +1,13 @@ |
7795 | - use axum::{Json, response::IntoResponse}; |
7796 | - |
7797 | use crate::storage::Error as StorageError; |
7798 | |
7799 | - // | ID | Code | Description | |
7800 | - // |-------- | ------------------------|------------------------------------------------------------| |
7801 | - // | code-1 | `BLOB_UNKNOWN` | blob unknown to registry | |
7802 | - // | code-2 | `BLOB_UPLOAD_INVALID` | blob upload invalid | |
7803 | - // | code-3 | `BLOB_UPLOAD_UNKNOWN` | blob upload unknown to registry | |
7804 | - // | code-4 | `DIGEST_INVALID` | provided digest did not match uploaded content | |
7805 | - // | code-5 | `MANIFEST_BLOB_UNKNOWN` | manifest references a manifest or blob unknown to registry | |
7806 | - // | code-6 | `MANIFEST_INVALID` | manifest invalid | |
7807 | - // | code-7 | `MANIFEST_UNKNOWN` | manifest unknown to registry | |
7808 | - // | code-8 | `NAME_INVALID` | invalid repository name | |
7809 | - // | code-9 | `NAME_UNKNOWN` | repository name not known to registry | |
7810 | - // | code-10 | `SIZE_INVALID` | provided length did not match content length | |
7811 | - // | code-11 | `UNAUTHORIZED` | authentication required | |
7812 | - // | code-12 | `DENIED` | requested access to the resource is denied | |
7813 | - // | code-13 | `UNSUPPORTED` | the operation is unsupported | |
7814 | - // | code-14 | `TOOMANYREQUESTS` | too many requests | |
7815 | - #[derive(Debug)] |
7816 | - pub enum Code { |
7817 | - BlobUnknown, |
7818 | - BlobUploadInvalid, |
7819 | - BlobUploadUnknown, |
7820 | - DigestInvalid, |
7821 | - ManifestBlobUnknown, |
7822 | - ManifestInvalid, |
7823 | - ManifestUnknown, |
7824 | - NameInvalid, |
7825 | - NameUnknown, |
7826 | - SizeInvalid, |
7827 | - Unathorized, |
7828 | - Denied, |
7829 | - Unsupported, |
7830 | - TooManyRequests, |
7831 | - } |
7832 | - |
7833 | - #[derive(serde::Serialize, Debug)] |
7834 | - pub struct Message { |
7835 | - pub code: String, |
7836 | - pub message: String, |
7837 | - pub detail: Option<String>, |
7838 | - } |
7839 | - |
7840 | #[derive(thiserror::Error, Debug)] |
7841 | pub enum Error { |
7842 | - Code(Code), |
7843 | + #[error("IO Failure: {0}")] |
7844 | Storage(StorageError), |
7845 | - } |
7846 | - |
7847 | - impl std::fmt::Display for Error { |
7848 | - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
7849 | - let msg: Message = self.into(); |
7850 | - f.write_str(&format!("{:?}", msg)) |
7851 | - } |
7852 | - } |
7853 | - |
7854 | - impl From<&Error> for Message { |
7855 | - fn from(val: &Error) -> Self { |
7856 | - match val { |
7857 | - Error::Code(code) => match code { |
7858 | - Code::BlobUnknown => Message { |
7859 | - code: String::from("BLOB_UNKNOWN"), |
7860 | - message: String::from("blob unknown to registry"), |
7861 | - detail: None, |
7862 | - }, |
7863 | - Code::BlobUploadInvalid => todo!(), |
7864 | - Code::BlobUploadUnknown => todo!(), |
7865 | - Code::DigestInvalid => todo!(), |
7866 | - Code::ManifestBlobUnknown => todo!(), |
7867 | - Code::ManifestInvalid => todo!(), |
7868 | - Code::ManifestUnknown => todo!(), |
7869 | - Code::NameInvalid => todo!(), |
7870 | - Code::NameUnknown => todo!(), |
7871 | - Code::SizeInvalid => todo!(), |
7872 | - Code::Unathorized => todo!(), |
7873 | - Code::Denied => todo!(), |
7874 | - Code::Unsupported => todo!(), |
7875 | - Code::TooManyRequests => todo!(), |
7876 | - }, |
7877 | - Error::Storage(error) => { |
7878 | - match error { |
7879 | - StorageError::Unspecified => todo!(), |
7880 | - StorageError::IO => todo!(), |
7881 | - StorageError::NotFound => todo!(), |
7882 | - } |
7883 | - }, |
7884 | - } |
7885 | - } |
7886 | - } |
7887 | - |
7888 | - impl IntoResponse for Error { |
7889 | - fn into_response(self) -> axum::response::Response { |
7890 | - let message = Message::from(&self); |
7891 | - Json(message).into_response() |
7892 | - } |
7893 | + #[error("Streaming error: {0}")] |
7894 | + Stream(String), |
7895 | + #[error("Namespace Invalid: {0}")] |
7896 | + Namespace(String), |
7897 | + #[error("Error parsing OCI Specification: {0}")] |
7898 | + OciSpec(#[from] oci_spec::OciSpecError) |
7899 | } |
7900 | diff --git a/src/lib.rs b/src/lib.rs |
7901 | index c3e1100..7ab9579 100644 |
7902 | --- a/src/lib.rs |
7903 | +++ b/src/lib.rs |
7904 | @@ -1,3 +1,74 @@ |
7905 | - pub mod routes; |
7906 | + use std::{fmt::Display, str::FromStr}; |
7907 | + |
7908 | + use error::Error; |
7909 | + use oci_spec::image::Digest; |
7910 | + use regex::Regex; |
7911 | + use relative_path::RelativePath; |
7912 | + |
7913 | + pub mod address; |
7914 | pub mod error; |
7915 | + pub mod oci_interface; |
7916 | pub mod storage; |
7917 | + |
7918 | + #[cfg(feature = "axum")] |
7919 | + pub mod axum; |
7920 | + |
7921 | + #[cfg(feature = "storage-fs")] |
7922 | + pub mod storage_fs; |
7923 | + |
7924 | + const NAME_REGEXP_MATCH: &str = |
7925 | + r"[a-z0-9]+((\.|_|__|-+)[a-z0-9]+)*(\/[a-z0-9]+((\.|_|__|-+)[a-z0-9]+)*)*"; |
7926 | + |
7927 | + #[derive(Clone, Debug)] |
7928 | + pub enum TagOrDigest { |
7929 | + Tag(String), |
7930 | + Digest(Digest) |
7931 | + } |
7932 | + |
7933 | + // TODO: Consider 255 char namespace limit - hostname length per spec docs |
7934 | + #[derive(Clone)] |
7935 | + pub struct Namespace(String); |
7936 | + |
7937 | + impl Namespace { |
7938 | + pub fn path(&self) -> &RelativePath { |
7939 | + RelativePath::new(&self.0) |
7940 | + } |
7941 | + } |
7942 | + |
7943 | + impl FromStr for Namespace { |
7944 | + type Err = Error; |
7945 | + |
7946 | + fn from_str(s: &str) -> Result<Self, Self::Err> { |
7947 | + let regexp = Regex::new(NAME_REGEXP_MATCH).unwrap(); |
7948 | + if regexp.is_match(s) { |
7949 | + Ok(Namespace(s.to_string())) |
7950 | + } else { |
7951 | + Err(Error::Namespace(s.to_string())) |
7952 | + } |
7953 | + } |
7954 | + } |
7955 | + |
7956 | + impl Display for Namespace { |
7957 | + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
7958 | + write!(f, "{}", self.0) |
7959 | + } |
7960 | + } |
7961 | + |
7962 | + impl AsRef<str> for Namespace { |
7963 | + fn as_ref(&self) -> &str { |
7964 | + &self.0 |
7965 | + } |
7966 | + } |
7967 | + |
7968 | + #[cfg(test)] |
7969 | + mod test { |
7970 | + use super::*; |
7971 | + |
7972 | + #[test] |
7973 | + fn namespace() { |
7974 | + Namespace::from_str("fuu").unwrap(); |
7975 | + Namespace::from_str("fuu/bar").unwrap(); |
7976 | + Namespace::from_str("fuu/bar/baz/").unwrap(); |
7977 | + Namespace::from_str("fuu/bar/baz/qux").unwrap(); |
7978 | + } |
7979 | + } |
7980 | diff --git a/src/oci_interface.rs b/src/oci_interface.rs |
7981 | new file mode 100644 |
7982 | index 0000000..9c63cb3 |
7983 | --- /dev/null |
7984 | +++ b/src/oci_interface.rs |
7985 | @@ -0,0 +1,245 @@ |
7986 | + use std::{pin::Pin, str::FromStr}; |
7987 | + |
7988 | + use bytes::Bytes; |
7989 | + use futures::{Stream, StreamExt}; |
7990 | + use oci_spec::{ |
7991 | + distribution::TagList, |
7992 | + image::{Digest, ImageManifest}, |
7993 | + }; |
7994 | + use sha2::{Digest as HashDigest, Sha256}; |
7995 | + use uuid::Uuid; |
7996 | + |
7997 | + use crate::{ |
7998 | + Namespace, TagOrDigest, |
7999 | + address::{Address, Addressable, Blob, LayerLink, Reference, Tag, TempBlob}, |
8000 | + error::Error, |
8001 | + storage::{InnerStream, Storage, StorageIface}, |
8002 | + }; |
8003 | + |
8004 | + use base64::prelude::*; |
8005 | + |
8006 | + pub mod paths { |
8007 | + pub const REPOSITORIES: &str = "/repositories"; |
8008 | + } |
8009 | + |
8010 | + #[derive(Clone)] |
8011 | + pub struct OciInterface { |
8012 | + pub storage: Storage, |
8013 | + } |
8014 | + |
8015 | + impl OciInterface { |
8016 | + fn store(&self) -> impl StorageIface { |
8017 | + self.storage.inner() |
8018 | + } |
8019 | + |
8020 | + async fn resolve_link<A>(&self, link: &A) -> Result<Address, Error> |
8021 | + where |
8022 | + A: Addressable + Send + Sync, |
8023 | + { |
8024 | + let digest_bytes = self |
8025 | + .store() |
8026 | + .read_bytes(link) |
8027 | + .await |
8028 | + .map_err(Error::Storage)? |
8029 | + .to_vec(); |
8030 | + let digest_str = String::from_utf8_lossy(digest_bytes.as_slice()); |
8031 | + let digest = Digest::from_str(&digest_str)?; |
8032 | + let blob_addr = Blob::from(&digest); |
8033 | + Ok(blob_addr.address()) |
8034 | + } |
8035 | + |
8036 | + pub async fn new_blob(&self, namespace: &Namespace) -> Result<Uuid, Error> { |
8037 | + let uuid = Uuid::new_v4(); |
8038 | + self.store() |
8039 | + .write_all( |
8040 | + &TempBlob { |
8041 | + uuid: &uuid, |
8042 | + namespace, |
8043 | + }, |
8044 | + &[], |
8045 | + ) |
8046 | + .await |
8047 | + .map_err(Error::Storage)?; |
8048 | + Ok(uuid) |
8049 | + } |
8050 | + |
8051 | + pub async fn commit_blob( |
8052 | + &self, |
8053 | + namespace: &Namespace, |
8054 | + uuid: &Uuid, |
8055 | + digest: &Digest, |
8056 | + ) -> Result<(), Error> { |
8057 | + self.store() |
8058 | + .mv(&TempBlob { uuid, namespace }, &Blob::from(digest)) |
8059 | + .await |
8060 | + .map_err(Error::Storage)?; |
8061 | + Ok(()) |
8062 | + } |
8063 | + |
8064 | + pub async fn delete_blob(&self, namespace: &Namespace, digest: &Digest) -> Result<(), Error> { |
8065 | + self.store() |
8066 | + .delete(&LayerLink { namespace, digest }) |
8067 | + .await |
8068 | + .map_err(Error::Storage)?; |
8069 | + Ok(()) |
8070 | + } |
8071 | + |
8072 | + pub async fn write_chunk<S>( |
8073 | + &self, |
8074 | + mut stream: Pin<Box<S>>, |
8075 | + namespace: &Namespace, |
8076 | + uuid: &Uuid, |
8077 | + ) -> Result<(), Error> |
8078 | + where |
8079 | + S: Stream<Item = Result<Bytes, Error>>, |
8080 | + { |
8081 | + let tmp_blob_addr = &TempBlob { namespace, uuid }; |
8082 | + while let Some(item) = stream.next().await { |
8083 | + let chunk = item?.to_vec(); |
8084 | + self.store() |
8085 | + .write(tmp_blob_addr, chunk.as_slice()) |
8086 | + .await |
8087 | + .map_err(Error::Storage)?; |
8088 | + } |
8089 | + Ok(()) |
8090 | + } |
8091 | + |
8092 | + pub async fn write_manifest( |
8093 | + &self, |
8094 | + namespace: &Namespace, |
8095 | + tag_or_digest: &TagOrDigest, |
8096 | + manifest: &ImageManifest, |
8097 | + manifest_bytes: &Bytes, |
8098 | + ) -> Result<(), Error> { |
8099 | + let uuid = Uuid::new_v4(); |
8100 | + let tmp_blob_addr = TempBlob { |
8101 | + uuid: &uuid, |
8102 | + namespace, |
8103 | + }; |
8104 | + self.storage |
8105 | + .inner() |
8106 | + .write_all(&tmp_blob_addr, manifest_bytes.to_vec().as_slice()) |
8107 | + .await |
8108 | + .map_err(Error::Storage)?; |
8109 | + // TODO: Generalize in storage.rs |
8110 | + let hashed = Sha256::digest(manifest_bytes); |
8111 | + let hash_str = base16ct::lower::encode_string(&hashed); |
8112 | + let digest = Digest::from_str(&format!("sha256:{}", hash_str)).unwrap(); |
8113 | + let blob_address = &Blob::from(&digest); |
8114 | + self.store() |
8115 | + .mv(&tmp_blob_addr, blob_address) |
8116 | + .await |
8117 | + .map_err(Error::Storage)?; |
8118 | + self.store() |
8119 | + .write_all( |
8120 | + &Reference { |
8121 | + namespace, |
8122 | + digest: &digest, |
8123 | + }, |
8124 | + digest.to_string().as_bytes(), |
8125 | + ) |
8126 | + .await |
8127 | + .map_err(Error::Storage)?; |
8128 | + |
8129 | + for layer in manifest.layers() { |
8130 | + // FIXME: iirc each blob needs to be resolved |
8131 | + let digest = layer.digest(); |
8132 | + let digest_str = digest.to_string(); |
8133 | + let digest_bytes = digest_str.as_bytes(); |
8134 | + let layer_addr = LayerLink { namespace, digest }; |
8135 | + self.storage |
8136 | + .inner() |
8137 | + .write_all(&layer_addr, digest_bytes) |
8138 | + .await |
8139 | + .map_err(Error::Storage)?; |
8140 | + } |
8141 | + let oci_config_digest = manifest.config().digest(); |
8142 | + let manifest_embedded_data = manifest.config().data(); |
8143 | + if let Some(manifest_embedded_data) = manifest_embedded_data { |
8144 | + // let manifest_str = manifest.to_string_pretty().unwrap(); |
8145 | + let decoded = BASE64_STANDARD.decode(manifest_embedded_data).unwrap(); |
8146 | + self.storage |
8147 | + .inner() |
8148 | + .write_all( |
8149 | + &Blob { |
8150 | + digest: oci_config_digest, |
8151 | + }, |
8152 | + decoded.as_slice(), |
8153 | + ) |
8154 | + .await |
8155 | + .map_err(Error::Storage)?; |
8156 | + self.storage |
8157 | + .inner() |
8158 | + .write_all( |
8159 | + &LayerLink { |
8160 | + namespace, |
8161 | + digest: oci_config_digest, |
8162 | + }, |
8163 | + decoded.as_slice(), |
8164 | + ) |
8165 | + .await |
8166 | + .map_err(Error::Storage)?; |
8167 | + } |
8168 | + |
8169 | + if let TagOrDigest::Tag(name) = tag_or_digest { |
8170 | + self.store() |
8171 | + .write_all(&Tag { namespace, name }, digest.to_string().as_bytes()) |
8172 | + .await |
8173 | + .map_err(Error::Storage)?; |
8174 | + } |
8175 | + |
8176 | + Ok(()) |
8177 | + } |
8178 | + |
8179 | + pub async fn read_manifest( |
8180 | + &self, |
8181 | + namespace: &Namespace, |
8182 | + tag_or_digest: &TagOrDigest, |
8183 | + ) -> Result<ImageManifest, Error> { |
8184 | + let blob_addr = match tag_or_digest { |
8185 | + TagOrDigest::Tag(name) => self.resolve_link(&Tag { namespace, name }).await?, |
8186 | + TagOrDigest::Digest(digest) => { |
8187 | + self.resolve_link(&Reference { namespace, digest }).await? |
8188 | + } |
8189 | + }; |
8190 | + let manifest_bytes = self |
8191 | + .storage |
8192 | + .inner() |
8193 | + .read_bytes(&blob_addr) |
8194 | + .await |
8195 | + .map_err(Error::Storage)?; |
8196 | + let manifest: ImageManifest = |
8197 | + serde_json::de::from_slice(manifest_bytes.iter().as_slice()).expect("manifest invalid"); |
8198 | + Ok(manifest) |
8199 | + } |
8200 | + |
8201 | + pub async fn has_blob(&self, digest: &Digest) -> Result<bool, Error> { |
8202 | + let blob_addr = Blob::from(digest); |
8203 | + self.store() |
8204 | + .exists(&blob_addr) |
8205 | + .await |
8206 | + .map_err(Error::Storage) |
8207 | + } |
8208 | + |
8209 | + pub async fn has_manifest( |
8210 | + &self, |
8211 | + namespace: &Namespace, |
8212 | + tag_or_digest: &TagOrDigest, |
8213 | + ) -> Result<bool, Error> { |
8214 | + let blob_addr = match tag_or_digest { |
8215 | + TagOrDigest::Tag(name) => self.resolve_link(&Tag { namespace, name }).await?, |
8216 | + TagOrDigest::Digest(digest) => { |
8217 | + self.resolve_link(&Reference { namespace, digest }).await? |
8218 | + } |
8219 | + }; |
8220 | + self.store() |
8221 | + .exists(&blob_addr) |
8222 | + .await |
8223 | + .map_err(Error::Storage) |
8224 | + } |
8225 | + |
8226 | + pub async fn read_blob(&self, digest: &Digest) -> Result<InnerStream, Error> { |
8227 | + let blob_addr = Blob::from(digest); |
8228 | + self.store().read(&blob_addr).await.map_err(Error::Storage) |
8229 | + } |
8230 | + } |
8231 | diff --git a/src/routes.rs b/src/routes.rs |
8232 | deleted file mode 100644 |
8233 | index acc33b5..0000000 |
8234 | --- a/src/routes.rs |
8235 | +++ /dev/null |
8236 | @@ -1,179 +0,0 @@ |
8237 | - use std::cell::OnceCell; |
8238 | - use std::str::FromStr; |
8239 | - |
8240 | - use axum::Json; |
8241 | - use axum::extract::{MatchedPath, Path, Request}; |
8242 | - use axum::response::IntoResponse; |
8243 | - use axum::routing::{delete, head, patch, post, put}; |
8244 | - use axum::{Router, routing::get}; |
8245 | - use core::result::Result as StdResult; |
8246 | - use oci_spec::image::{ImageIndexBuilder, ImageManifest}; |
8247 | - use regex::Regex; |
8248 | - use serde::Deserialize; |
8249 | - use serde_json::json; |
8250 | - use tracing::info_span; |
8251 | - |
8252 | - use crate::error::Error; |
8253 | - |
8254 | - pub type Result<T = Json<serde_json::Value>, E = Error> = std::result::Result<T, E>; |
8255 | - |
8256 | - const NAME_REGEXP_MATCH: &str = |
8257 | - r"[a-z0-9]+((\.|_|__|-+)[a-z0-9]+)*(\/[a-z0-9]+((\.|_|__|-+)[a-z0-9]+)*)*"; |
8258 | - |
8259 | - #[derive(Deserialize)] |
8260 | - pub struct Namespace(String); |
8261 | - |
8262 | - impl Namespace { |
8263 | - pub fn validate(&self) -> Result<(), Error> { |
8264 | - let regexp = Regex::new(NAME_REGEXP_MATCH).unwrap(); |
8265 | - if regexp.is_match(&self.0) { |
8266 | - Ok(()) |
8267 | - } else { |
8268 | - Err(Error::Code(crate::error::Code::NameInvalid)) |
8269 | - } |
8270 | - } |
8271 | - } |
8272 | - |
8273 | - // Registry conformance applies to the following workflow categories: |
8274 | - // |
8275 | - // 1. **Pull** - Clients are able to pull from the registry |
8276 | - // 2. **Push** - Clients are able to push to the registry |
8277 | - // 3. **Content Discovery** - Clients are able to list or otherwise query the content stored in the registry |
8278 | - // 4. **Content Management** - Clients are able to control the full life-cycle of the content stored in the registry |
8279 | - // |
8280 | - |
8281 | - pub async fn index() -> Result { |
8282 | - Ok(Json(json!({}))) |
8283 | - } |
8284 | - |
8285 | - pub mod pull { |
8286 | - pub async fn read_manifest() {} |
8287 | - pub async fn read_blob() {} |
8288 | - } |
8289 | - |
8290 | - pub mod push { |
8291 | - pub async fn write_manifest() {} |
8292 | - pub async fn write_blob() {} |
8293 | - } |
8294 | - |
8295 | - pub mod discovery { |
8296 | - use super::*; |
8297 | - |
8298 | - pub async fn read_tags(Path(name): Path<Namespace>) -> Result { |
8299 | - name.validate()?; |
8300 | - todo!() |
8301 | - } |
8302 | - |
8303 | - pub async fn read_referrers() {} |
8304 | - } |
8305 | - |
8306 | - pub mod management { |
8307 | - pub async fn delete_manifest() {} |
8308 | - pub async fn delete_tag() {} |
8309 | - pub async fn delete_blob() {} |
8310 | - } |
8311 | - |
8312 | - pub fn router() -> Router { |
8313 | - Router::new() |
8314 | - .route("/v2", get(index)) |
8315 | - .route("/v2/", get(index)) |
8316 | - .route("/v2/:name/blobs/:digest", get(pull::read_blob)) |
8317 | - .route("/v2/:name/blobs/:digest", head(pull::read_blob)) |
8318 | - .route("/v2/:name/manifests/:reference", get(pull::read_manifest)) |
8319 | - .route("/v2/:name/manifests/:reference", head(pull::read_manifest)) |
8320 | - .route("/v2/:name/blobs/uploads", post(push::write_blob)) |
8321 | - .route( |
8322 | - "/v2/:name/blobs/uploads/:reference", |
8323 | - patch(push::write_blob), |
8324 | - ) |
8325 | - .route("/v2/:name/manifests/:reference", put(push::write_manifest)) |
8326 | - .route("/v2/:name/tags/list", get(discovery::read_tags)) |
8327 | - .route( |
8328 | - "/v2/:name/manifests/:reference", |
8329 | - delete(management::delete_manifest), |
8330 | - ) |
8331 | - .route("/v2/:name/blobs/:digest", delete(management::delete_blob)) |
8332 | - // .route("/v2/:name/blobs/uploads", post()) |
8333 | - } |
8334 | - |
8335 | - // pub async fn handler_index(req: Request) -> Json<serde_json::Value> { |
8336 | - // req.headers().iter().for_each(|h| { |
8337 | - // let header_value = h.1.to_str().ok(); |
8338 | - // tracing::info!(key = h.0.as_str(), value = header_value); |
8339 | - // }); |
8340 | - // Json(json!({})) |
8341 | - // } |
8342 | - // |
8343 | - // pub async fn handler_manifest_index() -> Json<serde_json::Value> { |
8344 | - // } |
8345 | - |
8346 | - // async fn serve() { |
8347 | - // let app = Router::new() |
8348 | - // .route("/", get(|| async { "Hello, World!" })) |
8349 | - // .route("/v2", get(handler_index)) |
8350 | - // .route("/v2/", get(handler_index)) |
8351 | - // .layer( |
8352 | - // TraceLayer::new_for_http().make_span_with(|request: &Request<_>| { |
8353 | - // // Log the matched route's path (with placeholders not filled in). |
8354 | - // // Use request.uri() or OriginalUri if you want the real path. |
8355 | - // let matched_path = request |
8356 | - // .extensions() |
8357 | - // .get::<MatchedPath>() |
8358 | - // .map(MatchedPath::as_str); |
8359 | - // |
8360 | - // let actual_path = request.uri().path(); |
8361 | - // |
8362 | - // info_span!( |
8363 | - // "http_request", |
8364 | - // method = ?request.method(), |
8365 | - // matched_path, |
8366 | - // actual_path, |
8367 | - // some_other_field = tracing::field::Empty, |
8368 | - // ) |
8369 | - // }), // .on_request(|_request: &Request<_>, _span: &Span| { |
8370 | - // // // You can use `_span.record("some_other_field", value)` in one of these |
8371 | - // // // closures to attach a value to the initially empty field in the info_span |
8372 | - // // // created above. |
8373 | - // // }) |
8374 | - // // .on_response(|_response: &Response, _latency: Duration, _span: &Span| { |
8375 | - // // // ... |
8376 | - // // }) |
8377 | - // // .on_body_chunk(|_chunk: &Bytes, _latency: Duration, _span: &Span| { |
8378 | - // // // ... |
8379 | - // // }) |
8380 | - // // .on_eos( |
8381 | - // // |_trailers: Option<&HeaderMap>, _stream_duration: Duration, _span: &Span| { |
8382 | - // // // ... |
8383 | - // // }, |
8384 | - // // ) |
8385 | - // // .on_failure( |
8386 | - // // |_error: ServerErrorsFailureClass, _latency: Duration, _span: &Span| { |
8387 | - // // // ... |
8388 | - // // }, |
8389 | - // // ), |
8390 | - // ); |
8391 | - // |
8392 | - // // run our app with hyper, listening globally on port 3000 |
8393 | - // tracing::info!("Listening @ 0.0.0.0:3000"); |
8394 | - // let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap(); |
8395 | - // axum::serve(listener, app).await.unwrap(); |
8396 | - // } |
8397 | - // |
8398 | - // #[tokio::main] |
8399 | - // async fn main() { |
8400 | - // tracing_subscriber::registry() |
8401 | - // .with( |
8402 | - // tracing_subscriber::EnvFilter::try_from_default_env().unwrap_or_else(|_| { |
8403 | - // // axum logs rejections from built-in extractors with the `axum::rejection` |
8404 | - // // target, at `TRACE` level. `axum::rejection=trace` enables showing those events |
8405 | - // format!( |
8406 | - // "{}=debug,tower_http=debug,axum::rejection=trace", |
8407 | - // env!("CARGO_CRATE_NAME") |
8408 | - // ) |
8409 | - // .into() |
8410 | - // }), |
8411 | - // ) |
8412 | - // .with(tracing_subscriber::fmt::layer()) |
8413 | - // .init(); |
8414 | - // serve().await; |
8415 | - // } |
8416 | diff --git a/src/storage.rs b/src/storage.rs |
8417 | index 65cb4c0..e97ad41 100644 |
8418 | --- a/src/storage.rs |
8419 | +++ b/src/storage.rs |
8420 | @@ -1,21 +1,103 @@ |
8421 | + use std::{io::Error as IoError, path::PathBuf, pin::Pin}; |
8422 | + |
8423 | + use bytes::Bytes; |
8424 | + use futures::{Stream, stream::BoxStream}; |
8425 | + |
8426 | + use crate::{ |
8427 | + address::Addressable, |
8428 | + storage_fs::FileSystem, |
8429 | + }; |
8430 | + |
8431 | #[derive(thiserror::Error, Debug)] |
8432 | pub enum Error { |
8433 | + #[error("Unspecified Storage Error")] |
8434 | Unspecified, |
8435 | - IO, |
8436 | + #[error("Storage IO: {0}")] |
8437 | + Io(#[from] IoError), |
8438 | + #[error("Object Not Found")] |
8439 | NotFound, |
8440 | } |
8441 | |
8442 | - impl std::fmt::Display for Error { |
8443 | - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { |
8444 | + pub struct InnerStream { |
8445 | + stream: BoxStream<'static, Result<Bytes, std::io::Error>>, |
8446 | + } |
8447 | + |
8448 | + impl InnerStream { |
8449 | + pub fn new(stream: BoxStream<'static, Result<Bytes, std::io::Error>>) -> Self { |
8450 | + InnerStream { stream } |
8451 | + } |
8452 | + } |
8453 | + |
8454 | + impl Stream for InnerStream { |
8455 | + type Item = Result<Bytes, std::io::Error>; |
8456 | + |
8457 | + fn poll_next( |
8458 | + self: Pin<&mut Self>, |
8459 | + cx: &mut std::task::Context<'_>, |
8460 | + ) -> std::task::Poll<Option<Self::Item>> { |
8461 | + Pin::new(&mut self.get_mut().stream).poll_next(cx) |
8462 | + } |
8463 | + } |
8464 | + |
8465 | + /// The storage trait needs to be implemented for accessing objects from the |
8466 | + /// platform. This API is based on registry/storage/driver/storagedriver.go in |
8467 | + /// the distribution codebase. |
8468 | + pub trait StorageIface: Sync + Send { |
8469 | + /// List a single directory of objects |
8470 | + // async fn list(&self, addr: &Address) -> Result<Vec<Object>, Error>; |
8471 | + // async fn stat(&self, addr: &Address) -> Result<Option<Object>, Error>; |
8472 | + // async fn read_bytes(&self, addr: &Address) -> Result<Option<Vec<u8>>, Error>; |
8473 | + /// Check if an object exists at the given address |
8474 | + fn exists<A>(&self, path: &A) -> impl Future<Output = Result<bool, Error>> + Send |
8475 | + where |
8476 | + A: Addressable + Send + Sync; |
8477 | + /// Write bytes to the address, truncating any existing object |
8478 | + fn write_all<A>( |
8479 | + &self, |
8480 | + path: &A, |
8481 | + bytes: &[u8], |
8482 | + ) -> impl Future<Output = Result<(), Error>> + Send |
8483 | + where |
8484 | + A: Addressable + Send + Sync; |
8485 | + |
8486 | + /// write bytes to a file that has already been created |
8487 | + fn write<A>(&self, path: &A, bytes: &[u8]) -> impl Future<Output = Result<(), Error>> + Send |
8488 | + where |
8489 | + A: Addressable + Send + Sync; |
8490 | + |
8491 | + fn mv<A, B>(&self, src: &A, dst: &B) -> impl Future<Output = Result<(), Error>> + Send |
8492 | + where |
8493 | + A: Addressable + Send + Sync, |
8494 | + B: Addressable + Send + Sync; |
8495 | + // fn mv (&self, )std::future::Future<Output = ()> + Send |
8496 | + fn read<A>(&self, src: &A) -> impl Future<Output = Result<InnerStream, Error>> + Send |
8497 | + where |
8498 | + A: Addressable + Send + Sync; |
8499 | + |
8500 | + fn read_bytes<A>(&self, src: &A) -> impl Future<Output = Result<Bytes, Error>> + Send |
8501 | + where |
8502 | + A: Addressable + Send + Sync; |
8503 | + |
8504 | + fn delete<A>(&self, src: &A) -> impl Future<Output = Result<(), Error>> + Send |
8505 | + where |
8506 | + A: Addressable + Send + Sync; |
8507 | + } |
8508 | + |
8509 | + #[derive(Debug, Clone)] |
8510 | + pub enum Storage { |
8511 | + FileSystem { base: PathBuf }, |
8512 | + } |
8513 | + |
8514 | + impl Storage { |
8515 | + pub fn init(&self) -> Result<(), Error> { |
8516 | match self { |
8517 | - Error::Unspecified => f.write_str("An unspecified storage error occurred"), |
8518 | - Error::IO => f.write_str("A storage IO error occurred"), |
8519 | - Error::NotFound => f.write_str("Storage resource not found"), |
8520 | + Storage::FileSystem { base } => FileSystem { base: base.clone() }.init(), |
8521 | } |
8522 | } |
8523 | - } |
8524 | |
8525 | - #[async_trait::async_trait] |
8526 | - pub trait Storage: Sync + Send { |
8527 | - async fn read_tags() -> Result<Vec<String>, Error>; |
8528 | + pub fn inner(&self) -> impl StorageIface { |
8529 | + match self { |
8530 | + Storage::FileSystem { base } => FileSystem { base: base.clone() }, |
8531 | + } |
8532 | + } |
8533 | } |
8534 | diff --git a/src/storage_fs.rs b/src/storage_fs.rs |
8535 | index e69de29..6b5ec11 100644 |
8536 | --- a/src/storage_fs.rs |
8537 | +++ b/src/storage_fs.rs |
8538 | @@ -0,0 +1,137 @@ |
8539 | + use std::{ |
8540 | + io::Cursor, |
8541 | + path::{Path, PathBuf}, |
8542 | + }; |
8543 | + |
8544 | + use bytes::Bytes; |
8545 | + use futures::StreamExt; |
8546 | + use tokio::io::AsyncWriteExt; |
8547 | + |
8548 | + use crate::{ |
8549 | + address::Addressable, |
8550 | + storage::{Error, InnerStream, StorageIface}, |
8551 | + }; |
8552 | + |
8553 | + #[derive(Clone)] |
8554 | + pub struct FileSystem { |
8555 | + pub base: PathBuf, |
8556 | + } |
8557 | + |
8558 | + impl FileSystem { |
8559 | + pub fn init(&self) -> Result<(), Error> { |
8560 | + std::fs::create_dir_all(self.base.as_path())?; |
8561 | + Ok(()) |
8562 | + } |
8563 | + |
8564 | + pub async fn ensure_dir(&self, path: &Path) -> Result<(), Error> { |
8565 | + let parent = path.parent().unwrap(); |
8566 | + tokio::fs::create_dir_all(parent).await?; |
8567 | + Ok(()) |
8568 | + } |
8569 | + } |
8570 | + |
8571 | + impl StorageIface for FileSystem { |
8572 | + async fn exists<A>(&self, addr: &A) -> Result<bool, Error> |
8573 | + where |
8574 | + A: Addressable + Send + Sync, |
8575 | + { |
8576 | + let path = addr.address().as_path(&self.base); |
8577 | + if tokio::fs::try_exists(&path) |
8578 | + .await |
8579 | + .is_ok_and(|exists| exists) |
8580 | + { |
8581 | + let md = tokio::fs::metadata(path).await?; |
8582 | + if md.is_file() { Ok(true) } else { Ok(false) } |
8583 | + } else { |
8584 | + Ok(false) |
8585 | + } |
8586 | + } |
8587 | + |
8588 | + async fn write_all<A>(&self, addr: &A, bytes: &[u8]) -> Result<(), Error> |
8589 | + where |
8590 | + A: Addressable + Send + Sync, |
8591 | + { |
8592 | + let path = addr.address().as_path(&self.base); |
8593 | + self.ensure_dir(&path).await?; |
8594 | + let mut fp = tokio::fs::OpenOptions::new() |
8595 | + .create(true) |
8596 | + .truncate(true) |
8597 | + .write(true) |
8598 | + .open(&path) |
8599 | + .await?; |
8600 | + let mut cursor = Cursor::new(bytes); |
8601 | + fp.write_buf(&mut cursor).await?; |
8602 | + fp.flush().await?; |
8603 | + fp.sync_all().await?; |
8604 | + Ok(()) |
8605 | + } |
8606 | + |
8607 | + async fn write<A>(&self, addr: &A, bytes: &[u8]) -> Result<(), Error> |
8608 | + where |
8609 | + A: Addressable + Send + Sync, |
8610 | + { |
8611 | + let path = addr.address().as_path(&self.base); |
8612 | + let mut fp = tokio::fs::OpenOptions::new() |
8613 | + .create(false) |
8614 | + .truncate(false) |
8615 | + .write(true) |
8616 | + .open(path) |
8617 | + .await?; |
8618 | + let mut cursor = Cursor::new(bytes); |
8619 | + fp.write_buf(&mut cursor).await?; |
8620 | + fp.flush().await?; |
8621 | + fp.sync_all().await?; |
8622 | + Ok(()) |
8623 | + } |
8624 | + |
8625 | + async fn mv<A, B>(&self, src: &A, dst: &B) -> Result<(), Error> |
8626 | + where |
8627 | + A: Addressable + Send + Sync, |
8628 | + B: Addressable + Send + Sync, |
8629 | + { |
8630 | + let src_path = src.address().as_path(&self.base); |
8631 | + let dst_path = dst.address().as_path(&self.base); |
8632 | + self.ensure_dir(&dst_path).await?; |
8633 | + tracing::info!("mv {:?} -> {:?}", src_path, dst_path); |
8634 | + tokio::fs::rename(src_path, dst_path).await?; |
8635 | + Ok(()) |
8636 | + } |
8637 | + |
8638 | + async fn read<A>(&self, src: &A) -> Result<InnerStream, Error> |
8639 | + where |
8640 | + A: Addressable + Send + Sync, |
8641 | + { |
8642 | + let path = src.address().as_path(&self.base); |
8643 | + let fp = tokio::fs::File::open(path.as_path()) |
8644 | + .await |
8645 | + .map_err(|e| match e.kind() { |
8646 | + std::io::ErrorKind::NotFound => Error::NotFound, |
8647 | + _ => Error::Io(e), |
8648 | + })?; |
8649 | + let stream = tokio_util::io::ReaderStream::new(fp); |
8650 | + Ok(InnerStream::new(stream.boxed())) |
8651 | + } |
8652 | + |
8653 | + async fn read_bytes<A>(&self, src: &A) -> Result<Bytes, Error> |
8654 | + where |
8655 | + A: Addressable + Send + Sync, |
8656 | + { |
8657 | + let path = src.address().as_path(&self.base); |
8658 | + let payload = tokio::fs::read(path.as_path()) |
8659 | + .await |
8660 | + .map_err(|e| match e.kind() { |
8661 | + std::io::ErrorKind::NotFound => Error::NotFound, |
8662 | + _ => Error::Io(e), |
8663 | + })?; |
8664 | + Ok(Bytes::from(payload)) |
8665 | + } |
8666 | + |
8667 | + async fn delete<A>(&self, src: &A) -> Result<(), Error> |
8668 | + where |
8669 | + A: Addressable + Send + Sync |
8670 | + { |
8671 | + let path = src.address().as_path(&self.base); |
8672 | + tokio::fs::remove_file(path.as_path()).await?; |
8673 | + Ok(()) |
8674 | + } |
8675 | + } |