Skip to content

feat(server): add proxied OCI Distribution API#1042

Draft
ramizpolic wants to merge 6 commits intomainfrom
feat/oci-shim
Draft

feat(server): add proxied OCI Distribution API#1042
ramizpolic wants to merge 6 commits intomainfrom
feat/oci-shim

Conversation

@ramizpolic
Copy link
Member

@ramizpolic ramizpolic commented Mar 12, 2026

Local conformance tests bench

View conformance table stats
Test dir zot Diff (time) Diff (percent)
Content Discovery Setup Populate registry with test blob 1.80 ms 1.52 ms -277.00 µs -15.41%
Content Discovery Setup Populate registry with test layer 1.66 ms 1.09 ms -570.92 µs -34.42%
Content Discovery Setup Populate registry with test tags 26.89 ms 44.39 ms +17.50 ms +65.09%
Content Discovery Setup Populate registry with test tags (no push) 85.75 µs 78.04 µs -7.71 µs -8.99%
Content Discovery Setup References setup 38.11 ms 41.48 ms +3.36 ms +8.82%
Content Discovery Teardown Delete config blob created in tests 773.33 µs 599.00 µs -174.33 µs -22.54%
Content Discovery Teardown Delete created manifest & associated tags 7.81 ms 8.29 ms +474.54 µs +6.07%
Content Discovery Teardown Delete layer blob created in setup 661.79 µs 640.50 µs -21.29 µs -3.22%
Content Discovery Teardown References teardown 9.90 ms 5.36 ms -4.54 ms -45.87%
Content Discovery Test content discovery endpoints (listing references) GET request to existing blob should yield 200 947.71 µs 923.71 µs -24.00 µs -2.53%
Content Discovery Test content discovery endpoints (listing references) GET request to existing blob with filter should yield 200 817.12 µs 786.38 µs -30.75 µs -3.76%
Content Discovery Test content discovery endpoints (listing references) GET request to missing manifest should yield 200 881.29 µs 629.92 µs -251.38 µs -28.52%
Content Discovery Test content discovery endpoints (listing references) GET request to nonexistent blob should result in empty 200 response 744.58 µs 702.83 µs -41.75 µs -5.61%
Content Discovery Test content discovery endpoints (listing tags) GET number of tags should be limitable by n query parameter 547.38 µs 480.62 µs -66.75 µs -12.19%
Content Discovery Test content discovery endpoints (listing tags) GET request to list tags should yield 200 response and be in sorted order 645.33 µs 539.25 µs -106.08 µs -16.44%
Content Discovery Test content discovery endpoints (listing tags) GET start of tag is set by last query parameter 1.11 ms 893.33 µs -213.79 µs -19.31%
Content Management Blob delete DELETE request to blob URL should yield 202 response 1.35 ms 1.05 ms -301.58 µs -22.37%
Content Management Blob delete GET request to deleted blob URL should yield 404 response 700.50 µs 634.33 µs -66.17 µs -9.45%
Content Management Manifest delete DELETE request to manifest (digest) should yield 202 response unless already deleted 619.83 µs 966.50 µs +346.67 µs +55.93%
Content Management Manifest delete DELETE request to manifest tag should return 202, unless tag deletion is disallowed (400/405) 1.74 ms 1.14 ms -595.75 µs -34.26%
Content Management Manifest delete GET request to deleted manifest URL should yield 404 response, unless delete is disallowed 1.08 ms 510.04 µs -566.75 µs -52.63%
Content Management Manifest delete GET request to tags list should reflect manifest deletion 751.62 µs 501.00 µs -250.62 µs -33.34%
Content Management Setup Check how many tags there are before anything gets deleted 603.83 µs 805.58 µs +201.75 µs +33.41%
Content Management Setup Populate registry with test config blob 3.52 ms 3.14 ms -382.33 µs -10.86%
Content Management Setup Populate registry with test layer 1.70 ms 2.01 ms +302.29 µs +17.74%
Content Management Setup Populate registry with test tag 3.63 ms 3.73 ms +103.08 µs +2.84%
Pull Error codes 400 response body should contain OCI-conforming JSON message 410.42 µs 492.79 µs +82.38 µs +20.07%
Pull Pull blobs GET nonexistent blob should result in 404 response 812.62 µs 759.50 µs -53.13 µs -6.54%
Pull Pull blobs GET request to existing blob URL should yield 200 1.58 ms 599.12 µs -978.71 µs -62.03%
Pull Pull blobs HEAD request to existing blob should yield 200 1.01 ms 578.96 µs -435.92 µs -42.95%
Pull Pull blobs HEAD request to nonexistent blob should result in 404 response 955.71 µs 744.75 µs -210.96 µs -22.07%
Pull Pull manifests GET nonexistent manifest should return 404 389.50 µs 492.29 µs +102.79 µs +26.39%
Pull Pull manifests GET request to manifest path (tag) should yield 200 response 2.28 ms 725.58 µs -1.56 ms -68.22%
Pull Pull manifests GET request to manifest[0] path (digest) should yield 200 response 1.69 ms 1.04 ms -643.50 µs -38.14%
Pull Pull manifests GET request to manifest[1] path (digest) should yield 200 response 1.09 ms 860.62 µs -227.50 µs -20.91%
Pull Pull manifests HEAD request to manifest path (tag) should yield 200 response 622.54 µs 572.96 µs -49.58 µs -7.96%
Pull Pull manifests HEAD request to manifest[0] path (digest) should yield 200 response 859.75 µs 490.12 µs -369.63 µs -42.99%
Pull Pull manifests HEAD request to manifest[1] path (digest) should yield 200 response 650.58 µs 560.54 µs -90.04 µs -13.84%
Pull Pull manifests HEAD request to nonexistent manifest should return 404 479.42 µs 590.38 µs +110.96 µs +23.14%
Pull Setup Get tag name from environment 565.25 µs 728.38 µs +163.12 µs +28.86%
Pull Setup Populate registry with test blob 24.00 ms 22.53 ms -1.47 ms -6.14%
Pull Setup Populate registry with test layer 2.61 ms 2.05 ms -562.58 µs -21.55%
Pull Setup Populate registry with test manifest 25.04 ms 16.25 ms -8.80 ms -35.13%
Pull Teardown Delete config[0] blob created in setup 709.54 µs 645.67 µs -63.87 µs -9.00%
Pull Teardown Delete config[1] blob created in setup 652.83 µs 720.21 µs +67.37 µs +10.32%
Pull Teardown Delete layer blob created in setup 685.88 µs 599.33 µs -86.54 µs -12.62%
Pull Teardown Delete manifest[0] created in setup 1.10 ms 2.28 ms +1.18 ms +106.69%
Pull Teardown Delete manifest[1] created in setup 1.65 ms 1.36 ms -293.46 µs -17.76%
Push Blob Upload Chunked Get on stale blob upload should return 204 with a range and location 340.71 µs 477.92 µs +137.21 µs +40.27%
Push Blob Upload Chunked Out-of-order blob upload should return 416 1.14 ms 1.18 ms +45.71 µs +4.02%
Push Blob Upload Chunked PATCH request with first chunk should return 202 1.39 ms 1.08 ms -312.54 µs -22.50%
Push Blob Upload Chunked PATCH request with second chunk should return 202 596.83 µs 611.92 µs +15.08 µs +2.53%
Push Blob Upload Chunked PUT request with digest should return 201 2.09 ms 1.37 ms -713.88 µs -34.21%
Push Blob Upload Chunked Retry previous blob chunk should return 416 592.12 µs 620.96 µs +28.83 µs +4.87%
Push Blob Upload Monolithic GET nonexistent blob should result in 404 response 752.08 µs 544.58 µs -207.50 µs -27.59%
Push Blob Upload Monolithic GET request to blob URL from prior request should yield 200 or 404 based on response code 637.58 µs 491.62 µs -145.96 µs -22.89%
Push Blob Upload Monolithic GET request to existing blob should yield 200 response 591.29 µs 529.92 µs -61.38 µs -10.38%
Push Blob Upload Monolithic GET request to existing layer should yield 200 response 685.12 µs 492.71 µs -192.42 µs -28.08%
Push Blob Upload Monolithic POST request should yield a session ID 515.88 µs 509.29 µs -6.58 µs -1.28%
Push Blob Upload Monolithic POST request with digest and blob should yield a 201 or 202 1.70 ms 776.46 µs -924.92 µs -54.36%
Push Blob Upload Monolithic PUT upload of a blob should yield a 201 Response 1.11 ms 748.29 µs -365.67 µs -32.83%
Push Blob Upload Monolithic PUT upload of a layer blob should yield a 201 Response 1.70 ms 1.24 ms -459.25 µs -27.05%
Push Blob Upload Streamed PATCH request with blob in body should yield 202 response 910.12 µs 1.63 ms +720.08 µs +79.12%
Push Blob Upload Streamed PUT request to session URL with digest should yield 201 response 2.82 ms 2.53 ms -285.25 µs -10.13%
Push Cross-Repository Blob Mount Cross-mounting of a blob without the from argument should yield session id 624.42 µs 743.71 µs +119.29 µs +19.10%
Push Cross-Repository Blob Mount Cross-mounting of nonexistent blob should yield session id 284.62 µs 66.17 µs -218.46 µs -76.75%
Push Cross-Repository Blob Mount Cross-mounting without from, and automatic content discovery disabled should return a 202 447.83 µs 68.79 µs -379.04 µs -84.64%
Push Cross-Repository Blob Mount Cross-mounting without from, and automatic content discovery enabled should return a 201 48.33 µs 502.21 µs +453.87 µs +939.06%
Push Cross-Repository Blob Mount GET request to test digest within cross-mount namespace should return 200 630.25 µs 494.58 µs -135.67 µs -21.53%
Push Cross-Repository Blob Mount POST request to mount another repository's blob should return 201 or 202 2.43 ms 1.01 ms -1.42 ms -58.48%
Push Manifest Upload GET nonexistent manifest should return 404 408.83 µs 491.75 µs +82.92 µs +20.28%
Push Manifest Upload GET request to manifest URL (digest) should yield 200 response 967.58 µs 768.25 µs -199.33 µs -20.60%
Push Manifest Upload PUT should accept a manifest upload 16.92 ms 24.17 ms +7.25 ms +42.85%
Push Manifest Upload Registry should accept a manifest upload with no layers 3.30 ms 3.07 ms -228.96 µs -6.94%
Push Teardown Delete config blob created in tests 707.62 µs 464.33 µs -243.29 µs -34.38%
Push Teardown Delete layer blob created in setup 815.12 µs 603.58 µs -211.54 µs -25.95%
Push Teardown Delete manifest created in tests 2.00 ms 1.94 ms -60.25 µs -3.01%
html custom reporter 13.42 ms 13.83 ms +412.79 µs +3.08%
------ ---------- ---------- ------------- ----------------
TOTAL 239.50 ms 241.61 ms +2.10 ms +0.88%

Legend: + = dir is faster, - = dir is lagging behind zot

@github-actions github-actions bot added the size/M Denotes a PR that changes 200-999 lines label Mar 12, 2026
@github-actions
Copy link
Contributor

github-actions bot commented Mar 12, 2026

The latest Buf updates on your PR. Results from workflow Buf CI / verify-proto (pull_request).

BuildFormatLintBreakingUpdated (UTC)
✅ passed⏩ skipped⏩ skipped✅ passedMar 12, 2026, 8:36 PM

Signed-off-by: Ramiz Polic <ramiz.polic@hotmail.com>
Signed-off-by: Ramiz Polic <ramiz.polic@hotmail.com>
Signed-off-by: Ramiz Polic <ramiz.polic@hotmail.com>
Signed-off-by: Ramiz Polic <ramiz.polic@hotmail.com>
Signed-off-by: Ramiz Polic <ramiz.polic@hotmail.com>
Signed-off-by: Ramiz Polic <ramiz.polic@hotmail.com>
@ramizpolic ramizpolic changed the title feat(server): add OCI Distribution API feat(server): add proxied OCI Distribution API Mar 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/M Denotes a PR that changes 200-999 lines

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant