From 654ef3af1adf216200e36ff4b59b0016d2c7f499 Mon Sep 17 00:00:00 2001 From: Yann Brillouet Date: Mon, 8 Jun 2026 17:41:50 +0200 Subject: [PATCH 1/5] revert graphql-go completely --- go.mod | 2 +- go.sum | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f294a97726392..167ae88dbb3a9 100644 --- a/go.mod +++ b/go.mod @@ -65,7 +65,7 @@ require ( github.com/googleapis/gax-go/v2 v2.22.0 github.com/gorilla/schema v1.4.1 github.com/grafana/pyroscope-go v1.3.1 - github.com/graph-gophers/graphql-go v1.10.2 + github.com/graph-gophers/graphql-go v1.5.0 github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99 github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 diff --git a/go.sum b/go.sum index 6adaf441acd43..fa8d4eec553b8 100644 --- a/go.sum +++ b/go.sum @@ -611,6 +611,7 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -856,8 +857,8 @@ github.com/grafana/pyroscope-go v1.3.1 h1:Eb9h55+vtLezn/DQ4iXz+SJrOz8CNghDk9xx8X github.com/grafana/pyroscope-go v1.3.1/go.mod h1:vjZr7UNVSvbpVH+G9SBy8K0fATjfYwl+W12xLNOx9Xg= github.com/grafana/pyroscope-go/godeltaprof v0.1.11 h1:el5LYpXissAiCKZ5/6yjlr6mhYVV6Cp5lahTocxraXM= github.com/grafana/pyroscope-go/godeltaprof v0.1.11/go.mod h1:jl1V8M4cWsXciROCPIDDG7CtjSjT/ECbp6eLVuMxYRI= -github.com/graph-gophers/graphql-go v1.10.2 h1:HXu6Wu5klCH4ALn1fQHVI20cjEIa4wftavHIgbLA4Fo= -github.com/graph-gophers/graphql-go v1.10.2/go.mod h1:AsADheC4CCFwd8n1/QbkduTlHgYYMsRgtPihYVAlEsk= +github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= +github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= @@ -1216,6 +1217,7 @@ github.com/openshift/library-go v0.0.0-20260318142011-72bf34f474bc h1:a+rVRzEdFI github.com/openshift/library-go v0.0.0-20260318142011-72bf34f474bc/go.mod h1:3bi4pLpYRdVd1aEhsHfRTJkwxwPLfRZ+ZePn3RmJd2k= github.com/openshift/runtime-utils v0.0.0-20230921210328-7bdb5b9c177b h1:oXzC1N6E9gw76/WH2gEA8GEHvuq09wuVQ9GoCuR8GF4= github.com/openshift/runtime-utils v0.0.0-20230921210328-7bdb5b9c177b/go.mod h1:l9/qeKZuAmYUMl0yicJlbkPGDsIycGhwxOvOAWyaP0E= +github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/operator-framework/operator-lib v0.17.0 h1:cbz51wZ9+GpWR1ZYP4CSKSSBxDlWxmmnseaHVZZjZt4= github.com/operator-framework/operator-lib v0.17.0/go.mod h1:TGopBxIE8L6E/Cojzo26R3NFp1eNlqhQNmzqhOblaLw= github.com/owenrumney/go-sarif v1.1.1/go.mod h1:dNDiPlF04ESR/6fHlPyq7gHKmrM0sHUvAGjsoh8ZH0U= @@ -1598,6 +1600,7 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= +go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0 h1:Dn8rkudDzY6KV9dr/D/bTUuWgqDf9xe0rr4G2elrn0Y= @@ -1632,6 +1635,7 @@ go.opentelemetry.io/otel/sdk/log v0.19.0 h1:scYVLqT22D2gqXItnWiocLUKGH9yvkkeql5d go.opentelemetry.io/otel/sdk/log v0.19.0/go.mod h1:vFBowwXGLlW9AvpuF7bMgnNI95LiW10szrOdvzBHlAg= go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= From 0fa49ceb9cb9ff720280859604e3a4f499eef69c Mon Sep 17 00:00:00 2001 From: Yann Brillouet Date: Tue, 30 Jun 2026 16:48:58 +0200 Subject: [PATCH 2/5] Move from interface resolvers to implementation resolvers --- central/graphql/resolvers/image_components_v2_postgres_test.go | 2 +- central/graphql/resolvers/image_vulnerabilities_v2_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/central/graphql/resolvers/image_components_v2_postgres_test.go b/central/graphql/resolvers/image_components_v2_postgres_test.go index bc1896e4f99a6..4d109d5b2eed6 100644 --- a/central/graphql/resolvers/image_components_v2_postgres_test.go +++ b/central/graphql/resolvers/image_components_v2_postgres_test.go @@ -605,7 +605,7 @@ func (s *GraphQLImageComponentV2TestSuite) TestTopImageVulnerability() { assert.Equal(s.T(), expectedID, vuln.Id(ctx)) } -func (s *GraphQLImageComponentV2TestSuite) getImageResolver(ctx context.Context, id string) ImageResolver { +func (s *GraphQLImageComponentV2TestSuite) getImageResolver(ctx context.Context, id string) *imageV2Resolver { imageID := graphql.ID(id) image, err := s.resolver.Image(ctx, struct{ ID graphql.ID }{ID: imageID}) diff --git a/central/graphql/resolvers/image_vulnerabilities_v2_test.go b/central/graphql/resolvers/image_vulnerabilities_v2_test.go index 1bd63ee126787..04d41c3011eb8 100644 --- a/central/graphql/resolvers/image_vulnerabilities_v2_test.go +++ b/central/graphql/resolvers/image_vulnerabilities_v2_test.go @@ -735,7 +735,7 @@ func (s *GraphQLImageVulnerabilityV2TestSuite) TestImageVulnerabilityExceptionCo s.Equal(int32(1), count) } -func (s *GraphQLImageVulnerabilityV2TestSuite) getImageResolver(ctx context.Context, id string) ImageResolver { +func (s *GraphQLImageVulnerabilityV2TestSuite) getImageResolver(ctx context.Context, id string) *imageV2Resolver { imageID := graphql.ID(id) image, err := s.resolver.Image(ctx, struct{ ID graphql.ID }{ID: imageID}) From 292a2c80cab28c80c0fe1910cf295b3102338ed3 Mon Sep 17 00:00:00 2001 From: Yann Brillouet Date: Wed, 1 Jul 2026 14:05:28 +0200 Subject: [PATCH 3/5] Fix tests and linters --- central/graphql/resolvers/image_components_v2_postgres_test.go | 2 +- central/graphql/resolvers/image_vulnerabilities_v2_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/central/graphql/resolvers/image_components_v2_postgres_test.go b/central/graphql/resolvers/image_components_v2_postgres_test.go index 4d109d5b2eed6..bc1896e4f99a6 100644 --- a/central/graphql/resolvers/image_components_v2_postgres_test.go +++ b/central/graphql/resolvers/image_components_v2_postgres_test.go @@ -605,7 +605,7 @@ func (s *GraphQLImageComponentV2TestSuite) TestTopImageVulnerability() { assert.Equal(s.T(), expectedID, vuln.Id(ctx)) } -func (s *GraphQLImageComponentV2TestSuite) getImageResolver(ctx context.Context, id string) *imageV2Resolver { +func (s *GraphQLImageComponentV2TestSuite) getImageResolver(ctx context.Context, id string) ImageResolver { imageID := graphql.ID(id) image, err := s.resolver.Image(ctx, struct{ ID graphql.ID }{ID: imageID}) diff --git a/central/graphql/resolvers/image_vulnerabilities_v2_test.go b/central/graphql/resolvers/image_vulnerabilities_v2_test.go index 04d41c3011eb8..1bd63ee126787 100644 --- a/central/graphql/resolvers/image_vulnerabilities_v2_test.go +++ b/central/graphql/resolvers/image_vulnerabilities_v2_test.go @@ -735,7 +735,7 @@ func (s *GraphQLImageVulnerabilityV2TestSuite) TestImageVulnerabilityExceptionCo s.Equal(int32(1), count) } -func (s *GraphQLImageVulnerabilityV2TestSuite) getImageResolver(ctx context.Context, id string) *imageV2Resolver { +func (s *GraphQLImageVulnerabilityV2TestSuite) getImageResolver(ctx context.Context, id string) ImageResolver { imageID := graphql.ID(id) image, err := s.resolver.Image(ctx, struct{ ID graphql.ID }{ID: imageID}) From d02d4da90811a6dca4a42c8d35d6c4245f21cd03 Mon Sep 17 00:00:00 2001 From: Yann Brillouet Date: Wed, 1 Jul 2026 11:24:53 +0200 Subject: [PATCH 4/5] chore: revert to GraphQL interface resolvers --- .../resolvers/cluster_vulnerabilities.go | 39 +++++++++++-------- .../cluster_vulnerabilities_postgres_test.go | 2 +- central/graphql/resolvers/clusters.go | 16 ++++---- central/graphql/resolvers/deployments.go | 4 +- central/graphql/resolvers/image_components.go | 26 ++++++++----- .../image_components_v2_postgres_test.go | 4 +- central/graphql/resolvers/image_cve_core.go | 9 ++++- central/graphql/resolvers/image_scan.go | 2 +- .../resolvers/image_vulnerabilities.go | 39 ++++++++++++------- .../image_vulnerabilities_v2_test.go | 4 +- central/graphql/resolvers/images.go | 23 ++++++----- central/graphql/resolvers/images_v2.go | 10 ++--- central/graphql/resolvers/namespaces.go | 4 +- central/graphql/resolvers/node_components.go | 33 ++++++++++------ central/graphql/resolvers/node_cve_core.go | 2 +- central/graphql/resolvers/node_scan.go | 10 +++-- .../graphql/resolvers/node_vulnerabilities.go | 39 ++++++++++++------- central/graphql/resolvers/nodes.go | 6 +-- .../graphql/resolvers/platform_cve_core.go | 2 +- .../plotted_image_vulnerabilities.go | 2 +- .../resolvers/plotted_node_vulnerabilities.go | 2 +- central/graphql/resolvers/test_utils.go | 14 +++---- .../resolvers/vulnerability_counter.go | 21 +--------- 23 files changed, 173 insertions(+), 140 deletions(-) diff --git a/central/graphql/resolvers/cluster_vulnerabilities.go b/central/graphql/resolvers/cluster_vulnerabilities.go index 6cb5c33b42b2a..89ce553b46107 100644 --- a/central/graphql/resolvers/cluster_vulnerabilities.go +++ b/central/graphql/resolvers/cluster_vulnerabilities.go @@ -55,10 +55,8 @@ type ClusterVulnerabilityResolver interface { VulnerabilityTypes() []string } -var _ ClusterVulnerabilityResolver = (*clusterCVEResolver)(nil) - // ClusterVulnerability returns a vulnerability of the given id -func (resolver *Resolver) ClusterVulnerability(ctx context.Context, args IDQuery) (*clusterCVEResolver, error) { +func (resolver *Resolver) ClusterVulnerability(ctx context.Context, args IDQuery) (ClusterVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "ClusterVulnerability") // check permissions @@ -77,7 +75,7 @@ func (resolver *Resolver) ClusterVulnerability(ctx context.Context, args IDQuery } // ClusterVulnerabilities resolves a set of image vulnerabilities for the input query -func (resolver *Resolver) ClusterVulnerabilities(ctx context.Context, q PaginatedQuery) ([]*clusterCVEResolver, error) { +func (resolver *Resolver) ClusterVulnerabilities(ctx context.Context, q PaginatedQuery) ([]ClusterVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "ClusterVulnerabilities") // check permissions @@ -100,7 +98,17 @@ func (resolver *Resolver) ClusterVulnerabilities(ctx context.Context, q Paginate // get values query = tryUnsuppressedQuery(query) vulns, err := loader.FromQuery(ctx, query) - return resolver.wrapClusterCVEsWithContext(ctx, vulns, err) + cveResolvers, err := resolver.wrapClusterCVEsWithContext(ctx, vulns, err) + if err != nil { + return nil, err + } + + // cast as return type + ret := make([]ClusterVulnerabilityResolver, 0, len(cveResolvers)) + for _, res := range cveResolvers { + ret = append(ret, res) + } + return ret, nil } // ClusterVulnerabilityCount returns count of image vulnerabilities for the input query @@ -172,13 +180,13 @@ func (resolver *Resolver) ClusterVulnerabilityCounter(ctx context.Context, args } // K8sClusterVulnerability resolves a single k8s vulnerability based on an id (the CVE value). -func (resolver *Resolver) K8sClusterVulnerability(ctx context.Context, args IDQuery) (*clusterCVEResolver, error) { +func (resolver *Resolver) K8sClusterVulnerability(ctx context.Context, args IDQuery) (ClusterVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "K8sClusterVulnerability") return resolver.ClusterVulnerability(ctx, args) } // K8sClusterVulnerabilities resolves a set of k8s vulnerabilities based on a query. -func (resolver *Resolver) K8sClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*clusterCVEResolver, error) { +func (resolver *Resolver) K8sClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ClusterVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "K8sClusterVulnerabilities") query := withK8sTypeFiltering(args.String()) return resolver.ClusterVulnerabilities(ctx, PaginatedQuery{Query: &query, Pagination: args.Pagination}) @@ -192,13 +200,13 @@ func (resolver *Resolver) K8sClusterVulnerabilityCount(ctx context.Context, args } // IstioClusterVulnerability resolves a single k8s vulnerability based on an id (the CVE value). -func (resolver *Resolver) IstioClusterVulnerability(ctx context.Context, args IDQuery) (*clusterCVEResolver, error) { +func (resolver *Resolver) IstioClusterVulnerability(ctx context.Context, args IDQuery) (ClusterVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "IstioClusterVulnerability") return resolver.ClusterVulnerability(ctx, args) } // IstioClusterVulnerabilities resolves a set of k8s vulnerabilities based on a query. -func (resolver *Resolver) IstioClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*clusterCVEResolver, error) { +func (resolver *Resolver) IstioClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ClusterVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "IstioClusterVulnerabilities") query := withIstioTypeFiltering(args.String()) return resolver.ClusterVulnerabilities(ctx, PaginatedQuery{Query: &query, Pagination: args.Pagination}) @@ -212,13 +220,13 @@ func (resolver *Resolver) IstioClusterVulnerabilityCount(ctx context.Context, ar } // OpenShiftClusterVulnerability resolves a single k8s vulnerability based on an id (the CVE value). -func (resolver *Resolver) OpenShiftClusterVulnerability(ctx context.Context, args IDQuery) (*clusterCVEResolver, error) { +func (resolver *Resolver) OpenShiftClusterVulnerability(ctx context.Context, args IDQuery) (ClusterVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "OpenShiftClusterVulnerability") return resolver.ClusterVulnerability(ctx, args) } // OpenShiftClusterVulnerabilities resolves a set of k8s vulnerabilities based on a query. -func (resolver *Resolver) OpenShiftClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*clusterCVEResolver, error) { +func (resolver *Resolver) OpenShiftClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ClusterVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "OpenShiftClusterVulnerabilities") query := withOpenShiftTypeFiltering(args.String()) return resolver.ClusterVulnerabilities(ctx, PaginatedQuery{Query: &query, Pagination: args.Pagination}) @@ -268,13 +276,10 @@ func (resolver *clusterCVEResolver) clusterVulnerabilityScopeContext(ctx context }) } -func clusterCveToVulnerabilityWithSeverity(in []*storage.ClusterCVE) []*vulnerabilityWithSeverityImpl { - ret := make([]*vulnerabilityWithSeverityImpl, len(in)) +func clusterCveToVulnerabilityWithSeverity(in []*storage.ClusterCVE) []VulnerabilityWithSeverity { + ret := make([]VulnerabilityWithSeverity, len(in)) for i, vuln := range in { - ret[i] = &vulnerabilityWithSeverityImpl{ - id: vuln.GetId(), - severity: vuln.GetSeverity(), - } + ret[i] = vuln } return ret } diff --git a/central/graphql/resolvers/cluster_vulnerabilities_postgres_test.go b/central/graphql/resolvers/cluster_vulnerabilities_postgres_test.go index 9ea4384dd374f..1b975aa93a7b1 100644 --- a/central/graphql/resolvers/cluster_vulnerabilities_postgres_test.go +++ b/central/graphql/resolvers/cluster_vulnerabilities_postgres_test.go @@ -424,7 +424,7 @@ func (s *GraphQLClusterVulnerabilityTestSuite) getClusterResolver(ctx context.Co return cluster } -func (s *GraphQLClusterVulnerabilityTestSuite) getClusterVulnerabilityResolver(ctx context.Context, id string) *clusterCVEResolver { +func (s *GraphQLClusterVulnerabilityTestSuite) getClusterVulnerabilityResolver(ctx context.Context, id string) ClusterVulnerabilityResolver { vulnID := graphql.ID(id) vuln, err := s.resolver.ClusterVulnerability(ctx, IDQuery{ID: &vulnID}) diff --git a/central/graphql/resolvers/clusters.go b/central/graphql/resolvers/clusters.go index a40b7ee069c7f..4679ef99fb37b 100644 --- a/central/graphql/resolvers/clusters.go +++ b/central/graphql/resolvers/clusters.go @@ -523,7 +523,7 @@ func (resolver *clusterResolver) ImageCount(ctx context.Context, args RawQuery) return resolver.root.ImageCount(resolver.clusterScopeContext(ctx), args) } -func (resolver *clusterResolver) ImageComponents(ctx context.Context, args PaginatedQuery) ([]*imageComponentV2Resolver, error) { +func (resolver *clusterResolver) ImageComponents(ctx context.Context, args PaginatedQuery) ([]ImageComponentResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Cluster, "ImageComponents") return resolver.root.ImageComponents(resolver.clusterScopeContext(ctx), args) } @@ -534,7 +534,7 @@ func (resolver *clusterResolver) ImageComponentCount(ctx context.Context, args R } // NodeComponents returns the node components in the cluster. -func (resolver *clusterResolver) NodeComponents(ctx context.Context, args PaginatedQuery) ([]*nodeComponentResolver, error) { +func (resolver *clusterResolver) NodeComponents(ctx context.Context, args PaginatedQuery) ([]NodeComponentResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Cluster, "NodeComponents") return resolver.root.NodeComponents(resolver.clusterScopeContext(ctx), args) } @@ -546,7 +546,7 @@ func (resolver *clusterResolver) NodeComponentCount(ctx context.Context, args Ra } // NodeVulnerabilities returns the node vulnerabilities in the cluster. -func (resolver *clusterResolver) NodeVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*nodeCVEResolver, error) { +func (resolver *clusterResolver) NodeVulnerabilities(ctx context.Context, args PaginatedQuery) ([]NodeVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Cluster, "NodeVulnerabilities") // (ROX-10911) Cluster scoping the context is not able to resolve node vulns when combined with 'Fixable:true/false' query @@ -588,7 +588,7 @@ func (resolver *clusterResolver) clusterScopeContext(ctx context.Context) contex }) } -func (resolver *clusterResolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*imageCVEV2Resolver, error) { +func (resolver *clusterResolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ImageVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Cluster, "ImageVulnerabilities") return resolver.root.ImageVulnerabilities(resolver.clusterScopeContext(ctx), args) } @@ -603,7 +603,7 @@ func (resolver *clusterResolver) ImageVulnerabilityCounter(ctx context.Context, return resolver.root.ImageVulnerabilityCounter(resolver.clusterScopeContext(ctx), args) } -func (resolver *clusterResolver) ClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*clusterCVEResolver, error) { +func (resolver *clusterResolver) ClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ClusterVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Cluster, "ClusterVulnerabilities") return resolver.root.ClusterVulnerabilities(resolver.clusterScopeContext(ctx), args) } @@ -618,7 +618,7 @@ func (resolver *clusterResolver) ClusterVulnerabilityCounter(ctx context.Context return resolver.root.ClusterVulnerabilityCounter(resolver.clusterScopeContext(ctx), args) } -func (resolver *clusterResolver) K8sClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*clusterCVEResolver, error) { +func (resolver *clusterResolver) K8sClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ClusterVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Cluster, "K8sClusterVulnerabilities") return resolver.root.K8sClusterVulnerabilities(resolver.clusterScopeContext(ctx), args) } @@ -628,7 +628,7 @@ func (resolver *clusterResolver) K8sClusterVulnerabilityCount(ctx context.Contex return resolver.root.K8sClusterVulnerabilityCount(resolver.clusterScopeContext(ctx), args) } -func (resolver *clusterResolver) IstioClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*clusterCVEResolver, error) { +func (resolver *clusterResolver) IstioClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ClusterVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Cluster, "IstioClusterVulnerabilities") return resolver.root.IstioClusterVulnerabilities(resolver.clusterScopeContext(ctx), args) } @@ -638,7 +638,7 @@ func (resolver *clusterResolver) IstioClusterVulnerabilityCount(ctx context.Cont return resolver.root.IstioClusterVulnerabilityCount(resolver.clusterScopeContext(ctx), args) } -func (resolver *clusterResolver) OpenShiftClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*clusterCVEResolver, error) { +func (resolver *clusterResolver) OpenShiftClusterVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ClusterVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Cluster, "OpenShiftClusterVulnerabilities") return resolver.root.OpenShiftClusterVulnerabilities(resolver.clusterScopeContext(ctx), args) } diff --git a/central/graphql/resolvers/deployments.go b/central/graphql/resolvers/deployments.go index 3c594aa47735b..cd1e3c5ceb491 100644 --- a/central/graphql/resolvers/deployments.go +++ b/central/graphql/resolvers/deployments.go @@ -524,7 +524,7 @@ func (resolver *deploymentResolver) ImageCount(ctx context.Context, args RawQuer return resolver.root.ImageCount(resolver.withDeploymentScopeContext(ctx), args) } -func (resolver *deploymentResolver) ImageComponents(ctx context.Context, args PaginatedQuery) ([]*imageComponentV2Resolver, error) { +func (resolver *deploymentResolver) ImageComponents(ctx context.Context, args PaginatedQuery) ([]ImageComponentResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Deployments, "ImageComponents") return resolver.root.ImageComponents(resolver.withDeploymentScopeContext(ctx), args) } @@ -534,7 +534,7 @@ func (resolver *deploymentResolver) ImageComponentCount(ctx context.Context, arg return resolver.root.ImageComponentCount(resolver.withDeploymentScopeContext(ctx), args) } -func (resolver *deploymentResolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*imageCVEV2Resolver, error) { +func (resolver *deploymentResolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ImageVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Deployments, "ImageVulnerabilities") return resolver.root.ImageVulnerabilities(resolver.withDeploymentScopeContext(ctx), args) } diff --git a/central/graphql/resolvers/image_components.go b/central/graphql/resolvers/image_components.go index 88f8395f3387e..3f0c8bc7a7f1f 100644 --- a/central/graphql/resolvers/image_components.go +++ b/central/graphql/resolvers/image_components.go @@ -82,7 +82,7 @@ type ImageComponentResolver interface { Images(ctx context.Context, args PaginatedQuery) ([]ImageResolver, error) ImageVulnerabilityCount(ctx context.Context, args RawQuery) (int32, error) ImageVulnerabilityCounter(ctx context.Context, args RawQuery) (*VulnerabilityCounterResolver, error) - ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*imageCVEV2Resolver, error) + ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ImageVulnerabilityResolver, error) LastScanned(ctx context.Context) (*graphql.Time, error) LayerIndex() (*int32, error) License(ctx context.Context) (*licenseResolver, error) @@ -93,7 +93,7 @@ type ImageComponentResolver interface { Priority(ctx context.Context) int32 RiskScore(ctx context.Context) float64 Source(ctx context.Context) string - TopImageVulnerability(ctx context.Context) (*imageCVEV2Resolver, error) + TopImageVulnerability(ctx context.Context) (ImageVulnerabilityResolver, error) UnusedVarSink(ctx context.Context, args RawQuery) *int32 Version(ctx context.Context) string InBaseImageLayer(ctx context.Context) bool @@ -103,10 +103,8 @@ type ImageComponentResolver interface { FixedIn(ctx context.Context) string } -var _ ImageComponentResolver = (*imageComponentV2Resolver)(nil) - // ImageComponent returns an image component based on an input id (name:version) -func (resolver *Resolver) ImageComponent(ctx context.Context, args IDQuery) (*imageComponentV2Resolver, error) { +func (resolver *Resolver) ImageComponent(ctx context.Context, args IDQuery) (ImageComponentResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "ImageComponent") // check permissions @@ -150,7 +148,7 @@ func (resolver *Resolver) ImageComponent(ctx context.Context, args IDQuery) (*im } // ImageComponents returns image components that match the input query. -func (resolver *Resolver) ImageComponents(ctx context.Context, q PaginatedQuery) ([]*imageComponentV2Resolver, error) { +func (resolver *Resolver) ImageComponents(ctx context.Context, q PaginatedQuery) ([]ImageComponentResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "ImageComponents") // check permissions @@ -213,7 +211,17 @@ func (resolver *Resolver) ImageComponents(ctx context.Context, q PaginatedQuery) normalizedComponents = append(normalizedComponents, foundComponent[normalized]) } - return resolver.wrapImageComponentV2sFlatWithContext(ctx, normalizedComponents, componentFlatData, err) + componentResolvers, err := resolver.wrapImageComponentV2sFlatWithContext(ctx, normalizedComponents, componentFlatData, err) + if err != nil { + return nil, err + } + + // cast as return type + ret := make([]ImageComponentResolver, 0, len(componentResolvers)) + for _, res := range componentResolvers { + ret = append(ret, res) + } + return ret, nil } // ImageComponentCount returns count of image components that match the input query @@ -268,7 +276,7 @@ func (resolver *imageComponentV2Resolver) ImageVulnerabilityCounter(ctx context. return resolver.root.ImageVulnerabilityCounter(resolver.imageComponentScopeContext(ctx), args) } -func (resolver *imageComponentV2Resolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*imageCVEV2Resolver, error) { +func (resolver *imageComponentV2Resolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ImageVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.ImageComponents, "ImageVulnerabilities") if resolver.ctx == nil { resolver.ctx = ctx @@ -322,7 +330,7 @@ func (resolver *imageComponentV2Resolver) PlottedImageVulnerabilities(ctx contex return resolver.root.PlottedImageVulnerabilities(resolver.imageComponentScopeContext(ctx), args) } -func (resolver *imageComponentV2Resolver) TopImageVulnerability(ctx context.Context) (*imageCVEV2Resolver, error) { +func (resolver *imageComponentV2Resolver) TopImageVulnerability(ctx context.Context) (ImageVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.ImageComponents, "TopImageVulnerability") if resolver.ctx == nil { resolver.ctx = ctx diff --git a/central/graphql/resolvers/image_components_v2_postgres_test.go b/central/graphql/resolvers/image_components_v2_postgres_test.go index bc1896e4f99a6..0af4fdd85ed42 100644 --- a/central/graphql/resolvers/image_components_v2_postgres_test.go +++ b/central/graphql/resolvers/image_components_v2_postgres_test.go @@ -614,7 +614,7 @@ func (s *GraphQLImageComponentV2TestSuite) getImageResolver(ctx context.Context, return image } -func (s *GraphQLImageComponentV2TestSuite) getImageComponentResolver(ctx context.Context, id string) *imageComponentV2Resolver { +func (s *GraphQLImageComponentV2TestSuite) getImageComponentResolver(ctx context.Context, id string) ImageComponentResolver { vulnID := graphql.ID(id) vuln, err := s.resolver.ImageComponent(ctx, IDQuery{ID: &vulnID}) assert.NoError(s.T(), err) @@ -643,7 +643,7 @@ func (s *GraphQLImageComponentV2TestSuite) getComponentIDMap(images []*storage.I } } -func verifyLocationAndLayerIndex(ctx context.Context, t *testing.T, component *imageComponentV2Resolver, assertEmpty bool) { +func verifyLocationAndLayerIndex(ctx context.Context, t *testing.T, component ImageComponentResolver, assertEmpty bool) { if strings.EqualFold(component.Source(ctx), storage.SourceType_OS.String()) { return } diff --git a/central/graphql/resolvers/image_cve_core.go b/central/graphql/resolvers/image_cve_core.go index bd6e2960953ba..0c79acd591c40 100644 --- a/central/graphql/resolvers/image_cve_core.go +++ b/central/graphql/resolvers/image_cve_core.go @@ -172,7 +172,7 @@ func (resolver *imageCVECoreResolver) Deployments(ctx context.Context, args stru }) } -func (resolver *imageCVECoreResolver) DistroTuples(ctx context.Context) ([]*imageCVEV2Resolver, error) { +func (resolver *imageCVECoreResolver) DistroTuples(ctx context.Context) ([]ImageVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.ImageCVECore, "DistroTuples") query := search.NewQueryBuilder().AddExactMatches(search.CVEID, resolver.data.GetCVEIDs()...).ProtoQuery() @@ -192,7 +192,12 @@ func (resolver *imageCVECoreResolver) DistroTuples(ctx context.Context) ([]*imag cveResolvers[i] = &imageCVEV2Resolver{ctx: ctx, root: resolver.root, data: v, flatData: nil} } - return cveResolvers, nil + // cast cves to the resolver + ret := make([]ImageVulnerabilityResolver, 0, len(cveResolvers)) + for _, res := range cveResolvers { + ret = append(ret, res) + } + return ret, nil } func (resolver *imageCVECoreResolver) FirstDiscoveredInSystem(_ context.Context) *graphql.Time { diff --git a/central/graphql/resolvers/image_scan.go b/central/graphql/resolvers/image_scan.go index 27239cb312cf3..808b2f61ef260 100644 --- a/central/graphql/resolvers/image_scan.go +++ b/central/graphql/resolvers/image_scan.go @@ -17,7 +17,7 @@ func init() { ) } -func (resolver *imageScanResolver) ImageComponents(_ context.Context, args PaginatedQuery) ([]*imageComponentV2Resolver, error) { +func (resolver *imageScanResolver) ImageComponents(_ context.Context, args PaginatedQuery) ([]ImageComponentResolver, error) { return resolver.root.ImageComponents(resolver.ctx, args) } diff --git a/central/graphql/resolvers/image_vulnerabilities.go b/central/graphql/resolvers/image_vulnerabilities.go index 37facb01a0b46..50318ed05403d 100644 --- a/central/graphql/resolvers/image_vulnerabilities.go +++ b/central/graphql/resolvers/image_vulnerabilities.go @@ -81,7 +81,7 @@ type ImageVulnerabilityResolver interface { EffectiveVulnerabilityRequest(ctx context.Context) (*VulnerabilityRequestResolver, error) ExceptionCount(ctx context.Context, args struct{ RequestStatus *[]*string }) (int32, error) ImageComponentCount(ctx context.Context, args RawQuery) (int32, error) - ImageComponents(ctx context.Context, args PaginatedQuery) ([]*imageComponentV2Resolver, error) + ImageComponents(ctx context.Context, args PaginatedQuery) ([]ImageComponentResolver, error) ImageCount(ctx context.Context, args RawQuery) (int32, error) Images(ctx context.Context, args PaginatedQuery) ([]ImageResolver, error) OperatingSystem(ctx context.Context) string @@ -90,10 +90,8 @@ type ImageVulnerabilityResolver interface { NvdScoreVersion(ctx context.Context) string } -var _ ImageVulnerabilityResolver = (*imageCVEV2Resolver)(nil) - // ImageVulnerability returns a vulnerability of the given id -func (resolver *Resolver) ImageVulnerability(ctx context.Context, args IDQuery) (*imageCVEV2Resolver, error) { +func (resolver *Resolver) ImageVulnerability(ctx context.Context, args IDQuery) (ImageVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "ImageVulnerability") // check permissions @@ -135,7 +133,7 @@ func (resolver *Resolver) ImageVulnerability(ctx context.Context, args IDQuery) } // ImageVulnerabilities resolves a set of image vulnerabilities for the input query -func (resolver *Resolver) ImageVulnerabilities(ctx context.Context, q PaginatedQuery) ([]*imageCVEV2Resolver, error) { +func (resolver *Resolver) ImageVulnerabilities(ctx context.Context, q PaginatedQuery) ([]ImageVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "ImageVulnerabilities") // check permissions if err := readImages(ctx); err != nil { @@ -188,7 +186,17 @@ func (resolver *Resolver) ImageVulnerabilities(ctx context.Context, q PaginatedQ for _, cveFlat := range cveFlatData { normalizedVulns = append(normalizedVulns, foundVulns[cveFlat.GetCVE()]) } - return resolver.wrapImageCVEV2sFlatWithContext(ctx, normalizedVulns, cveFlatData, err) + cveResolvers, err := resolver.wrapImageCVEV2sFlatWithContext(ctx, normalizedVulns, cveFlatData, err) + if err != nil { + return nil, err + } + + // cast as return type + ret := make([]ImageVulnerabilityResolver, 0, len(cveResolvers)) + for _, res := range cveResolvers { + ret = append(ret, res) + } + return ret, nil } // ImageVulnerabilityCount returns count of image vulnerabilities for the input query @@ -251,7 +259,7 @@ func (resolver *Resolver) ImageVulnerabilityCounter(ctx context.Context, args Ra } // TopImageVulnerability returns the most severe image vulnerability found in the scoped context -func (resolver *Resolver) TopImageVulnerability(ctx context.Context, args RawQuery) (*imageCVEV2Resolver, error) { +func (resolver *Resolver) TopImageVulnerability(ctx context.Context, args RawQuery) (ImageVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "TopImageVulnerability") searchCategory := v1.SearchCategory_IMAGES if features.FlattenImageData.Enabled() { @@ -298,24 +306,25 @@ func (resolver *Resolver) TopImageVulnerability(ctx context.Context, args RawQue return nil, errors.New("TopImageVulnerability query returned more than one vulnerabilities") } - return resolver.wrapImageCVEV2WithContext(ctx, topVuln[0], true, nil) + res, err := resolver.wrapImageCVEV2WithContext(ctx, topVuln[0], true, nil) + if err != nil { + return nil, err + } + return res, nil } /* Utility Functions */ -func imageCveV2ToVulnerabilityWithSeverity(in []*storage.ImageCVEV2) []*vulnerabilityWithSeverityImpl { - ret := make([]*vulnerabilityWithSeverityImpl, 0, len(in)) +func imageCveV2ToVulnerabilityWithSeverity(in []*storage.ImageCVEV2) []VulnerabilityWithSeverity { + ret := make([]VulnerabilityWithSeverity, 0, len(in)) // Data is now denormalized, need to normalize it to make the counts make sense. seenVulns := set.NewStringSet() for _, vuln := range in { if !seenVulns.Contains(vuln.GetCveBaseInfo().GetCve()) { - ret = append(ret, &vulnerabilityWithSeverityImpl{ - id: vuln.GetId(), - severity: vuln.GetSeverity(), - }) + ret = append(ret, vuln) seenVulns.Add(vuln.GetCveBaseInfo().GetCve()) } } @@ -583,7 +592,7 @@ func (resolver *imageCVEV2Resolver) DiscoveredAtImage(_ context.Context, _ RawQu return protocompat.ConvertTimestampToGraphqlTimeOrError(resolver.data.GetFirstImageOccurrence()) } -func (resolver *imageCVEV2Resolver) ImageComponents(ctx context.Context, args PaginatedQuery) ([]*imageComponentV2Resolver, error) { +func (resolver *imageCVEV2Resolver) ImageComponents(ctx context.Context, args PaginatedQuery) ([]ImageComponentResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.ImageCVEs, "ImageComponents") return resolver.root.ImageComponents(resolver.imageVulnerabilityScopeContext(ctx), args) diff --git a/central/graphql/resolvers/image_vulnerabilities_v2_test.go b/central/graphql/resolvers/image_vulnerabilities_v2_test.go index 1bd63ee126787..1c5990ada0359 100644 --- a/central/graphql/resolvers/image_vulnerabilities_v2_test.go +++ b/central/graphql/resolvers/image_vulnerabilities_v2_test.go @@ -744,7 +744,7 @@ func (s *GraphQLImageVulnerabilityV2TestSuite) getImageResolver(ctx context.Cont return image } -func (s *GraphQLImageVulnerabilityV2TestSuite) getImageVulnerabilityResolver(ctx context.Context, id string) *imageCVEV2Resolver { +func (s *GraphQLImageVulnerabilityV2TestSuite) getImageVulnerabilityResolver(ctx context.Context, id string) ImageVulnerabilityResolver { vulnID := graphql.ID(id) vuln, err := s.resolver.ImageVulnerability(ctx, IDQuery{ID: &vulnID}) @@ -753,7 +753,7 @@ func (s *GraphQLImageVulnerabilityV2TestSuite) getImageVulnerabilityResolver(ctx return vuln } -func getCVEList(ctx context.Context, vulns []*imageCVEV2Resolver) []string { +func getCVEList(ctx context.Context, vulns []ImageVulnerabilityResolver) []string { cveList := make([]string, 0, len(vulns)) for _, vuln := range vulns { cveList = append(cveList, vuln.CVE(ctx)) diff --git a/central/graphql/resolvers/images.go b/central/graphql/resolvers/images.go index 6429ad9057285..46f8fb85f3e89 100644 --- a/central/graphql/resolvers/images.go +++ b/central/graphql/resolvers/images.go @@ -54,12 +54,12 @@ type ImageResolver interface { BaseImage(ctx context.Context) (*baseImageResolver, error) Deployments(ctx context.Context, args PaginatedQuery) ([]*deploymentResolver, error) DeploymentCount(ctx context.Context, args RawQuery) (int32, error) - TopImageVulnerability(ctx context.Context, args RawQuery) (*imageCVEV2Resolver, error) - ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*imageCVEV2Resolver, error) + TopImageVulnerability(ctx context.Context, args RawQuery) (ImageVulnerabilityResolver, error) + ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ImageVulnerabilityResolver, error) ImageVulnerabilityCount(ctx context.Context, args RawQuery) (int32, error) ImageVulnerabilityCounter(ctx context.Context, args RawQuery) (*VulnerabilityCounterResolver, error) ImageCVECountBySeverity(ctx context.Context, q RawQuery) (*resourceCountBySeverityResolver, error) - ImageComponents(ctx context.Context, args PaginatedQuery) ([]*imageComponentV2Resolver, error) + ImageComponents(ctx context.Context, args PaginatedQuery) ([]ImageComponentResolver, error) ImageComponentCount(ctx context.Context, args RawQuery) (int32, error) PlottedImageVulnerabilities(ctx context.Context, args RawQuery) (*PlottedImageVulnerabilitiesResolver, error) Scan(ctx context.Context) (*imageScanResolver, error) @@ -73,8 +73,6 @@ type ImageResolver interface { SignatureCount(ctx context.Context) (int32, error) } -var _ ImageResolver = (*imageResolver)(nil) - var ( imageWatchStatuses []string @@ -235,13 +233,13 @@ func (resolver *imageResolver) DeploymentCount(ctx context.Context, args RawQuer } // TopImageVulnerability returns the image vulnerability with the top CVSS score. -func (resolver *imageResolver) TopImageVulnerability(ctx context.Context, args RawQuery) (*imageCVEV2Resolver, error) { +func (resolver *imageResolver) TopImageVulnerability(ctx context.Context, args RawQuery) (ImageVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Images, "TopImageVulnerability") return resolver.root.TopImageVulnerability(resolver.withImageScopeContext(ctx), args) } -// ImageVulnerabilities returns, as imageCVEV2Resolver, the vulnerabilities for the image -func (resolver *imageResolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*imageCVEV2Resolver, error) { +// ImageVulnerabilities returns, as ImageVulnerabilityResolver, the vulnerabilities for the image +func (resolver *imageResolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ImageVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Images, "ImageVulnerabilities") return resolver.root.ImageVulnerabilities(resolver.withImageScopeContext(ctx), args) } @@ -275,10 +273,15 @@ func (resolver *imageResolver) ImageCVECountBySeverity(ctx context.Context, q Ra return nil, err } val, err := resolver.root.ImageCVEView.CountBySeverity(resolver.withImageScopeContext(ctx), query) - return resolver.root.wrapResourceCountByCVESeverityWithContext(ctx, val, err) + imgResolver, err := resolver.root.wrapResourceCountByCVESeverityWithContext(ctx, val, err) + if err != nil { + log.Error(err) + return nil, err + } + return imgResolver, nil } -func (resolver *imageResolver) ImageComponents(ctx context.Context, args PaginatedQuery) ([]*imageComponentV2Resolver, error) { +func (resolver *imageResolver) ImageComponents(ctx context.Context, args PaginatedQuery) ([]ImageComponentResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Images, "ImageComponents") imgResolver, err := resolver.root.ImageComponents(resolver.withImageScopeContext(ctx), args) if err != nil { diff --git a/central/graphql/resolvers/images_v2.go b/central/graphql/resolvers/images_v2.go index d715481f85441..9ea15e44e716a 100644 --- a/central/graphql/resolvers/images_v2.go +++ b/central/graphql/resolvers/images_v2.go @@ -56,8 +56,6 @@ func init() { ) } -var _ ImageResolver = (*imageV2Resolver)(nil) - // ImagesV2 returns GraphQL resolvers for all images using the ImageV2 model func (resolver *Resolver) ImageV2s(ctx context.Context, args PaginatedQuery) ([]ImageResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "ImageV2s") @@ -141,13 +139,13 @@ func (resolver *imageV2Resolver) DeploymentCount(ctx context.Context, args RawQu } // TopImageVulnerability returns the image vulnerability with the top CVSS score. -func (resolver *imageV2Resolver) TopImageVulnerability(ctx context.Context, args RawQuery) (*imageCVEV2Resolver, error) { +func (resolver *imageV2Resolver) TopImageVulnerability(ctx context.Context, args RawQuery) (ImageVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Images, "TopImageVulnerability") return resolver.root.TopImageVulnerability(resolver.withImageScopeContext(ctx), args) } -// ImageVulnerabilities returns, as imageCVEV2Resolver, the vulnerabilities for the image -func (resolver *imageV2Resolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*imageCVEV2Resolver, error) { +// ImageVulnerabilities returns, as ImageVulnerabilityResolver, the vulnerabilities for the image +func (resolver *imageV2Resolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ImageVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Images, "ImageVulnerabilities") return resolver.root.ImageVulnerabilities(resolver.withImageScopeContext(ctx), args) } @@ -184,7 +182,7 @@ func (resolver *imageV2Resolver) ImageCVECountBySeverity(ctx context.Context, q return resolver.root.wrapResourceCountByCVESeverityWithContext(ctx, val, err) } -func (resolver *imageV2Resolver) ImageComponents(ctx context.Context, args PaginatedQuery) ([]*imageComponentV2Resolver, error) { +func (resolver *imageV2Resolver) ImageComponents(ctx context.Context, args PaginatedQuery) ([]ImageComponentResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Images, "ImageComponents") return resolver.root.ImageComponents(resolver.withImageScopeContext(ctx), args) } diff --git a/central/graphql/resolvers/namespaces.go b/central/graphql/resolvers/namespaces.go index 1cdddabd02362..cbde5703ff071 100644 --- a/central/graphql/resolvers/namespaces.go +++ b/central/graphql/resolvers/namespaces.go @@ -483,7 +483,7 @@ func (resolver *namespaceResolver) getActiveDeployAlerts(ctx context.Context, q return resolver.root.ViolationsDataStore.SearchListAlerts(ctx, q, true) } -func (resolver *namespaceResolver) ImageComponents(ctx context.Context, args PaginatedQuery) ([]*imageComponentV2Resolver, error) { +func (resolver *namespaceResolver) ImageComponents(ctx context.Context, args PaginatedQuery) ([]ImageComponentResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Namespaces, "ImageComponents") return resolver.root.ImageComponents(resolver.namespaceScopeContext(ctx), args) } @@ -509,7 +509,7 @@ func (resolver *namespaceResolver) namespaceScopeContext(ctx context.Context) co }) } -func (resolver *namespaceResolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*imageCVEV2Resolver, error) { +func (resolver *namespaceResolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ImageVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Namespaces, "ImageVulnerabilities") return resolver.root.ImageVulnerabilities(resolver.namespaceScopeContext(ctx), args) } diff --git a/central/graphql/resolvers/node_components.go b/central/graphql/resolvers/node_components.go index 26f6fc4ded6d5..f54f8404851ab 100644 --- a/central/graphql/resolvers/node_components.go +++ b/central/graphql/resolvers/node_components.go @@ -63,7 +63,7 @@ type NodeComponentResolver interface { Name(ctx context.Context) string Nodes(ctx context.Context, args PaginatedQuery) ([]*nodeResolver, error) NodeCount(ctx context.Context, args RawQuery) (int32, error) - NodeVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*nodeCVEResolver, error) + NodeVulnerabilities(ctx context.Context, args PaginatedQuery) ([]NodeVulnerabilityResolver, error) NodeVulnerabilityCount(ctx context.Context, args RawQuery) (int32, error) NodeVulnerabilityCounter(ctx context.Context, args RawQuery) (*VulnerabilityCounterResolver, error) OperatingSystem(ctx context.Context) string @@ -71,15 +71,13 @@ type NodeComponentResolver interface { Priority(ctx context.Context) int32 RiskScore(ctx context.Context) float64 Source(ctx context.Context) string - TopNodeVulnerability(ctx context.Context) (*nodeCVEResolver, error) + TopNodeVulnerability(ctx context.Context) (NodeVulnerabilityResolver, error) UnusedVarSink(ctx context.Context, args RawQuery) *int32 Version(ctx context.Context) string } -var _ NodeComponentResolver = (*nodeComponentResolver)(nil) - // NodeComponent returns a node component based on an input id (name:version) -func (resolver *Resolver) NodeComponent(ctx context.Context, args IDQuery) (*nodeComponentResolver, error) { +func (resolver *Resolver) NodeComponent(ctx context.Context, args IDQuery) (NodeComponentResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "NodeComponent") if err := readNodes(ctx); err != nil { @@ -95,7 +93,7 @@ func (resolver *Resolver) NodeComponent(ctx context.Context, args IDQuery) (*nod } // NodeComponents returns node components that match the input query. -func (resolver *Resolver) NodeComponents(ctx context.Context, q PaginatedQuery) ([]*nodeComponentResolver, error) { +func (resolver *Resolver) NodeComponents(ctx context.Context, q PaginatedQuery) ([]NodeComponentResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "NodeComponents") if err := readNodes(ctx); err != nil { @@ -111,7 +109,16 @@ func (resolver *Resolver) NodeComponents(ctx context.Context, q PaginatedQuery) } comps, err := loader.FromQuery(ctx, query) - return resolver.wrapNodeComponentsWithContext(ctx, comps, err) + componentResolvers, err := resolver.wrapNodeComponentsWithContext(ctx, comps, err) + if err != nil { + return nil, err + } + + ret := make([]NodeComponentResolver, 0, len(componentResolvers)) + for _, res := range componentResolvers { + ret = append(ret, res) + } + return ret, nil } // NodeComponentCount returns count of node components that match the input query @@ -157,7 +164,7 @@ func (resolver *nodeComponentResolver) nodeComponentQuery() *v1.Query { return search.NewQueryBuilder().AddExactMatches(search.ComponentID, resolver.data.GetId()).ProtoQuery() } -func getNodeCVEResolvers(ctx context.Context, root *Resolver, os string, vulns []*storage.NodeVulnerability, query *v1.Query) ([]*nodeCVEResolver, error) { +func getNodeCVEResolvers(ctx context.Context, root *Resolver, os string, vulns []*storage.NodeVulnerability, query *v1.Query) ([]NodeVulnerabilityResolver, error) { query, _ = search.FilterQueryWithMap(query, mappings.NodeVulnerabilityOptionsMap) predicate, err := nodeVulnerabilityPredicateFactory.GeneratePredicate(query) if err != nil { @@ -192,7 +199,11 @@ func getNodeCVEResolvers(ctx context.Context, root *Resolver, os string, vulns [ return resolverObjs[i].data.GetId() < resolverObjs[j].data.GetId() }) } - return paginate(query.GetPagination(), resolverObjs, nil) + nodeVulnResolvers := make([]NodeVulnerabilityResolver, 0, len(resolverObjs)) + for _, resolver := range resolverObjs { + nodeVulnResolvers = append(nodeVulnResolvers, resolver) + } + return paginate(query.GetPagination(), nodeVulnResolvers, nil) } /* @@ -263,7 +274,7 @@ func (resolver *nodeComponentResolver) NodeCount(ctx context.Context, args RawQu } // NodeVulnerabilities contained in the node component -func (resolver *nodeComponentResolver) NodeVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*nodeCVEResolver, error) { +func (resolver *nodeComponentResolver) NodeVulnerabilities(ctx context.Context, args PaginatedQuery) ([]NodeVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.NodeComponents, "NodeVulnerabilities") if resolver.ctx == nil { @@ -308,7 +319,7 @@ func (resolver *nodeComponentResolver) Source(_ context.Context) string { } // TopNodeVulnerability returns the first node component vulnerability with the top CVSS score -func (resolver *nodeComponentResolver) TopNodeVulnerability(ctx context.Context) (*nodeCVEResolver, error) { +func (resolver *nodeComponentResolver) TopNodeVulnerability(ctx context.Context) (NodeVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.NodeComponents, "TopNodeVulnerability") // Short path. Full node is embedded when node scan resolver is called. diff --git a/central/graphql/resolvers/node_cve_core.go b/central/graphql/resolvers/node_cve_core.go index 8044d39a1a03a..ca8092891113f 100644 --- a/central/graphql/resolvers/node_cve_core.go +++ b/central/graphql/resolvers/node_cve_core.go @@ -84,7 +84,7 @@ func (resolver *nodeCVECoreResolver) CVE(_ context.Context) string { return resolver.data.GetCVE() } -func (resolver *nodeCVECoreResolver) DistroTuples(ctx context.Context) ([]*nodeCVEResolver, error) { +func (resolver *nodeCVECoreResolver) DistroTuples(ctx context.Context) ([]NodeVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.NodeCVEs, "DistroTuples") // DistroTuples resolver filters out snoozed CVEs when no explicit filter by CVESuppressed is provided. // When DistroTuples resolver is called from here, it is to get the details of a single CVE which cannot be diff --git a/central/graphql/resolvers/node_scan.go b/central/graphql/resolvers/node_scan.go index 012fb8620d76b..0f95e36b84d28 100644 --- a/central/graphql/resolvers/node_scan.go +++ b/central/graphql/resolvers/node_scan.go @@ -42,7 +42,7 @@ func (resolver *nodeScanResolver) NodeComponentCount(_ context.Context, args Raw return resolver.root.NodeComponentCount(resolver.ctx, args) } -func (resolver *nodeScanResolver) NodeComponents(ctx context.Context, args PaginatedQuery) ([]*nodeComponentResolver, error) { +func (resolver *nodeScanResolver) NodeComponents(ctx context.Context, args PaginatedQuery) ([]NodeComponentResolver, error) { if resolver.ctx == nil { resolver.ctx = ctx } @@ -53,7 +53,7 @@ func (resolver *nodeScanResolver) NodeComponents(ctx context.Context, args Pagin return getNodeComponentResolvers(resolver.ctx, resolver.root, resolver.data, query) } -func getNodeComponentResolvers(ctx context.Context, root *Resolver, nodeScan *storage.NodeScan, query *v1.Query) ([]*nodeComponentResolver, error) { +func getNodeComponentResolvers(ctx context.Context, root *Resolver, nodeScan *storage.NodeScan, query *v1.Query) ([]NodeComponentResolver, error) { query, _ = search.FilterQueryWithMap(query, mappings.NodeComponentOptionsMap) predicate, err := nodeComponentPredicateFactory.GeneratePredicate(query) if err != nil { @@ -90,5 +90,9 @@ func getNodeComponentResolvers(ctx context.Context, root *Resolver, nodeScan *st return resolverObjs[i].data.GetId() < resolverObjs[j].data.GetId() }) } - return paginate(query.GetPagination(), resolverObjs, nil) + nodeCompResolvers := make([]NodeComponentResolver, 0, len(resolverObjs)) + for _, resolver := range resolverObjs { + nodeCompResolvers = append(nodeCompResolvers, resolver) + } + return paginate(query.GetPagination(), nodeCompResolvers, nil) } diff --git a/central/graphql/resolvers/node_vulnerabilities.go b/central/graphql/resolvers/node_vulnerabilities.go index e2ea4ab8ace9f..0e4ef66d3b0c9 100644 --- a/central/graphql/resolvers/node_vulnerabilities.go +++ b/central/graphql/resolvers/node_vulnerabilities.go @@ -44,16 +44,14 @@ type NodeVulnerabilityResolver interface { CommonVulnerabilityResolver NodeComponentCount(ctx context.Context, args RawQuery) (int32, error) - NodeComponents(ctx context.Context, args PaginatedQuery) ([]*nodeComponentResolver, error) + NodeComponents(ctx context.Context, args PaginatedQuery) ([]NodeComponentResolver, error) NodeCount(ctx context.Context, args RawQuery) (int32, error) Nodes(ctx context.Context, args PaginatedQuery) ([]*nodeResolver, error) OperatingSystem(ctx context.Context) string } -var _ NodeVulnerabilityResolver = (*nodeCVEResolver)(nil) - // NodeVulnerability resolves a single vulnerability based on an id -func (resolver *Resolver) NodeVulnerability(ctx context.Context, args IDQuery) (*nodeCVEResolver, error) { +func (resolver *Resolver) NodeVulnerability(ctx context.Context, args IDQuery) (NodeVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "NodeVulnerability") if err := readNodes(ctx); err != nil { @@ -69,7 +67,7 @@ func (resolver *Resolver) NodeVulnerability(ctx context.Context, args IDQuery) ( } // NodeVulnerabilities resolves a set of vulnerabilities based on a query. -func (resolver *Resolver) NodeVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*nodeCVEResolver, error) { +func (resolver *Resolver) NodeVulnerabilities(ctx context.Context, args PaginatedQuery) ([]NodeVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "NodeVulnerabilities") if err := readNodes(ctx); err != nil { @@ -89,7 +87,17 @@ func (resolver *Resolver) NodeVulnerabilities(ctx context.Context, args Paginate query = common.WithoutOrphanedNodeCVEsQuery(query) vulns, err := vulnLoader.FromQuery(ctx, query) - return resolver.wrapNodeCVEsWithContext(ctx, vulns, err) + vulnResolvers, err := resolver.wrapNodeCVEsWithContext(ctx, vulns, err) + + if err != nil { + return nil, err + } + + ret := make([]NodeVulnerabilityResolver, 0, len(vulnResolvers)) + for _, res := range vulnResolvers { + ret = append(ret, res) + } + return ret, nil } // NodeVulnerabilityCount returns count of node vulnerabilities based on a query @@ -154,7 +162,7 @@ func (resolver *Resolver) NodeVulnerabilityCounter(ctx context.Context, args Raw } // TopNodeVulnerability returns the most severe node vulnerability found in the scoped context -func (resolver *Resolver) TopNodeVulnerability(ctx context.Context, args RawQuery) (*nodeCVEResolver, error) { +func (resolver *Resolver) TopNodeVulnerability(ctx context.Context, args RawQuery) (NodeVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Root, "TopNodeVulnerability") if err := readNodes(ctx); err != nil { @@ -201,7 +209,11 @@ func (resolver *Resolver) TopNodeVulnerability(ctx context.Context, args RawQuer return nil, errors.New("multiple vulnerabilities matched for top node vulnerability") } - return resolver.wrapNodeCVEWithContext(ctx, vulns[0], true, nil) + res, err := resolver.wrapNodeCVEWithContext(ctx, vulns[0], true, nil) + if err != nil { + return nil, err + } + return res, nil } /* @@ -212,13 +224,10 @@ func (resolver *nodeCVEResolver) getNodeCVEQuery() *v1.Query { return search.NewQueryBuilder().AddExactMatches(search.CVEID, resolver.data.GetId()).ProtoQuery() } -func nodeCveToVulnerabilityWithSeverity(in []*storage.NodeCVE) []*vulnerabilityWithSeverityImpl { - ret := make([]*vulnerabilityWithSeverityImpl, 0, len(in)) +func nodeCveToVulnerabilityWithSeverity(in []*storage.NodeCVE) []VulnerabilityWithSeverity { + ret := make([]VulnerabilityWithSeverity, 0, len(in)) for _, vuln := range in { - ret = append(ret, &vulnerabilityWithSeverityImpl{ - id: vuln.GetId(), - severity: vuln.GetSeverity(), - }) + ret = append(ret, vuln) } return ret } @@ -392,7 +401,7 @@ func (resolver *nodeCVEResolver) NodeComponentCount(ctx context.Context, args Ra } // NodeComponents are the node components that contain the node CVE. -func (resolver *nodeCVEResolver) NodeComponents(ctx context.Context, args PaginatedQuery) ([]*nodeComponentResolver, error) { +func (resolver *nodeCVEResolver) NodeComponents(ctx context.Context, args PaginatedQuery) ([]NodeComponentResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.NodeCVEs, "NodeComponents") return resolver.root.NodeComponents(resolver.nodeVulnerabilityScopeContext(ctx), args) } diff --git a/central/graphql/resolvers/nodes.go b/central/graphql/resolvers/nodes.go index 4da4a4ab5bca7..40ad434fd069b 100644 --- a/central/graphql/resolvers/nodes.go +++ b/central/graphql/resolvers/nodes.go @@ -301,7 +301,7 @@ func (resolver *nodeResolver) NodeStatus(_ context.Context, _ RawQuery) (string, } // NodeComponents returns the components in the node. -func (resolver *nodeResolver) NodeComponents(ctx context.Context, args PaginatedQuery) ([]*nodeComponentResolver, error) { +func (resolver *nodeResolver) NodeComponents(ctx context.Context, args PaginatedQuery) ([]NodeComponentResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Nodes, "NodeComponents") return resolver.root.NodeComponents(resolver.nodeScopeContext(ctx), args) } @@ -313,7 +313,7 @@ func (resolver *nodeResolver) NodeComponentCount(ctx context.Context, args RawQu } // TopNodeVulnerability returns the first node vulnerability with the top CVSS score. -func (resolver *nodeResolver) TopNodeVulnerability(ctx context.Context, args RawQuery) (*nodeCVEResolver, error) { +func (resolver *nodeResolver) TopNodeVulnerability(ctx context.Context, args RawQuery) (NodeVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Nodes, "TopNodeVulnerability") return resolver.root.TopNodeVulnerability(resolver.nodeScopeContext(ctx), args) @@ -330,7 +330,7 @@ func (resolver *nodeResolver) NodeCVECountBySeverity(ctx context.Context, args R } // NodeVulnerabilities returns the vulnerabilities in the node. -func (resolver *nodeResolver) NodeVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*nodeCVEResolver, error) { +func (resolver *nodeResolver) NodeVulnerabilities(ctx context.Context, args PaginatedQuery) ([]NodeVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.Nodes, "NodeVulnerabilities") return resolver.root.NodeVulnerabilities(resolver.nodeScopeContext(ctx), args) } diff --git a/central/graphql/resolvers/platform_cve_core.go b/central/graphql/resolvers/platform_cve_core.go index 3cd8d8182d994..1061743031268 100644 --- a/central/graphql/resolvers/platform_cve_core.go +++ b/central/graphql/resolvers/platform_cve_core.go @@ -209,7 +209,7 @@ func (resolver *platformCVECoreResolver) Clusters(ctx context.Context, args stru // ClusterVulnerability returns the associated cluster vulnerability with the given platform cve. // The cluster vulnerability contains metadata for cve like link, summary, etc -func (resolver *platformCVECoreResolver) ClusterVulnerability(ctx context.Context) (*clusterCVEResolver, error) { +func (resolver *platformCVECoreResolver) ClusterVulnerability(ctx context.Context) (ClusterVulnerabilityResolver, error) { defer metrics.SetGraphQLOperationDurationTime(time.Now(), pkgMetrics.PlatformCVECore, "ClusterVulnerability") cveID := graphql.ID(resolver.data.GetCVEID()) diff --git a/central/graphql/resolvers/plotted_image_vulnerabilities.go b/central/graphql/resolvers/plotted_image_vulnerabilities.go index 4c3264b90d99c..8e0955dea760f 100644 --- a/central/graphql/resolvers/plotted_image_vulnerabilities.go +++ b/central/graphql/resolvers/plotted_image_vulnerabilities.go @@ -84,7 +84,7 @@ func (resolver *PlottedImageVulnerabilitiesResolver) BasicImageVulnerabilityCoun } // ImageVulnerabilities returns the image vulnerabilities for top risky images scatter-plot -func (resolver *PlottedImageVulnerabilitiesResolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]*imageCVEV2Resolver, error) { +func (resolver *PlottedImageVulnerabilitiesResolver) ImageVulnerabilities(ctx context.Context, args PaginatedQuery) ([]ImageVulnerabilityResolver, error) { if resolver.ctx == nil { resolver.ctx = ctx } diff --git a/central/graphql/resolvers/plotted_node_vulnerabilities.go b/central/graphql/resolvers/plotted_node_vulnerabilities.go index c645d0fdc9edf..32285c2c97aa9 100644 --- a/central/graphql/resolvers/plotted_node_vulnerabilities.go +++ b/central/graphql/resolvers/plotted_node_vulnerabilities.go @@ -85,7 +85,7 @@ func (resolver *PlottedNodeVulnerabilitiesResolver) BasicNodeVulnerabilityCounte } // NodeVulnerabilities returns the node vulnerabilities for top risky nodes scatter-plot -func (resolver *PlottedNodeVulnerabilitiesResolver) NodeVulnerabilities(ctx context.Context, args PaginationWrapper) ([]*nodeCVEResolver, error) { +func (resolver *PlottedNodeVulnerabilitiesResolver) NodeVulnerabilities(ctx context.Context, args PaginationWrapper) ([]NodeVulnerabilityResolver, error) { if resolver.ctx == nil { resolver.ctx = ctx } diff --git a/central/graphql/resolvers/test_utils.go b/central/graphql/resolvers/test_utils.go index fb37b28bbd0c6..6227566ba6617 100644 --- a/central/graphql/resolvers/test_utils.go +++ b/central/graphql/resolvers/test_utils.go @@ -654,7 +654,7 @@ func getFixableRawQuery(fixable bool) (string, error) { func getIDList(ctx context.Context, resolvers interface{}) []string { var list []string switch res := resolvers.(type) { - case []*imageCVEV2Resolver: + case []ImageVulnerabilityResolver: for _, r := range res { list = append(list, string(r.Id(ctx))) } @@ -662,11 +662,11 @@ func getIDList(ctx context.Context, resolvers interface{}) []string { for _, r := range res { list = append(list, string(r.Id(ctx))) } - case []*imageComponentV2Resolver: + case []ImageComponentResolver: for _, r := range res { list = append(list, string(r.Id(ctx))) } - case []*nodeCVEResolver: + case []NodeVulnerabilityResolver: for _, r := range res { list = append(list, string(r.Id(ctx))) } @@ -674,11 +674,11 @@ func getIDList(ctx context.Context, resolvers interface{}) []string { for _, r := range res { list = append(list, string(r.Id(ctx))) } - case []*nodeComponentResolver: + case []NodeComponentResolver: for _, r := range res { list = append(list, string(r.Id(ctx))) } - case []*clusterCVEResolver: + case []ClusterVulnerabilityResolver: for _, r := range res { list = append(list, string(r.Id(ctx))) } @@ -712,7 +712,7 @@ func getNodeResolver(ctx context.Context, t *testing.T, resolver *Resolver, id s return node } -func getNodeComponentResolver(ctx context.Context, t *testing.T, resolver *Resolver, id string) *nodeComponentResolver { +func getNodeComponentResolver(ctx context.Context, t *testing.T, resolver *Resolver, id string) NodeComponentResolver { compID := graphql.ID(id) comp, err := resolver.NodeComponent(ctx, IDQuery{ID: &compID}) @@ -721,7 +721,7 @@ func getNodeComponentResolver(ctx context.Context, t *testing.T, resolver *Resol return comp } -func getNodeVulnerabilityResolver(ctx context.Context, t *testing.T, resolver *Resolver, id string) *nodeCVEResolver { +func getNodeVulnerabilityResolver(ctx context.Context, t *testing.T, resolver *Resolver, id string) NodeVulnerabilityResolver { vulnID := graphql.ID(id) vuln, err := resolver.NodeVulnerability(ctx, IDQuery{ID: &vulnID}) diff --git a/central/graphql/resolvers/vulnerability_counter.go b/central/graphql/resolvers/vulnerability_counter.go index b6f7c682c4118..93ea1b02d5971 100644 --- a/central/graphql/resolvers/vulnerability_counter.go +++ b/central/graphql/resolvers/vulnerability_counter.go @@ -81,25 +81,6 @@ type VulnerabilityWithSeverity interface { GetSeverity() storage.VulnerabilitySeverity } -type vulnerabilityWithSeverityImpl struct { - id string - severity storage.VulnerabilitySeverity -} - -func (v *vulnerabilityWithSeverityImpl) GetId() string { - if v == nil { - return "" - } - return v.id -} - -func (v *vulnerabilityWithSeverityImpl) GetSeverity() storage.VulnerabilitySeverity { - if v == nil { - return storage.VulnerabilitySeverity_UNKNOWN_VULNERABILITY_SEVERITY - } - return v.severity -} - // Static helpers. ////////////////// @@ -129,7 +110,7 @@ func mapVulnsToVulnerabilityCounter(vulns []*storage.EmbeddedVulnerability) *Vul return counter } -func mapCVEsToVulnerabilityCounter(fixable, unFixable []*vulnerabilityWithSeverityImpl) *VulnerabilityCounterResolver { +func mapCVEsToVulnerabilityCounter(fixable, unFixable []VulnerabilityWithSeverity) *VulnerabilityCounterResolver { counter := emptyVulnerabilityCounter() seenVulns := set.NewStringSet() for _, vuln := range fixable { From 5c5fae09f565e106d174d28995501acb1e44ce3f Mon Sep 17 00:00:00 2001 From: Yann Brillouet Date: Fri, 3 Jul 2026 15:48:48 +0200 Subject: [PATCH 5/5] Bump graphql-go version to fixed main branch --- go.mod | 2 +- go.sum | 8 ++------ 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index 167ae88dbb3a9..44303063db8e0 100644 --- a/go.mod +++ b/go.mod @@ -65,7 +65,7 @@ require ( github.com/googleapis/gax-go/v2 v2.22.0 github.com/gorilla/schema v1.4.1 github.com/grafana/pyroscope-go v1.3.1 - github.com/graph-gophers/graphql-go v1.5.0 + github.com/graph-gophers/graphql-go v1.10.3-0.20260702060009-60399cce0c05 github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.3 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20210315223345-82c243799c99 github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 diff --git a/go.sum b/go.sum index fa8d4eec553b8..e2bc6517261cb 100644 --- a/go.sum +++ b/go.sum @@ -611,7 +611,6 @@ github.com/go-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7 github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= @@ -857,8 +856,8 @@ github.com/grafana/pyroscope-go v1.3.1 h1:Eb9h55+vtLezn/DQ4iXz+SJrOz8CNghDk9xx8X github.com/grafana/pyroscope-go v1.3.1/go.mod h1:vjZr7UNVSvbpVH+G9SBy8K0fATjfYwl+W12xLNOx9Xg= github.com/grafana/pyroscope-go/godeltaprof v0.1.11 h1:el5LYpXissAiCKZ5/6yjlr6mhYVV6Cp5lahTocxraXM= github.com/grafana/pyroscope-go/godeltaprof v0.1.11/go.mod h1:jl1V8M4cWsXciROCPIDDG7CtjSjT/ECbp6eLVuMxYRI= -github.com/graph-gophers/graphql-go v1.5.0 h1:fDqblo50TEpD0LY7RXk/LFVYEVqo3+tXMNMPSVXA1yc= -github.com/graph-gophers/graphql-go v1.5.0/go.mod h1:YtmJZDLbF1YYNrlNAuiO5zAStUWc3XZT07iGsVqe1Os= +github.com/graph-gophers/graphql-go v1.10.3-0.20260702060009-60399cce0c05 h1:nz9OX9q1iUJZwrPA2Ge8xNlB3inmq+pafyf6qmBLBew= +github.com/graph-gophers/graphql-go v1.10.3-0.20260702060009-60399cce0c05/go.mod h1:AsADheC4CCFwd8n1/QbkduTlHgYYMsRgtPihYVAlEsk= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= @@ -1217,7 +1216,6 @@ github.com/openshift/library-go v0.0.0-20260318142011-72bf34f474bc h1:a+rVRzEdFI github.com/openshift/library-go v0.0.0-20260318142011-72bf34f474bc/go.mod h1:3bi4pLpYRdVd1aEhsHfRTJkwxwPLfRZ+ZePn3RmJd2k= github.com/openshift/runtime-utils v0.0.0-20230921210328-7bdb5b9c177b h1:oXzC1N6E9gw76/WH2gEA8GEHvuq09wuVQ9GoCuR8GF4= github.com/openshift/runtime-utils v0.0.0-20230921210328-7bdb5b9c177b/go.mod h1:l9/qeKZuAmYUMl0yicJlbkPGDsIycGhwxOvOAWyaP0E= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= github.com/operator-framework/operator-lib v0.17.0 h1:cbz51wZ9+GpWR1ZYP4CSKSSBxDlWxmmnseaHVZZjZt4= github.com/operator-framework/operator-lib v0.17.0/go.mod h1:TGopBxIE8L6E/Cojzo26R3NFp1eNlqhQNmzqhOblaLw= github.com/owenrumney/go-sarif v1.1.1/go.mod h1:dNDiPlF04ESR/6fHlPyq7gHKmrM0sHUvAGjsoh8ZH0U= @@ -1600,7 +1598,6 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.6 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.67.0/go.mod h1:NoUCKYWK+3ecatC4HjkRktREheMeEtrXoQxrqYFeHSc= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= -go.opentelemetry.io/otel v1.6.3/go.mod h1:7BgNga5fNlF/iZjG06hM3yofffp0ofKCDwSXx1GC4dI= go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU= go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc= go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc v0.19.0 h1:Dn8rkudDzY6KV9dr/D/bTUuWgqDf9xe0rr4G2elrn0Y= @@ -1635,7 +1632,6 @@ go.opentelemetry.io/otel/sdk/log v0.19.0 h1:scYVLqT22D2gqXItnWiocLUKGH9yvkkeql5d go.opentelemetry.io/otel/sdk/log v0.19.0/go.mod h1:vFBowwXGLlW9AvpuF7bMgnNI95LiW10szrOdvzBHlAg= go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= -go.opentelemetry.io/otel/trace v1.6.3/go.mod h1:GNJQusJlUgZl9/TQBPKU/Y/ty+0iVB5fjhKeJGZPGFs= go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk= go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=