Skip to content

Commit

Permalink
fetch base image details using imageDetailsByDigest
Browse files Browse the repository at this point in the history
  • Loading branch information
chrispatrick committed Mar 7, 2024
1 parent fdb379b commit ba64db2
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 46 deletions.
51 changes: 23 additions & 28 deletions policy/policy_handler/mocks/base_image_details.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,12 +12,11 @@ import (
const (
ImageDetailsQueryName = "image-details-by-digest"

baseImagesByDigestQueryName = "base-images-by-digest"
imageDetailsByDigestQueryName = "base-image-details-by-digest"

baseImagesByDigestQuery = `
query ($context: Context!, $digest: String!) {
baseImagesByDigest(context: $context, digest: $digest) {
images {
imageDetailsByDigestQuery = `
query ($context: Context!, $digest: String!, $platform: ImagePlatform!) {
imageDetailsByDigest(context: $context, digest: $digest, platform: $platform) {
digest
tags {
current
Expand All @@ -27,7 +26,6 @@ const (
hostName
repoName
}
}
}
}`
)
Expand Down Expand Up @@ -59,19 +57,13 @@ type (
Digest string `json:"digest" edn:"digest"`
BaseImage *BaseImage `json:"baseImage" edn:"baseImage"`
BaseImageTag *Tag `json:"baseImageTag" edn:"baseImageTag"`
Tags []Tag `json:"tags" edn:"tags"`
Repository Repository `json:"repository" edn:"repository"`
}

ImageDetailsByDigestResponse struct {
ImageDetailsByDigest *ImageDetailsByDigest `json:"imageDetailsByDigest" edn:"imageDetailsByDigest"`
}

BaseImagesByDigest struct {
Images []BaseImage `json:"images" edn:"images"`
}

BaseImagesByDigestResponse struct {
BaseImagesByDigest *BaseImagesByDigest `json:"baseImagesByDigest" edn:"baseImagesByDigest"`
}
)

func MockBaseImageDetails(ctx context.Context, req skill.RequestContext, sb *types.SBOM) (ImageDetailsByDigestResponse, error) {
Expand All @@ -84,42 +76,45 @@ func MockBaseImageDetails(ctx context.Context, req skill.RequestContext, sb *typ
}

func mockBaseImageDetails(ctx context.Context, req skill.RequestContext, sb *types.SBOM, ds data.DataSource) (ImageDetailsByDigestResponse, error) {
ds, err := data.NewSyncGraphqlDataSource(ctx, req)
if err != nil {
return ImageDetailsByDigestResponse{}, err
}

baseImageDigest := sb.Source.Provenance.BaseImage.Digest

var queryResponse BaseImagesByDigestResponse
var queryResponse ImageDetailsByDigestResponse

queryVariables := map[string]interface{}{
"digest": baseImageDigest,
"context": data.GqlContext(req)}
_, err = ds.Query(ctx, baseImagesByDigestQueryName, baseImagesByDigestQuery, queryVariables, &queryResponse)
"context": data.GqlContext(req),
"platform": GqlImagePlatform{
Architecture: sb.Source.Provenance.BaseImage.Platform.Architecture,
Os: sb.Source.Provenance.BaseImage.Platform.OS,
Variant: sb.Source.Provenance.BaseImage.Platform.Variant}}
_, err := ds.Query(ctx, imageDetailsByDigestQueryName, imageDetailsByDigestQuery, queryVariables, &queryResponse)
if err != nil {
return ImageDetailsByDigestResponse{}, err
}

if len(queryResponse.BaseImagesByDigest.Images) == 0 {
if queryResponse.ImageDetailsByDigest == nil {
return ImageDetailsByDigestResponse{}, fmt.Errorf("no base images found for digest %s", baseImageDigest)
}

baseImage := queryResponse.BaseImagesByDigest.Images[0]
baseImageTag := findBaseImageTag(baseImage, sb.Source.Provenance.BaseImage.Tag)
baseImage := queryResponse.ImageDetailsByDigest
baseImageTag := findBaseImageTag(*baseImage, sb.Source.Provenance.BaseImage.Tag)

mockResponse := ImageDetailsByDigestResponse{
ImageDetailsByDigest: &ImageDetailsByDigest{
Digest: sb.Source.Image.Digest,
BaseImage: &baseImage,
Digest: sb.Source.Image.Digest,
BaseImage: &BaseImage{
Digest: baseImage.Digest,
Repository: baseImage.Repository,
Tags: baseImage.Tags,
},
BaseImageTag: baseImageTag,
},
}

return mockResponse, nil
}

func findBaseImageTag(baseImage BaseImage, tag string) *Tag {
func findBaseImageTag(baseImage ImageDetailsByDigest, tag string) *Tag {
for _, t := range baseImage.Tags {
if t.Name == tag {
return &t
Expand Down
34 changes: 16 additions & 18 deletions policy/policy_handler/mocks/base_image_details.test.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,26 +15,24 @@ type MockDs struct {
}

func (ds MockDs) Query(ctx context.Context, queryName string, query string, variables map[string]interface{}, output interface{}) (*data.QueryResponse, error) {
assert.Equal(ds.t, queryName, baseImagesByDigestQueryName)
assert.Equal(ds.t, query, baseImagesByDigestQuery)
assert.Equal(ds.t, queryName, imageDetailsByDigestQueryName)
assert.Equal(ds.t, query, imageDetailsByDigestQuery)

r := output.(*BaseImagesByDigestResponse)
r.BaseImagesByDigest.Images = []BaseImage{
{
Digest: "sha256:1234",
Repository: Repository{
HostName: "registry.com",
RepoName: "namespace/repository",
r := output.(*ImageDetailsByDigestResponse)
r.ImageDetailsByDigest = &ImageDetailsByDigest{
Digest: "sha256:1234",
Repository: Repository{
HostName: "registry.com",
RepoName: "namespace/repository",
},
Tags: []Tag{
{
Name: "latest",
Current: true,
},
Tags: []Tag{
{
Name: "latest",
Current: true,
},
{
Name: "1.0",
Current: false,
},
{
Name: "1.0",
Current: false,
},
},
}
Expand Down

0 comments on commit ba64db2

Please sign in to comment.