Skip to content

Commit b5f09eb

Browse files
authored
Merge pull request #491 from sudo-bmitch/pr-referrers-to-missing
Support referrers to a missing manifest
2 parents a12c8d7 + 0a867d6 commit b5f09eb

File tree

3 files changed

+59
-2
lines changed

3 files changed

+59
-2
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

@@ -351,6 +363,22 @@ var test03ContentDiscovery = func() {
351363
Warn("filtering by artifact-type is not implemented")
352364
}
353365
})
366+
367+
g.Specify("GET request to missing manifest should yield 200", func() {
368+
SkipIfDisabled(contentDiscovery)
369+
req := client.NewRequest(reggie.GET, "/v2/<name>/referrers/<digest>",
370+
reggie.WithDigest(manifests[3].Digest))
371+
resp, err := client.Do(req)
372+
Expect(err).To(BeNil())
373+
Expect(resp.StatusCode()).To(Equal(http.StatusOK))
374+
Expect(resp.Header().Get("Content-Type")).To(Equal("application/vnd.oci.image.index.v1+json"))
375+
376+
var index index
377+
err = json.Unmarshal(resp.Body(), &index)
378+
Expect(err).To(BeNil())
379+
Expect(len(index.Manifests)).To(Equal(1))
380+
Expect(index.Manifests[0].Digest.String()).To(Equal(refsManifestCLayerArtifactDigest))
381+
})
354382
})
355383

356384
g.Context("Teardown", func() {
@@ -367,6 +395,7 @@ var test03ContentDiscovery = func() {
367395
testTagName,
368396
refsManifestBConfigArtifactDigest,
369397
refsManifestBLayerArtifactDigest,
398+
refsManifestCLayerArtifactDigest,
370399
}
371400
for _, ref := range references {
372401
req := client.NewRequest(reggie.DELETE, "/v2/<name>/manifests/<digest>", reggie.WithDigest(ref))
@@ -427,6 +456,7 @@ var test03ContentDiscovery = func() {
427456
testTagName,
428457
refsManifestBConfigArtifactDigest,
429458
refsManifestBLayerArtifactDigest,
459+
refsManifestCLayerArtifactDigest,
430460
}
431461
for _, ref := range references {
432462
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
@@ -149,6 +149,8 @@ var (
149149
refsManifestBConfigArtifactDigest string
150150
refsManifestBLayerArtifactContent []byte
151151
refsManifestBLayerArtifactDigest string
152+
refsManifestCLayerArtifactContent []byte
153+
refsManifestCLayerArtifactDigest string
152154
refsIndexArtifactContent []byte
153155
refsIndexArtifactDigest string
154156
reportJUnitFilename string
@@ -461,6 +463,33 @@ func init() {
461463
refsManifestBLayerArtifactDigest = godigest.FromBytes(refsManifestBLayerArtifactContent).String()
462464
testAnnotationValues[refsManifestBLayerArtifactDigest] = refsManifestBLayerArtifact.Annotations[testAnnotationKey]
463465

466+
// ManifestCLayerArtifact is the same as B but based on a subject that has not been pushed
467+
refsManifestCLayerArtifact := manifest{
468+
SchemaVersion: 2,
469+
MediaType: "application/vnd.oci.image.manifest.v1+json",
470+
ArtifactType: testRefArtifactTypeB,
471+
Config: emptyJSONDescriptor,
472+
Subject: &descriptor{
473+
MediaType: "application/vnd.oci.image.manifest.v1+json",
474+
Size: int64(len(manifests[3].Content)),
475+
Digest: godigest.FromBytes(manifests[3].Content),
476+
},
477+
Layers: []descriptor{
478+
{
479+
MediaType: testRefArtifactTypeB,
480+
Size: int64(len(testRefBlobB)),
481+
Digest: godigest.FromBytes(testRefBlobB),
482+
},
483+
},
484+
}
485+
486+
refsManifestCLayerArtifactContent, err = json.MarshalIndent(&refsManifestCLayerArtifact, "", "\t")
487+
if err != nil {
488+
log.Fatal(err)
489+
}
490+
491+
refsManifestCLayerArtifactDigest = godigest.FromBytes(refsManifestCLayerArtifactContent).String()
492+
464493
testRefArtifactTypeIndex = "application/vnd.food.stand"
465494
refsIndexArtifact := index{
466495
SchemaVersion: 2,

spec.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -567,8 +567,6 @@ If the `artifactType` is empty or missing in the image manifest, the value of `a
567567
If the `artifactType` is empty or missing in an index, the `artifactType` MUST be omitted.
568568
The descriptors MUST include annotations from the image manifest or index.
569569
If a query results in no matching referrers, an empty manifest list MUST be returned.
570-
If a manifest with the digest `<digest>` does not exist, a registry MAY return an empty manifest list.
571-
After a manifest with the digest `<digest>` is pushed, the registry MUST include previously pushed entries in the referrers list.
572570

573571
```json
574572
{

0 commit comments

Comments
 (0)