diff --git a/pkg/registry/manifest.go b/pkg/registry/manifest.go index db8a8dc69..90715a53d 100644 --- a/pkg/registry/manifest.go +++ b/pkg/registry/manifest.go @@ -426,6 +426,7 @@ func (m *manifests) handleReferrers(resp http.ResponseWriter, req *http.Request) Config struct { MediaType string `json:"mediaType"` } `json:"config"` + Annotations map[string]string `json:"annotations,omitempty"` } json.Unmarshal(manifest.blob, &imageAsArtifact) im.Manifests = append(im.Manifests, v1.Descriptor{ @@ -433,6 +434,7 @@ func (m *manifests) handleReferrers(resp http.ResponseWriter, req *http.Request) Size: int64(len(manifest.blob)), Digest: h, ArtifactType: imageAsArtifact.Config.MediaType, + Annotations: imageAsArtifact.Annotations, }) } msg, _ := json.Marshal(&im) diff --git a/pkg/v1/remote/referrers_test.go b/pkg/v1/remote/referrers_test.go index 7fb566a88..9dcef0667 100644 --- a/pkg/v1/remote/referrers_test.go +++ b/pkg/v1/remote/referrers_test.go @@ -69,11 +69,16 @@ func TestReferrers(t *testing.T) { if err != nil { t.Fatal(err) } + mf, err := img.Manifest() + if err != nil { + t.Fatal(err) + } return v1.Descriptor{ Digest: d, Size: sz, MediaType: mt, ArtifactType: "application/testing123", + Annotations: mf.Annotations, } } @@ -118,6 +123,7 @@ func TestReferrers(t *testing.T) { t.Fatal(err) } leafImg = mutate.ConfigMediaType(leafImg, types.MediaType("application/testing123")) + leafImg = mutate.Annotations(leafImg, map[string]string{"annotation-key": "annotation-value"}).(v1.Image) leafImg = mutate.Subject(leafImg, rootDesc).(v1.Image) if err := remote.Write(leafRef, leafImg); err != nil { t.Fatal(err) @@ -139,6 +145,11 @@ func TestReferrers(t *testing.T) { t.Fatalf("referrers diff (-want,+got): %s", d) } + // Verify the annotations are present in the descriptor + if got := m2.Manifests[0].Annotations["annotation-key"]; got != "annotation-value" { + t.Errorf("expected annotation 'annotation-key' to be 'annotation-value', got %q", got) + } + if leg.tryFallback { // Get the referrers by querying the root image's fallback tag directly. tag, err := name.ParseReference(fmt.Sprintf("%s/repo:sha256-%s", u.Host, rootDesc.Digest.Hex)) @@ -187,7 +198,7 @@ func TestReferrers(t *testing.T) { t.Fatalf("referrers diff after second push (-want,+got): %s", d) } - // Try applying filters and verify number of manifests and and annotations + // Try applying filters and verify number of manifests and annotations index, err = remote.Referrers(rootRefDigest, remote.WithFilter("artifactType", "application/testing123")) if err != nil { diff --git a/pkg/v1/remote/write.go b/pkg/v1/remote/write.go index 1167cb793..86d3d74dd 100644 --- a/pkg/v1/remote/write.go +++ b/pkg/v1/remote/write.go @@ -560,6 +560,7 @@ func (w *writer) commitManifest(ctx context.Context, t Taggable, ref name.Refere Config struct { MediaType types.MediaType `json:"mediaType"` } `json:"config"` + Annotations map[string]string `json:"annotations,omitempty"` } if err := json.Unmarshal(raw, &mf); err != nil { return err @@ -603,6 +604,7 @@ func (w *writer) commitManifest(ctx context.Context, t Taggable, ref name.Refere MediaType: mf.MediaType, Digest: h, Size: size, + Annotations: mf.Annotations, } if err := w.commitSubjectReferrers(ctx, ref.Context().Digest(mf.Subject.Digest.String()),