From 2e0d2f3c7687d9fc4adda54f94c3ba4df6d5837e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jean-Philippe=20Qu=C3=A9m=C3=A9ner?= Date: Fri, 7 Mar 2025 15:27:31 +0100 Subject: [PATCH] fix(unified-storage): break dependency from dualwriter in resource module (#101788) --- pkg/registry/apis/dashboard/search.go | 2 +- pkg/services/apiserver/client/client.go | 2 +- pkg/storage/legacysql/dualwrite/types.go | 14 ++++++++++++++ pkg/storage/unified/resource/search_client.go | 17 ++++++++++------- 4 files changed, 26 insertions(+), 9 deletions(-) diff --git a/pkg/registry/apis/dashboard/search.go b/pkg/registry/apis/dashboard/search.go index 85f5ab2e654..7ade0969ead 100644 --- a/pkg/registry/apis/dashboard/search.go +++ b/pkg/registry/apis/dashboard/search.go @@ -43,7 +43,7 @@ type SearchHandler struct { } func NewSearchHandler(tracer trace.Tracer, dual dualwrite.Service, legacyDashboardSearcher resource.ResourceIndexClient, resourceClient resource.ResourceClient, features featuremgmt.FeatureToggles) *SearchHandler { - searchClient := resource.NewSearchClient(dual, dashboardv0alpha1.DashboardResourceInfo.GroupResource(), resourceClient, legacyDashboardSearcher) + searchClient := resource.NewSearchClient(dualwrite.NewSearchAdapter(dual), dashboardv0alpha1.DashboardResourceInfo.GroupResource(), resourceClient, legacyDashboardSearcher) return &SearchHandler{ client: searchClient, log: log.New("grafana-apiserver.dashboards.search"), diff --git a/pkg/services/apiserver/client/client.go b/pkg/services/apiserver/client/client.go index 021dc5d53eb..2b312f309bd 100644 --- a/pkg/services/apiserver/client/client.go +++ b/pkg/services/apiserver/client/client.go @@ -53,7 +53,7 @@ type k8sHandler struct { func NewK8sHandler(dual dualwrite.Service, namespacer request.NamespaceMapper, gvr schema.GroupVersionResource, restConfig func(context.Context) (*rest.Config, error), dashStore dashboards.Store, userSvc user.Service, resourceClient resource.ResourceClient, sorter sort.Service) K8sHandler { legacySearcher := legacysearcher.NewDashboardSearchClient(dashStore, sorter) - searchClient := resource.NewSearchClient(dual, gvr.GroupResource(), resourceClient, legacySearcher) + searchClient := resource.NewSearchClient(dualwrite.NewSearchAdapter(dual), gvr.GroupResource(), resourceClient, legacySearcher) return &k8sHandler{ namespacer: namespacer, diff --git a/pkg/storage/legacysql/dualwrite/types.go b/pkg/storage/legacysql/dualwrite/types.go index 0478aa5438e..a983432659c 100644 --- a/pkg/storage/legacysql/dualwrite/types.go +++ b/pkg/storage/legacysql/dualwrite/types.go @@ -50,3 +50,17 @@ type Service interface { // change the status (finish migration etc) Update(ctx context.Context, status StorageStatus) (StorageStatus, error) } + +type SearchAdapter struct { + Service +} + +func NewSearchAdapter(s Service) *SearchAdapter { + return &SearchAdapter{Service: s} +} + +func (d *SearchAdapter) IsEnabled(gr schema.GroupResource) bool { + //nolint:errcheck + status, _ := d.Status(context.Background(), gr) + return status.Runtime && d.Service.ShouldManage(gr) +} diff --git a/pkg/storage/unified/resource/search_client.go b/pkg/storage/unified/resource/search_client.go index c3ebeeea185..cf94ed29fb5 100644 --- a/pkg/storage/unified/resource/search_client.go +++ b/pkg/storage/unified/resource/search_client.go @@ -5,13 +5,15 @@ import ( "google.golang.org/grpc" "k8s.io/apimachinery/pkg/runtime/schema" - - "github.com/grafana/grafana/pkg/storage/legacysql/dualwrite" ) -func NewSearchClient(dual dualwrite.Service, gr schema.GroupResource, unifiedClient ResourceIndexClient, legacyClient ResourceIndexClient) ResourceIndexClient { - status, _ := dual.Status(context.Background(), gr) - if status.Runtime && dual.ShouldManage(gr) { +type DualWriter interface { + IsEnabled(schema.GroupResource) bool + ReadFromUnified(context.Context, schema.GroupResource) (bool, error) +} + +func NewSearchClient(dual DualWriter, gr schema.GroupResource, unifiedClient ResourceIndexClient, legacyClient ResourceIndexClient) ResourceIndexClient { + if dual.IsEnabled(gr) { return &searchWrapper{ dual: dual, groupResource: gr, @@ -19,14 +21,15 @@ func NewSearchClient(dual dualwrite.Service, gr schema.GroupResource, unifiedCli legacyClient: legacyClient, } } - if status.ReadUnified { + //nolint:errcheck + if ok, _ := dual.ReadFromUnified(context.Background(), gr); ok { return unifiedClient } return legacyClient } type searchWrapper struct { - dual dualwrite.Service + dual DualWriter groupResource schema.GroupResource unifiedClient ResourceIndexClient