Commit

Author:

Hash:

Timestamp:

+3129 -441 +/-17 browse

Kevin Schoon [me@kevinschoon.com]

9b508dfd130c28eda091d1d26b3c25b0536577aa

Wed, 09 Apr 2025 13:51:50 +0000 (4 months ago)

.
1diff --git a/Cargo.toml b/Cargo.toml
2index 058c908..af0944c 100644
3--- a/Cargo.toml
4+++ b/Cargo.toml
5 @@ -4,7 +4,13 @@ version = "0.1.0"
6 edition = "2024"
7
8 [dependencies]
9- axum = { version = "0.8.3", features = ["macros", "query", "json"] }
10+ axum = { version = "0.8.3", features = ["macros", "query", "json"], optional = true }
11+ http = { version = "1.3.1", optional = true }
12+ tower = { version = "0.5.2", features = ["util"], optional = true }
13+
14+ tokio = { version = "1.44.1", features = ["fs"], optional = true }
15+ tokio-util = { version = "0.7.14", features = ["io"], optional = true }
16+
17 oci-spec = "0.7.1"
18 serde = "1.0.219"
19 serde_json = "1.0.140"
20 @@ -12,14 +18,10 @@ async-trait = "0.1.88"
21 regex = "1.11.1"
22 tracing = { version = "0.1.41", features = ["log"] }
23 thiserror = "2.0.12"
24- tokio = { version = "1.44.1", features = ["fs"], optional = true }
25 futures = "0.3.31"
26 uuid = { version = "1.16.0", features = ["v4"] }
27- http = "1.3.1"
28- tower = { version = "0.5.2", features = ["util"] }
29 bytes = "1.10.1"
30 relative-path = "1.9.3"
31- tokio-util = { version = "0.7.14", features = ["io"] }
32
33 [dev-dependencies]
34 tokio = { version = "1.44.1", features = ["full"] }
35 @@ -29,11 +31,23 @@ tracing-subscriber = "0.3.19"
36 [features]
37 default = []
38
39+ axum-router = [
40+ "axum",
41+ "http",
42+ "tower"
43+ ]
44+
45 storage-fs = [
46- "tokio"
47+ "tokio",
48+ "tokio-util"
49 ]
50
51 [[example]]
52 name = "server"
53 path = "examples/server.rs"
54+ required-features = ["axum-router", "storage-fs"]
55+
56+ [[example]]
57+ name = "custom"
58+ path = "examples/custom.rs"
59 required-features = ["storage-fs"]
60 diff --git a/examples/custom.rs b/examples/custom.rs
61new file mode 100644
62index 0000000..18fa445
63--- /dev/null
64+++ b/examples/custom.rs
65 @@ -0,0 +1,14 @@
66+ use std::{error::Error, path::Path};
67+
68+ use papyri::{oci_interface::OciInterface, storage};
69+
70+ #[tokio::main]
71+ async fn main() -> Result<(), Box<dyn Error>> {
72+ let fs = storage::Storage::FileSystem {
73+ base: Path::new("registry").to_path_buf(),
74+ };
75+ fs.init()?;
76+ let oci_interface = OciInterface {storage: fs};
77+ let blob = oci_interface.new_blob();
78+ Ok(())
79+ }
80 diff --git a/examples/server.rs b/examples/server.rs
81index 184692e..118c051 100644
82--- a/examples/server.rs
83+++ b/examples/server.rs
84 @@ -1,16 +1,6 @@
85- use std::{
86- error::Error,
87- path::{Path, PathBuf},
88- str::FromStr,
89- sync::Arc,
90- };
91-
92- use axum::{
93- Router, ServiceExt,
94- extract::Request,
95- middleware::{self, Next},
96- response::Response,
97- };
98+ use std::{error::Error, path::Path, str::FromStr};
99+
100+ use axum::{Router, extract::Request};
101 use papyri::storage::Storage;
102 use tower::Layer;
103 use tower_http::{normalize_path::NormalizePathLayer, trace::TraceLayer};
104 @@ -29,13 +19,14 @@ async fn main() -> Result<(), Box<dyn Error>> {
105 let listener = tokio::net::TcpListener::bind(ADDRESS).await?;
106 tracing::info!("listening @ {}", ADDRESS);
107
108-
109- let fs = Storage::FileSystem{ base: Path::new("registry").to_path_buf() };
110+ let fs = Storage::FileSystem {
111+ base: Path::new("registry").to_path_buf(),
112+ };
113 fs.init()?;
114
115 // Registry middleware must be wrapped with namespace extraction/rewrite.
116- let registry = papyri::routes::router(&fs);
117- let middleware = tower::util::MapRequestLayer::new(papyri::routes::extract_namespace);
118+ let registry = papyri::axum::router(&fs);
119+ let middleware = tower::util::MapRequestLayer::new(papyri::axum::extract_namespace);
120
121 let router =
122 Router::new()
123 diff --git a/results/junit.xml b/results/junit.xml
124new file mode 100644
125index 0000000..43b9bd6
126--- /dev/null
127+++ b/results/junit.xml
128 @@ -0,0 +1,330 @@
129+ <?xml version="1.0" encoding="UTF-8"?>
130+ <testsuites tests="80" disabled="56" errors="0" failures="10" time="0.031466247">
131+ <testsuite name="conformance tests" package="/results" tests="80" disabled="0" skipped="56" errors="0" failures="10" time="0.031466247" timestamp="2025-04-09T13:51:31">
132+ <properties>
133+ <property name="SuiteSucceeded" value="false"></property>
134+ <property name="SuiteHasProgrammaticFocus" value="false"></property>
135+ <property name="SpecialSuiteFailureReason" value=""></property>
136+ <property name="SuiteLabels" value="[]"></property>
137+ <property name="RandomSeed" value="1744206691"></property>
138+ <property name="RandomizeAllSpecs" value="false"></property>
139+ <property name="LabelFilter" value=""></property>
140+ <property name="FocusStrings" value=""></property>
141+ <property name="SkipStrings" value=""></property>
142+ <property name="FocusFiles" value=""></property>
143+ <property name="SkipFiles" value=""></property>
144+ <property name="FailOnPending" value="false"></property>
145+ <property name="FailFast" value="false"></property>
146+ <property name="FlakeAttempts" value="0"></property>
147+ <property name="DryRun" value="false"></property>
148+ <property name="ParallelTotal" value="1"></property>
149+ <property name="OutputInterceptorMode" value=""></property>
150+ </properties>
151+ <testcase name="OCI Distribution Conformance Tests Pull Setup Populate registry with test blob" classname="conformance tests" status="passed" time="0.002647825">
152+ <system-err>&gt; Enter [It] Populate registry with test blob - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:18 @ 04/09/25 13:51:31.414&#xA;&lt; Exit [It] Populate registry with test blob - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:18 @ 04/09/25 13:51:31.416 (3ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.416&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.416 (0s)&#xA;</system-err>
153+ </testcase>
154+ <testcase name="OCI Distribution Conformance Tests Pull Setup Populate registry with test blob" classname="conformance tests" status="passed" time="0.001591635">
155+ <system-err>&gt; Enter [It] Populate registry with test blob - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:36 @ 04/09/25 13:51:31.416&#xA;&lt; Exit [It] Populate registry with test blob - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:36 @ 04/09/25 13:51:31.418 (2ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.418&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.418 (0s)&#xA;</system-err>
156+ </testcase>
157+ <testcase name="OCI Distribution Conformance Tests Pull Setup Populate registry with test layer" classname="conformance tests" status="passed" time="0.001476086">
158+ <system-err>&gt; Enter [It] Populate registry with test layer - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:54 @ 04/09/25 13:51:31.418&#xA;&lt; Exit [It] Populate registry with test layer - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:54 @ 04/09/25 13:51:31.419 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.419&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.419 (0s)&#xA;</system-err>
159+ </testcase>
160+ <testcase name="OCI Distribution Conformance Tests Pull Setup Populate registry with test manifest" classname="conformance tests" status="passed" time="0.001391199">
161+ <system-err>&gt; Enter [It] Populate registry with test manifest - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:72 @ 04/09/25 13:51:31.419&#xA;&lt; Exit [It] Populate registry with test manifest - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:72 @ 04/09/25 13:51:31.421 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.421&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.421 (0s)&#xA;</system-err>
162+ </testcase>
163+ <testcase name="OCI Distribution Conformance Tests Pull Setup Populate registry with test manifest" classname="conformance tests" status="passed" time="0.001454818">
164+ <system-err>&gt; Enter [It] Populate registry with test manifest - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:87 @ 04/09/25 13:51:31.421&#xA;&lt; Exit [It] Populate registry with test manifest - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:87 @ 04/09/25 13:51:31.422 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.422&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.422 (0s)&#xA;</system-err>
165+ </testcase>
166+ <testcase name="OCI Distribution Conformance Tests Pull Setup Get tag name from environment" classname="conformance tests" status="skipped" time="9.5408e-05">
167+ <skipped message="skipped - you have skipped this test."></skipped>
168+ <system-err>&gt; Enter [It] Get tag name from environment - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:101 @ 04/09/25 13:51:31.422&#xA;[SKIPPED] you have skipped this test.&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:591 @ 04/09/25 13:51:31.422&#xA;&lt; Exit [It] Get tag name from environment - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:101 @ 04/09/25 13:51:31.422 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.422&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.422 (0s)&#xA;</system-err>
169+ </testcase>
170+ <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.00077957">
171+ <system-err>&gt; 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/09/25 13:51:31.422&#xA;&lt; 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/09/25 13:51:31.423 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.423&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.423 (0s)&#xA;</system-err>
172+ </testcase>
173+ <testcase name="OCI Distribution Conformance Tests Pull Pull blobs HEAD request to existing blob should yield 200" classname="conformance tests" status="passed" time="0.000831756">
174+ <system-err>&gt; Enter [It] HEAD request to existing blob should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:121 @ 04/09/25 13:51:31.423&#xA;&lt; Exit [It] HEAD request to existing blob should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:121 @ 04/09/25 13:51:31.424 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.424&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.424 (0s)&#xA;</system-err>
175+ </testcase>
176+ <testcase name="OCI Distribution Conformance Tests Pull Pull blobs GET nonexistent blob should result in 404 response" classname="conformance tests" status="failed" time="0.001857332">
177+ <failure message="Expected&#xA; &lt;*url.Error | 0xc0000ae7b0&gt;: &#xA; Get &#34;http://localhost:8700/v2/myorg/myrepo/a/blobs/sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9&#34;: EOF&#xA; {&#xA; Op: &#34;Get&#34;,&#xA; URL: &#34;http://localhost:8700/v2/myorg/myrepo/a/blobs/sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9&#34;,&#xA; Err: &lt;*errors.errorString | 0xc0001120f0&gt;{s: &#34;EOF&#34;},&#xA; }&#xA;to be nil" type="failed">[FAILED] Expected&#xA; &lt;*url.Error | 0xc0000ae7b0&gt;: &#xA; Get &#34;http://localhost:8700/v2/myorg/myrepo/a/blobs/sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9&#34;: EOF&#xA; {&#xA; Op: &#34;Get&#34;,&#xA; URL: &#34;http://localhost:8700/v2/myorg/myrepo/a/blobs/sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9&#34;,&#xA; Err: &lt;*errors.errorString | 0xc0001120f0&gt;{s: &#34;EOF&#34;},&#xA; }&#xA;to be nil&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:138 @ 04/09/25 13:51:31.426&#xA;</failure>
178+ <system-err>&gt; Enter [It] GET nonexistent blob should result in 404 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:133 @ 04/09/25 13:51:31.424&#xA;[FAILED] Expected&#xA; &lt;*url.Error | 0xc0000ae7b0&gt;: &#xA; Get &#34;http://localhost:8700/v2/myorg/myrepo/a/blobs/sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9&#34;: EOF&#xA; {&#xA; Op: &#34;Get&#34;,&#xA; URL: &#34;http://localhost:8700/v2/myorg/myrepo/a/blobs/sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9&#34;,&#xA; Err: &lt;*errors.errorString | 0xc0001120f0&gt;{s: &#34;EOF&#34;},&#xA; }&#xA;to be nil&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:138 @ 04/09/25 13:51:31.426&#xA;&lt; Exit [It] GET nonexistent blob should result in 404 response - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:133 @ 04/09/25 13:51:31.426 (2ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.426&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.426 (0s)&#xA;</system-err>
179+ </testcase>
180+ <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.001366974">
181+ <system-err>&gt; 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/09/25 13:51:31.426&#xA;&lt; 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/09/25 13:51:31.427 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.427&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.427 (0s)&#xA;</system-err>
182+ </testcase>
183+ <testcase name="OCI Distribution Conformance Tests Pull Pull manifests HEAD request to nonexistent manifest should return 404" classname="conformance tests" status="failed" time="0.000858373">
184+ <failure message="Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 404" type="failed">[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 404&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:158 @ 04/09/25 13:51:31.428&#xA;</failure>
185+ <system-err>&gt; Enter [It] HEAD request to nonexistent manifest should return 404 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:152 @ 04/09/25 13:51:31.427&#xA;[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 404&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:158 @ 04/09/25 13:51:31.428&#xA;&lt; Exit [It] HEAD request to nonexistent manifest should return 404 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:152 @ 04/09/25 13:51:31.428 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.428&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.428 (0s)&#xA;</system-err>
186+ </testcase>
187+ <testcase name="OCI Distribution Conformance Tests Pull Pull manifests HEAD request to manifest[0] path (digest) should yield 200 response" classname="conformance tests" status="failed" time="0.000843179">
188+ <failure message="Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200" type="failed">[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:167 @ 04/09/25 13:51:31.429&#xA;</failure>
189+ <system-err>&gt; 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/09/25 13:51:31.428&#xA;[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:167 @ 04/09/25 13:51:31.429&#xA;&lt; 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/09/25 13:51:31.429 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.429&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.429 (0s)&#xA;</system-err>
190+ </testcase>
191+ <testcase name="OCI Distribution Conformance Tests Pull Pull manifests HEAD request to manifest[1] path (digest) should yield 200 response" classname="conformance tests" status="failed" time="0.000829146">
192+ <failure message="Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200" type="failed">[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:179 @ 04/09/25 13:51:31.43&#xA;</failure>
193+ <system-err>&gt; 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/09/25 13:51:31.429&#xA;[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:179 @ 04/09/25 13:51:31.43&#xA;&lt; 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/09/25 13:51:31.43 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.43&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.43 (0s)&#xA;</system-err>
194+ </testcase>
195+ <testcase name="OCI Distribution Conformance Tests Pull Pull manifests HEAD request to manifest path (tag) should yield 200 response" classname="conformance tests" status="failed" time="0.00083691">
196+ <failure message="Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200" type="failed">[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:192 @ 04/09/25 13:51:31.431&#xA;</failure>
197+ <system-err>&gt; 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/09/25 13:51:31.43&#xA;[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:192 @ 04/09/25 13:51:31.431&#xA;&lt; 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/09/25 13:51:31.431 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.431&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.431 (0s)&#xA;</system-err>
198+ </testcase>
199+ <testcase name="OCI Distribution Conformance Tests Pull Pull manifests GET nonexistent manifest should return 404" classname="conformance tests" status="failed" time="0.000809984">
200+ <failure message="Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 404" type="failed">[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 404&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:204 @ 04/09/25 13:51:31.432&#xA;</failure>
201+ <system-err>&gt; Enter [It] GET nonexistent manifest should return 404 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:198 @ 04/09/25 13:51:31.431&#xA;[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 404&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:204 @ 04/09/25 13:51:31.432&#xA;&lt; Exit [It] GET nonexistent manifest should return 404 - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:198 @ 04/09/25 13:51:31.432 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.432&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.432 (0s)&#xA;</system-err>
202+ </testcase>
203+ <testcase name="OCI Distribution Conformance Tests Pull Pull manifests GET request to manifest[0] path (digest) should yield 200 response" classname="conformance tests" status="failed" time="0.000820741">
204+ <failure message="Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200" type="failed">[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:213 @ 04/09/25 13:51:31.433&#xA;</failure>
205+ <system-err>&gt; 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/09/25 13:51:31.432&#xA;[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:213 @ 04/09/25 13:51:31.433&#xA;&lt; 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/09/25 13:51:31.433 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.433&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.433 (0s)&#xA;</system-err>
206+ </testcase>
207+ <testcase name="OCI Distribution Conformance Tests Pull Pull manifests GET request to manifest[1] path (digest) should yield 200 response" classname="conformance tests" status="failed" time="0.000815015">
208+ <failure message="Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200" type="failed">[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:222 @ 04/09/25 13:51:31.434&#xA;</failure>
209+ <system-err>&gt; 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/09/25 13:51:31.433&#xA;[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:222 @ 04/09/25 13:51:31.434&#xA;&lt; 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/09/25 13:51:31.434 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.434&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.434 (0s)&#xA;</system-err>
210+ </testcase>
211+ <testcase name="OCI Distribution Conformance Tests Pull Pull manifests GET request to manifest path (tag) should yield 200 response" classname="conformance tests" status="failed" time="0.000842778">
212+ <failure message="Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200" type="failed">[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:232 @ 04/09/25 13:51:31.434&#xA;</failure>
213+ <system-err>&gt; 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/09/25 13:51:31.434&#xA;[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;to equal&#xA; &lt;int&gt;: 200&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:232 @ 04/09/25 13:51:31.434&#xA;&lt; 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/09/25 13:51:31.434 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.434&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.434 (0s)&#xA;</system-err>
214+ </testcase>
215+ <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.000821476">
216+ <failure message="Expected&#xA; &lt;int&gt;: 405&#xA;To satisfy at least one of these matchers: [%!s(*matchers.EqualMatcher=&amp;{400}) %!s(*matchers.EqualMatcher=&amp;{404})]" type="failed">[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;To satisfy at least one of these matchers: [%!s(*matchers.EqualMatcher=&amp;{400}) %!s(*matchers.EqualMatcher=&amp;{404})]&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:245 @ 04/09/25 13:51:31.435&#xA;</failure>
217+ <system-err>&gt; 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/09/25 13:51:31.434&#xA;[FAILED] Expected&#xA; &lt;int&gt;: 405&#xA;To satisfy at least one of these matchers: [%!s(*matchers.EqualMatcher=&amp;{400}) %!s(*matchers.EqualMatcher=&amp;{404})]&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:245 @ 04/09/25 13:51:31.435&#xA;&lt; 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/09/25 13:51:31.435 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.435&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.435 (0s)&#xA;</system-err>
218+ </testcase>
219+ <testcase name="OCI Distribution Conformance Tests Pull Teardown Delete config[0] blob created in setup" classname="conformance tests" status="passed" time="0.000718441">
220+ <system-err>&gt; Enter [It] Delete config[0] blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:290 @ 04/09/25 13:51:31.435&#xA;&lt; Exit [It] Delete config[0] blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:290 @ 04/09/25 13:51:31.436 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.436&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.436 (0s)&#xA;</system-err>
221+ </testcase>
222+ <testcase name="OCI Distribution Conformance Tests Pull Teardown Delete config[1] blob created in setup" classname="conformance tests" status="passed" time="0.000717725">
223+ <system-err>&gt; Enter [It] Delete config[1] blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:305 @ 04/09/25 13:51:31.436&#xA;&lt; Exit [It] Delete config[1] blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:305 @ 04/09/25 13:51:31.437 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.437&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.437 (0s)&#xA;</system-err>
224+ </testcase>
225+ <testcase name="OCI Distribution Conformance Tests Pull Teardown Delete layer blob created in setup" classname="conformance tests" status="passed" time="0.000738939">
226+ <system-err>&gt; Enter [It] Delete layer blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:321 @ 04/09/25 13:51:31.437&#xA;&lt; Exit [It] Delete layer blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:321 @ 04/09/25 13:51:31.438 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.438&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.438 (0s)&#xA;</system-err>
227+ </testcase>
228+ <testcase name="OCI Distribution Conformance Tests Pull Teardown Delete manifest[0] created in setup" classname="conformance tests" status="passed" time="0.000728846">
229+ <system-err>&gt; Enter [It] Delete manifest[0] created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:338 @ 04/09/25 13:51:31.438&#xA;&lt; Exit [It] Delete manifest[0] created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:338 @ 04/09/25 13:51:31.438 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.438&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.438 (0s)&#xA;</system-err>
230+ </testcase>
231+ <testcase name="OCI Distribution Conformance Tests Pull Teardown Delete manifest[1] created in setup" classname="conformance tests" status="passed" time="0.000719764">
232+ <system-err>&gt; Enter [It] Delete manifest[1] created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:352 @ 04/09/25 13:51:31.438&#xA;&lt; Exit [It] Delete manifest[1] created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/01_pull_test.go:352 @ 04/09/25 13:51:31.439 (1ms)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.439&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.439 (0s)&#xA;</system-err>
233+ </testcase>
234+ <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="8.1503e-05">
235+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
236+ <system-err>&gt; 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/09/25 13:51:31.439&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.439&#xA;&lt; 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/09/25 13:51:31.439 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.439&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.439 (0s)&#xA;</system-err>
237+ </testcase>
238+ <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="7.2019e-05">
239+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
240+ <system-err>&gt; 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/09/25 13:51:31.439&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.439&#xA;&lt; 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/09/25 13:51:31.439 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.439&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.439 (0s)&#xA;</system-err>
241+ </testcase>
242+ <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.2584e-05">
243+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
244+ <system-err>&gt; Enter [It] GET nonexistent blob should result in 404 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:58 @ 04/09/25 13:51:31.439&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.439&#xA;&lt; Exit [It] GET nonexistent blob should result in 404 response - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:58 @ 04/09/25 13:51:31.439 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.439&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.439 (0s)&#xA;</system-err>
245+ </testcase>
246+ <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="0.000148154">
247+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
248+ <system-err>&gt; 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/09/25 13:51:31.439&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.439&#xA;&lt; 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/09/25 13:51:31.439 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.439&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44 (0s)&#xA;</system-err>
249+ </testcase>
250+ <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="0.000114055">
251+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
252+ <system-err>&gt; 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/09/25 13:51:31.44&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.44&#xA;&lt; 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/09/25 13:51:31.44 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44 (0s)&#xA;</system-err>
253+ </testcase>
254+ <testcase name="OCI Distribution Conformance Tests Push Blob Upload Monolithic POST request should yield a session ID" classname="conformance tests" status="skipped" time="7.8049e-05">
255+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
256+ <system-err>&gt; Enter [It] POST request should yield a session ID - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:98 @ 04/09/25 13:51:31.44&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.44&#xA;&lt; Exit [It] POST request should yield a session ID - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:98 @ 04/09/25 13:51:31.44 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44 (0s)&#xA;</system-err>
257+ </testcase>
258+ <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="8.3338e-05">
259+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
260+ <system-err>&gt; 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/09/25 13:51:31.44&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.44&#xA;&lt; 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/09/25 13:51:31.44 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44 (0s)&#xA;</system-err>
261+ </testcase>
262+ <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.6252e-05">
263+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;"></skipped>
264+ <system-err>&gt; 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/09/25 13:51:31.44&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.44&#xA;&lt; 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/09/25 13:51:31.44 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44 (0s)&#xA;</system-err>
265+ </testcase>
266+ <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="7.4107e-05">
267+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
268+ <system-err>&gt; 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/09/25 13:51:31.44&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.44&#xA;&lt; 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/09/25 13:51:31.44 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44 (0s)&#xA;</system-err>
269+ </testcase>
270+ <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="7.3632e-05">
271+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;"></skipped>
272+ <system-err>&gt; 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/09/25 13:51:31.44&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.44&#xA;&lt; 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/09/25 13:51:31.44 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44 (0s)&#xA;</system-err>
273+ </testcase>
274+ <testcase name="OCI Distribution Conformance Tests Push Blob Upload Chunked Out-of-order blob upload should return 416" classname="conformance tests" status="skipped" time="9.0273e-05">
275+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;"></skipped>
276+ <system-err>&gt; Enter [It] Out-of-order blob upload should return 416 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:156 @ 04/09/25 13:51:31.44&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.44&#xA;&lt; Exit [It] Out-of-order blob upload should return 416 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:156 @ 04/09/25 13:51:31.44 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44 (0s)&#xA;</system-err>
277+ </testcase>
278+ <testcase name="OCI Distribution Conformance Tests Push Blob Upload Chunked PATCH request with first chunk should return 202" classname="conformance tests" status="skipped" time="8.7631e-05">
279+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;"></skipped>
280+ <system-err>&gt; Enter [It] PATCH request with first chunk should return 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:185 @ 04/09/25 13:51:31.44&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.44&#xA;&lt; Exit [It] PATCH request with first chunk should return 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:185 @ 04/09/25 13:51:31.44 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.44 (0s)&#xA;</system-err>
281+ </testcase>
282+ <testcase name="OCI Distribution Conformance Tests Push Blob Upload Chunked Retry previous blob chunk should return 416" classname="conformance tests" status="skipped" time="7.5939e-05">
283+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
284+ <system-err>&gt; Enter [It] Retry previous blob chunk should return 416 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:206 @ 04/09/25 13:51:31.44&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.441&#xA;&lt; Exit [It] Retry previous blob chunk should return 416 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:206 @ 04/09/25 13:51:31.441 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441 (0s)&#xA;</system-err>
285+ </testcase>
286+ <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="6.8961e-05">
287+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
288+ <system-err>&gt; 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/09/25 13:51:31.441&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.441&#xA;&lt; 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/09/25 13:51:31.441 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441 (0s)&#xA;</system-err>
289+ </testcase>
290+ <testcase name="OCI Distribution Conformance Tests Push Blob Upload Chunked PATCH request with second chunk should return 202" classname="conformance tests" status="skipped" time="8.0487e-05">
291+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;"></skipped>
292+ <system-err>&gt; Enter [It] PATCH request with second chunk should return 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:229 @ 04/09/25 13:51:31.441&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.441&#xA;&lt; Exit [It] PATCH request with second chunk should return 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:229 @ 04/09/25 13:51:31.441 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441 (0s)&#xA;</system-err>
293+ </testcase>
294+ <testcase name="OCI Distribution Conformance Tests Push Blob Upload Chunked PUT request with digest should return 201" classname="conformance tests" status="skipped" time="7.9952e-05">
295+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;"></skipped>
296+ <system-err>&gt; Enter [It] PUT request with digest should return 201 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:244 @ 04/09/25 13:51:31.441&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.441&#xA;&lt; Exit [It] PUT request with digest should return 201 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:244 @ 04/09/25 13:51:31.441 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441 (0s)&#xA;</system-err>
297+ </testcase>
298+ <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.8501e-05">
299+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;"></skipped>
300+ <system-err>&gt; 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/09/25 13:51:31.441&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.441&#xA;&lt; 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/09/25 13:51:31.441 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441 (0s)&#xA;</system-err>
301+ </testcase>
302+ <testcase name="OCI Distribution Conformance Tests Push Cross-Repository Blob Mount POST request to mount another repository&#39;s blob should return 201 or 202" classname="conformance tests" status="skipped" time="7.9945e-05">
303+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;"></skipped>
304+ <system-err>&gt; Enter [It] POST request to mount another repository&#39;s blob should return 201 or 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:270 @ 04/09/25 13:51:31.441&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.441&#xA;&lt; Exit [It] POST request to mount another repository&#39;s blob should return 201 or 202 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:270 @ 04/09/25 13:51:31.441 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441 (0s)&#xA;</system-err>
305+ </testcase>
306+ <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.7288e-05">
307+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;"></skipped>
308+ <system-err>&gt; 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/09/25 13:51:31.441&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.441&#xA;&lt; 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/09/25 13:51:31.441 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441 (0s)&#xA;</system-err>
309+ </testcase>
310+ <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="8.8497e-05">
311+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
312+ <system-err>&gt; 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/09/25 13:51:31.441&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.441&#xA;&lt; 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/09/25 13:51:31.441 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441 (0s)&#xA;</system-err>
313+ </testcase>
314+ <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.5339e-05">
315+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
316+ <system-err>&gt; 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/09/25 13:51:31.441&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.441&#xA;&lt; 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/09/25 13:51:31.441 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.441 (0s)&#xA;</system-err>
317+ </testcase>
318+ <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.2383e-05">
319+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
320+ <system-err>&gt; 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/09/25 13:51:31.441&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.442&#xA;&lt; 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/09/25 13:51:31.442 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442 (0s)&#xA;</system-err>
321+ </testcase>
322+ <testcase name="OCI Distribution Conformance Tests Push Manifest Upload GET nonexistent manifest should return 404" classname="conformance tests" status="skipped" time="7.6576e-05">
323+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
324+ <system-err>&gt; Enter [It] GET nonexistent manifest should return 404 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:329 @ 04/09/25 13:51:31.442&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [It] GET nonexistent manifest should return 404 - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:329 @ 04/09/25 13:51:31.442 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442 (0s)&#xA;</system-err>
325+ </testcase>
326+ <testcase name="OCI Distribution Conformance Tests Push Manifest Upload PUT should accept a manifest upload" classname="conformance tests" status="skipped" time="7.4054e-05">
327+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;"></skipped>
328+ <system-err>&gt; Enter [It] PUT should accept a manifest upload - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:338 @ 04/09/25 13:51:31.442&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [It] PUT should accept a manifest upload - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:338 @ 04/09/25 13:51:31.442 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442 (0s)&#xA;</system-err>
329+ </testcase>
330+ <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.606e-05">
331+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;"></skipped>
332+ <system-err>&gt; 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/09/25 13:51:31.442&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.442&#xA;&lt; 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/09/25 13:51:31.442 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442 (0s)&#xA;</system-err>
333+ </testcase>
334+ <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="8.2993e-05">
335+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
336+ <system-err>&gt; 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/09/25 13:51:31.442&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.442&#xA;&lt; 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/09/25 13:51:31.442 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442 (0s)&#xA;</system-err>
337+ </testcase>
338+ <testcase name="OCI Distribution Conformance Tests Push Teardown Delete config blob created in tests" classname="conformance tests" status="skipped" time="7.8505e-05">
339+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;"></skipped>
340+ <system-err>&gt; Enter [It] Delete config blob created in tests - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:412 @ 04/09/25 13:51:31.442&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [It] Delete config blob created in tests - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:412 @ 04/09/25 13:51:31.442 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442 (0s)&#xA;</system-err>
341+ </testcase>
342+ <testcase name="OCI Distribution Conformance Tests Push Teardown Delete layer blob created in setup" classname="conformance tests" status="skipped" time="9.7438e-05">
343+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;"></skipped>
344+ <system-err>&gt; Enter [It] Delete layer blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:428 @ 04/09/25 13:51:31.442&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [It] Delete layer blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:428 @ 04/09/25 13:51:31.442 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442 (0s)&#xA;</system-err>
345+ </testcase>
346+ <testcase name="OCI Distribution Conformance Tests Push Teardown Delete manifest created in tests" classname="conformance tests" status="skipped" time="7.6473e-05">
347+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;"></skipped>
348+ <system-err>&gt; Enter [It] Delete manifest created in tests - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:445 @ 04/09/25 13:51:31.442&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [It] Delete manifest created in tests - /go/src/github.com/opencontainers/distribution-spec/conformance/02_push_test.go:445 @ 04/09/25 13:51:31.442 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442 (0s)&#xA;</system-err>
349+ </testcase>
350+ <testcase name="OCI Distribution Conformance Tests Content Discovery Setup Populate registry with test blob" classname="conformance tests" status="skipped" time="8.0715e-05">
351+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
352+ <system-err>&gt; Enter [It] Populate registry with test blob - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:24 @ 04/09/25 13:51:31.442&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [It] Populate registry with test blob - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:24 @ 04/09/25 13:51:31.442 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442 (0s)&#xA;</system-err>
353+ </testcase>
354+ <testcase name="OCI Distribution Conformance Tests Content Discovery Setup Populate registry with test layer" classname="conformance tests" status="skipped" time="7.3825e-05">
355+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
356+ <system-err>&gt; Enter [It] Populate registry with test layer - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:42 @ 04/09/25 13:51:31.442&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [It] Populate registry with test layer - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:42 @ 04/09/25 13:51:31.442 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.442 (0s)&#xA;</system-err>
357+ </testcase>
358+ <testcase name="OCI Distribution Conformance Tests Content Discovery Setup Populate registry with test tags" classname="conformance tests" status="skipped" time="7.6405e-05">
359+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
360+ <system-err>&gt; Enter [It] Populate registry with test tags - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:60 @ 04/09/25 13:51:31.443&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [It] Populate registry with test tags - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:60 @ 04/09/25 13:51:31.443 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443 (0s)&#xA;</system-err>
361+ </testcase>
362+ <testcase name="OCI Distribution Conformance Tests Content Discovery Setup Populate registry with test tags (no push)" classname="conformance tests" status="skipped" time="7.8168e-05">
363+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
364+ <system-err>&gt; Enter [It] Populate registry with test tags (no push) - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:82 @ 04/09/25 13:51:31.443&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [It] Populate registry with test tags (no push) - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:82 @ 04/09/25 13:51:31.443 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443 (0s)&#xA;</system-err>
365+ </testcase>
366+ <testcase name="OCI Distribution Conformance Tests Content Discovery Setup References setup" classname="conformance tests" status="skipped" time="7.2792e-05">
367+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
368+ <system-err>&gt; Enter [It] References setup - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:88 @ 04/09/25 13:51:31.443&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [It] References setup - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:88 @ 04/09/25 13:51:31.443 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443 (0s)&#xA;</system-err>
369+ </testcase>
370+ <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="8.1202e-05">
371+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
372+ <system-err>&gt; 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/09/25 13:51:31.443&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.443&#xA;&lt; 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/09/25 13:51:31.443 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443 (0s)&#xA;</system-err>
373+ </testcase>
374+ <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="8.393e-05">
375+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
376+ <system-err>&gt; 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/09/25 13:51:31.443&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.443&#xA;&lt; 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/09/25 13:51:31.443 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443 (0s)&#xA;</system-err>
377+ </testcase>
378+ <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="7.3976e-05">
379+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
380+ <system-err>&gt; 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/09/25 13:51:31.443&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.443&#xA;&lt; 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/09/25 13:51:31.443 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443 (0s)&#xA;</system-err>
381+ </testcase>
382+ <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="8.1411e-05">
383+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;"></skipped>
384+ <system-err>&gt; 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/09/25 13:51:31.443&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.443&#xA;&lt; 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/09/25 13:51:31.443 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443 (0s)&#xA;</system-err>
385+ </testcase>
386+ <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.4514e-05">
387+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;"></skipped>
388+ <system-err>&gt; Enter [It] GET request to existing blob should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:315 @ 04/09/25 13:51:31.443&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [It] GET request to existing blob should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:315 @ 04/09/25 13:51:31.443 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443 (0s)&#xA;</system-err>
389+ </testcase>
390+ <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="8.6116e-05">
391+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
392+ <system-err>&gt; 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/09/25 13:51:31.443&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.443&#xA;&lt; 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/09/25 13:51:31.443 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443 (0s)&#xA;</system-err>
393+ </testcase>
394+ <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="9.3264e-05">
395+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
396+ <system-err>&gt; Enter [It] GET request to missing manifest should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:367 @ 04/09/25 13:51:31.443&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [It] GET request to missing manifest should yield 200 - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:367 @ 04/09/25 13:51:31.443 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.443 (0s)&#xA;</system-err>
397+ </testcase>
398+ <testcase name="OCI Distribution Conformance Tests Content Discovery Teardown Delete config blob created in tests" classname="conformance tests" status="skipped" time="7.3348e-05">
399+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
400+ <system-err>&gt; Enter [It] Delete config blob created in tests - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:415 @ 04/09/25 13:51:31.444&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [It] Delete config blob created in tests - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:415 @ 04/09/25 13:51:31.444 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444 (0s)&#xA;</system-err>
401+ </testcase>
402+ <testcase name="OCI Distribution Conformance Tests Content Discovery Teardown Delete layer blob created in setup" classname="conformance tests" status="skipped" time="7.7941e-05">
403+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
404+ <system-err>&gt; Enter [It] Delete layer blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:431 @ 04/09/25 13:51:31.444&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [It] Delete layer blob created in setup - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:431 @ 04/09/25 13:51:31.444 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444 (0s)&#xA;</system-err>
405+ </testcase>
406+ <testcase name="OCI Distribution Conformance Tests Content Discovery Teardown Delete created manifest &amp; associated tags" classname="conformance tests" status="skipped" time="8.0591e-05">
407+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;"></skipped>
408+ <system-err>&gt; Enter [It] Delete created manifest &amp; associated tags - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:448 @ 04/09/25 13:51:31.444&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [It] Delete created manifest &amp; associated tags - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:448 @ 04/09/25 13:51:31.444 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444 (0s)&#xA;</system-err>
409+ </testcase>
410+ <testcase name="OCI Distribution Conformance Tests Content Discovery Teardown References teardown" classname="conformance tests" status="skipped" time="8.345e-05">
411+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
412+ <system-err>&gt; Enter [It] References teardown - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:477 @ 04/09/25 13:51:31.444&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [It] References teardown - /go/src/github.com/opencontainers/distribution-spec/conformance/03_discovery_test.go:477 @ 04/09/25 13:51:31.444 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444 (0s)&#xA;</system-err>
413+ </testcase>
414+ <testcase name="OCI Distribution Conformance Tests Content Management Setup Populate registry with test config blob" classname="conformance tests" status="skipped" time="7.4634e-05">
415+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
416+ <system-err>&gt; Enter [It] Populate registry with test config blob - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:21 @ 04/09/25 13:51:31.444&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [It] Populate registry with test config blob - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:21 @ 04/09/25 13:51:31.444 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444 (0s)&#xA;</system-err>
417+ </testcase>
418+ <testcase name="OCI Distribution Conformance Tests Content Management Setup Populate registry with test layer" classname="conformance tests" status="skipped" time="7.8229e-05">
419+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
420+ <system-err>&gt; Enter [It] Populate registry with test layer - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:39 @ 04/09/25 13:51:31.444&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [It] Populate registry with test layer - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:39 @ 04/09/25 13:51:31.444 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444 (0s)&#xA;</system-err>
421+ </testcase>
422+ <testcase name="OCI Distribution Conformance Tests Content Management Setup Populate registry with test tag" classname="conformance tests" status="skipped" time="7.6033e-05">
423+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;"></skipped>
424+ <system-err>&gt; Enter [It] Populate registry with test tag - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:57 @ 04/09/25 13:51:31.444&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [It] Populate registry with test tag - /go/src/github.com/opencontainers/distribution-spec/conformance/04_management_test.go:57 @ 04/09/25 13:51:31.444 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444 (0s)&#xA;</system-err>
425+ </testcase>
426+ <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="8.4414e-05">
427+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;"></skipped>
428+ <system-err>&gt; 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/09/25 13:51:31.444&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.444&#xA;&lt; 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/09/25 13:51:31.444 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444 (0s)&#xA;</system-err>
429+ </testcase>
430+ <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="7.6006e-05">
431+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;"></skipped>
432+ <system-err>&gt; 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/09/25 13:51:31.444&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.444&#xA;&lt; 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/09/25 13:51:31.444 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444 (0s)&#xA;</system-err>
433+ </testcase>
434+ <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="8.3898e-05">
435+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
436+ <system-err>&gt; 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/09/25 13:51:31.444&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.444&#xA;&lt; 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/09/25 13:51:31.444 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.444 (0s)&#xA;</system-err>
437+ </testcase>
438+ <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="7.3672e-05">
439+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;"></skipped>
440+ <system-err>&gt; 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/09/25 13:51:31.444&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.445&#xA;&lt; 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/09/25 13:51:31.445 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.445&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.445 (0s)&#xA;</system-err>
441+ </testcase>
442+ <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.9792e-05">
443+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;"></skipped>
444+ <system-err>&gt; 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/09/25 13:51:31.445&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.445&#xA;&lt; 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/09/25 13:51:31.445 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.445&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.445 (0s)&#xA;</system-err>
445+ </testcase>
446+ <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="7.4715e-05">
447+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;"></skipped>
448+ <system-err>&gt; 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/09/25 13:51:31.445&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.445&#xA;&lt; 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/09/25 13:51:31.445 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.445&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.445 (0s)&#xA;</system-err>
449+ </testcase>
450+ <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="8.3435e-05">
451+ <skipped message="skipped - you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;"></skipped>
452+ <system-err>&gt; 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/09/25 13:51:31.445&#xA;[SKIPPED] you have skipped this test; if this is an error, check your environment variable settings:&#xA;&#x9;OCI_TEST_PULL=1&#xA;&#x9;OCI_TEST_PUSH=0&#xA;&#x9;OCI_TEST_CONTENT_DISCOVERY=0&#xA;&#x9;OCI_TEST_CONTENT_MANAGEMENT=0&#xA;In [It] at: /go/src/github.com/opencontainers/distribution-spec/conformance/setup.go:579 @ 04/09/25 13:51:31.445&#xA;&lt; 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/09/25 13:51:31.445 (0s)&#xA;&gt; Enter [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.445&#xA;&lt; Exit [ReportAfterEach] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:23 @ 04/09/25 13:51:31.445 (0s)&#xA;</system-err>
453+ </testcase>
454+ <testcase name="html custom reporter" classname="conformance tests" status="passed" time="0.005109376">
455+ <system-err>&gt; Enter [ReportAfterSuite] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:24 @ 04/09/25 13:51:31.445&#xA;&lt; Exit [ReportAfterSuite] TOP-LEVEL - /go/src/github.com/opencontainers/distribution-spec/conformance/00_conformance_suite_test.go:24 @ 04/09/25 13:51:31.45 (5ms)&#xA;</system-err>
456+ </testcase>
457+ </testsuite>
458+ </testsuites>
459\ No newline at end of file
460 diff --git a/results/report.html b/results/report.html
461new file mode 100644
462index 0000000..bf99735
463--- /dev/null
464+++ b/results/report.html
465 @@ -0,0 +1,2314 @@
466+ <html>
467+ <head>
468+ <title>OCI Distribution Conformance Tests</title>
469+ <style>
470+ body {
471+ padding: 10px 20px 10px 20px;
472+ 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;
473+ background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAG0lEQVQYV2Pce7zwv7NlPyMDFMAZGAIwlRgqAFydCAVv5m4UAAAAAElFTkSuQmCC") repeat;
474+
475+ }
476+ table {
477+ border-collapse: collapse;
478+ width: 100%;
479+ background-color: white;
480+ }
481+ th, td {
482+ padding: 12px;
483+ text-align: left;
484+ border-bottom: 1px solid #ddd;
485+ }
486+ tr:hover {
487+ background-color: #ffe39b;
488+ }
489+ .result {
490+ padding: 1.25em 0 .25em 0.8em;
491+ border: 1px solid #e1e1e1;
492+ border-radius: 5px;
493+ margin-top: 10px;
494+ }
495+ .red {
496+ background: #ffc8c8;
497+ }
498+ pre.fail-message {
499+ background: #f9a5a5;
500+ padding: 20px;
501+ margin-right: 10px;
502+ display: inline-block;
503+ border-radius: 4px;
504+ font-size: 1.25em;
505+ width: 94%;
506+ overflow-x: auto;
507+ max-width: 85%;
508+ }
509+ .green {
510+ background: #c8ffc8;
511+ padding: 1.25em 0 1.25em 0.8em;
512+ }
513+ .grey {
514+ background: lightgrey;
515+ padding: 1.25em 0 1.25em 0.8em;
516+ }
517+ .toggle {
518+ border: 2px solid #3e3e3e;
519+ cursor: pointer;
520+ width: 1em;
521+ text-align: center;
522+ font-weight: bold;
523+ display: inline;
524+ font-family: monospace;
525+ padding: 0 .25em 0 .25em;
526+ margin: 1em 1em 1em 0;
527+ font-size: 12pt;
528+ color: #3e3e3e;
529+ border-radius: 3px;
530+ }
531+ pre.pre-box {
532+ background: #343a40;
533+ color: #fff;
534+ padding: 10px;
535+ border: 1px solid gray;
536+ display: inline-block;
537+ border-radius: 4px;
538+ width: 97%;
539+ font-size: 1.25em;
540+ overflow-x: auto;
541+ max-height: 60em;
542+ overflow-y: auto;
543+ max-width: 85%;
544+ }
545+ .summary {
546+ width: 100%;
547+ height: auto;
548+ padding: 0 0 .5em 0;
549+ border-radius: 6px;
550+ border: 1px solid #cccddd;
551+ background: white;
552+ }
553+ .summary-bullet {
554+ width: 100%;
555+ height: auto;
556+ display: flex;
557+ flex-wrap: wrap;
558+ padding: .5em .1em .1em .5em;
559+ }
560+ .bullet-left {
561+ width: 25%;
562+ font-weight: bold;
563+ font-size: 100%;
564+ }
565+ .bullet-right {
566+ width: auto;
567+ font-family: monospace;
568+ font-size: 110%;
569+ }
570+ .quick-summary {
571+ width: 70%;
572+ display: flex;
573+ margin: 0 auto 0 0;
574+ font-weight: bold;
575+ font-size: 1.2em;
576+ }
577+ .darkgreen {
578+ color: green;
579+ }
580+ .darkred {
581+ color: red;
582+ padding: 0 0 0 2em;
583+ }
584+ .darkgrey {
585+ color: grey;
586+ padding: 0 0 0 2em;
587+ }
588+ .meter {
589+ border: 1px solid black;
590+ margin: 0 .5em 0 auto;
591+ display: flex;
592+ height: 25px;
593+ width: 45%;
594+ }
595+ @media only screen and (max-width: 600px) {
596+ .meter {
597+ display: none;
598+ }
599+ }
600+ .meter-green {
601+ height: 100%;
602+ background: green;
603+ width: 16%;
604+ }
605+ .meter-red {
606+ height: 100%;
607+ background: red;
608+ width: 13%;
609+ }
610+ .meter-grey {
611+ height: 100%;
612+ background: grey;
613+ width: 71%;
614+ }
615+ .subcategory {
616+ background: white;
617+ padding: 0px 20px 20px 20px;
618+ border: 1px solid #cccddd;
619+ border-radius: 6px;
620+ }
621+ h2 {
622+ margin-top: 45px;
623+ }
624+ h4 {
625+ vertical-align: bottom;
626+ cursor: pointer;
627+ }
628+ </style>
629+ <script>
630+ function toggleOutput(id) {
631+ var elem = document.getElementById(id);
632+ var button = document.getElementById(id + "-button");
633+ if (elem.style['display'] === 'block') {
634+ button.innerHTML = "+";
635+ elem.style['display'] = 'none';
636+ } else {
637+ button.innerHTML = "-";
638+ elem.style['display'] = 'block';
639+ }
640+ }
641+ </script>
642+ </head>
643+ <body>
644+ <h1>OCI Distribution Conformance Tests</h1>
645+ <table>
646+ <tr>
647+ </tr>
648+ <tr>
649+ <td class="bullet-left">Summary</td>
650+ <td>
651+ <div class="quick-summary"><span class="darkgreen">13 passed</span><span class="darkred">10 failed</span><span class="darkgrey">56 skipped</span><div class="meter">
652+ <div class="meter-green"></div>
653+ <div class="meter-red"></div>
654+ <div class="meter-grey"></div>
655+ </div>
656+ </div>
657+ </td>
658+ </tr>
659+ <tr>
660+ <td class="bullet-left">Start Time</td>
661+ <td>Apr 9 13:51:31.412 &#43;0000 UTC</td>
662+ </tr>
663+ <tr>
664+ <td class="bullet-left">End Time</td>
665+ <td>Apr 9 13:51:31.445 &#43;0000 UTC</td>
666+ </tr>
667+ <tr>
668+ <td class="bullet-left">Time Elapsed</td>
669+ <td>32.597729ms</td>
670+ </tr>
671+ <tr>
672+ <td class="bullet-left">Test Version</td>
673+ <td>unknown</td>
674+ </tr>
675+ <tr>
676+ <td class="bullet-left">Configuration</td>
677+ <td><div class="bullet-right">
678+
679+ OCI_ROOT_URL=http://localhost:8700<br />
680+
681+ OCI_NAMESPACE=myorg/myrepo/a<br />
682+
683+ OCI_USERNAME=*****<br />
684+
685+ OCI_PASSWORD=*****<br />
686+
687+ OCI_DEBUG=0<br />
688+
689+ OCI_TEST_PULL=1<br />
690+
691+ OCI_TEST_PUSH=0<br />
692+
693+ OCI_TEST_CONTENT_DISCOVERY=0<br />
694+
695+ OCI_TEST_CONTENT_MANAGEMENT=0<br />
696+
697+ OCI_HIDE_SKIPPED_WORKFLOWS=0<br />
698+
699+ </div></td>
700+ </tr>
701+ </table>
702+
703+ <div>
704+
705+
706+
707+
708+
709+
710+ <h2>Pull</h2>
711+ <div class="subcategory">
712+
713+
714+ <h3>Setup</h3>
715+
716+
717+
718+
719+
720+
721+ <div class="result green">
722+ <div id="output-box-1-button" class="toggle" onclick="javascript:toggleOutput('output-box-1')">+</div>
723+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-1')">Populate registry with test blob</h4>
724+ <br>
725+ <div id="output-box-1" style="display: none;">
726+ <pre class="pre-box">DEBUG
727+ ==============================================================================
728+ ~~~ REQUEST ~~~
729+ POST /v2/myorg/myrepo/a/blobs/uploads/ HTTP/1.1
730+ HOST : localhost:8700
731+ HEADERS:
732+ User-Agent: distribution-spec-conformance-tests
733+ BODY :
734+ ***** NO CONTENT *****
735+ ------------------------------------------------------------------------------
736+ ~~~ RESPONSE ~~~
737+ STATUS : 202 Accepted
738+ PROTO : HTTP/1.1
739+ RECEIVED AT : 2025-04-09T13:51:31.41759354Z
740+ TIME DURATION: 833.437µs
741+ HEADERS :
742+ Content-Length: 0
743+ Date: Wed, 09 Apr 2025 13:51:31 GMT
744+ Location: /v2/upload/2359f278-ee50-486d-8271-96f618da7e5a
745+ Oci-Chunk-Min-Length: 10000000
746+ BODY :
747+
748+ ==============================================================================
749+
750+ DEBUG
751+ ==============================================================================
752+ ~~~ REQUEST ~~~
753+ PUT /v2/upload/2359f278-ee50-486d-8271-96f618da7e5a?digest=sha256%3A1be7a80f5103aa7bd241ecd66f6d9cc187b42bee1d5b92e92c487a1e541c9124 HTTP/1.1
754+ HOST : localhost:8700
755+ HEADERS:
756+ Content-Length: 129
757+ Content-Type: application/octet-stream
758+ User-Agent: distribution-spec-conformance-tests
759+ BODY :
760+ ***** BODY IS byte(s) (size - 129) *****
761+ ------------------------------------------------------------------------------
762+ ~~~ RESPONSE ~~~
763+ STATUS : 201 Created
764+ PROTO : HTTP/1.1
765+ RECEIVED AT : 2025-04-09T13:51:31.418222029Z
766+ TIME DURATION: 504.944µs
767+ HEADERS :
768+ Content-Length: 0
769+ Date: Wed, 09 Apr 2025 13:51:31 GMT
770+ BODY :
771+
772+ ==============================================================================
773+
774+ </pre>
775+ </div>
776+ </div>
777+
778+
779+
780+
781+ <div class="result green">
782+ <div id="output-box-1-button" class="toggle" onclick="javascript:toggleOutput('output-box-1')">+</div>
783+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-1')">Populate registry with test blob</h4>
784+ <br>
785+ <div id="output-box-1" style="display: none;">
786+ <pre class="pre-box">DEBUG
787+ ==============================================================================
788+ ~~~ REQUEST ~~~
789+ POST /v2/myorg/myrepo/a/blobs/uploads/ HTTP/1.1
790+ HOST : localhost:8700
791+ HEADERS:
792+ User-Agent: distribution-spec-conformance-tests
793+ BODY :
794+ ***** NO CONTENT *****
795+ ------------------------------------------------------------------------------
796+ ~~~ RESPONSE ~~~
797+ STATUS : 202 Accepted
798+ PROTO : HTTP/1.1
799+ RECEIVED AT : 2025-04-09T13:51:31.41759354Z
800+ TIME DURATION: 833.437µs
801+ HEADERS :
802+ Content-Length: 0
803+ Date: Wed, 09 Apr 2025 13:51:31 GMT
804+ Location: /v2/upload/2359f278-ee50-486d-8271-96f618da7e5a
805+ Oci-Chunk-Min-Length: 10000000
806+ BODY :
807+
808+ ==============================================================================
809+
810+ DEBUG
811+ ==============================================================================
812+ ~~~ REQUEST ~~~
813+ PUT /v2/upload/2359f278-ee50-486d-8271-96f618da7e5a?digest=sha256%3A1be7a80f5103aa7bd241ecd66f6d9cc187b42bee1d5b92e92c487a1e541c9124 HTTP/1.1
814+ HOST : localhost:8700
815+ HEADERS:
816+ Content-Length: 129
817+ Content-Type: application/octet-stream
818+ User-Agent: distribution-spec-conformance-tests
819+ BODY :
820+ ***** BODY IS byte(s) (size - 129) *****
821+ ------------------------------------------------------------------------------
822+ ~~~ RESPONSE ~~~
823+ STATUS : 201 Created
824+ PROTO : HTTP/1.1
825+ RECEIVED AT : 2025-04-09T13:51:31.418222029Z
826+ TIME DURATION: 504.944µs
827+ HEADERS :
828+ Content-Length: 0
829+ Date: Wed, 09 Apr 2025 13:51:31 GMT
830+ BODY :
831+
832+ ==============================================================================
833+
834+ </pre>
835+ </div>
836+ </div>
837+
838+
839+
840+
841+ <div class="result green">
842+ <div id="output-box-2-button" class="toggle" onclick="javascript:toggleOutput('output-box-2')">+</div>
843+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-2')">Populate registry with test layer</h4>
844+ <br>
845+ <div id="output-box-2" style="display: none;">
846+ <pre class="pre-box">DEBUG
847+ ==============================================================================
848+ ~~~ REQUEST ~~~
849+ POST /v2/myorg/myrepo/a/blobs/uploads/ HTTP/1.1
850+ HOST : localhost:8700
851+ HEADERS:
852+ User-Agent: distribution-spec-conformance-tests
853+ BODY :
854+ ***** NO CONTENT *****
855+ ------------------------------------------------------------------------------
856+ ~~~ RESPONSE ~~~
857+ STATUS : 202 Accepted
858+ PROTO : HTTP/1.1
859+ RECEIVED AT : 2025-04-09T13:51:31.419106935Z
860+ TIME DURATION: 725.613µs
861+ HEADERS :
862+ Content-Length: 0
863+ Date: Wed, 09 Apr 2025 13:51:31 GMT
864+ Location: /v2/upload/ccf3e3d3-f6f9-4d5e-96db-bb18ed6afb4e
865+ Oci-Chunk-Min-Length: 10000000
866+ BODY :
867+
868+ ==============================================================================
869+
870+ DEBUG
871+ ==============================================================================
872+ ~~~ REQUEST ~~~
873+ PUT /v2/upload/ccf3e3d3-f6f9-4d5e-96db-bb18ed6afb4e?digest=sha256%3A48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183 HTTP/1.1
874+ HOST : localhost:8700
875+ HEADERS:
876+ Content-Length: 168
877+ Content-Type: application/octet-stream
878+ User-Agent: distribution-spec-conformance-tests
879+ BODY :
880+ ***** BODY IS byte(s) (size - 168) *****
881+ ------------------------------------------------------------------------------
882+ ~~~ RESPONSE ~~~
883+ STATUS : 201 Created
884+ PROTO : HTTP/1.1
885+ RECEIVED AT : 2025-04-09T13:51:31.419718267Z
886+ TIME DURATION: 498.329µs
887+ HEADERS :
888+ Content-Length: 0
889+ Date: Wed, 09 Apr 2025 13:51:31 GMT
890+ BODY :
891+
892+ ==============================================================================
893+
894+ </pre>
895+ </div>
896+ </div>
897+
898+
899+
900+
901+ <div class="result green">
902+ <div id="output-box-4-button" class="toggle" onclick="javascript:toggleOutput('output-box-4')">+</div>
903+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-4')">Populate registry with test manifest</h4>
904+ <br>
905+ <div id="output-box-4" style="display: none;">
906+ <pre class="pre-box">DEBUG
907+ ==============================================================================
908+ ~~~ REQUEST ~~~
909+ PUT /v2/myorg/myrepo/a/manifests/sha256:5ac70ec4172003757fe6ef3eacce7dd9e57fee69170ad9c519865bb02a5358da HTTP/1.1
910+ HOST : localhost:8700
911+ HEADERS:
912+ Content-Type: application/vnd.oci.image.manifest.v1&#43;json
913+ User-Agent: distribution-spec-conformance-tests
914+ BODY :
915+ &#34;ewoJInNjaGVtYVZlcnNpb24iOiAyLAoJIm1lZGlhVHlwZSI6ICJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLm1hbmlmZXN0LnYxK2pzb24iLAoJImNvbmZpZyI6IHsKCQkibWVkaWFUeXBlIjogImFwcGxpY2F0aW9uL3ZuZC5vY2kuaW1hZ2UuY29uZmlnLnYxK2pzb24iLAoJCSJkaWdlc3QiOiAic2hhMjU2OjFiZTdhODBmNTEwM2FhN2JkMjQxZWNkNjZmNmQ5Y2MxODdiNDJiZWUxZDViOTJlOTJjNDg3YTFlNTQxYzkxMjQiLAoJCSJzaXplIjogMTI5LAoJCSJkYXRhIjogImV3b0pJbUYxZEdodmNpSTZJQ0phUTFOeWEwRmtkR2RpTWt4WGRYUm9JaXdLQ1NKaGNtTm9hWFJsWTNSMWNtVWlPaUFpWVcxa05qUWlMQW9KSW05eklqb2dJbXhwYm5WNElpd0tDU0p5YjI5MFpuTWlPaUI3Q2drSkluUjVjR1VpT2lBaWJHRjVaWEp6SWl3S0NRa2laR2xtWmw5cFpITWlPaUJiWFFvSmZRcDkiLAoJCSJuZXdVbnNwZWNpZmllZEZpZWxkIjogImFHVnNiRzhnZDI5eWJHUT0iCgl9LAoJImxheWVycyI6IFsKCQl7CgkJCSJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLm9jaS5pbWFnZS5sYXllci52MS50YXIrZ3ppcCIsCgkJCSJkaWdlc3QiOiAic2hhMjU2OjQ4YWNmZjFkOTE3NTJlOTU3NTI3YzFiNTQxNmU3Mzc2ZDkxMGJjYWNmMDFiOTQ0MTE3NWY4YzI3MGUzNWMxODMiLAoJCQkic2l6ZSI6IDE2OCwKCQkJIm5ld1Vuc3BlY2lmaWVkRmllbGQiOiBudWxsCgkJfQoJXQp9&#34;
916+ ------------------------------------------------------------------------------
917+ ~~~ RESPONSE ~~~
918+ STATUS : 200 OK
919+ PROTO : HTTP/1.1
920+ RECEIVED AT : 2025-04-09T13:51:31.422518106Z
921+ TIME DURATION: 1.211848ms
922+ HEADERS :
923+ Content-Length: 0
924+ Date: Wed, 09 Apr 2025 13:51:31 GMT
925+ BODY :
926+
927+ ==============================================================================
928+
929+ </pre>
930+ </div>
931+ </div>
932+
933+
934+
935+
936+ <div class="result green">
937+ <div id="output-box-4-button" class="toggle" onclick="javascript:toggleOutput('output-box-4')">+</div>
938+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-4')">Populate registry with test manifest</h4>
939+ <br>
940+ <div id="output-box-4" style="display: none;">
941+ <pre class="pre-box">DEBUG
942+ ==============================================================================
943+ ~~~ REQUEST ~~~
944+ PUT /v2/myorg/myrepo/a/manifests/sha256:5ac70ec4172003757fe6ef3eacce7dd9e57fee69170ad9c519865bb02a5358da HTTP/1.1
945+ HOST : localhost:8700
946+ HEADERS:
947+ Content-Type: application/vnd.oci.image.manifest.v1&#43;json
948+ User-Agent: distribution-spec-conformance-tests
949+ BODY :
950+ &#34;ewoJInNjaGVtYVZlcnNpb24iOiAyLAoJIm1lZGlhVHlwZSI6ICJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLm1hbmlmZXN0LnYxK2pzb24iLAoJImNvbmZpZyI6IHsKCQkibWVkaWFUeXBlIjogImFwcGxpY2F0aW9uL3ZuZC5vY2kuaW1hZ2UuY29uZmlnLnYxK2pzb24iLAoJCSJkaWdlc3QiOiAic2hhMjU2OjFiZTdhODBmNTEwM2FhN2JkMjQxZWNkNjZmNmQ5Y2MxODdiNDJiZWUxZDViOTJlOTJjNDg3YTFlNTQxYzkxMjQiLAoJCSJzaXplIjogMTI5LAoJCSJkYXRhIjogImV3b0pJbUYxZEdodmNpSTZJQ0phUTFOeWEwRmtkR2RpTWt4WGRYUm9JaXdLQ1NKaGNtTm9hWFJsWTNSMWNtVWlPaUFpWVcxa05qUWlMQW9KSW05eklqb2dJbXhwYm5WNElpd0tDU0p5YjI5MFpuTWlPaUI3Q2drSkluUjVjR1VpT2lBaWJHRjVaWEp6SWl3S0NRa2laR2xtWmw5cFpITWlPaUJiWFFvSmZRcDkiLAoJCSJuZXdVbnNwZWNpZmllZEZpZWxkIjogImFHVnNiRzhnZDI5eWJHUT0iCgl9LAoJImxheWVycyI6IFsKCQl7CgkJCSJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLm9jaS5pbWFnZS5sYXllci52MS50YXIrZ3ppcCIsCgkJCSJkaWdlc3QiOiAic2hhMjU2OjQ4YWNmZjFkOTE3NTJlOTU3NTI3YzFiNTQxNmU3Mzc2ZDkxMGJjYWNmMDFiOTQ0MTE3NWY4YzI3MGUzNWMxODMiLAoJCQkic2l6ZSI6IDE2OCwKCQkJIm5ld1Vuc3BlY2lmaWVkRmllbGQiOiBudWxsCgkJfQoJXQp9&#34;
951+ ------------------------------------------------------------------------------
952+ ~~~ RESPONSE ~~~
953+ STATUS : 200 OK
954+ PROTO : HTTP/1.1
955+ RECEIVED AT : 2025-04-09T13:51:31.422518106Z
956+ TIME DURATION: 1.211848ms
957+ HEADERS :
958+ Content-Length: 0
959+ Date: Wed, 09 Apr 2025 13:51:31 GMT
960+ BODY :
961+
962+ ==============================================================================
963+
964+ </pre>
965+ </div>
966+ </div>
967+
968+
969+
970+
971+ <div class="result grey">
972+ <div id="output-box-5-button" class="toggle" onclick="javascript:toggleOutput('output-box-5')">+</div>
973+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-5')">Get tag name from environment</h4>
974+ <br>
975+ <div id="output-box-5" style="display: none;">
976+ <pre class="pre-box">you have skipped this test.</pre>
977+ </div>
978+ </div>
979+
980+ <br>
981+
982+
983+ <h3>Pull blobs</h3>
984+
985+
986+
987+
988+
989+
990+ <div class="result green">
991+ <div id="output-box-6-button" class="toggle" onclick="javascript:toggleOutput('output-box-6')">+</div>
992+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-6')">HEAD request to nonexistent blob should result in 404 response</h4>
993+ <br>
994+ <div id="output-box-6" style="display: none;">
995+ <pre class="pre-box">DEBUG
996+ ==============================================================================
997+ ~~~ REQUEST ~~~
998+ HEAD /v2/myorg/myrepo/a/blobs/sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9 HTTP/1.1
999+ HOST : localhost:8700
1000+ HEADERS:
1001+ User-Agent: distribution-spec-conformance-tests
1002+ BODY :
1003+ ***** NO CONTENT *****
1004+ ------------------------------------------------------------------------------
1005+ ~~~ RESPONSE ~~~
1006+ STATUS : 404 Not Found
1007+ PROTO : HTTP/1.1
1008+ RECEIVED AT : 2025-04-09T13:51:31.42353567Z
1009+ TIME DURATION: 663.435µs
1010+ HEADERS :
1011+ Content-Length: 0
1012+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1013+ BODY :
1014+
1015+ ==============================================================================
1016+
1017+ </pre>
1018+ </div>
1019+ </div>
1020+
1021+
1022+
1023+
1024+ <div class="result green">
1025+ <div id="output-box-7-button" class="toggle" onclick="javascript:toggleOutput('output-box-7')">+</div>
1026+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-7')">HEAD request to existing blob should yield 200</h4>
1027+ <br>
1028+ <div id="output-box-7" style="display: none;">
1029+ <pre class="pre-box">DEBUG
1030+ ==============================================================================
1031+ ~~~ REQUEST ~~~
1032+ HEAD /v2/myorg/myrepo/a/blobs/sha256:033a7e405d99ad879f058944c51563b04bf32099b8b22f41d9c9ad9d575ea01f HTTP/1.1
1033+ HOST : localhost:8700
1034+ HEADERS:
1035+ User-Agent: distribution-spec-conformance-tests
1036+ BODY :
1037+ ***** NO CONTENT *****
1038+ ------------------------------------------------------------------------------
1039+ ~~~ RESPONSE ~~~
1040+ STATUS : 200 OK
1041+ PROTO : HTTP/1.1
1042+ RECEIVED AT : 2025-04-09T13:51:31.424379925Z
1043+ TIME DURATION: 708.328µs
1044+ HEADERS :
1045+ Content-Length: 0
1046+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1047+ BODY :
1048+
1049+ ==============================================================================
1050+
1051+ </pre>
1052+ </div>
1053+ </div>
1054+
1055+
1056+
1057+
1058+ <div class="result red">
1059+ <div id="output-box-8-button" class="toggle" onclick="javascript:toggleOutput('output-box-8')">+</div>
1060+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-8')">GET nonexistent blob should result in 404 response</h4>
1061+ <br>
1062+ <div>
1063+ <div id="output-box-8" style="display: none;">
1064+ <pre class="pre-box"></pre>
1065+ </div>
1066+ </div>
1067+ <pre class="fail-message">Expected
1068+ &lt;*url.Error | 0xc0000ae7b0&gt;:
1069+ Get &#34;http://localhost:8700/v2/myorg/myrepo/a/blobs/sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9&#34;: EOF
1070+ {
1071+ Op: &#34;Get&#34;,
1072+ URL: &#34;http://localhost:8700/v2/myorg/myrepo/a/blobs/sha256:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9&#34;,
1073+ Err: &lt;*errors.errorString | 0xc0001120f0&gt;{s: &#34;EOF&#34;},
1074+ }
1075+ to be nil</pre>
1076+ <br>
1077+ </div>
1078+
1079+
1080+
1081+
1082+ <div class="result green">
1083+ <div id="output-box-9-button" class="toggle" onclick="javascript:toggleOutput('output-box-9')">+</div>
1084+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-9')">GET request to existing blob URL should yield 200</h4>
1085+ <br>
1086+ <div id="output-box-9" style="display: none;">
1087+ <pre class="pre-box">DEBUG
1088+ ==============================================================================
1089+ ~~~ REQUEST ~~~
1090+ GET /v2/myorg/myrepo/a/blobs/sha256:033a7e405d99ad879f058944c51563b04bf32099b8b22f41d9c9ad9d575ea01f HTTP/1.1
1091+ HOST : localhost:8700
1092+ HEADERS:
1093+ User-Agent: distribution-spec-conformance-tests
1094+ BODY :
1095+ ***** NO CONTENT *****
1096+ ------------------------------------------------------------------------------
1097+ ~~~ RESPONSE ~~~
1098+ STATUS : 200 OK
1099+ PROTO : HTTP/1.1
1100+ RECEIVED AT : 2025-04-09T13:51:31.427709782Z
1101+ TIME DURATION: 1.00809ms
1102+ HEADERS :
1103+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1104+ BODY :
1105+ {
1106+ &#34;schemaVersion&#34;: 2,
1107+ &#34;mediaType&#34;: &#34;application/vnd.oci.image.manifest.v1&#43;json&#34;,
1108+ &#34;config&#34;: {
1109+ &#34;mediaType&#34;: &#34;application/vnd.oci.image.config.v1&#43;json&#34;,
1110+ &#34;digest&#34;: &#34;sha256:033a7e405d99ad879f058944c51563b04bf32099b8b22f41d9c9ad9d575ea01f&#34;,
1111+ &#34;size&#34;: 129,
1112+ &#34;data&#34;: &#34;ewoJImF1dGhvciI6ICJndDIwWVlsVTlpNzZkU29aIiwKCSJhcmNoaXRlY3R1cmUiOiAiYW1kNjQiLAoJIm9zIjogImxpbnV4IiwKCSJyb290ZnMiOiB7CgkJInR5cGUiOiAibGF5ZXJzIiwKCQkiZGlmZl9pZHMiOiBbXQoJfQp9&#34;,
1113+ &#34;newUnspecifiedField&#34;: &#34;aGVsbG8gd29ybGQ=&#34;
1114+ },
1115+ &#34;layers&#34;: [
1116+ {
1117+ &#34;mediaType&#34;: &#34;application/vnd.oci.image.layer.v1.tar&#43;gzip&#34;,
1118+ &#34;digest&#34;: &#34;sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183&#34;,
1119+ &#34;size&#34;: 168,
1120+ &#34;newUnspecifiedField&#34;: null
1121+ }
1122+ ]
1123+ }
1124+ ==============================================================================
1125+
1126+ </pre>
1127+ </div>
1128+ </div>
1129+
1130+ <br>
1131+
1132+
1133+ <h3>Pull manifests</h3>
1134+
1135+
1136+
1137+
1138+
1139+
1140+ <div class="result red">
1141+ <div id="output-box-10-button" class="toggle" onclick="javascript:toggleOutput('output-box-10')">+</div>
1142+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-10')">HEAD request to nonexistent manifest should return 404</h4>
1143+ <br>
1144+ <div>
1145+ <div id="output-box-10" style="display: none;">
1146+ <pre class="pre-box">DEBUG
1147+ ==============================================================================
1148+ ~~~ REQUEST ~~~
1149+ HEAD /v2/myorg/myrepo/a/manifests/.INVALID_MANIFEST_NAME HTTP/1.1
1150+ HOST : localhost:8700
1151+ HEADERS:
1152+ User-Agent: distribution-spec-conformance-tests
1153+ BODY :
1154+ ***** NO CONTENT *****
1155+ ------------------------------------------------------------------------------
1156+ ~~~ RESPONSE ~~~
1157+ STATUS : 405 Method Not Allowed
1158+ PROTO : HTTP/1.1
1159+ RECEIVED AT : 2025-04-09T13:51:31.428540397Z
1160+ TIME DURATION: 625.762µs
1161+ HEADERS :
1162+ Allow: PUT
1163+ Content-Length: 0
1164+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1165+ BODY :
1166+
1167+ ==============================================================================
1168+
1169+ </pre>
1170+ </div>
1171+ </div>
1172+ <pre class="fail-message">Expected
1173+ &lt;int&gt;: 405
1174+ to equal
1175+ &lt;int&gt;: 404</pre>
1176+ <br>
1177+ </div>
1178+
1179+
1180+
1181+
1182+ <div class="result red">
1183+ <div id="output-box-11-button" class="toggle" onclick="javascript:toggleOutput('output-box-11')">+</div>
1184+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-11')">HEAD request to manifest[0] path (digest) should yield 200 response</h4>
1185+ <br>
1186+ <div>
1187+ <div id="output-box-11" style="display: none;">
1188+ <pre class="pre-box">DEBUG
1189+ ==============================================================================
1190+ ~~~ REQUEST ~~~
1191+ HEAD /v2/myorg/myrepo/a/manifests/sha256:36cf5fdc2e4dbd479721b22234141d0baa2cd13432d6db1a800a7758e8b6850a HTTP/1.1
1192+ HOST : localhost:8700
1193+ HEADERS:
1194+ Accept: application/vnd.oci.image.manifest.v1&#43;json
1195+ User-Agent: distribution-spec-conformance-tests
1196+ BODY :
1197+ ***** NO CONTENT *****
1198+ ------------------------------------------------------------------------------
1199+ ~~~ RESPONSE ~~~
1200+ STATUS : 405 Method Not Allowed
1201+ PROTO : HTTP/1.1
1202+ RECEIVED AT : 2025-04-09T13:51:31.429461261Z
1203+ TIME DURATION: 629.452µs
1204+ HEADERS :
1205+ Allow: PUT
1206+ Content-Length: 0
1207+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1208+ BODY :
1209+
1210+ ==============================================================================
1211+
1212+ </pre>
1213+ </div>
1214+ </div>
1215+ <pre class="fail-message">Expected
1216+ &lt;int&gt;: 405
1217+ to equal
1218+ &lt;int&gt;: 200</pre>
1219+ <br>
1220+ </div>
1221+
1222+
1223+
1224+
1225+ <div class="result red">
1226+ <div id="output-box-12-button" class="toggle" onclick="javascript:toggleOutput('output-box-12')">+</div>
1227+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-12')">HEAD request to manifest[1] path (digest) should yield 200 response</h4>
1228+ <br>
1229+ <div>
1230+ <div id="output-box-12" style="display: none;">
1231+ <pre class="pre-box">DEBUG
1232+ ==============================================================================
1233+ ~~~ REQUEST ~~~
1234+ HEAD /v2/myorg/myrepo/a/manifests/sha256:5ac70ec4172003757fe6ef3eacce7dd9e57fee69170ad9c519865bb02a5358da HTTP/1.1
1235+ HOST : localhost:8700
1236+ HEADERS:
1237+ Accept: application/vnd.oci.image.manifest.v1&#43;json
1238+ User-Agent: distribution-spec-conformance-tests
1239+ BODY :
1240+ ***** NO CONTENT *****
1241+ ------------------------------------------------------------------------------
1242+ ~~~ RESPONSE ~~~
1243+ STATUS : 405 Method Not Allowed
1244+ PROTO : HTTP/1.1
1245+ RECEIVED AT : 2025-04-09T13:51:31.430353016Z
1246+ TIME DURATION: 607.356µs
1247+ HEADERS :
1248+ Allow: PUT
1249+ Content-Length: 0
1250+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1251+ BODY :
1252+
1253+ ==============================================================================
1254+
1255+ </pre>
1256+ </div>
1257+ </div>
1258+ <pre class="fail-message">Expected
1259+ &lt;int&gt;: 405
1260+ to equal
1261+ &lt;int&gt;: 200</pre>
1262+ <br>
1263+ </div>
1264+
1265+
1266+
1267+
1268+ <div class="result red">
1269+ <div id="output-box-13-button" class="toggle" onclick="javascript:toggleOutput('output-box-13')">+</div>
1270+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-13')">HEAD request to manifest path (tag) should yield 200 response</h4>
1271+ <br>
1272+ <div>
1273+ <div id="output-box-13" style="display: none;">
1274+ <pre class="pre-box">DEBUG
1275+ ==============================================================================
1276+ ~~~ REQUEST ~~~
1277+ HEAD /v2/myorg/myrepo/a/manifests/tagtest0 HTTP/1.1
1278+ HOST : localhost:8700
1279+ HEADERS:
1280+ Accept: application/vnd.oci.image.manifest.v1&#43;json
1281+ User-Agent: distribution-spec-conformance-tests
1282+ BODY :
1283+ ***** NO CONTENT *****
1284+ ------------------------------------------------------------------------------
1285+ ~~~ RESPONSE ~~~
1286+ STATUS : 405 Method Not Allowed
1287+ PROTO : HTTP/1.1
1288+ RECEIVED AT : 2025-04-09T13:51:31.431207582Z
1289+ TIME DURATION: 598.883µs
1290+ HEADERS :
1291+ Allow: PUT
1292+ Content-Length: 0
1293+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1294+ BODY :
1295+
1296+ ==============================================================================
1297+
1298+ </pre>
1299+ </div>
1300+ </div>
1301+ <pre class="fail-message">Expected
1302+ &lt;int&gt;: 405
1303+ to equal
1304+ &lt;int&gt;: 200</pre>
1305+ <br>
1306+ </div>
1307+
1308+
1309+
1310+
1311+ <div class="result red">
1312+ <div id="output-box-14-button" class="toggle" onclick="javascript:toggleOutput('output-box-14')">+</div>
1313+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-14')">GET nonexistent manifest should return 404</h4>
1314+ <br>
1315+ <div>
1316+ <div id="output-box-14" style="display: none;">
1317+ <pre class="pre-box">DEBUG
1318+ ==============================================================================
1319+ ~~~ REQUEST ~~~
1320+ GET /v2/myorg/myrepo/a/manifests/.INVALID_MANIFEST_NAME HTTP/1.1
1321+ HOST : localhost:8700
1322+ HEADERS:
1323+ User-Agent: distribution-spec-conformance-tests
1324+ BODY :
1325+ ***** NO CONTENT *****
1326+ ------------------------------------------------------------------------------
1327+ ~~~ RESPONSE ~~~
1328+ STATUS : 405 Method Not Allowed
1329+ PROTO : HTTP/1.1
1330+ RECEIVED AT : 2025-04-09T13:51:31.432112142Z
1331+ TIME DURATION: 608.102µs
1332+ HEADERS :
1333+ Allow: PUT
1334+ Content-Length: 0
1335+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1336+ BODY :
1337+
1338+ ==============================================================================
1339+
1340+ </pre>
1341+ </div>
1342+ </div>
1343+ <pre class="fail-message">Expected
1344+ &lt;int&gt;: 405
1345+ to equal
1346+ &lt;int&gt;: 404</pre>
1347+ <br>
1348+ </div>
1349+
1350+
1351+
1352+
1353+ <div class="result red">
1354+ <div id="output-box-15-button" class="toggle" onclick="javascript:toggleOutput('output-box-15')">+</div>
1355+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-15')">GET request to manifest[0] path (digest) should yield 200 response</h4>
1356+ <br>
1357+ <div>
1358+ <div id="output-box-15" style="display: none;">
1359+ <pre class="pre-box">DEBUG
1360+ ==============================================================================
1361+ ~~~ REQUEST ~~~
1362+ GET /v2/myorg/myrepo/a/manifests/sha256:36cf5fdc2e4dbd479721b22234141d0baa2cd13432d6db1a800a7758e8b6850a HTTP/1.1
1363+ HOST : localhost:8700
1364+ HEADERS:
1365+ Accept: application/vnd.oci.image.manifest.v1&#43;json
1366+ User-Agent: distribution-spec-conformance-tests
1367+ BODY :
1368+ ***** NO CONTENT *****
1369+ ------------------------------------------------------------------------------
1370+ ~~~ RESPONSE ~~~
1371+ STATUS : 405 Method Not Allowed
1372+ PROTO : HTTP/1.1
1373+ RECEIVED AT : 2025-04-09T13:51:31.43298626Z
1374+ TIME DURATION: 604.008µs
1375+ HEADERS :
1376+ Allow: PUT
1377+ Content-Length: 0
1378+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1379+ BODY :
1380+
1381+ ==============================================================================
1382+
1383+ </pre>
1384+ </div>
1385+ </div>
1386+ <pre class="fail-message">Expected
1387+ &lt;int&gt;: 405
1388+ to equal
1389+ &lt;int&gt;: 200</pre>
1390+ <br>
1391+ </div>
1392+
1393+
1394+
1395+
1396+ <div class="result red">
1397+ <div id="output-box-16-button" class="toggle" onclick="javascript:toggleOutput('output-box-16')">+</div>
1398+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-16')">GET request to manifest[1] path (digest) should yield 200 response</h4>
1399+ <br>
1400+ <div>
1401+ <div id="output-box-16" style="display: none;">
1402+ <pre class="pre-box">DEBUG
1403+ ==============================================================================
1404+ ~~~ REQUEST ~~~
1405+ GET /v2/myorg/myrepo/a/manifests/sha256:5ac70ec4172003757fe6ef3eacce7dd9e57fee69170ad9c519865bb02a5358da HTTP/1.1
1406+ HOST : localhost:8700
1407+ HEADERS:
1408+ Accept: application/vnd.oci.image.manifest.v1&#43;json
1409+ User-Agent: distribution-spec-conformance-tests
1410+ BODY :
1411+ ***** NO CONTENT *****
1412+ ------------------------------------------------------------------------------
1413+ ~~~ RESPONSE ~~~
1414+ STATUS : 405 Method Not Allowed
1415+ PROTO : HTTP/1.1
1416+ RECEIVED AT : 2025-04-09T13:51:31.433837157Z
1417+ TIME DURATION: 612.472µs
1418+ HEADERS :
1419+ Allow: PUT
1420+ Content-Length: 0
1421+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1422+ BODY :
1423+
1424+ ==============================================================================
1425+
1426+ </pre>
1427+ </div>
1428+ </div>
1429+ <pre class="fail-message">Expected
1430+ &lt;int&gt;: 405
1431+ to equal
1432+ &lt;int&gt;: 200</pre>
1433+ <br>
1434+ </div>
1435+
1436+
1437+
1438+
1439+ <div class="result red">
1440+ <div id="output-box-17-button" class="toggle" onclick="javascript:toggleOutput('output-box-17')">+</div>
1441+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-17')">GET request to manifest path (tag) should yield 200 response</h4>
1442+ <br>
1443+ <div>
1444+ <div id="output-box-17" style="display: none;">
1445+ <pre class="pre-box">DEBUG
1446+ ==============================================================================
1447+ ~~~ REQUEST ~~~
1448+ GET /v2/myorg/myrepo/a/manifests/tagtest0 HTTP/1.1
1449+ HOST : localhost:8700
1450+ HEADERS:
1451+ Accept: application/vnd.oci.image.manifest.v1&#43;json
1452+ User-Agent: distribution-spec-conformance-tests
1453+ BODY :
1454+ ***** NO CONTENT *****
1455+ ------------------------------------------------------------------------------
1456+ ~~~ RESPONSE ~~~
1457+ STATUS : 405 Method Not Allowed
1458+ PROTO : HTTP/1.1
1459+ RECEIVED AT : 2025-04-09T13:51:31.434721505Z
1460+ TIME DURATION: 607.513µs
1461+ HEADERS :
1462+ Allow: PUT
1463+ Content-Length: 0
1464+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1465+ BODY :
1466+
1467+ ==============================================================================
1468+
1469+ </pre>
1470+ </div>
1471+ </div>
1472+ <pre class="fail-message">Expected
1473+ &lt;int&gt;: 405
1474+ to equal
1475+ &lt;int&gt;: 200</pre>
1476+ <br>
1477+ </div>
1478+
1479+ <br>
1480+
1481+
1482+ <h3>Error codes</h3>
1483+
1484+
1485+
1486+
1487+
1488+
1489+ <div class="result red">
1490+ <div id="output-box-18-button" class="toggle" onclick="javascript:toggleOutput('output-box-18')">+</div>
1491+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-18')">400 response body should contain OCI-conforming JSON message</h4>
1492+ <br>
1493+ <div>
1494+ <div id="output-box-18" style="display: none;">
1495+ <pre class="pre-box">DEBUG
1496+ ==============================================================================
1497+ ~~~ REQUEST ~~~
1498+ GET /v2/myorg/myrepo/a/manifests/sha256:totallywrong HTTP/1.1
1499+ HOST : localhost:8700
1500+ HEADERS:
1501+ Content-Type: application/vnd.oci.image.manifest.v1&#43;json
1502+ User-Agent: distribution-spec-conformance-tests
1503+ BODY :
1504+ ***** NO CONTENT *****
1505+ ------------------------------------------------------------------------------
1506+ ~~~ RESPONSE ~~~
1507+ STATUS : 405 Method Not Allowed
1508+ PROTO : HTTP/1.1
1509+ RECEIVED AT : 2025-04-09T13:51:31.435607946Z
1510+ TIME DURATION: 611.719µs
1511+ HEADERS :
1512+ Allow: PUT
1513+ Content-Length: 0
1514+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1515+ BODY :
1516+
1517+ ==============================================================================
1518+
1519+ </pre>
1520+ </div>
1521+ </div>
1522+ <pre class="fail-message">Expected
1523+ &lt;int&gt;: 405
1524+ To satisfy at least one of these matchers: [%!s(*matchers.EqualMatcher=&amp;{400}) %!s(*matchers.EqualMatcher=&amp;{404})]</pre>
1525+ <br>
1526+ </div>
1527+
1528+ <br>
1529+
1530+
1531+ <h3>Teardown</h3>
1532+
1533+
1534+
1535+
1536+
1537+
1538+ <div class="result green">
1539+ <div id="output-box-19-button" class="toggle" onclick="javascript:toggleOutput('output-box-19')">+</div>
1540+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-19')">Delete config[0] blob created in setup</h4>
1541+ <br>
1542+ <div id="output-box-19" style="display: none;">
1543+ <pre class="pre-box">DEBUG
1544+ ==============================================================================
1545+ ~~~ REQUEST ~~~
1546+ DELETE /v2/myorg/myrepo/a/blobs/sha256:033a7e405d99ad879f058944c51563b04bf32099b8b22f41d9c9ad9d575ea01f HTTP/1.1
1547+ HOST : localhost:8700
1548+ HEADERS:
1549+ User-Agent: distribution-spec-conformance-tests
1550+ BODY :
1551+ ***** NO CONTENT *****
1552+ ------------------------------------------------------------------------------
1553+ ~~~ RESPONSE ~~~
1554+ STATUS : 405 Method Not Allowed
1555+ PROTO : HTTP/1.1
1556+ RECEIVED AT : 2025-04-09T13:51:31.436461189Z
1557+ TIME DURATION: 600.452µs
1558+ HEADERS :
1559+ Allow: HEAD,GET,HEAD
1560+ Content-Length: 0
1561+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1562+ BODY :
1563+
1564+ ==============================================================================
1565+
1566+ </pre>
1567+ </div>
1568+ </div>
1569+
1570+
1571+
1572+
1573+ <div class="result green">
1574+ <div id="output-box-20-button" class="toggle" onclick="javascript:toggleOutput('output-box-20')">+</div>
1575+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-20')">Delete config[1] blob created in setup</h4>
1576+ <br>
1577+ <div id="output-box-20" style="display: none;">
1578+ <pre class="pre-box">DEBUG
1579+ ==============================================================================
1580+ ~~~ REQUEST ~~~
1581+ DELETE /v2/myorg/myrepo/a/blobs/sha256:1be7a80f5103aa7bd241ecd66f6d9cc187b42bee1d5b92e92c487a1e541c9124 HTTP/1.1
1582+ HOST : localhost:8700
1583+ HEADERS:
1584+ User-Agent: distribution-spec-conformance-tests
1585+ BODY :
1586+ ***** NO CONTENT *****
1587+ ------------------------------------------------------------------------------
1588+ ~~~ RESPONSE ~~~
1589+ STATUS : 405 Method Not Allowed
1590+ PROTO : HTTP/1.1
1591+ RECEIVED AT : 2025-04-09T13:51:31.43719373Z
1592+ TIME DURATION: 597.191µs
1593+ HEADERS :
1594+ Allow: HEAD,GET,HEAD
1595+ Content-Length: 0
1596+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1597+ BODY :
1598+
1599+ ==============================================================================
1600+
1601+ </pre>
1602+ </div>
1603+ </div>
1604+
1605+
1606+
1607+
1608+ <div class="result green">
1609+ <div id="output-box-21-button" class="toggle" onclick="javascript:toggleOutput('output-box-21')">+</div>
1610+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-21')">Delete layer blob created in setup</h4>
1611+ <br>
1612+ <div id="output-box-21" style="display: none;">
1613+ <pre class="pre-box">DEBUG
1614+ ==============================================================================
1615+ ~~~ REQUEST ~~~
1616+ DELETE /v2/myorg/myrepo/a/blobs/sha256:48acff1d91752e957527c1b5416e7376d910bcacf01b9441175f8c270e35c183 HTTP/1.1
1617+ HOST : localhost:8700
1618+ HEADERS:
1619+ User-Agent: distribution-spec-conformance-tests
1620+ BODY :
1621+ ***** NO CONTENT *****
1622+ ------------------------------------------------------------------------------
1623+ ~~~ RESPONSE ~~~
1624+ STATUS : 405 Method Not Allowed
1625+ PROTO : HTTP/1.1
1626+ RECEIVED AT : 2025-04-09T13:51:31.437938486Z
1627+ TIME DURATION: 598.383µs
1628+ HEADERS :
1629+ Allow: HEAD,GET,HEAD
1630+ Content-Length: 0
1631+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1632+ BODY :
1633+
1634+ ==============================================================================
1635+
1636+ </pre>
1637+ </div>
1638+ </div>
1639+
1640+
1641+
1642+
1643+ <div class="result green">
1644+ <div id="output-box-22-button" class="toggle" onclick="javascript:toggleOutput('output-box-22')">+</div>
1645+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-22')">Delete manifest[0] created in setup</h4>
1646+ <br>
1647+ <div id="output-box-22" style="display: none;">
1648+ <pre class="pre-box">DEBUG
1649+ ==============================================================================
1650+ ~~~ REQUEST ~~~
1651+ DELETE /v2/myorg/myrepo/a/manifests/sha256:36cf5fdc2e4dbd479721b22234141d0baa2cd13432d6db1a800a7758e8b6850a HTTP/1.1
1652+ HOST : localhost:8700
1653+ HEADERS:
1654+ User-Agent: distribution-spec-conformance-tests
1655+ BODY :
1656+ ***** NO CONTENT *****
1657+ ------------------------------------------------------------------------------
1658+ ~~~ RESPONSE ~~~
1659+ STATUS : 405 Method Not Allowed
1660+ PROTO : HTTP/1.1
1661+ RECEIVED AT : 2025-04-09T13:51:31.438700907Z
1662+ TIME DURATION: 605.97µs
1663+ HEADERS :
1664+ Allow: PUT
1665+ Content-Length: 0
1666+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1667+ BODY :
1668+
1669+ ==============================================================================
1670+
1671+ </pre>
1672+ </div>
1673+ </div>
1674+
1675+
1676+
1677+
1678+ <div class="result green">
1679+ <div id="output-box-23-button" class="toggle" onclick="javascript:toggleOutput('output-box-23')">+</div>
1680+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-23')">Delete manifest[1] created in setup</h4>
1681+ <br>
1682+ <div id="output-box-23" style="display: none;">
1683+ <pre class="pre-box">DEBUG
1684+ ==============================================================================
1685+ ~~~ REQUEST ~~~
1686+ DELETE /v2/myorg/myrepo/a/manifests/sha256:5ac70ec4172003757fe6ef3eacce7dd9e57fee69170ad9c519865bb02a5358da HTTP/1.1
1687+ HOST : localhost:8700
1688+ HEADERS:
1689+ User-Agent: distribution-spec-conformance-tests
1690+ BODY :
1691+ ***** NO CONTENT *****
1692+ ------------------------------------------------------------------------------
1693+ ~~~ RESPONSE ~~~
1694+ STATUS : 405 Method Not Allowed
1695+ PROTO : HTTP/1.1
1696+ RECEIVED AT : 2025-04-09T13:51:31.439440122Z
1697+ TIME DURATION: 601.655µs
1698+ HEADERS :
1699+ Allow: PUT
1700+ Content-Length: 0
1701+ Date: Wed, 09 Apr 2025 13:51:31 GMT
1702+ BODY :
1703+
1704+ ==============================================================================
1705+
1706+ </pre>
1707+ </div>
1708+ </div>
1709+
1710+ <br>
1711+
1712+
1713+
1714+
1715+ </div>
1716+
1717+
1718+
1719+
1720+ <h2>Push</h2>
1721+ <div class="subcategory">
1722+
1723+
1724+ <h3>Blob Upload Streamed</h3>
1725+
1726+
1727+
1728+
1729+
1730+
1731+ <div class="result grey">
1732+ <div id="output-box-24-button" class="toggle" onclick="javascript:toggleOutput('output-box-24')">+</div>
1733+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-24')">PATCH request with blob in body should yield 202 response</h4>
1734+ <br>
1735+ <div id="output-box-24" style="display: none;">
1736+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1737+ OCI_TEST_PULL=1
1738+ OCI_TEST_PUSH=0
1739+ OCI_TEST_CONTENT_DISCOVERY=0
1740+ OCI_TEST_CONTENT_MANAGEMENT=0
1741+ </pre>
1742+ </div>
1743+ </div>
1744+
1745+
1746+
1747+
1748+ <div class="result grey">
1749+ <div id="output-box-25-button" class="toggle" onclick="javascript:toggleOutput('output-box-25')">+</div>
1750+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-25')">PUT request to session URL with digest should yield 201 response</h4>
1751+ <br>
1752+ <div id="output-box-25" style="display: none;">
1753+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1754+ OCI_TEST_PULL=1
1755+ OCI_TEST_PUSH=0
1756+ OCI_TEST_CONTENT_DISCOVERY=0
1757+ OCI_TEST_CONTENT_MANAGEMENT=0
1758+ </pre>
1759+ </div>
1760+ </div>
1761+
1762+ <br>
1763+
1764+
1765+ <h3>Blob Upload Monolithic</h3>
1766+
1767+
1768+
1769+
1770+
1771+
1772+ <div class="result grey">
1773+ <div id="output-box-26-button" class="toggle" onclick="javascript:toggleOutput('output-box-26')">+</div>
1774+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-26')">GET nonexistent blob should result in 404 response</h4>
1775+ <br>
1776+ <div id="output-box-26" style="display: none;">
1777+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1778+ OCI_TEST_PULL=1
1779+ OCI_TEST_PUSH=0
1780+ OCI_TEST_CONTENT_DISCOVERY=0
1781+ OCI_TEST_CONTENT_MANAGEMENT=0
1782+ </pre>
1783+ </div>
1784+ </div>
1785+
1786+
1787+
1788+
1789+ <div class="result grey">
1790+ <div id="output-box-27-button" class="toggle" onclick="javascript:toggleOutput('output-box-27')">+</div>
1791+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-27')">POST request with digest and blob should yield a 201 or 202</h4>
1792+ <br>
1793+ <div id="output-box-27" style="display: none;">
1794+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1795+ OCI_TEST_PULL=1
1796+ OCI_TEST_PUSH=0
1797+ OCI_TEST_CONTENT_DISCOVERY=0
1798+ OCI_TEST_CONTENT_MANAGEMENT=0
1799+ </pre>
1800+ </div>
1801+ </div>
1802+
1803+
1804+
1805+
1806+ <div class="result grey">
1807+ <div id="output-box-28-button" class="toggle" onclick="javascript:toggleOutput('output-box-28')">+</div>
1808+ <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>
1809+ <br>
1810+ <div id="output-box-28" style="display: none;">
1811+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1812+ OCI_TEST_PULL=1
1813+ OCI_TEST_PUSH=0
1814+ OCI_TEST_CONTENT_DISCOVERY=0
1815+ OCI_TEST_CONTENT_MANAGEMENT=0
1816+ </pre>
1817+ </div>
1818+ </div>
1819+
1820+
1821+
1822+
1823+ <div class="result grey">
1824+ <div id="output-box-29-button" class="toggle" onclick="javascript:toggleOutput('output-box-29')">+</div>
1825+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-29')">POST request should yield a session ID</h4>
1826+ <br>
1827+ <div id="output-box-29" style="display: none;">
1828+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1829+ OCI_TEST_PULL=1
1830+ OCI_TEST_PUSH=0
1831+ OCI_TEST_CONTENT_DISCOVERY=0
1832+ OCI_TEST_CONTENT_MANAGEMENT=0
1833+ </pre>
1834+ </div>
1835+ </div>
1836+
1837+
1838+
1839+
1840+ <div class="result grey">
1841+ <div id="output-box-30-button" class="toggle" onclick="javascript:toggleOutput('output-box-30')">+</div>
1842+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-30')">PUT upload of a blob should yield a 201 Response</h4>
1843+ <br>
1844+ <div id="output-box-30" style="display: none;">
1845+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1846+ OCI_TEST_PULL=1
1847+ OCI_TEST_PUSH=0
1848+ OCI_TEST_CONTENT_DISCOVERY=0
1849+ OCI_TEST_CONTENT_MANAGEMENT=0
1850+ </pre>
1851+ </div>
1852+ </div>
1853+
1854+
1855+
1856+
1857+ <div class="result grey">
1858+ <div id="output-box-31-button" class="toggle" onclick="javascript:toggleOutput('output-box-31')">+</div>
1859+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-31')">GET request to existing blob should yield 200 response</h4>
1860+ <br>
1861+ <div id="output-box-31" style="display: none;">
1862+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1863+ OCI_TEST_CONTENT_DISCOVERY=0
1864+ OCI_TEST_CONTENT_MANAGEMENT=0
1865+ OCI_TEST_PULL=1
1866+ OCI_TEST_PUSH=0
1867+ </pre>
1868+ </div>
1869+ </div>
1870+
1871+
1872+
1873+
1874+ <div class="result grey">
1875+ <div id="output-box-32-button" class="toggle" onclick="javascript:toggleOutput('output-box-32')">+</div>
1876+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-32')">PUT upload of a layer blob should yield a 201 Response</h4>
1877+ <br>
1878+ <div id="output-box-32" style="display: none;">
1879+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1880+ OCI_TEST_PULL=1
1881+ OCI_TEST_PUSH=0
1882+ OCI_TEST_CONTENT_DISCOVERY=0
1883+ OCI_TEST_CONTENT_MANAGEMENT=0
1884+ </pre>
1885+ </div>
1886+ </div>
1887+
1888+
1889+
1890+
1891+ <div class="result grey">
1892+ <div id="output-box-33-button" class="toggle" onclick="javascript:toggleOutput('output-box-33')">+</div>
1893+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-33')">GET request to existing layer should yield 200 response</h4>
1894+ <br>
1895+ <div id="output-box-33" style="display: none;">
1896+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1897+ OCI_TEST_PUSH=0
1898+ OCI_TEST_CONTENT_DISCOVERY=0
1899+ OCI_TEST_CONTENT_MANAGEMENT=0
1900+ OCI_TEST_PULL=1
1901+ </pre>
1902+ </div>
1903+ </div>
1904+
1905+ <br>
1906+
1907+
1908+ <h3>Blob Upload Chunked</h3>
1909+
1910+
1911+
1912+
1913+
1914+
1915+ <div class="result grey">
1916+ <div id="output-box-34-button" class="toggle" onclick="javascript:toggleOutput('output-box-34')">+</div>
1917+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-34')">Out-of-order blob upload should return 416</h4>
1918+ <br>
1919+ <div id="output-box-34" style="display: none;">
1920+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1921+ OCI_TEST_CONTENT_DISCOVERY=0
1922+ OCI_TEST_CONTENT_MANAGEMENT=0
1923+ OCI_TEST_PULL=1
1924+ OCI_TEST_PUSH=0
1925+ </pre>
1926+ </div>
1927+ </div>
1928+
1929+
1930+
1931+
1932+ <div class="result grey">
1933+ <div id="output-box-35-button" class="toggle" onclick="javascript:toggleOutput('output-box-35')">+</div>
1934+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-35')">PATCH request with first chunk should return 202</h4>
1935+ <br>
1936+ <div id="output-box-35" style="display: none;">
1937+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1938+ OCI_TEST_CONTENT_MANAGEMENT=0
1939+ OCI_TEST_PULL=1
1940+ OCI_TEST_PUSH=0
1941+ OCI_TEST_CONTENT_DISCOVERY=0
1942+ </pre>
1943+ </div>
1944+ </div>
1945+
1946+
1947+
1948+
1949+ <div class="result grey">
1950+ <div id="output-box-36-button" class="toggle" onclick="javascript:toggleOutput('output-box-36')">+</div>
1951+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-36')">Retry previous blob chunk should return 416</h4>
1952+ <br>
1953+ <div id="output-box-36" style="display: none;">
1954+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1955+ OCI_TEST_PULL=1
1956+ OCI_TEST_PUSH=0
1957+ OCI_TEST_CONTENT_DISCOVERY=0
1958+ OCI_TEST_CONTENT_MANAGEMENT=0
1959+ </pre>
1960+ </div>
1961+ </div>
1962+
1963+
1964+
1965+
1966+ <div class="result grey">
1967+ <div id="output-box-37-button" class="toggle" onclick="javascript:toggleOutput('output-box-37')">+</div>
1968+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-37')">Get on stale blob upload should return 204 with a range and location</h4>
1969+ <br>
1970+ <div id="output-box-37" style="display: none;">
1971+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1972+ OCI_TEST_PULL=1
1973+ OCI_TEST_PUSH=0
1974+ OCI_TEST_CONTENT_DISCOVERY=0
1975+ OCI_TEST_CONTENT_MANAGEMENT=0
1976+ </pre>
1977+ </div>
1978+ </div>
1979+
1980+
1981+
1982+
1983+ <div class="result grey">
1984+ <div id="output-box-38-button" class="toggle" onclick="javascript:toggleOutput('output-box-38')">+</div>
1985+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-38')">PATCH request with second chunk should return 202</h4>
1986+ <br>
1987+ <div id="output-box-38" style="display: none;">
1988+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
1989+ OCI_TEST_PUSH=0
1990+ OCI_TEST_CONTENT_DISCOVERY=0
1991+ OCI_TEST_CONTENT_MANAGEMENT=0
1992+ OCI_TEST_PULL=1
1993+ </pre>
1994+ </div>
1995+ </div>
1996+
1997+
1998+
1999+
2000+ <div class="result grey">
2001+ <div id="output-box-39-button" class="toggle" onclick="javascript:toggleOutput('output-box-39')">+</div>
2002+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-39')">PUT request with digest should return 201</h4>
2003+ <br>
2004+ <div id="output-box-39" style="display: none;">
2005+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2006+ OCI_TEST_CONTENT_MANAGEMENT=0
2007+ OCI_TEST_PULL=1
2008+ OCI_TEST_PUSH=0
2009+ OCI_TEST_CONTENT_DISCOVERY=0
2010+ </pre>
2011+ </div>
2012+ </div>
2013+
2014+ <br>
2015+
2016+
2017+ <h3>Cross-Repository Blob Mount</h3>
2018+
2019+
2020+
2021+
2022+
2023+
2024+ <div class="result grey">
2025+ <div id="output-box-40-button" class="toggle" onclick="javascript:toggleOutput('output-box-40')">+</div>
2026+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-40')">Cross-mounting of a blob without the from argument should yield session id</h4>
2027+ <br>
2028+ <div id="output-box-40" style="display: none;">
2029+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2030+ OCI_TEST_CONTENT_DISCOVERY=0
2031+ OCI_TEST_CONTENT_MANAGEMENT=0
2032+ OCI_TEST_PULL=1
2033+ OCI_TEST_PUSH=0
2034+ </pre>
2035+ </div>
2036+ </div>
2037+
2038+
2039+
2040+
2041+ <div class="result grey">
2042+ <div id="output-box-41-button" class="toggle" onclick="javascript:toggleOutput('output-box-41')">+</div>
2043+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-41')">POST request to mount another repository&#39;s blob should return 201 or 202</h4>
2044+ <br>
2045+ <div id="output-box-41" style="display: none;">
2046+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2047+ OCI_TEST_PUSH=0
2048+ OCI_TEST_CONTENT_DISCOVERY=0
2049+ OCI_TEST_CONTENT_MANAGEMENT=0
2050+ OCI_TEST_PULL=1
2051+ </pre>
2052+ </div>
2053+ </div>
2054+
2055+
2056+
2057+
2058+ <div class="result grey">
2059+ <div id="output-box-42-button" class="toggle" onclick="javascript:toggleOutput('output-box-42')">+</div>
2060+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-42')">GET request to test digest within cross-mount namespace should return 200</h4>
2061+ <br>
2062+ <div id="output-box-42" style="display: none;">
2063+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2064+ OCI_TEST_CONTENT_MANAGEMENT=0
2065+ OCI_TEST_PULL=1
2066+ OCI_TEST_PUSH=0
2067+ OCI_TEST_CONTENT_DISCOVERY=0
2068+ </pre>
2069+ </div>
2070+ </div>
2071+
2072+
2073+
2074+
2075+ <div class="result grey">
2076+ <div id="output-box-43-button" class="toggle" onclick="javascript:toggleOutput('output-box-43')">+</div>
2077+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-43')">Cross-mounting of nonexistent blob should yield session id</h4>
2078+ <br>
2079+ <div id="output-box-43" style="display: none;">
2080+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2081+ OCI_TEST_PULL=1
2082+ OCI_TEST_PUSH=0
2083+ OCI_TEST_CONTENT_DISCOVERY=0
2084+ OCI_TEST_CONTENT_MANAGEMENT=0
2085+ </pre>
2086+ </div>
2087+ </div>
2088+
2089+
2090+
2091+
2092+ <div class="result grey">
2093+ <div id="output-box-44-button" class="toggle" onclick="javascript:toggleOutput('output-box-44')">+</div>
2094+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-44')">Cross-mounting without from, and automatic content discovery enabled should return a 201</h4>
2095+ <br>
2096+ <div id="output-box-44" style="display: none;">
2097+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2098+ OCI_TEST_PULL=1
2099+ OCI_TEST_PUSH=0
2100+ OCI_TEST_CONTENT_DISCOVERY=0
2101+ OCI_TEST_CONTENT_MANAGEMENT=0
2102+ </pre>
2103+ </div>
2104+ </div>
2105+
2106+
2107+
2108+
2109+ <div class="result grey">
2110+ <div id="output-box-45-button" class="toggle" onclick="javascript:toggleOutput('output-box-45')">+</div>
2111+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-45')">Cross-mounting without from, and automatic content discovery disabled should return a 202</h4>
2112+ <br>
2113+ <div id="output-box-45" style="display: none;">
2114+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2115+ OCI_TEST_PULL=1
2116+ OCI_TEST_PUSH=0
2117+ OCI_TEST_CONTENT_DISCOVERY=0
2118+ OCI_TEST_CONTENT_MANAGEMENT=0
2119+ </pre>
2120+ </div>
2121+ </div>
2122+
2123+ <br>
2124+
2125+
2126+ <h3>Manifest Upload</h3>
2127+
2128+
2129+
2130+
2131+
2132+
2133+ <div class="result grey">
2134+ <div id="output-box-46-button" class="toggle" onclick="javascript:toggleOutput('output-box-46')">+</div>
2135+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-46')">GET nonexistent manifest should return 404</h4>
2136+ <br>
2137+ <div id="output-box-46" style="display: none;">
2138+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2139+ OCI_TEST_PULL=1
2140+ OCI_TEST_PUSH=0
2141+ OCI_TEST_CONTENT_DISCOVERY=0
2142+ OCI_TEST_CONTENT_MANAGEMENT=0
2143+ </pre>
2144+ </div>
2145+ </div>
2146+
2147+
2148+
2149+
2150+ <div class="result grey">
2151+ <div id="output-box-47-button" class="toggle" onclick="javascript:toggleOutput('output-box-47')">+</div>
2152+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-47')">PUT should accept a manifest upload</h4>
2153+ <br>
2154+ <div id="output-box-47" style="display: none;">
2155+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2156+ OCI_TEST_PUSH=0
2157+ OCI_TEST_CONTENT_DISCOVERY=0
2158+ OCI_TEST_CONTENT_MANAGEMENT=0
2159+ OCI_TEST_PULL=1
2160+ </pre>
2161+ </div>
2162+ </div>
2163+
2164+
2165+
2166+
2167+ <div class="result grey">
2168+ <div id="output-box-48-button" class="toggle" onclick="javascript:toggleOutput('output-box-48')">+</div>
2169+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-48')">Registry should accept a manifest upload with no layers</h4>
2170+ <br>
2171+ <div id="output-box-48" style="display: none;">
2172+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2173+ OCI_TEST_CONTENT_DISCOVERY=0
2174+ OCI_TEST_CONTENT_MANAGEMENT=0
2175+ OCI_TEST_PULL=1
2176+ OCI_TEST_PUSH=0
2177+ </pre>
2178+ </div>
2179+ </div>
2180+
2181+
2182+
2183+
2184+ <div class="result grey">
2185+ <div id="output-box-49-button" class="toggle" onclick="javascript:toggleOutput('output-box-49')">+</div>
2186+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-49')">GET request to manifest URL (digest) should yield 200 response</h4>
2187+ <br>
2188+ <div id="output-box-49" style="display: none;">
2189+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2190+ OCI_TEST_PULL=1
2191+ OCI_TEST_PUSH=0
2192+ OCI_TEST_CONTENT_DISCOVERY=0
2193+ OCI_TEST_CONTENT_MANAGEMENT=0
2194+ </pre>
2195+ </div>
2196+ </div>
2197+
2198+ <br>
2199+
2200+
2201+ <h3>Teardown</h3>
2202+
2203+
2204+
2205+
2206+
2207+
2208+ <div class="result grey">
2209+ <div id="output-box-50-button" class="toggle" onclick="javascript:toggleOutput('output-box-50')">+</div>
2210+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-50')">Delete config blob created in tests</h4>
2211+ <br>
2212+ <div id="output-box-50" style="display: none;">
2213+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2214+ OCI_TEST_CONTENT_DISCOVERY=0
2215+ OCI_TEST_CONTENT_MANAGEMENT=0
2216+ OCI_TEST_PULL=1
2217+ OCI_TEST_PUSH=0
2218+ </pre>
2219+ </div>
2220+ </div>
2221+
2222+
2223+
2224+
2225+ <div class="result grey">
2226+ <div id="output-box-51-button" class="toggle" onclick="javascript:toggleOutput('output-box-51')">+</div>
2227+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-51')">Delete layer blob created in setup</h4>
2228+ <br>
2229+ <div id="output-box-51" style="display: none;">
2230+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2231+ OCI_TEST_PUSH=0
2232+ OCI_TEST_CONTENT_DISCOVERY=0
2233+ OCI_TEST_CONTENT_MANAGEMENT=0
2234+ OCI_TEST_PULL=1
2235+ </pre>
2236+ </div>
2237+ </div>
2238+
2239+
2240+
2241+
2242+ <div class="result grey">
2243+ <div id="output-box-52-button" class="toggle" onclick="javascript:toggleOutput('output-box-52')">+</div>
2244+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-52')">Delete manifest created in tests</h4>
2245+ <br>
2246+ <div id="output-box-52" style="display: none;">
2247+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2248+ OCI_TEST_CONTENT_DISCOVERY=0
2249+ OCI_TEST_CONTENT_MANAGEMENT=0
2250+ OCI_TEST_PULL=1
2251+ OCI_TEST_PUSH=0
2252+ </pre>
2253+ </div>
2254+ </div>
2255+
2256+ <br>
2257+
2258+
2259+
2260+
2261+ </div>
2262+
2263+
2264+
2265+
2266+ <h2>Content Discovery</h2>
2267+ <div class="subcategory">
2268+
2269+
2270+ <h3>Setup</h3>
2271+
2272+
2273+
2274+
2275+
2276+
2277+ <div class="result grey">
2278+ <div id="output-box-53-button" class="toggle" onclick="javascript:toggleOutput('output-box-53')">+</div>
2279+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-53')">Populate registry with test blob</h4>
2280+ <br>
2281+ <div id="output-box-53" style="display: none;">
2282+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2283+ OCI_TEST_PULL=1
2284+ OCI_TEST_PUSH=0
2285+ OCI_TEST_CONTENT_DISCOVERY=0
2286+ OCI_TEST_CONTENT_MANAGEMENT=0
2287+ </pre>
2288+ </div>
2289+ </div>
2290+
2291+
2292+
2293+
2294+ <div class="result grey">
2295+ <div id="output-box-54-button" class="toggle" onclick="javascript:toggleOutput('output-box-54')">+</div>
2296+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-54')">Populate registry with test layer</h4>
2297+ <br>
2298+ <div id="output-box-54" style="display: none;">
2299+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2300+ OCI_TEST_PULL=1
2301+ OCI_TEST_PUSH=0
2302+ OCI_TEST_CONTENT_DISCOVERY=0
2303+ OCI_TEST_CONTENT_MANAGEMENT=0
2304+ </pre>
2305+ </div>
2306+ </div>
2307+
2308+
2309+
2310+
2311+ <div class="result grey">
2312+ <div id="output-box-55-button" class="toggle" onclick="javascript:toggleOutput('output-box-55')">+</div>
2313+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-55')">Populate registry with test tags</h4>
2314+ <br>
2315+ <div id="output-box-55" style="display: none;">
2316+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2317+ OCI_TEST_PULL=1
2318+ OCI_TEST_PUSH=0
2319+ OCI_TEST_CONTENT_DISCOVERY=0
2320+ OCI_TEST_CONTENT_MANAGEMENT=0
2321+ </pre>
2322+ </div>
2323+ </div>
2324+
2325+
2326+
2327+
2328+ <div class="result grey">
2329+ <div id="output-box-56-button" class="toggle" onclick="javascript:toggleOutput('output-box-56')">+</div>
2330+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-56')">Populate registry with test tags (no push)</h4>
2331+ <br>
2332+ <div id="output-box-56" style="display: none;">
2333+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2334+ OCI_TEST_PULL=1
2335+ OCI_TEST_PUSH=0
2336+ OCI_TEST_CONTENT_DISCOVERY=0
2337+ OCI_TEST_CONTENT_MANAGEMENT=0
2338+ </pre>
2339+ </div>
2340+ </div>
2341+
2342+
2343+
2344+
2345+ <div class="result grey">
2346+ <div id="output-box-57-button" class="toggle" onclick="javascript:toggleOutput('output-box-57')">+</div>
2347+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-57')">References setup</h4>
2348+ <br>
2349+ <div id="output-box-57" style="display: none;">
2350+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2351+ OCI_TEST_PULL=1
2352+ OCI_TEST_PUSH=0
2353+ OCI_TEST_CONTENT_DISCOVERY=0
2354+ OCI_TEST_CONTENT_MANAGEMENT=0
2355+ </pre>
2356+ </div>
2357+ </div>
2358+
2359+ <br>
2360+
2361+
2362+ <h3>Test content discovery endpoints (listing tags)</h3>
2363+
2364+
2365+
2366+
2367+
2368+
2369+ <div class="result grey">
2370+ <div id="output-box-58-button" class="toggle" onclick="javascript:toggleOutput('output-box-58')">+</div>
2371+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-58')">GET request to list tags should yield 200 response</h4>
2372+ <br>
2373+ <div id="output-box-58" style="display: none;">
2374+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2375+ OCI_TEST_PULL=1
2376+ OCI_TEST_PUSH=0
2377+ OCI_TEST_CONTENT_DISCOVERY=0
2378+ OCI_TEST_CONTENT_MANAGEMENT=0
2379+ </pre>
2380+ </div>
2381+ </div>
2382+
2383+
2384+
2385+
2386+ <div class="result grey">
2387+ <div id="output-box-59-button" class="toggle" onclick="javascript:toggleOutput('output-box-59')">+</div>
2388+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-59')">GET number of tags should be limitable by `n` query parameter</h4>
2389+ <br>
2390+ <div id="output-box-59" style="display: none;">
2391+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2392+ OCI_TEST_PULL=1
2393+ OCI_TEST_PUSH=0
2394+ OCI_TEST_CONTENT_DISCOVERY=0
2395+ OCI_TEST_CONTENT_MANAGEMENT=0
2396+ </pre>
2397+ </div>
2398+ </div>
2399+
2400+
2401+
2402+
2403+ <div class="result grey">
2404+ <div id="output-box-60-button" class="toggle" onclick="javascript:toggleOutput('output-box-60')">+</div>
2405+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-60')">GET start of tag is set by `last` query parameter</h4>
2406+ <br>
2407+ <div id="output-box-60" style="display: none;">
2408+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2409+ OCI_TEST_PULL=1
2410+ OCI_TEST_PUSH=0
2411+ OCI_TEST_CONTENT_DISCOVERY=0
2412+ OCI_TEST_CONTENT_MANAGEMENT=0
2413+ </pre>
2414+ </div>
2415+ </div>
2416+
2417+ <br>
2418+
2419+
2420+ <h3>Test content discovery endpoints (listing references)</h3>
2421+
2422+
2423+
2424+
2425+
2426+
2427+ <div class="result grey">
2428+ <div id="output-box-61-button" class="toggle" onclick="javascript:toggleOutput('output-box-61')">+</div>
2429+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-61')">GET request to nonexistent blob should result in empty 200 response</h4>
2430+ <br>
2431+ <div id="output-box-61" style="display: none;">
2432+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2433+ OCI_TEST_CONTENT_DISCOVERY=0
2434+ OCI_TEST_CONTENT_MANAGEMENT=0
2435+ OCI_TEST_PULL=1
2436+ OCI_TEST_PUSH=0
2437+ </pre>
2438+ </div>
2439+ </div>
2440+
2441+
2442+
2443+
2444+ <div class="result grey">
2445+ <div id="output-box-62-button" class="toggle" onclick="javascript:toggleOutput('output-box-62')">+</div>
2446+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-62')">GET request to existing blob should yield 200</h4>
2447+ <br>
2448+ <div id="output-box-62" style="display: none;">
2449+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2450+ OCI_TEST_PUSH=0
2451+ OCI_TEST_CONTENT_DISCOVERY=0
2452+ OCI_TEST_CONTENT_MANAGEMENT=0
2453+ OCI_TEST_PULL=1
2454+ </pre>
2455+ </div>
2456+ </div>
2457+
2458+
2459+
2460+
2461+ <div class="result grey">
2462+ <div id="output-box-63-button" class="toggle" onclick="javascript:toggleOutput('output-box-63')">+</div>
2463+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-63')">GET request to existing blob with filter should yield 200</h4>
2464+ <br>
2465+ <div id="output-box-63" style="display: none;">
2466+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2467+ OCI_TEST_PULL=1
2468+ OCI_TEST_PUSH=0
2469+ OCI_TEST_CONTENT_DISCOVERY=0
2470+ OCI_TEST_CONTENT_MANAGEMENT=0
2471+ </pre>
2472+ </div>
2473+ </div>
2474+
2475+
2476+
2477+
2478+ <div class="result grey">
2479+ <div id="output-box-64-button" class="toggle" onclick="javascript:toggleOutput('output-box-64')">+</div>
2480+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-64')">GET request to missing manifest should yield 200</h4>
2481+ <br>
2482+ <div id="output-box-64" style="display: none;">
2483+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2484+ OCI_TEST_PULL=1
2485+ OCI_TEST_PUSH=0
2486+ OCI_TEST_CONTENT_DISCOVERY=0
2487+ OCI_TEST_CONTENT_MANAGEMENT=0
2488+ </pre>
2489+ </div>
2490+ </div>
2491+
2492+ <br>
2493+
2494+
2495+ <h3>Teardown</h3>
2496+
2497+
2498+
2499+
2500+
2501+
2502+ <div class="result grey">
2503+ <div id="output-box-65-button" class="toggle" onclick="javascript:toggleOutput('output-box-65')">+</div>
2504+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-65')">Delete config blob created in tests</h4>
2505+ <br>
2506+ <div id="output-box-65" style="display: none;">
2507+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2508+ OCI_TEST_PULL=1
2509+ OCI_TEST_PUSH=0
2510+ OCI_TEST_CONTENT_DISCOVERY=0
2511+ OCI_TEST_CONTENT_MANAGEMENT=0
2512+ </pre>
2513+ </div>
2514+ </div>
2515+
2516+
2517+
2518+
2519+ <div class="result grey">
2520+ <div id="output-box-66-button" class="toggle" onclick="javascript:toggleOutput('output-box-66')">+</div>
2521+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-66')">Delete layer blob created in setup</h4>
2522+ <br>
2523+ <div id="output-box-66" style="display: none;">
2524+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2525+ OCI_TEST_PULL=1
2526+ OCI_TEST_PUSH=0
2527+ OCI_TEST_CONTENT_DISCOVERY=0
2528+ OCI_TEST_CONTENT_MANAGEMENT=0
2529+ </pre>
2530+ </div>
2531+ </div>
2532+
2533+
2534+
2535+
2536+ <div class="result grey">
2537+ <div id="output-box-67-button" class="toggle" onclick="javascript:toggleOutput('output-box-67')">+</div>
2538+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-67')">Delete created manifest &amp; associated tags</h4>
2539+ <br>
2540+ <div id="output-box-67" style="display: none;">
2541+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2542+ OCI_TEST_CONTENT_DISCOVERY=0
2543+ OCI_TEST_CONTENT_MANAGEMENT=0
2544+ OCI_TEST_PULL=1
2545+ OCI_TEST_PUSH=0
2546+ </pre>
2547+ </div>
2548+ </div>
2549+
2550+
2551+
2552+
2553+ <div class="result grey">
2554+ <div id="output-box-68-button" class="toggle" onclick="javascript:toggleOutput('output-box-68')">+</div>
2555+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-68')">References teardown</h4>
2556+ <br>
2557+ <div id="output-box-68" style="display: none;">
2558+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2559+ OCI_TEST_PULL=1
2560+ OCI_TEST_PUSH=0
2561+ OCI_TEST_CONTENT_DISCOVERY=0
2562+ OCI_TEST_CONTENT_MANAGEMENT=0
2563+ </pre>
2564+ </div>
2565+ </div>
2566+
2567+ <br>
2568+
2569+
2570+
2571+
2572+ </div>
2573+
2574+
2575+
2576+
2577+ <h2>Content Management</h2>
2578+ <div class="subcategory">
2579+
2580+
2581+ <h3>Setup</h3>
2582+
2583+
2584+
2585+
2586+
2587+
2588+ <div class="result grey">
2589+ <div id="output-box-69-button" class="toggle" onclick="javascript:toggleOutput('output-box-69')">+</div>
2590+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-69')">Populate registry with test config blob</h4>
2591+ <br>
2592+ <div id="output-box-69" style="display: none;">
2593+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2594+ OCI_TEST_PULL=1
2595+ OCI_TEST_PUSH=0
2596+ OCI_TEST_CONTENT_DISCOVERY=0
2597+ OCI_TEST_CONTENT_MANAGEMENT=0
2598+ </pre>
2599+ </div>
2600+ </div>
2601+
2602+
2603+
2604+
2605+ <div class="result grey">
2606+ <div id="output-box-70-button" class="toggle" onclick="javascript:toggleOutput('output-box-70')">+</div>
2607+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-70')">Populate registry with test layer</h4>
2608+ <br>
2609+ <div id="output-box-70" style="display: none;">
2610+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2611+ OCI_TEST_PULL=1
2612+ OCI_TEST_PUSH=0
2613+ OCI_TEST_CONTENT_DISCOVERY=0
2614+ OCI_TEST_CONTENT_MANAGEMENT=0
2615+ </pre>
2616+ </div>
2617+ </div>
2618+
2619+
2620+
2621+
2622+ <div class="result grey">
2623+ <div id="output-box-71-button" class="toggle" onclick="javascript:toggleOutput('output-box-71')">+</div>
2624+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-71')">Populate registry with test tag</h4>
2625+ <br>
2626+ <div id="output-box-71" style="display: none;">
2627+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2628+ OCI_TEST_PUSH=0
2629+ OCI_TEST_CONTENT_DISCOVERY=0
2630+ OCI_TEST_CONTENT_MANAGEMENT=0
2631+ OCI_TEST_PULL=1
2632+ </pre>
2633+ </div>
2634+ </div>
2635+
2636+
2637+
2638+
2639+ <div class="result grey">
2640+ <div id="output-box-72-button" class="toggle" onclick="javascript:toggleOutput('output-box-72')">+</div>
2641+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-72')">Check how many tags there are before anything gets deleted</h4>
2642+ <br>
2643+ <div id="output-box-72" style="display: none;">
2644+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2645+ OCI_TEST_PUSH=0
2646+ OCI_TEST_CONTENT_DISCOVERY=0
2647+ OCI_TEST_CONTENT_MANAGEMENT=0
2648+ OCI_TEST_PULL=1
2649+ </pre>
2650+ </div>
2651+ </div>
2652+
2653+ <br>
2654+
2655+
2656+ <h3>Manifest delete</h3>
2657+
2658+
2659+
2660+
2661+
2662+
2663+ <div class="result grey">
2664+ <div id="output-box-73-button" class="toggle" onclick="javascript:toggleOutput('output-box-73')">+</div>
2665+ <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>
2666+ <br>
2667+ <div id="output-box-73" style="display: none;">
2668+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2669+ OCI_TEST_PUSH=0
2670+ OCI_TEST_CONTENT_DISCOVERY=0
2671+ OCI_TEST_CONTENT_MANAGEMENT=0
2672+ OCI_TEST_PULL=1
2673+ </pre>
2674+ </div>
2675+ </div>
2676+
2677+
2678+
2679+
2680+ <div class="result grey">
2681+ <div id="output-box-74-button" class="toggle" onclick="javascript:toggleOutput('output-box-74')">+</div>
2682+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-74')">DELETE request to manifest (digest) should yield 202 response unless already deleted</h4>
2683+ <br>
2684+ <div id="output-box-74" style="display: none;">
2685+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2686+ OCI_TEST_PULL=1
2687+ OCI_TEST_PUSH=0
2688+ OCI_TEST_CONTENT_DISCOVERY=0
2689+ OCI_TEST_CONTENT_MANAGEMENT=0
2690+ </pre>
2691+ </div>
2692+ </div>
2693+
2694+
2695+
2696+
2697+ <div class="result grey">
2698+ <div id="output-box-75-button" class="toggle" onclick="javascript:toggleOutput('output-box-75')">+</div>
2699+ <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>
2700+ <br>
2701+ <div id="output-box-75" style="display: none;">
2702+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2703+ OCI_TEST_PUSH=0
2704+ OCI_TEST_CONTENT_DISCOVERY=0
2705+ OCI_TEST_CONTENT_MANAGEMENT=0
2706+ OCI_TEST_PULL=1
2707+ </pre>
2708+ </div>
2709+ </div>
2710+
2711+
2712+
2713+
2714+ <div class="result grey">
2715+ <div id="output-box-76-button" class="toggle" onclick="javascript:toggleOutput('output-box-76')">+</div>
2716+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-76')">GET request to tags list should reflect manifest deletion</h4>
2717+ <br>
2718+ <div id="output-box-76" style="display: none;">
2719+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2720+ OCI_TEST_CONTENT_MANAGEMENT=0
2721+ OCI_TEST_PULL=1
2722+ OCI_TEST_PUSH=0
2723+ OCI_TEST_CONTENT_DISCOVERY=0
2724+ </pre>
2725+ </div>
2726+ </div>
2727+
2728+ <br>
2729+
2730+
2731+ <h3>Blob delete</h3>
2732+
2733+
2734+
2735+
2736+
2737+
2738+ <div class="result grey">
2739+ <div id="output-box-77-button" class="toggle" onclick="javascript:toggleOutput('output-box-77')">+</div>
2740+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-77')">DELETE request to blob URL should yield 202 response</h4>
2741+ <br>
2742+ <div id="output-box-77" style="display: none;">
2743+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2744+ OCI_TEST_CONTENT_MANAGEMENT=0
2745+ OCI_TEST_PULL=1
2746+ OCI_TEST_PUSH=0
2747+ OCI_TEST_CONTENT_DISCOVERY=0
2748+ </pre>
2749+ </div>
2750+ </div>
2751+
2752+
2753+
2754+
2755+ <div class="result grey">
2756+ <div id="output-box-78-button" class="toggle" onclick="javascript:toggleOutput('output-box-78')">+</div>
2757+ <h4 style="display: inline;" onclick="javascript:toggleOutput('output-box-78')">GET request to deleted blob URL should yield 404 response</h4>
2758+ <br>
2759+ <div id="output-box-78" style="display: none;">
2760+ <pre class="pre-box">you have skipped this test; if this is an error, check your environment variable settings:
2761+ OCI_TEST_PULL=1
2762+ OCI_TEST_PUSH=0
2763+ OCI_TEST_CONTENT_DISCOVERY=0
2764+ OCI_TEST_CONTENT_MANAGEMENT=0
2765+ </pre>
2766+ </div>
2767+ </div>
2768+
2769+ <br>
2770+
2771+
2772+
2773+
2774+ </div>
2775+
2776+
2777+ </div>
2778+ </body>
2779+ </html>
2780 diff --git a/src/axum/error.rs b/src/axum/error.rs
2781new file mode 100644
2782index 0000000..c43905a
2783--- /dev/null
2784+++ b/src/axum/error.rs
2785 @@ -0,0 +1,75 @@
2786+ use axum::{Json, extract::rejection::BytesRejection, response::IntoResponse};
2787+ use http::StatusCode;
2788+
2789+ #[derive(serde::Serialize, Debug)]
2790+ pub struct Message {
2791+ pub code: String,
2792+ pub message: String,
2793+ pub detail: Option<String>,
2794+ }
2795+
2796+ #[derive(thiserror::Error, Debug)]
2797+ pub enum Error {
2798+ #[error("Papyri: {0}")]
2799+ Papyri(#[from] crate::error::Error),
2800+ #[error("Connection: {0}")]
2801+ Connection(#[from] BytesRejection),
2802+ }
2803+
2804+ impl From<&Error> for Message {
2805+ fn from(val: &Error) -> Self {
2806+ match val {
2807+ Error::Papyri(_) => todo!(),
2808+ Error::Connection(_) => todo!(),
2809+ }
2810+ // match val {
2811+ // crate::error::Code(code) => match code {
2812+ // Code::BlobUnknown => Message {
2813+ // code: String::from("BLOB_UNKNOWN"),
2814+ // message: String::from("blob unknown to registry"),
2815+ // detail: None,
2816+ // },
2817+ // Code::BlobUploadInvalid => todo!(),
2818+ // Code::BlobUploadUnknown => todo!(),
2819+ // Code::DigestInvalid => todo!(),
2820+ // Code::ManifestBlobUnknown => todo!(),
2821+ // Code::ManifestInvalid => todo!(),
2822+ // Code::ManifestUnknown => todo!(),
2823+ // Code::NameInvalid => todo!(),
2824+ // Code::NameUnknown => todo!(),
2825+ // Code::SizeInvalid => todo!(),
2826+ // Code::Unathorized => todo!(),
2827+ // Code::Denied => todo!(),
2828+ // Code::Unsupported => todo!(),
2829+ // Code::TooManyRequests => todo!(),
2830+ // },
2831+ // Error::Storage(error) => Message {
2832+ // code: String::from("STORAGE_ERROR"),
2833+ // message: String::from("Storage level failure"),
2834+ // detail: Some(error.to_string()),
2835+ // },
2836+ // Error::OciInternal(oci_spec_error) => Message {
2837+ // code: String::from("OCI_SPEC_ERROR"),
2838+ // message: String::from("Failed to parse OCI specification"),
2839+ // detail: Some(oci_spec_error.to_string()),
2840+ // },
2841+ // Error::OciParsing(parse_error) => todo!(),
2842+ // Error::Stream(_) => todo!(),
2843+ // }
2844+ }
2845+ }
2846+
2847+ impl IntoResponse for Error {
2848+ fn into_response(self) -> axum::response::Response {
2849+ let message = Message::from(&self);
2850+ match self {
2851+ Error::Papyri(_) => {
2852+ let mut res = Json(message).into_response();
2853+ let status_code = res.status_mut();
2854+ *status_code = StatusCode::INTERNAL_SERVER_ERROR;
2855+ res
2856+ }
2857+ Error::Connection(_) => todo!(),
2858+ }
2859+ }
2860+ }
2861 diff --git a/src/axum/extractors.rs b/src/axum/extractors.rs
2862new file mode 100644
2863index 0000000..8b13789
2864--- /dev/null
2865+++ b/src/axum/extractors.rs
2866 @@ -0,0 +1 @@
2867+
2868 diff --git a/src/axum/handlers.rs b/src/axum/handlers.rs
2869new file mode 100644
2870index 0000000..ef8f52d
2871--- /dev/null
2872+++ b/src/axum/handlers.rs
2873 @@ -0,0 +1,34 @@
2874+ use std::{str::FromStr, sync::Arc};
2875+
2876+ use super::{AppState, error::Error};
2877+ use crate::Namespace;
2878+ use axum::{
2879+ Extension, Json,
2880+ body::HttpBody,
2881+ extract::{FromRequest, Path, Query, Request, State},
2882+ http::StatusCode,
2883+ response::{IntoResponse, Response},
2884+ };
2885+ use bytes::{Buf, Bytes};
2886+ use futures::TryStreamExt;
2887+ use oci_spec::distribution::TagList;
2888+ use serde_json::json;
2889+
2890+ pub async fn index() -> Result<Json<serde_json::Value>, Error> {
2891+ Ok(Json(json!({})))
2892+ }
2893+
2894+ pub(crate) async fn read_tags(
2895+ State(state): State<Arc<AppState>>,
2896+ Path(name): Path<String>,
2897+ ) -> Result<Json<TagList>, Error> {
2898+ let namespace = Namespace::from_str(&name)?;
2899+ let tags = state.oci.list_tags(&namespace).await?;
2900+ Ok(Json(tags))
2901+ }
2902+
2903+ pub async fn read_referrers() {}
2904+
2905+ pub async fn delete_manifest() {}
2906+ pub async fn delete_tag() {}
2907+ pub async fn delete_blob() {}
2908 diff --git a/src/axum/handlers_blob.rs b/src/axum/handlers_blob.rs
2909new file mode 100644
2910index 0000000..ac30b2b
2911--- /dev/null
2912+++ b/src/axum/handlers_blob.rs
2913 @@ -0,0 +1,120 @@
2914+ use std::{str::FromStr, sync::Arc};
2915+
2916+ use axum::{
2917+ Extension,
2918+ extract::{Path, Query, Request, State},
2919+ response::Response,
2920+ };
2921+ use futures::TryStreamExt;
2922+ use http::{HeaderValue, StatusCode, header::CONTENT_LENGTH};
2923+ use oci_spec::image::Digest;
2924+ use serde::Deserialize;
2925+ use uuid::Uuid;
2926+
2927+ use crate::Namespace;
2928+
2929+ use super::{AppState, error::Error};
2930+
2931+ const OCI_CHUNK_MIN_LENGTH: usize = 10_000_000;
2932+
2933+ #[derive(Deserialize)]
2934+ pub struct UploadQuery {
2935+ pub digest: Digest,
2936+ }
2937+
2938+ /// Initiate a blob upload
2939+ /// FIXME: Per the spec for chunked uploads a header of Content-Length: 0
2940+ /// MUST be present (for some reason).
2941+ pub async fn initiate(State(state): State<Arc<AppState>>) -> Result<Response, Error> {
2942+ let uuid = state.oci.new_blob().await?;
2943+ let mut res = Response::new(axum::body::Body::empty());
2944+ let status = res.status_mut();
2945+ *status = StatusCode::ACCEPTED;
2946+ let headers = res.headers_mut();
2947+ let uuid_str = uuid.to_string();
2948+ let uri = format!("/v2/upload/{}", uuid_str);
2949+ headers.insert("Location", uri.parse().unwrap());
2950+ // FIXME: make configurable
2951+ headers.insert(
2952+ "OCI-Chunk-Min-Length",
2953+ HeaderValue::from_str(&OCI_CHUNK_MIN_LENGTH.to_string()).unwrap(),
2954+ );
2955+ Ok(res)
2956+ }
2957+
2958+ pub async fn read(
2959+ State(state): State<Arc<AppState>>,
2960+ Extension(namespace): Extension<Namespace>,
2961+ Path(digest): Path<Digest>,
2962+ ) -> Result<Response, Error> {
2963+ let handle = state.oci.read_blob(&digest).await?;
2964+ let body = axum::body::Body::from_stream(handle);
2965+ let res = Response::new(body);
2966+ Ok(res)
2967+ }
2968+
2969+ pub async fn stat(
2970+ State(state): State<Arc<AppState>>,
2971+ Path(digest): Path<Digest>,
2972+ ) -> Result<StatusCode, Error> {
2973+ if !state.oci.has_blob(&digest).await? {
2974+ Ok(StatusCode::NOT_FOUND)
2975+ } else {
2976+ Ok(StatusCode::OK)
2977+ }
2978+ }
2979+
2980+ pub async fn write_chunk(
2981+ State(state): State<Arc<AppState>>,
2982+ Path(upload_uuid): Path<String>,
2983+ req: Request,
2984+ ) -> Result<Response, Error> {
2985+ let uuid = Uuid::from_str(&upload_uuid)
2986+ .map_err(|_| crate::Error::Code(crate::error::Code::BlobUploadInvalid))?;
2987+ let stream = req.into_body().into_data_stream();
2988+ let stream = stream.map_err(|e| crate::Error::Stream(e.to_string()));
2989+ state.oci.write_chunk(Box::pin(stream), &uuid).await?;
2990+ let mut res = Response::new(axum::body::Body::empty());
2991+ let status = res.status_mut();
2992+ *status = StatusCode::ACCEPTED;
2993+ let uuid_str = uuid.to_string();
2994+ let uri = format!("/v2/upload/{}", uuid_str);
2995+ let headers = res.headers_mut();
2996+ headers.insert("Location", uri.parse().unwrap());
2997+ Ok(res)
2998+ }
2999+
3000+
3001+ /// Write a complete blob in one request
3002+ pub async fn write(
3003+ State(state): State<Arc<AppState>>,
3004+ Path(upload_uuid): Path<String>,
3005+ Query(query): Query<UploadQuery>,
3006+ req: Request,
3007+ ) -> Result<StatusCode, Error> {
3008+ let uuid = Uuid::from_str(&upload_uuid)
3009+ .map_err(|_| crate::error::Error::Code(crate::error::Code::BlobUploadInvalid))?;
3010+ let stream = req.into_body().into_data_stream();
3011+ let stream = stream.map_err(|e| crate::error::Error::Stream(e.to_string()));
3012+ state.oci.write_chunk(Box::pin(stream), &uuid).await?;
3013+ state.oci.commit_blob(&uuid, &query.digest).await?;
3014+ Ok(StatusCode::OK)
3015+ }
3016+
3017+ pub async fn close(
3018+ State(state): State<Arc<AppState>>,
3019+ Path(upload_uuid): Path<String>,
3020+ Query(query): Query<UploadQuery>,
3021+ req: Request,
3022+ ) -> Result<StatusCode, Error> {
3023+ let uuid = Uuid::from_str(&upload_uuid)
3024+ .map_err(|_| crate::Error::Code(crate::error::Code::BlobUploadInvalid))?;
3025+ let headers = req.headers();
3026+ if headers.get(CONTENT_LENGTH).is_some() {
3027+ let stream = req.into_body().into_data_stream();
3028+ let stream = stream.map_err(|e| crate::error::Error::Stream(e.to_string()));
3029+ state.oci.write_chunk(Box::pin(stream), &uuid).await?;
3030+ }
3031+ state.oci.commit_blob(&uuid, &query.digest).await?;
3032+ Ok(StatusCode::CREATED)
3033+ }
3034 diff --git a/src/axum/handlers_manifest.rs b/src/axum/handlers_manifest.rs
3035new file mode 100644
3036index 0000000..3e47f23
3037--- /dev/null
3038+++ b/src/axum/handlers_manifest.rs
3039 @@ -0,0 +1,64 @@
3040+ use std::{str::FromStr, sync::Arc};
3041+
3042+ use axum::{
3043+ extract::{FromRequest, Path, Request, State}, Extension, Json
3044+ };
3045+ use bytes::{Buf, Bytes};
3046+ use http::{header::CONTENT_TYPE, StatusCode};
3047+ use oci_spec::{distribution::Reference, image::{ImageManifest, MediaType}};
3048+
3049+ use crate::Namespace;
3050+
3051+ use super::{AppState, error::Error};
3052+
3053+ /// Extracts the manifest but also retains the exact byte specification of the
3054+ /// client manifest input.
3055+ pub struct ManifestExtractor((Bytes, ImageManifest));
3056+
3057+ impl<S> FromRequest<S> for ManifestExtractor
3058+ where
3059+ S: Send + Sync,
3060+ {
3061+ type Rejection = super::error::Error;
3062+
3063+ async fn from_request(req: Request, state: &S) -> Result<Self, Self::Rejection> {
3064+ let headers = req.headers();
3065+ let Some(content_type) = headers.get(CONTENT_TYPE) else {
3066+ todo!()
3067+ };
3068+ let content_type_str = content_type.to_str().unwrap();
3069+ let media_type = MediaType::from(content_type_str);
3070+ if !matches!(media_type, MediaType::ImageManifest) {
3071+ todo!()
3072+ }
3073+ let body = Bytes::from_request(req, state).await?;
3074+
3075+ let buf = body.as_ref().reader();
3076+ let manifest = ImageManifest::from_reader(buf).map_err(|e| crate::error::Error::from(e))?;
3077+ Ok(ManifestExtractor((body, manifest)))
3078+ }
3079+ }
3080+
3081+ pub async fn read(
3082+ State(state): State<Arc<AppState>>,
3083+ Path((name, reference)): Path<(String, String)>,
3084+ ) -> Result<Json<ImageManifest>, Error> {
3085+ let namespace = Namespace::from_str(&name)?;
3086+ let reference = Reference::from_str(&reference).unwrap();
3087+ let manifest = state.oci.read_manifest(&namespace, &reference).await?;
3088+ Ok(Json(manifest))
3089+ }
3090+
3091+ pub async fn write(
3092+ Extension(namespace): Extension<Namespace>,
3093+ State(state): State<Arc<AppState>>,
3094+ Path(reference): Path<String>,
3095+ ManifestExtractor((manifest_bytes, manifest)): ManifestExtractor,
3096+ ) -> Result<StatusCode, Error> {
3097+ let digest = manifest.config().digest();
3098+ state
3099+ .oci
3100+ .write_manifest(&namespace, digest, &reference, &manifest_bytes)
3101+ .await?;
3102+ Ok(StatusCode::OK)
3103+ }
3104 diff --git a/src/axum/mod.rs b/src/axum/mod.rs
3105new file mode 100644
3106index 0000000..7eac269
3107--- /dev/null
3108+++ b/src/axum/mod.rs
3109 @@ -0,0 +1,118 @@
3110+ use std::str::FromStr;
3111+ use std::sync::Arc;
3112+
3113+ use axum::Json;
3114+ use axum::extract::{DefaultBodyLimit, Request};
3115+ use axum::routing::{head, patch, post, put};
3116+ use axum::{Router, routing::get};
3117+ use http::Uri;
3118+ use serde_json::json;
3119+
3120+ use crate::Namespace;
3121+ use crate::oci_interface::OciInterface;
3122+ use crate::storage::Storage;
3123+
3124+ mod error;
3125+ mod extractors;
3126+ mod handlers;
3127+ mod handlers_blob;
3128+ mod handlers_manifest;
3129+
3130+ #[derive(Clone)]
3131+ pub(crate) struct AppState {
3132+ pub oci: OciInterface,
3133+ }
3134+
3135+ pub fn read_ns(uri: &str) -> Option<(Namespace, String)> {
3136+ let mut components: Vec<String> = uri.split("/").map(|cmp| cmp.to_string()).collect();
3137+ components.reverse();
3138+ let stop = components.iter().enumerate().find_map(|(i, entry)| {
3139+ if *entry == "blobs" || *entry == "manifests" || *entry == "tags" {
3140+ Some(i + 1)
3141+ } else {
3142+ None
3143+ }
3144+ });
3145+ if let Some(stop) = stop {
3146+ let (route, ns) = components.split_at(stop);
3147+ let mut ns: Vec<String> = ns.iter().map(String::from).collect();
3148+ ns.reverse();
3149+ let ns = ns.join("/");
3150+ let mut route: Vec<String> = route.iter().map(String::from).collect();
3151+ route.reverse();
3152+ let route = format!("/{}", route.join("/"));
3153+ Some((Namespace::from_str(&ns).unwrap(), route))
3154+ } else {
3155+ None
3156+ }
3157+ }
3158+
3159+ /// Due to the registry spec allowing "namespacing", e.g. fuu/bar/baz/blobs/...
3160+ /// it is required that we rewrite the URI extacting any namespace if it is
3161+ /// specified.
3162+ pub fn extract_namespace(mut req: Request<axum::body::Body>) -> Request<axum::body::Body> {
3163+ let uri_str = req.uri().to_string();
3164+ if let Some((namespace, route)) = read_ns(&uri_str) {
3165+ tracing::info!("Namespace is {}", namespace);
3166+ let extensions = req.extensions_mut();
3167+ extensions.insert(namespace);
3168+ let uri = req.uri_mut();
3169+ *uri = Uri::from_str(&route).unwrap();
3170+ }
3171+ req
3172+ }
3173+
3174+ #[axum::debug_handler]
3175+ pub async fn index() -> Result<Json<serde_json::Value>, error::Error> {
3176+ Ok(Json(json!({})))
3177+ }
3178+
3179+ const MAXIMUM_MANIFEST_SIZE: usize = 5_000_000;
3180+
3181+ pub fn router(storage: &Storage) -> Router {
3182+ Router::new()
3183+ .route("/v2", get(index))
3184+ .route("/upload/{reference}", patch(handlers_blob::write_chunk))
3185+ .route("/upload/{reference}", post(handlers_blob::write))
3186+ .route("/upload/{reference}", put(handlers_blob::close))
3187+ .route("/blobs/uploads", post(handlers_blob::initiate))
3188+ .route("/blobs/{digest}", head(handlers_blob::stat))
3189+ .route("/blobs/{digest}", get(handlers_blob::read))
3190+ .route(
3191+ "/manifests/{digest}",
3192+ put(handlers_manifest::write)
3193+ .layer(DefaultBodyLimit::max(MAXIMUM_MANIFEST_SIZE)),
3194+ )
3195+ // // .route("/{name}/blobs/{digest}", head(crate::handlers::stat_blob))
3196+ // // .route(
3197+ // // "/{name}/manifests/{reference}",
3198+ // // get(crate::handlers::read_manifest),
3199+ // // )
3200+ // // .route(
3201+ // // "/{name}/manifests/{reference}",
3202+ // // head(crate::handlers::read_manifest),
3203+ // // )
3204+ // // .route("/{name}/blobs/uploads", post(crate::handlers::initiate_blob))
3205+ // // .route(
3206+ // // "/{name}/blobs/uploads/{reference}",
3207+ // // patch(crate::handlers::write_blob),
3208+ // // )
3209+ // // .route(
3210+ // // "/{name}/manifests/{reference}",
3211+ // // put(crate::handlers::write_manifest),
3212+ // // )
3213+ // // .route("/{name}/tags/list", get(crate::handlers::read_tags))
3214+ // // .route(
3215+ // // "/{name}/manifests/{reference}",
3216+ // // delete(crate::handlers::delete_manifest),
3217+ // // )
3218+ // // .route(
3219+ // // "/{name}/blobs/{digest}",
3220+ // // delete(crate::handlers::delete_blob),
3221+ // // )
3222+ .with_state(Arc::new(AppState {
3223+ oci: OciInterface {
3224+ storage: storage.clone(),
3225+ },
3226+ }))
3227+ }
3228 diff --git a/src/error.rs b/src/error.rs
3229index ddc49ec..dcdec17 100644
3230--- a/src/error.rs
3231+++ b/src/error.rs
3232 @@ -1,5 +1,4 @@
3233- use axum::{Json, response::IntoResponse};
3234- use http::StatusCode;
3235+ use std::fmt::Display;
3236
3237 use crate::storage::Error as StorageError;
3238
3239 @@ -24,7 +23,7 @@ pub enum Code {
3240 BlobUnknown,
3241 BlobUploadInvalid,
3242 BlobUploadUnknown,
3243- DigestInvalid,
3244+ DigestInvalid(String),
3245 ManifestBlobUnknown,
3246 ManifestInvalid,
3247 ManifestUnknown,
3248 @@ -37,13 +36,14 @@ pub enum Code {
3249 TooManyRequests,
3250 }
3251
3252- #[derive(serde::Serialize, Debug)]
3253- pub struct Message {
3254- pub code: String,
3255- pub message: String,
3256- pub detail: Option<String>,
3257+ impl Display for Code {
3258+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
3259+ todo!()
3260+ }
3261 }
3262
3263+ impl std::error::Error for Code {}
3264+
3265 #[derive(thiserror::Error, Debug)]
3266 pub enum Error {
3267 #[error("Distribution Error: {{0:?}}")]
3268 @@ -57,60 +57,20 @@ pub enum Error {
3269 #[error("Streaming error: {0}")]
3270 Stream(String),
3271 }
3272-
3273- impl From<&Error> for Message {
3274- fn from(val: &Error) -> Self {
3275- match val {
3276- Error::Code(code) => match code {
3277- Code::BlobUnknown => Message {
3278- code: String::from("BLOB_UNKNOWN"),
3279- message: String::from("blob unknown to registry"),
3280- detail: None,
3281- },
3282- Code::BlobUploadInvalid => todo!(),
3283- Code::BlobUploadUnknown => todo!(),
3284- Code::DigestInvalid => todo!(),
3285- Code::ManifestBlobUnknown => todo!(),
3286- Code::ManifestInvalid => todo!(),
3287- Code::ManifestUnknown => todo!(),
3288- Code::NameInvalid => todo!(),
3289- Code::NameUnknown => todo!(),
3290- Code::SizeInvalid => todo!(),
3291- Code::Unathorized => todo!(),
3292- Code::Denied => todo!(),
3293- Code::Unsupported => todo!(),
3294- Code::TooManyRequests => todo!(),
3295- },
3296- Error::Storage(error) => Message {
3297- code: String::from("STORAGE_ERROR"),
3298- message: String::from("Storage level failure"),
3299- detail: Some(error.to_string()),
3300- },
3301- Error::OciInternal(oci_spec_error) => Message {
3302- code: String::from("OCI_SPEC_ERROR"),
3303- message: String::from("Failed to parse OCI specification"),
3304- detail: Some(oci_spec_error.to_string()),
3305- },
3306- Error::OciParsing(parse_error) => todo!(),
3307- Error::Stream(_) => todo!(),
3308- }
3309- }
3310- }
3311-
3312- impl IntoResponse for Error {
3313- fn into_response(self) -> axum::response::Response {
3314- let message = Message::from(&self);
3315- let mut res = Json(message).into_response();
3316- let status_code = res.status_mut();
3317- *status_code = StatusCode::INTERNAL_SERVER_ERROR;
3318- tracing::error!("Server failure: {:?}", self);
3319- // match self {
3320- // Error::Code(code) => todo!(),
3321- // Error::Storage(error) => todo!(),
3322- // Error::OciInternal(oci_spec_error) => todo!(),
3323- // Error::OciParsing(parse_error) => todo!(),
3324- // Error::Stream(_) => todo!(),
3325- // }
3326- res
3327- }
3328- }
3329+ // impl IntoResponse for Error {
3330+ // fn into_response(self) -> axum::response::Response {
3331+ // let message = Message::from(&self);
3332+ // let mut res = Json(message).into_response();
3333+ // let status_code = res.status_mut();
3334+ // *status_code = StatusCode::INTERNAL_SERVER_ERROR;
3335+ // tracing::error!("Server failure: {:?}", self);
3336+ // // match self {
3337+ // // Error::Code(code) => todo!(),
3338+ // // Error::Storage(error) => todo!(),
3339+ // // Error::OciInternal(oci_spec_error) => todo!(),
3340+ // // Error::OciParsing(parse_error) => todo!(),
3341+ // // Error::Stream(_) => todo!(),
3342+ // // }
3343+ // res
3344+ // }
3345+ // }
3346 diff --git a/src/handlers.rs b/src/handlers.rs
3347deleted file mode 100644
3348index 1d4a40a..0000000
3349--- a/src/handlers.rs
3350+++ /dev/null
3351 @@ -1,207 +0,0 @@
3352- use std::{str::FromStr, sync::Arc};
3353-
3354- use axum::{
3355- Extension, Json,
3356- body::HttpBody,
3357- extract::{FromRequest, Path, Query, Request, State},
3358- http::StatusCode,
3359- response::{IntoResponse, Response},
3360- };
3361- use bytes::{Buf, Bytes};
3362- use futures::TryStreamExt;
3363- use http::{
3364- HeaderValue,
3365- header::{CONTENT_LENGTH, CONTENT_TYPE},
3366- };
3367- use oci_spec::{
3368- distribution::{Reference, TagList},
3369- image::{Digest, ImageManifest, MediaType},
3370- };
3371- use serde::Deserialize;
3372- use serde_json::json;
3373- use uuid::Uuid;
3374-
3375- use crate::{address::{Address, Blob}, error::Error, routes::AppState, storage::StorageIface, Namespace};
3376-
3377- pub async fn index() -> Result<Json<serde_json::Value>, Error> {
3378- Ok(Json(json!({})))
3379- }
3380-
3381- pub async fn read_manifest(
3382- State(state): State<Arc<AppState>>,
3383- Path((name, reference)): Path<(String, String)>,
3384- ) -> Result<Json<ImageManifest>, Error> {
3385- let namespace = Namespace::from_str(&name)?;
3386- let reference = Reference::from_str(&reference)?;
3387- let manifest = state.oci.read_manifest(&namespace, &reference).await?;
3388- Ok(Json(manifest))
3389- }
3390-
3391- pub async fn read_blob(
3392- State(state): State<Arc<AppState>>,
3393- Extension(namespace): Extension<Namespace>,
3394- Path(digest): Path<String>,
3395- ) -> Result<Response, Error> {
3396- let digest = Digest::from_str(&digest)?;
3397- let handle = state.oci.read_blob(&digest).await?;
3398- axum::body::Body::from_stream(handle);
3399- println!("Namespace is: {}", namespace);
3400- todo!()
3401- }
3402-
3403- pub async fn stat_blob(
3404- State(state): State<Arc<AppState>>,
3405- Path(digest): Path<String>,
3406- ) -> Result<StatusCode, Error> {
3407- let digest = Digest::from_str(&digest)?;
3408- if !state.oci.has_blob(&digest).await? {
3409- Ok(StatusCode::NOT_FOUND)
3410- } else {
3411- Ok(StatusCode::OK)
3412- }
3413- }
3414-
3415- /// Extracts the manifest but also retains the exact byte specification of the
3416- /// client manifest input.
3417- pub struct ManifestExtractor((Bytes, ImageManifest));
3418-
3419- impl<S> FromRequest<S> for ManifestExtractor
3420- where
3421- S: Send + Sync,
3422- {
3423- type Rejection = Error;
3424-
3425- async fn from_request(req: Request, state: &S) -> Result<Self, Self::Rejection> {
3426- let headers = req.headers();
3427- let Some(content_type) = headers.get(CONTENT_TYPE) else {
3428- todo!()
3429- };
3430- let content_type_str = content_type.to_str().unwrap();
3431- let media_type = MediaType::from(content_type_str);
3432- if !matches!(media_type, MediaType::ImageManifest) {
3433- todo!()
3434- }
3435- let body = Bytes::from_request(req, state)
3436- .await
3437- .map_err(|err| Error::Stream(err.to_string()))?;
3438-
3439- let buf = body.as_ref().reader();
3440- let manifest = ImageManifest::from_reader(buf)?;
3441- Ok(ManifestExtractor((body, manifest)))
3442- }
3443- }
3444-
3445- pub async fn write_manifest(
3446- Extension(namespace): Extension<Namespace>,
3447- State(state): State<Arc<AppState>>,
3448- Path(reference): Path<String>,
3449- ManifestExtractor((manifest_bytes, manifest)): ManifestExtractor,
3450- ) -> Result<StatusCode, Error> {
3451- let digest = manifest.config().digest();
3452- state
3453- .oci
3454- .write_manifest(&namespace, digest, &reference, &manifest_bytes)
3455- .await?;
3456- Ok(StatusCode::OK)
3457- }
3458-
3459- #[derive(Deserialize)]
3460- pub struct UploadQuery {
3461- pub digest: String,
3462- }
3463-
3464- /// Write a complete blob in one request
3465- pub async fn write_blob(
3466- State(state): State<Arc<AppState>>,
3467- Path(upload_uuid): Path<String>,
3468- Query(query): Query<UploadQuery>,
3469- req: Request,
3470- ) -> Result<StatusCode, Error> {
3471- let digest = Digest::from_str(&query.digest)?;
3472- let uuid = Uuid::from_str(&upload_uuid)
3473- .map_err(|_| Error::Code(crate::error::Code::BlobUploadInvalid))?;
3474- let stream = req.into_body().into_data_stream();
3475- let stream = stream.map_err(|e| Error::Stream(e.to_string()));
3476- state.oci.write_chunk(Box::pin(stream), &uuid).await?;
3477- state.oci.commit_blob(&uuid, &digest).await?;
3478- Ok(StatusCode::OK)
3479- }
3480-
3481- pub async fn write_blob_chunk(
3482- State(state): State<Arc<AppState>>,
3483- Path(upload_uuid): Path<String>,
3484- req: Request,
3485- ) -> Result<Response, Error> {
3486- let uuid = Uuid::from_str(&upload_uuid)
3487- .map_err(|_| Error::Code(crate::error::Code::BlobUploadInvalid))?;
3488- let stream = req.into_body().into_data_stream();
3489- let stream = stream.map_err(|e| Error::Stream(e.to_string()));
3490- state.oci.write_chunk(Box::pin(stream), &uuid).await?;
3491- let mut res = Response::new(axum::body::Body::empty());
3492- let status = res.status_mut();
3493- *status = StatusCode::ACCEPTED;
3494- let uuid_str = uuid.to_string();
3495- let uri = format!("/v2/upload/{}", uuid_str);
3496- let headers = res.headers_mut();
3497- headers.insert("Location", uri.parse().unwrap());
3498- Ok(res)
3499- }
3500-
3501- pub async fn close_blob(
3502- State(state): State<Arc<AppState>>,
3503- Path(upload_uuid): Path<String>,
3504- Query(query): Query<UploadQuery>,
3505- req: Request,
3506- ) -> Result<StatusCode, Error> {
3507- let digest = Digest::from_str(&query.digest)?;
3508- let uuid = Uuid::from_str(&upload_uuid)
3509- .map_err(|_| Error::Code(crate::error::Code::BlobUploadInvalid))?;
3510- let headers = req.headers();
3511- if headers.get(CONTENT_LENGTH).is_some() {
3512- let stream = req.into_body().into_data_stream();
3513- let stream = stream.map_err(|e| Error::Stream(e.to_string()));
3514- state.oci.write_chunk(Box::pin(stream), &uuid).await?;
3515- }
3516- state.oci.commit_blob(&uuid, &digest).await?;
3517- Ok(StatusCode::CREATED)
3518- }
3519-
3520- const OCI_CHUNK_MIN_LENGTH: usize = 10_000_000;
3521-
3522- /// Initiate a blob upload
3523- /// FIXME: Per the spec for chunked uploads a header of Content-Length: 0
3524- /// MUST be present (for some reason).
3525- pub async fn initiate_blob(
3526- State(state): State<Arc<AppState>>,
3527- Extension(namespace): Extension<Namespace>,
3528- ) -> Result<Response, Error> {
3529- let uuid = state.oci.new_blob(&namespace).await?;
3530- let mut res = Response::new(axum::body::Body::empty());
3531- let status = res.status_mut();
3532- *status = StatusCode::ACCEPTED;
3533- let headers = res.headers_mut();
3534- let uuid_str = uuid.to_string();
3535- let uri = format!("/v2/upload/{}", uuid_str);
3536- headers.insert("Location", uri.parse().unwrap());
3537- // FIXME: make configurable
3538- headers.insert(
3539- "OCI-Chunk-Min-Length",
3540- HeaderValue::from_str(&OCI_CHUNK_MIN_LENGTH.to_string()).unwrap(),
3541- );
3542- Ok(res)
3543- }
3544-
3545- pub(crate) async fn read_tags(
3546- State(state): State<Arc<AppState>>,
3547- Path(name): Path<String>,
3548- ) -> Result<Json<TagList>, Error> {
3549- let namespace = Namespace::from_str(&name)?;
3550- let tags = state.oci.list_tags(&namespace).await?;
3551- Ok(Json(tags))
3552- }
3553-
3554- pub async fn read_referrers() {}
3555-
3556- pub async fn delete_manifest() {}
3557- pub async fn delete_tag() {}
3558- pub async fn delete_blob() {}
3559 diff --git a/src/lib.rs b/src/lib.rs
3560index f41d040..9e55da7 100644
3561--- a/src/lib.rs
3562+++ b/src/lib.rs
3563 @@ -6,11 +6,12 @@ use relative_path::RelativePath;
3564
3565 pub mod address;
3566 pub mod error;
3567- mod handlers;
3568 pub mod oci_interface;
3569- pub mod routes;
3570 pub mod storage;
3571
3572+ #[cfg(feature = "axum")]
3573+ pub mod axum;
3574+
3575 #[cfg(feature = "storage-fs")]
3576 pub mod storage_fs;
3577
3578 diff --git a/src/oci_interface.rs b/src/oci_interface.rs
3579index 5372ca6..47222c8 100644
3580--- a/src/oci_interface.rs
3581+++ b/src/oci_interface.rs
3582 @@ -20,7 +20,7 @@ pub mod paths {
3583 }
3584
3585 #[derive(Clone)]
3586- pub(crate) struct OciInterface {
3587+ pub struct OciInterface {
3588 pub storage: Storage,
3589 }
3590
3591 @@ -33,7 +33,7 @@ impl OciInterface {
3592 todo!()
3593 }
3594
3595- pub async fn new_blob(&self, namespace: &Namespace) -> Result<Uuid, Error> {
3596+ pub async fn new_blob(&self) -> Result<Uuid, Error> {
3597 let uuid = Uuid::new_v4();
3598 self.store()
3599 .write_all(&Address::new(&TempBlob::from(&uuid)), &[])
3600 @@ -94,19 +94,6 @@ impl OciInterface {
3601 .await
3602 .map_err(Error::Storage)?;
3603 Ok(())
3604- // let blob_addr = Address::data(&Blob::from(digest));
3605- // self.storage
3606- // .write_all(&blob_addr, manifest_bytes.to_vec().as_slice())
3607- // .await
3608- // .map_err(Error::Storage)?;
3609- // self.storage
3610- // .write_all(
3611- // &Address::link(&crate::address::Manifest { namespace, digest }),
3612- // digest.to_string().as_bytes(),
3613- // )
3614- // .await
3615- // .map_err(Error::Storage)?;
3616- // Ok(())
3617 }
3618
3619 pub async fn read_manifest(
3620 @@ -115,17 +102,6 @@ impl OciInterface {
3621 reference: &Reference,
3622 ) -> Result<ImageManifest, Error> {
3623 todo!()
3624- // let bytes = self
3625- // .storage
3626- // .read_bytes(&Address::Manifest {
3627- // namespace,
3628- // reference,
3629- // })
3630- // .await
3631- // .map_err(Error::Storage)?
3632- // .unwrap();
3633- // let manifest: ImageManifest = serde_json::from_slice(bytes.as_slice()).unwrap();
3634- // Ok(manifest)
3635 }
3636
3637 pub async fn has_blob(&self, digest: &Digest) -> Result<bool, Error> {
3638 @@ -140,13 +116,4 @@ impl OciInterface {
3639 let blob_addr = Address::data(&Blob::from(digest));
3640 self.store().read(&blob_addr).await.map_err(Error::Storage)
3641 }
3642-
3643- // pub async fn exists(&self, digest: &Digest) -> Result<bool, Error> {
3644- // Ok(self
3645- // .storage
3646- // .stat(&Address::BlobSpec { digest })
3647- // .await
3648- // .map_err(Error::Storage)?
3649- // .is_some())
3650- // }
3651 }
3652 diff --git a/src/routes.rs b/src/routes.rs
3653deleted file mode 100644
3654index 94751e0..0000000
3655--- a/src/routes.rs
3656+++ /dev/null
3657 @@ -1,108 +0,0 @@
3658- use std::str::FromStr;
3659- use std::sync::Arc;
3660-
3661- use axum::extract::{DefaultBodyLimit, Request};
3662- use axum::routing::{head, patch, post, put};
3663- use axum::{Router, routing::get};
3664- use http::Uri;
3665-
3666- use crate::Namespace;
3667- use crate::oci_interface::OciInterface;
3668- use crate::storage::Storage;
3669-
3670- #[derive(Clone)]
3671- pub(crate) struct AppState {
3672- pub oci: OciInterface,
3673- }
3674-
3675- pub fn read_ns(uri: &str) -> Option<(Namespace, String)> {
3676- let mut components: Vec<String> = uri.split("/").map(|cmp| cmp.to_string()).collect();
3677- components.reverse();
3678- let stop = components.iter().enumerate().find_map(|(i, entry)| {
3679- if *entry == "blobs" || *entry == "manifests" || *entry == "tags" {
3680- Some(i + 1)
3681- } else {
3682- None
3683- }
3684- });
3685- if let Some(stop) = stop {
3686- let (route, ns) = components.split_at(stop);
3687- let mut ns: Vec<String> = ns.iter().map(String::from).collect();
3688- ns.reverse();
3689- let ns = ns.join("/");
3690- let mut route: Vec<String> = route.iter().map(String::from).collect();
3691- route.reverse();
3692- let route = format!("/{}", route.join("/"));
3693- Some((Namespace::from_str(&ns).unwrap(), route))
3694- } else {
3695- None
3696- }
3697- }
3698-
3699- /// Due to the registry spec allowing "namespacing", e.g. fuu/bar/baz/blobs/...
3700- /// it is required that we rewrite the URI extacting any namespace if it is
3701- /// specified.
3702- pub fn extract_namespace(mut req: Request<axum::body::Body>) -> Request<axum::body::Body> {
3703- let uri_str = req.uri().to_string();
3704- if let Some((namespace, route)) = read_ns(&uri_str) {
3705- tracing::info!("Namespace is {}", namespace);
3706- let extensions = req.extensions_mut();
3707- extensions.insert(namespace);
3708- let uri = req.uri_mut();
3709- *uri = Uri::from_str(&route).unwrap();
3710- }
3711- req
3712- }
3713-
3714- const MAXIMUM_MANIFEST_SIZE: usize = 5_000_000;
3715-
3716- pub fn router(storage: &Storage) -> Router {
3717- Router::new()
3718- .route("/v2", get(crate::handlers::index))
3719- .route(
3720- "/upload/{reference}",
3721- patch(crate::handlers::write_blob_chunk),
3722- )
3723- .route("/upload/{reference}", post(crate::handlers::write_blob))
3724- .route("/upload/{reference}", put(crate::handlers::close_blob))
3725- .route("/blobs/uploads", post(crate::handlers::initiate_blob))
3726- .route("/blobs/{digest}", head(crate::handlers::stat_blob))
3727- .route("/blobs/{digest}", get(crate::handlers::read_blob))
3728- .route(
3729- "/manifests/{digest}",
3730- put(crate::handlers::write_manifest)
3731- .layer(DefaultBodyLimit::max(MAXIMUM_MANIFEST_SIZE)),
3732- )
3733- // // .route("/{name}/blobs/{digest}", head(crate::handlers::stat_blob))
3734- // // .route(
3735- // // "/{name}/manifests/{reference}",
3736- // // get(crate::handlers::read_manifest),
3737- // // )
3738- // // .route(
3739- // // "/{name}/manifests/{reference}",
3740- // // head(crate::handlers::read_manifest),
3741- // // )
3742- // // .route("/{name}/blobs/uploads", post(crate::handlers::initiate_blob))
3743- // // .route(
3744- // // "/{name}/blobs/uploads/{reference}",
3745- // // patch(crate::handlers::write_blob),
3746- // // )
3747- // // .route(
3748- // // "/{name}/manifests/{reference}",
3749- // // put(crate::handlers::write_manifest),
3750- // // )
3751- // // .route("/{name}/tags/list", get(crate::handlers::read_tags))
3752- // // .route(
3753- // // "/{name}/manifests/{reference}",
3754- // // delete(crate::handlers::delete_manifest),
3755- // // )
3756- // // .route(
3757- // // "/{name}/blobs/{digest}",
3758- // // delete(crate::handlers::delete_blob),
3759- // // )
3760- .with_state(Arc::new(AppState {
3761- oci: OciInterface {
3762- storage: storage.clone(),
3763- },
3764- }))
3765- }
3766 diff --git a/src/storage_fs.rs b/src/storage_fs.rs
3767index d36a5de..b9eb0f8 100644
3768--- a/src/storage_fs.rs
3769+++ b/src/storage_fs.rs
3770 @@ -12,7 +12,7 @@ use crate::{
3771 };
3772
3773 #[derive(Clone)]
3774- pub(crate) struct FileSystem {
3775+ pub struct FileSystem {
3776 pub base: PathBuf,
3777 }
3778