Skip to content

Commit f695222

Browse files
committed
Support referrers to a missing manifest
Signed-off-by: Brandon Mitchell <[email protected]>
1 parent 91ba954 commit f695222

File tree

3 files changed

+59
-1
lines changed

3 files changed

+59
-1
lines changed

conformance/03_discovery_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,18 @@ var test03ContentDiscovery = func() {
237237
BeNumerically(">=", 200),
238238
BeNumerically("<", 300)))
239239
Expect(resp.Header().Get("OCI-Subject")).To(Equal(manifests[4].Digest))
240+
241+
// Populate registry with test references manifest to a non-existent subject
242+
req = client.NewRequest(reggie.PUT, "/v2/<name>/manifests/<reference>",
243+
reggie.WithReference(refsManifestCLayerArtifactDigest)).
244+
SetHeader("Content-Type", "application/vnd.oci.image.manifest.v1+json").
245+
SetBody(refsManifestCLayerArtifactContent)
246+
resp, err = client.Do(req)
247+
Expect(err).To(BeNil())
248+
Expect(resp.StatusCode()).To(SatisfyAll(
249+
BeNumerically(">=", 200),
250+
BeNumerically("<", 300)))
251+
Expect(resp.Header().Get("OCI-Subject")).To(Equal(manifests[3].Digest))
240252
})
241253
})
242254

@@ -345,6 +357,22 @@ var test03ContentDiscovery = func() {
345357
Warn("filtering by artifact-type is not implemented")
346358
}
347359
})
360+
361+
g.Specify("GET request to missing manifest should yield 200", func() {
362+
SkipIfDisabled(contentDiscovery)
363+
req := client.NewRequest(reggie.GET, "/v2/<name>/referrers/<digest>",
364+
reggie.WithDigest(manifests[3].Digest))
365+
resp, err := client.Do(req)
366+
Expect(err).To(BeNil())
367+
Expect(resp.StatusCode()).To(Equal(http.StatusOK))
368+
Expect(resp.Header().Get("Content-Type")).To(Equal("application/vnd.oci.image.index.v1+json"))
369+
370+
var index index
371+
err = json.Unmarshal(resp.Body(), &index)
372+
Expect(err).To(BeNil())
373+
Expect(len(index.Manifests)).To(Equal(1))
374+
Expect(index.Manifests[0].Digest.String()).To(Equal(refsManifestCLayerArtifactDigest))
375+
})
348376
})
349377

350378
g.Context("Teardown", func() {
@@ -361,6 +389,7 @@ var test03ContentDiscovery = func() {
361389
testTagName,
362390
refsManifestBConfigArtifactDigest,
363391
refsManifestBLayerArtifactDigest,
392+
refsManifestCLayerArtifactDigest,
364393
}
365394
for _, ref := range references {
366395
req := client.NewRequest(reggie.DELETE, "/v2/<name>/manifests/<digest>", reggie.WithDigest(ref))
@@ -421,6 +450,7 @@ var test03ContentDiscovery = func() {
421450
testTagName,
422451
refsManifestBConfigArtifactDigest,
423452
refsManifestBLayerArtifactDigest,
453+
refsManifestCLayerArtifactDigest,
424454
}
425455
for _, ref := range references {
426456
req := client.NewRequest(reggie.DELETE, "/v2/<name>/manifests/<digest>", reggie.WithDigest(ref))

conformance/setup.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,8 @@ var (
147147
refsManifestBConfigArtifactDigest string
148148
refsManifestBLayerArtifactContent []byte
149149
refsManifestBLayerArtifactDigest string
150+
refsManifestCLayerArtifactContent []byte
151+
refsManifestCLayerArtifactDigest string
150152
refsIndexArtifactContent []byte
151153
refsIndexArtifactDigest string
152154
reportJUnitFilename string
@@ -440,6 +442,33 @@ func init() {
440442

441443
refsManifestBLayerArtifactDigest = godigest.FromBytes(refsManifestBLayerArtifactContent).String()
442444

445+
// ManifestCLayerArtifact is the same as B but based on a subject that has not been pushed
446+
refsManifestCLayerArtifact := manifest{
447+
SchemaVersion: 2,
448+
MediaType: "application/vnd.oci.image.manifest.v1+json",
449+
ArtifactType: testRefArtifactTypeB,
450+
Config: emptyJSONDescriptor,
451+
Subject: &descriptor{
452+
MediaType: "application/vnd.oci.image.manifest.v1+json",
453+
Size: int64(len(manifests[3].Content)),
454+
Digest: godigest.FromBytes(manifests[3].Content),
455+
},
456+
Layers: []descriptor{
457+
{
458+
MediaType: testRefArtifactTypeB,
459+
Size: int64(len(testRefBlobB)),
460+
Digest: godigest.FromBytes(testRefBlobB),
461+
},
462+
},
463+
}
464+
465+
refsManifestCLayerArtifactContent, err = json.MarshalIndent(&refsManifestCLayerArtifact, "", "\t")
466+
if err != nil {
467+
log.Fatal(err)
468+
}
469+
470+
refsManifestCLayerArtifactDigest = godigest.FromBytes(refsManifestCLayerArtifactContent).String()
471+
443472
testRefArtifactTypeIndex = "application/vnd.food.stand"
444473
refsIndexArtifact := index{
445474
SchemaVersion: 2,

spec.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -566,7 +566,6 @@ The descriptors MUST include an `artifactType` field that is set to the value of
566566
If the `artifactType` is empty or missing in the image manifest, the value of `artifactType` MUST be set to the config descriptor `mediaType` value.
567567
The descriptors MUST include annotations from the image manifest.
568568
If a query results in no matching referrers, an empty manifest list MUST be returned.
569-
If a manifest with the digest `<digest>` does not exist, a registry MAY return an empty manifest list.
570569
After a manifest with the digest `<digest>` is pushed, the registry MUST include previously pushed entries in the referrers list.
571570

572571
```json

0 commit comments

Comments
 (0)