Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion docs/modules/ROOT/pages/ec_oci_image_referrers.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,4 @@ Discover artifacts attached to an image via OCI Referrers API.

== Return

`referrers` (`array<object<artifactType: string, digest: string, mediaType: string, ref: string, size: number>>`): list of referrer descriptors discovered via OCI Referrers API
`referrers` (`array<object<annotations: object[string: string], artifactType: string, digest: string, mediaType: string, ref: string, size: number>>`): list of referrer descriptors discovered via OCI Referrers API
3 changes: 3 additions & 0 deletions internal/rego/oci/oci.go
Original file line number Diff line number Diff line change
Expand Up @@ -446,13 +446,15 @@ func registerOCIImageTagRefs() {
}

func registerOCIImageReferrers() {
annotations := types.NewObject(nil, types.NewDynamicProperty(types.S, types.S))
descriptor := types.NewObject(
[]*types.StaticProperty{
{Key: "mediaType", Value: types.S},
{Key: "size", Value: types.N},
{Key: "digest", Value: types.S},
{Key: "artifactType", Value: types.S},
{Key: "ref", Value: types.S},
{Key: "annotations", Value: annotations},
},
nil,
)
Expand Down Expand Up @@ -1511,6 +1513,7 @@ func ociImageReferrers(bctx rego.BuiltinContext, a *ast.Term) (*ast.Term, error)
ast.Item(ast.StringTerm("digest"), ast.StringTerm(descriptor.Digest.String())),
ast.Item(ast.StringTerm("artifactType"), ast.StringTerm(descriptor.ArtifactType)),
ast.Item(ast.StringTerm("ref"), ast.StringTerm(referrerRef)),
ast.Item(ast.StringTerm("annotations"), newAnnotationsTerm(descriptor.Annotations)),
)

referrerDescriptors = append(referrerDescriptors, descriptorTerm)
Expand Down
26 changes: 26 additions & 0 deletions internal/rego/oci/oci_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1771,11 +1771,37 @@ func TestOCIImageReferrers(t *testing.T) {
require.NotNil(t, obj.Get(ast.StringTerm("mediaType")), "descriptor should have mediaType")
require.NotNil(t, obj.Get(ast.StringTerm("size")), "descriptor should have size")
require.NotNil(t, obj.Get(ast.StringTerm("artifactType")), "descriptor should have artifactType")
require.NotNil(t, obj.Get(ast.StringTerm("annotations")), "descriptor should have annotations")
}

// Verify the referrers match (order-independent)
require.ElementsMatch(t, c.want, gotRefs, "referrers mismatch")
}
})
}

// Verify annotations field is present as an object on every referrer descriptor
t.Run("annotations field is an object", func(t *testing.T) {
ClearCaches()

bctx := rego.BuiltinContext{Context: context.Background()}
got, err := ociImageReferrers(bctx, ast.StringTerm(digestRef))
require.NoError(t, err)
require.NotNil(t, got)

arr, ok := got.Value.(*ast.Array)
require.True(t, ok)
require.Greater(t, arr.Len(), 0)

for i := 0; i < arr.Len(); i++ {
obj, ok := arr.Elem(i).Value.(ast.Object)
require.True(t, ok)

annTerm := obj.Get(ast.StringTerm("annotations"))
require.NotNil(t, annTerm, "descriptor %d should have annotations field", i)

_, ok = annTerm.Value.(ast.Object)
require.True(t, ok, "descriptor %d annotations should be an object", i)
}
})
}
Loading