feat(cve): ability to return CVEs per image os and architecture (#1607)

Signed-off-by: Andrei Aaron <aaaron@luxoft.com>
This commit is contained in:
Andrei Aaron
2023-07-11 19:29:04 +03:00
committed by GitHub
parent aaf03c75fc
commit 418a1a006c
12 changed files with 658 additions and 97 deletions
@@ -166,9 +166,9 @@ type ComplexityRoot struct {
GlobalSearch func(childComplexity int, query string, filter *Filter, requestedPage *PageInput) int
Image func(childComplexity int, image string) int
ImageList func(childComplexity int, repo string, requestedPage *PageInput) int
ImageListForCve func(childComplexity int, id string, requestedPage *PageInput) int
ImageListForCve func(childComplexity int, id string, filter *Filter, requestedPage *PageInput) int
ImageListForDigest func(childComplexity int, id string, requestedPage *PageInput) int
ImageListWithCVEFixed func(childComplexity int, id string, image string, requestedPage *PageInput) int
ImageListWithCVEFixed func(childComplexity int, id string, image string, filter *Filter, requestedPage *PageInput) int
Referrers func(childComplexity int, repo string, digest string, typeArg []string) int
RepoListWithNewestImage func(childComplexity int, requestedPage *PageInput) int
StarredRepos func(childComplexity int, requestedPage *PageInput) int
@@ -209,8 +209,8 @@ type ComplexityRoot struct {
type QueryResolver interface {
CVEListForImage(ctx context.Context, image string, requestedPage *PageInput, searchedCve *string) (*CVEResultForImage, error)
ImageListForCve(ctx context.Context, id string, requestedPage *PageInput) (*PaginatedImagesResult, error)
ImageListWithCVEFixed(ctx context.Context, id string, image string, requestedPage *PageInput) (*PaginatedImagesResult, error)
ImageListForCve(ctx context.Context, id string, filter *Filter, requestedPage *PageInput) (*PaginatedImagesResult, error)
ImageListWithCVEFixed(ctx context.Context, id string, image string, filter *Filter, requestedPage *PageInput) (*PaginatedImagesResult, error)
ImageListForDigest(ctx context.Context, id string, requestedPage *PageInput) (*PaginatedImagesResult, error)
RepoListWithNewestImage(ctx context.Context, requestedPage *PageInput) (*PaginatedReposResult, error)
ImageList(ctx context.Context, repo string, requestedPage *PageInput) (*PaginatedImagesResult, error)
@@ -828,7 +828,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
return 0, false
}
return e.complexity.Query.ImageListForCve(childComplexity, args["id"].(string), args["requestedPage"].(*PageInput)), true
return e.complexity.Query.ImageListForCve(childComplexity, args["id"].(string), args["filter"].(*Filter), args["requestedPage"].(*PageInput)), true
case "Query.ImageListForDigest":
if e.complexity.Query.ImageListForDigest == nil {
@@ -852,7 +852,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
return 0, false
}
return e.complexity.Query.ImageListWithCVEFixed(childComplexity, args["id"].(string), args["image"].(string), args["requestedPage"].(*PageInput)), true
return e.complexity.Query.ImageListWithCVEFixed(childComplexity, args["id"].(string), args["image"].(string), args["filter"].(*Filter), args["requestedPage"].(*PageInput)), true
case "Query.Referrers":
if e.complexity.Query.Referrers == nil {
@@ -1693,6 +1693,8 @@ type Query {
ImageListForCVE(
"CVE ID"
id: String!,
"Filter to apply before returning the results"
filter: Filter,
"Sets the parameters of the requested page"
requestedPage: PageInput
): PaginatedImagesResult!
@@ -1706,6 +1708,8 @@ type Query {
id: String!,
"Repository name"
image: String!,
"Filter to apply before returning the results"
filter: Filter,
"Sets the parameters of the requested page"
requestedPage: PageInput
): PaginatedImagesResult!
@@ -2004,15 +2008,24 @@ func (ec *executionContext) field_Query_ImageListForCVE_args(ctx context.Context
}
}
args["id"] = arg0
var arg1 *PageInput
if tmp, ok := rawArgs["requestedPage"]; ok {
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("requestedPage"))
arg1, err = ec.unmarshalOPageInput2ᚖzotregistryᚗioᚋzotᚋpkgᚋextensionsᚋsearchᚋgql_generatedᚐPageInput(ctx, tmp)
var arg1 *Filter
if tmp, ok := rawArgs["filter"]; ok {
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("filter"))
arg1, err = ec.unmarshalOFilter2ᚖzotregistryᚗioᚋzotᚋpkgᚋextensionsᚋsearchᚋgql_generatedᚐFilter(ctx, tmp)
if err != nil {
return nil, err
}
}
args["requestedPage"] = arg1
args["filter"] = arg1
var arg2 *PageInput
if tmp, ok := rawArgs["requestedPage"]; ok {
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("requestedPage"))
arg2, err = ec.unmarshalOPageInput2ᚖzotregistryᚗioᚋzotᚋpkgᚋextensionsᚋsearchᚋgql_generatedᚐPageInput(ctx, tmp)
if err != nil {
return nil, err
}
}
args["requestedPage"] = arg2
return args, nil
}
@@ -2061,15 +2074,24 @@ func (ec *executionContext) field_Query_ImageListWithCVEFixed_args(ctx context.C
}
}
args["image"] = arg1
var arg2 *PageInput
if tmp, ok := rawArgs["requestedPage"]; ok {
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("requestedPage"))
arg2, err = ec.unmarshalOPageInput2ᚖzotregistryᚗioᚋzotᚋpkgᚋextensionsᚋsearchᚋgql_generatedᚐPageInput(ctx, tmp)
var arg2 *Filter
if tmp, ok := rawArgs["filter"]; ok {
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("filter"))
arg2, err = ec.unmarshalOFilter2ᚖzotregistryᚗioᚋzotᚋpkgᚋextensionsᚋsearchᚋgql_generatedᚐFilter(ctx, tmp)
if err != nil {
return nil, err
}
}
args["requestedPage"] = arg2
args["filter"] = arg2
var arg3 *PageInput
if tmp, ok := rawArgs["requestedPage"]; ok {
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("requestedPage"))
arg3, err = ec.unmarshalOPageInput2ᚖzotregistryᚗioᚋzotᚋpkgᚋextensionsᚋsearchᚋgql_generatedᚐPageInput(ctx, tmp)
if err != nil {
return nil, err
}
}
args["requestedPage"] = arg3
return args, nil
}
@@ -5440,7 +5462,7 @@ func (ec *executionContext) _Query_ImageListForCVE(ctx context.Context, field gr
}()
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Query().ImageListForCve(rctx, fc.Args["id"].(string), fc.Args["requestedPage"].(*PageInput))
return ec.resolvers.Query().ImageListForCve(rctx, fc.Args["id"].(string), fc.Args["filter"].(*Filter), fc.Args["requestedPage"].(*PageInput))
})
if err != nil {
ec.Error(ctx, err)
@@ -5501,7 +5523,7 @@ func (ec *executionContext) _Query_ImageListWithCVEFixed(ctx context.Context, fi
}()
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Query().ImageListWithCVEFixed(rctx, fc.Args["id"].(string), fc.Args["image"].(string), fc.Args["requestedPage"].(*PageInput))
return ec.resolvers.Query().ImageListWithCVEFixed(rctx, fc.Args["id"].(string), fc.Args["image"].(string), fc.Args["filter"].(*Filter), fc.Args["requestedPage"].(*PageInput))
})
if err != nil {
ec.Error(ctx, err)
+33 -3
View File
@@ -133,7 +133,8 @@ func getImageListForDigest(ctx context.Context, digest string, repoDB repodb.Rep
}
// get all repos
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterTags(ctx, FilterByDigest(digest), pageInput)
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterTags(ctx,
FilterByDigest(digest), repodb.Filter{}, pageInput)
if err != nil {
return &gql_generated.PaginatedImagesResult{}, err
}
@@ -383,6 +384,7 @@ func getImageListForCVE(
ctx context.Context,
cveID string,
cveInfo cveinfo.CveInfo,
filter *gql_generated.Filter,
requestedPage *gql_generated.PageInput,
repoDB repodb.RepoDB,
log log.Logger,
@@ -426,6 +428,17 @@ func getImageListForCVE(
requestedPage = &gql_generated.PageInput{}
}
localFilter := repodb.Filter{}
if filter != nil {
localFilter = repodb.Filter{
Os: filter.Os,
Arch: filter.Arch,
HasToBeSigned: filter.HasToBeSigned,
IsBookmarked: filter.IsBookmarked,
IsStarred: filter.IsStarred,
}
}
// Actual page requested by user
pageInput := repodb.PageInput{
Limit: safeDereferencing(requestedPage.Limit, 0),
@@ -437,7 +450,7 @@ func getImageListForCVE(
// get all repos
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterTags(ctx,
FilterByTagInfo(affectedImages), pageInput)
FilterByTagInfo(affectedImages), localFilter, pageInput)
if err != nil {
return &gql_generated.PaginatedImagesResult{}, err
}
@@ -462,6 +475,7 @@ func getImageListWithCVEFixed(
cveID string,
repo string,
cveInfo cveinfo.CveInfo,
filter *gql_generated.Filter,
requestedPage *gql_generated.PageInput,
repoDB repodb.RepoDB,
log log.Logger,
@@ -488,6 +502,17 @@ func getImageListWithCVEFixed(
requestedPage = &gql_generated.PageInput{}
}
localFilter := repodb.Filter{}
if filter != nil {
localFilter = repodb.Filter{
Os: filter.Os,
Arch: filter.Arch,
HasToBeSigned: filter.HasToBeSigned,
IsBookmarked: filter.IsBookmarked,
IsStarred: filter.IsStarred,
}
}
// Actual page requested by user
pageInput := repodb.PageInput{
Limit: safeDereferencing(requestedPage.Limit, 0),
@@ -498,7 +523,9 @@ func getImageListWithCVEFixed(
}
// get all repos
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterTags(ctx, FilterByTagInfo(tagsInfo), pageInput)
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterTags(ctx,
FilterByTagInfo(tagsInfo), localFilter, pageInput,
)
if err != nil {
return &gql_generated.PaginatedImagesResult{}, err
}
@@ -786,6 +813,7 @@ func derivedImageList(ctx context.Context, image string, digest *string, repoDB
// we need all available tags
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterTags(ctx,
filterDerivedImages(searchedImage),
repodb.Filter{},
pageInput)
if err != nil {
return &gql_generated.PaginatedImagesResult{}, err
@@ -900,6 +928,7 @@ func baseImageList(ctx context.Context, image string, digest *string, repoDB rep
// we need all available tags
reposMeta, manifestMetaMap, indexDataMap, pageInfo, err := repoDB.FilterTags(ctx,
filterBaseImages(searchedImage),
repodb.Filter{},
pageInput)
if err != nil {
return &gql_generated.PaginatedImagesResult{}, err
@@ -1259,6 +1288,7 @@ func getImageList(ctx context.Context, repo string, repoDB repodb.RepoDB, cveInf
func(repoMeta repodb.RepoMetadata, manifestMeta repodb.ManifestMetadata) bool {
return true
},
repodb.Filter{},
pageInput)
if err != nil {
return &gql_generated.PaginatedImagesResult{}, err
+158 -62
View File
@@ -690,7 +690,7 @@ func TestImageListForDigest(t *testing.T) {
Convey("getImageList", t, func() {
Convey("no page requested, FilterTagsFn returns error", func() {
mockSearchDB := mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc,
FilterTagsFn: func(ctx context.Context, filterFunc repodb.FilterFunc, filter repodb.Filter,
requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo,
error,
@@ -708,7 +708,7 @@ func TestImageListForDigest(t *testing.T) {
Convey("invalid manifest blob", func() {
mockSearchDB := mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc,
FilterTagsFn: func(ctx context.Context, filterFunc repodb.FilterFunc, filter repodb.Filter,
requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error) {
repos := []repodb.RepoMetadata{
@@ -756,7 +756,7 @@ func TestImageListForDigest(t *testing.T) {
manifestDigest := godigest.FromBytes(manifestBlob).String()
mockSearchDB := mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc,
FilterTagsFn: func(ctx context.Context, filterFunc repodb.FilterFunc, filter repodb.Filter,
requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error) {
repos := []repodb.RepoMetadata{
@@ -781,7 +781,7 @@ func TestImageListForDigest(t *testing.T) {
}
matchedTags := repos[0].Tags
for tag, manifestDescriptor := range repos[0].Tags {
if !filter(repos[0], manifestMetaDatas[manifestDescriptor.Digest]) {
if !filterFunc(repos[0], manifestMetaDatas[manifestDescriptor.Digest]) {
delete(matchedTags, tag)
delete(manifestMetaDatas, manifestDescriptor.Digest)
@@ -829,7 +829,7 @@ func TestImageListForDigest(t *testing.T) {
configDigest := godigest.FromBytes(configBlob)
mockSearchDB := mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc,
FilterTagsFn: func(ctx context.Context, filterFunc repodb.FilterFunc, filter repodb.Filter,
requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error) {
repos := []repodb.RepoMetadata{
@@ -859,7 +859,7 @@ func TestImageListForDigest(t *testing.T) {
matchedTags := repos[0].Tags
for tag, manifestDescriptor := range repos[0].Tags {
if !filter(repos[0], manifestMetaDatas[manifestDescriptor.Digest]) {
if !filterFunc(repos[0], manifestMetaDatas[manifestDescriptor.Digest]) {
delete(matchedTags, tag)
delete(manifestMetaDatas, manifestDescriptor.Digest)
@@ -903,7 +903,7 @@ func TestImageListForDigest(t *testing.T) {
layerDigest := godigest.Digest("validDigest")
mockSearchDB := mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc,
FilterTagsFn: func(ctx context.Context, filterFunc repodb.FilterFunc, filter repodb.Filter,
requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error) {
repos := []repodb.RepoMetadata{
@@ -935,7 +935,7 @@ func TestImageListForDigest(t *testing.T) {
matchedTags := repos[0].Tags
for tag, manifestDescriptor := range repos[0].Tags {
if !filter(repos[0], manifestMetaDatas[manifestDescriptor.Digest]) {
if !filterFunc(repos[0], manifestMetaDatas[manifestDescriptor.Digest]) {
delete(matchedTags, tag)
delete(manifestMetaDatas, manifestDescriptor.Digest)
@@ -977,7 +977,7 @@ func TestImageListForDigest(t *testing.T) {
So(err, ShouldBeNil)
mockSearchDB := mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc,
FilterTagsFn: func(ctx context.Context, filterFunc repodb.FilterFunc, filter repodb.Filter,
requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error) {
repos := []repodb.RepoMetadata{
@@ -1003,7 +1003,7 @@ func TestImageListForDigest(t *testing.T) {
matchedTags := repo.Tags
for tag, manifestDescriptor := range repo.Tags {
if !filter(repo, manifestMetaDatas[manifestDescriptor.Digest]) {
if !filterFunc(repo, manifestMetaDatas[manifestDescriptor.Digest]) {
delete(matchedTags, tag)
delete(manifestMetaDatas, manifestDescriptor.Digest)
@@ -1046,7 +1046,7 @@ func TestImageListForDigest(t *testing.T) {
So(err, ShouldBeNil)
mockSearchDB := mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc,
FilterTagsFn: func(ctx context.Context, filterFunc repodb.FilterFunc, filter repodb.Filter,
requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo,
error,
@@ -1081,7 +1081,7 @@ func TestImageListForDigest(t *testing.T) {
matchedTags := repo.Tags
for tag, manifestDescriptor := range repo.Tags {
if !filter(repo, manifestMetaDatas[manifestDescriptor.Digest]) {
if !filterFunc(repo, manifestMetaDatas[manifestDescriptor.Digest]) {
delete(matchedTags, tag)
delete(manifestMetaDatas, manifestDescriptor.Digest)
@@ -1329,7 +1329,7 @@ func TestImageList(t *testing.T) {
testLogger := log.NewLogger("debug", "")
Convey("no page requested, SearchRepoFn returns error", func() {
mockSearchDB := mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc,
FilterTagsFn: func(ctx context.Context, filterFunc repodb.FilterFunc, filter repodb.Filter,
requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo,
error,
@@ -1348,7 +1348,7 @@ func TestImageList(t *testing.T) {
Convey("valid repoList returned", func() {
mockSearchDB := mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc,
FilterTagsFn: func(ctx context.Context, filterFunc repodb.FilterFunc, filter repodb.Filter,
requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData, common.PageInfo, error) {
repos := []repodb.RepoMetadata{
@@ -1546,7 +1546,7 @@ func TestQueryResolverErrors(t *testing.T) {
resolverConfig,
}
_, err := qr.ImageListForCve(ctx, "cve1", &gql_generated.PageInput{})
_, err := qr.ImageListForCve(ctx, "cve1", &gql_generated.Filter{}, &gql_generated.PageInput{})
So(err, ShouldNotBeNil)
})
@@ -1557,7 +1557,8 @@ func TestQueryResolverErrors(t *testing.T) {
DefaultStore: mocks.MockedImageStore{},
},
mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc, requestedPage repodb.PageInput,
FilterTagsFn: func(ctx context.Context,
filterFunc repodb.FilterFunc, filter repodb.Filter, requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData,
common.PageInfo, error,
) {
@@ -1572,7 +1573,7 @@ func TestQueryResolverErrors(t *testing.T) {
resolverConfig,
}
_, err := qr.ImageListForCve(ctx, "cve1", &gql_generated.PageInput{})
_, err := qr.ImageListForCve(ctx, "cve1", &gql_generated.Filter{}, &gql_generated.PageInput{})
So(err, ShouldNotBeNil)
})
@@ -1583,7 +1584,8 @@ func TestQueryResolverErrors(t *testing.T) {
DefaultStore: mocks.MockedImageStore{},
},
mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc, requestedPage repodb.PageInput,
FilterTagsFn: func(ctx context.Context,
filterFunc repodb.FilterFunc, filter repodb.Filter, requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData,
common.PageInfo, error,
) {
@@ -1598,7 +1600,7 @@ func TestQueryResolverErrors(t *testing.T) {
resolverConfig,
}
_, err := qr.ImageListWithCVEFixed(ctx, "cve1", "image", &gql_generated.PageInput{})
_, err := qr.ImageListWithCVEFixed(ctx, "cve1", "image", &gql_generated.Filter{}, &gql_generated.PageInput{})
So(err, ShouldNotBeNil)
})
@@ -1657,7 +1659,8 @@ func TestQueryResolverErrors(t *testing.T) {
log,
storage.StoreController{},
mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc, requestedPage repodb.PageInput,
FilterTagsFn: func(ctx context.Context,
filterFunc repodb.FilterFunc, filter repodb.Filter, requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData,
common.PageInfo, error,
) {
@@ -1753,7 +1756,8 @@ func TestQueryResolverErrors(t *testing.T) {
log,
storage.StoreController{},
mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc, requestedPage repodb.PageInput,
FilterTagsFn: func(ctx context.Context,
filterFunc repodb.FilterFunc, filter repodb.Filter, requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData,
common.PageInfo, error,
) {
@@ -1818,6 +1822,10 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
RootDir: t.TempDir(),
}
LINUX := "linux"
AMD := "amd"
ARM := "arm64"
boltDriver, err := bolt.GetBoltDriver(params)
if err != nil {
panic(err)
@@ -1836,6 +1844,10 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
configBlob1, err := json.Marshal(ispec.Image{
Created: &timeStamp1,
Platform: ispec.Platform{
Architecture: AMD,
OS: LINUX,
},
})
if err != nil {
panic(err)
@@ -1875,6 +1887,10 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
configBlob2, err := json.Marshal(ispec.Image{
Created: &timeStamp2,
Platform: ispec.Platform{
Architecture: AMD,
OS: LINUX,
},
})
if err != nil {
panic(err)
@@ -1914,6 +1930,10 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
configBlob3, err := json.Marshal(ispec.Image{
Created: &timeStamp3,
Platform: ispec.Platform{
Architecture: ARM,
OS: LINUX,
},
})
if err != nil {
panic(err)
@@ -2165,7 +2185,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
responseContext := graphql.WithResponseContext(context.Background(), graphql.DefaultErrorPresenter,
graphql.DefaultRecover)
images, err := getImageListForCVE(responseContext, "CVE1", cveInfo, nil, repoDB, log)
images, err := getImageListForCVE(responseContext, "CVE1", cveInfo, nil, nil, repoDB, log)
So(err, ShouldBeNil)
expectedImages := []string{
@@ -2178,7 +2198,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
So(fmt.Sprintf("%s:%s", *image.RepoName, *image.Tag), ShouldBeIn, expectedImages)
}
images, err = getImageListForCVE(responseContext, "CVE2", cveInfo, nil, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE2", cveInfo, nil, nil, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2192,7 +2212,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
So(fmt.Sprintf("%s:%s", *image.RepoName, *image.Tag), ShouldBeIn, expectedImages)
}
images, err = getImageListForCVE(responseContext, "CVE3", cveInfo, nil, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE3", cveInfo, nil, nil, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2214,7 +2234,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput := getPageInput(1, 0)
images, err := getImageListForCVE(responseContext, "CVE1", cveInfo, pageInput, repoDB, log)
images, err := getImageListForCVE(responseContext, "CVE1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages := []string{
@@ -2228,7 +2248,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(1, 1)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, pageInput, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2242,19 +2262,19 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(1, 2)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, pageInput, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
So(len(images.Results), ShouldEqual, 0)
pageInput = getPageInput(1, 5)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, pageInput, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
So(len(images.Results), ShouldEqual, 0)
pageInput = getPageInput(2, 0)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, pageInput, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2269,7 +2289,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(5, 0)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, pageInput, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2284,7 +2304,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(5, 1)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, pageInput, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2298,19 +2318,19 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(5, 2)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, pageInput, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
So(len(images.Results), ShouldEqual, 0)
pageInput = getPageInput(5, 5)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, pageInput, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
So(len(images.Results), ShouldEqual, 0)
pageInput = getPageInput(5, 0)
images, err = getImageListForCVE(responseContext, "CVE2", cveInfo, pageInput, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE2", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2326,7 +2346,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(5, 3)
images, err = getImageListForCVE(responseContext, "CVE2", cveInfo, pageInput, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE2", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2341,7 +2361,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(5, 0)
images, err = getImageListForCVE(responseContext, "CVE3", cveInfo, pageInput, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE3", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2356,7 +2376,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(5, 5)
images, err = getImageListForCVE(responseContext, "CVE3", cveInfo, pageInput, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE3", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2371,7 +2391,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(5, 10)
images, err = getImageListForCVE(responseContext, "CVE3", cveInfo, pageInput, repoDB, log)
images, err = getImageListForCVE(responseContext, "CVE3", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2382,6 +2402,37 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
for _, image := range images.Results {
So(fmt.Sprintf("%s:%s", *image.RepoName, *image.Tag), ShouldBeIn, expectedImages)
}
amdFilter := &gql_generated.Filter{Arch: []*string{&AMD}}
pageInput = getPageInput(5, 0)
images, err = getImageListForCVE(responseContext, "CVE3", cveInfo, amdFilter, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
"repo1:1.0.0", "repo1:1.0.1",
"repo2:2.0.0", "repo2:2.0.1",
"repo3:3.0.1",
}
So(len(images.Results), ShouldEqual, len(expectedImages))
for _, image := range images.Results {
So(fmt.Sprintf("%s:%s", *image.RepoName, *image.Tag), ShouldBeIn, expectedImages)
}
pageInput = getPageInput(2, 2)
images, err = getImageListForCVE(responseContext, "CVE3", cveInfo, amdFilter, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
"repo2:2.0.0", "repo2:2.0.1",
}
So(len(images.Results), ShouldEqual, len(expectedImages))
for _, image := range images.Results {
So(fmt.Sprintf("%s:%s", *image.RepoName, *image.Tag), ShouldBeIn, expectedImages)
}
})
})
@@ -2390,7 +2441,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
responseContext := graphql.WithResponseContext(context.Background(), graphql.DefaultErrorPresenter,
graphql.DefaultRecover)
images, err := getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, nil, repoDB, log)
images, err := getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, nil, nil, repoDB, log)
So(err, ShouldBeNil)
expectedImages := []string{
@@ -2402,7 +2453,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
So(fmt.Sprintf("%s:%s", *image.RepoName, *image.Tag), ShouldBeIn, expectedImages)
}
images, err = getImageListWithCVEFixed(responseContext, "CVE2", "repo1", cveInfo, nil, repoDB, log)
images, err = getImageListWithCVEFixed(responseContext, "CVE2", "repo1", cveInfo, nil, nil, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2414,7 +2465,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
So(fmt.Sprintf("%s:%s", *image.RepoName, *image.Tag), ShouldBeIn, expectedImages)
}
images, err = getImageListWithCVEFixed(responseContext, "CVE3", "repo1", cveInfo, nil, repoDB, log)
images, err = getImageListWithCVEFixed(responseContext, "CVE3", "repo1", cveInfo, nil, nil, repoDB, log)
So(err, ShouldBeNil)
So(len(images.Results), ShouldEqual, 0)
})
@@ -2426,7 +2477,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput := getPageInput(1, 0)
images, err := getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, pageInput, repoDB, log)
images, err := getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages := []string{
@@ -2440,7 +2491,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(1, 1)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, pageInput, repoDB, log)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2454,7 +2505,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(1, 2)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, pageInput, repoDB, log)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2468,19 +2519,19 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(1, 3)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, pageInput, repoDB, log)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
So(len(images.Results), ShouldEqual, 0)
pageInput = getPageInput(1, 10)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, pageInput, repoDB, log)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
So(len(images.Results), ShouldEqual, 0)
pageInput = getPageInput(2, 0)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, pageInput, repoDB, log)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2494,7 +2545,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(2, 1)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, pageInput, repoDB, log)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2508,7 +2559,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(2, 2)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, pageInput, repoDB, log)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2522,7 +2573,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(5, 0)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, pageInput, repoDB, log)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2536,7 +2587,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(5, 0)
images, err = getImageListWithCVEFixed(responseContext, "CVE2", "repo1", cveInfo, pageInput, repoDB, log)
images, err = getImageListWithCVEFixed(responseContext, "CVE2", "repo1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{
@@ -2550,9 +2601,46 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
pageInput = getPageInput(5, 2)
images, err = getImageListWithCVEFixed(responseContext, "CVE2", "repo1", cveInfo, pageInput, repoDB, log)
images, err = getImageListWithCVEFixed(responseContext, "CVE2", "repo1", cveInfo, nil, pageInput, repoDB, log)
So(err, ShouldBeNil)
So(len(images.Results), ShouldEqual, 0)
amdFilter := &gql_generated.Filter{Arch: []*string{&AMD}}
armFilter := &gql_generated.Filter{Arch: []*string{&ARM}}
pageInput = getPageInput(3, 0)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, amdFilter, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{"repo1:1.0.1"}
So(len(images.Results), ShouldEqual, len(expectedImages))
for _, image := range images.Results {
So(fmt.Sprintf("%s:%s", *image.RepoName, *image.Tag), ShouldBeIn, expectedImages)
}
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, armFilter, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{"repo1:1.1.0", "repo1:latest"}
So(len(images.Results), ShouldEqual, len(expectedImages))
for _, image := range images.Results {
So(fmt.Sprintf("%s:%s", *image.RepoName, *image.Tag), ShouldBeIn, expectedImages)
}
pageInput = getPageInput(1, 1)
images, err = getImageListWithCVEFixed(responseContext, "CVE1", "repo1", cveInfo, armFilter, pageInput, repoDB, log)
So(err, ShouldBeNil)
expectedImages = []string{"repo1:latest"}
So(len(images.Results), ShouldEqual, len(expectedImages))
for _, image := range images.Results {
So(fmt.Sprintf("%s:%s", *image.RepoName, *image.Tag), ShouldBeIn, expectedImages)
}
})
})
@@ -2566,6 +2654,7 @@ func TestCVEResolvers(t *testing.T) { //nolint:gocyclo
},
},
nil,
nil,
mocks.RepoDBMock{
GetMultipleRepoMetaFn: func(ctx context.Context, filter func(repoMeta repodb.RepoMetadata) bool,
requestedPage repodb.PageInput,
@@ -2592,7 +2681,8 @@ func getPageInput(limit int, offset int) *gql_generated.PageInput {
func TestDerivedImageList(t *testing.T) {
Convey("RepoDB FilterTags error", t, func() {
mockSearchDB := mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc, requestedPage repodb.PageInput,
FilterTagsFn: func(ctx context.Context,
filterFunc repodb.FilterFunc, filter repodb.Filter, requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData,
common.PageInfo, error,
) {
@@ -2633,7 +2723,8 @@ func TestDerivedImageList(t *testing.T) {
manifestDigest := godigest.FromBytes(manifestBlob)
mockSearchDB := mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc, requestedPage repodb.PageInput,
FilterTagsFn: func(ctx context.Context,
filterFunc repodb.FilterFunc, filter repodb.Filter, requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData,
common.PageInfo, error,
) {
@@ -2783,7 +2874,8 @@ func TestDerivedImageList(t *testing.T) {
ConfigBlob: configBlob,
}, nil
},
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc, requestedPage repodb.PageInput,
FilterTagsFn: func(ctx context.Context,
filterFunc repodb.FilterFunc, filter repodb.Filter, requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData,
common.PageInfo, error,
) {
@@ -2806,7 +2898,7 @@ func TestDerivedImageList(t *testing.T) {
matchedTags := repo.Tags
for tag, descriptor := range repo.Tags {
if !filter(repo, manifestMetas[descriptor.Digest]) {
if !filterFunc(repo, manifestMetas[descriptor.Digest]) {
delete(matchedTags, tag)
delete(manifestMetas, descriptor.Digest)
@@ -2861,7 +2953,8 @@ func TestDerivedImageList(t *testing.T) {
func TestBaseImageList(t *testing.T) {
Convey("RepoDB FilterTags error", t, func() {
mockSearchDB := mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc, requestedPage repodb.PageInput,
FilterTagsFn: func(ctx context.Context,
filterFunc repodb.FilterFunc, filter repodb.Filter, requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData,
common.PageInfo, error,
) {
@@ -2902,7 +2995,8 @@ func TestBaseImageList(t *testing.T) {
manifestDigest := godigest.FromBytes(manifestBlob)
mockSearchDB := mocks.RepoDBMock{
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc, requestedPage repodb.PageInput,
FilterTagsFn: func(ctx context.Context,
filterFunc repodb.FilterFunc, filter repodb.Filter, requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData,
common.PageInfo, error,
) {
@@ -3046,7 +3140,8 @@ func TestBaseImageList(t *testing.T) {
ConfigBlob: configBlob,
}, nil
},
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc, requestedPage repodb.PageInput,
FilterTagsFn: func(ctx context.Context,
filterFunc repodb.FilterFunc, filter repodb.Filter, requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData,
common.PageInfo, error,
) {
@@ -3069,7 +3164,7 @@ func TestBaseImageList(t *testing.T) {
matchedTags := repo.Tags
for tag, descriptor := range repo.Tags {
if !filter(repo, manifestMetas[descriptor.Digest]) {
if !filterFunc(repo, manifestMetas[descriptor.Digest]) {
delete(matchedTags, tag)
delete(manifestMetas, descriptor.Digest)
@@ -3221,7 +3316,8 @@ func TestBaseImageList(t *testing.T) {
ConfigBlob: configBlob,
}, nil
},
FilterTagsFn: func(ctx context.Context, filter repodb.FilterFunc, requestedPage repodb.PageInput,
FilterTagsFn: func(ctx context.Context,
filterFunc repodb.FilterFunc, filter repodb.Filter, requestedPage repodb.PageInput,
) ([]repodb.RepoMetadata, map[string]repodb.ManifestMetadata, map[string]repodb.IndexData,
common.PageInfo, error,
) {
@@ -3243,7 +3339,7 @@ func TestBaseImageList(t *testing.T) {
matchedTags := repo.Tags
for tag, descriptor := range repo.Tags {
if !filter(repo, manifestMetas[descriptor.Digest]) {
if !filterFunc(repo, manifestMetas[descriptor.Digest]) {
delete(matchedTags, tag)
delete(manifestMetas, descriptor.Digest)
+4
View File
@@ -606,6 +606,8 @@ type Query {
ImageListForCVE(
"CVE ID"
id: String!,
"Filter to apply before returning the results"
filter: Filter,
"Sets the parameters of the requested page"
requestedPage: PageInput
): PaginatedImagesResult!
@@ -619,6 +621,8 @@ type Query {
id: String!,
"Repository name"
image: String!,
"Filter to apply before returning the results"
filter: Filter,
"Sets the parameters of the requested page"
requestedPage: PageInput
): PaginatedImagesResult!
+8 -4
View File
@@ -27,21 +27,25 @@ func (r *queryResolver) CVEListForImage(ctx context.Context, image string, reque
}
// ImageListForCve is the resolver for the ImageListForCVE field.
func (r *queryResolver) ImageListForCve(ctx context.Context, id string, requestedPage *gql_generated.PageInput) (*gql_generated.PaginatedImagesResult, error) {
func (r *queryResolver) ImageListForCve(ctx context.Context, id string, filter *gql_generated.Filter, requestedPage *gql_generated.PageInput) (*gql_generated.PaginatedImagesResult, error) {
if r.cveInfo == nil {
return &gql_generated.PaginatedImagesResult{}, zerr.ErrCVESearchDisabled
}
return getImageListForCVE(ctx, id, r.cveInfo, requestedPage, r.repoDB, r.log)
filter = cleanFilter(filter)
return getImageListForCVE(ctx, id, r.cveInfo, filter, requestedPage, r.repoDB, r.log)
}
// ImageListWithCVEFixed is the resolver for the ImageListWithCVEFixed field.
func (r *queryResolver) ImageListWithCVEFixed(ctx context.Context, id string, image string, requestedPage *gql_generated.PageInput) (*gql_generated.PaginatedImagesResult, error) {
func (r *queryResolver) ImageListWithCVEFixed(ctx context.Context, id string, image string, filter *gql_generated.Filter, requestedPage *gql_generated.PageInput) (*gql_generated.PaginatedImagesResult, error) {
if r.cveInfo == nil {
return &gql_generated.PaginatedImagesResult{}, zerr.ErrCVESearchDisabled
}
return getImageListWithCVEFixed(ctx, id, image, r.cveInfo, requestedPage, r.repoDB, r.log)
filter = cleanFilter(filter)
return getImageListWithCVEFixed(ctx, id, image, r.cveInfo, filter, requestedPage, r.repoDB, r.log)
}
// ImageListForDigest is the resolver for the ImageListForDigest field.