Search: Include managedBy in DashboardHit result (#111600)

This commit is contained in:
Ryan McKinley
2025-09-29 14:28:26 +03:00
committed by GitHub
parent 34b662c3e1
commit c4a2bb5540
12 changed files with 373 additions and 101 deletions
@@ -2043,13 +2043,13 @@ func (dr *DashboardServiceImpl) searchProvisionedDashboardsThroughK8s(ctx contex
dashs := make([]*dashboardProvisioningWithUID, 0)
for _, hit := range searchResults.Hits {
if utils.ParseManagerKindString(hit.Field.GetNestedString(resource.SEARCH_FIELD_MANAGER_KIND)) != utils.ManagerKindClassicFP { // nolint:staticcheck
if utils.ParseManagerKindString(string(hit.ManagedBy.Kind)) != utils.ManagerKindClassicFP { // nolint:staticcheck
continue
}
provisioning := &dashboardProvisioningWithUID{
DashboardProvisioning: dashboards.DashboardProvisioning{
Name: hit.Field.GetNestedString(resource.SEARCH_FIELD_MANAGER_ID),
Name: hit.ManagedBy.ID,
ExternalID: hit.Field.GetNestedString(resource.SEARCH_FIELD_SOURCE_PATH),
CheckSum: hit.Field.GetNestedString(resource.SEARCH_FIELD_SOURCE_CHECKSUM),
Updated: hit.Field.GetNestedInt64(resource.SEARCH_FIELD_SOURCE_TIME),
@@ -5,21 +5,24 @@ import (
"encoding/json"
"fmt"
common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1"
"github.com/grafana/grafana/pkg/storage/unified/resourcepb"
"github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1"
common "github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1"
"github.com/grafana/grafana/pkg/apimachinery/utils"
"github.com/grafana/grafana/pkg/storage/unified/resource"
"github.com/grafana/grafana/pkg/storage/unified/resourcepb"
)
var (
excludedFields = map[string]string{
resource.SEARCH_FIELD_EXPLAIN: "",
resource.SEARCH_FIELD_SCORE: "",
resource.SEARCH_FIELD_TITLE: "",
resource.SEARCH_FIELD_FOLDER: "",
resource.SEARCH_FIELD_TAGS: "",
resource.SEARCH_FIELD_DESCRIPTION: "",
// These fields exist at the top-level of DashboardHit
standardFields = map[string]string{
resource.SEARCH_FIELD_EXPLAIN: "",
resource.SEARCH_FIELD_SCORE: "",
resource.SEARCH_FIELD_TITLE: "",
resource.SEARCH_FIELD_FOLDER: "",
resource.SEARCH_FIELD_TAGS: "",
resource.SEARCH_FIELD_DESCRIPTION: "",
resource.SEARCH_FIELD_MANAGER_ID: "",
resource.SEARCH_FIELD_MANAGER_KIND: "",
}
IncludeFields = []string{
@@ -56,6 +59,8 @@ func ParseResults(result *resourcepb.ResourceSearchResponse, offset int64) (v0al
descriptionIDX := -1
scoreIDX := -1
explainIDX := -1
managerKindIDX := -1
managerIdIDX := -1
for i, v := range result.Results.Columns {
switch v.Name {
@@ -69,6 +74,10 @@ func ParseResults(result *resourcepb.ResourceSearchResponse, offset int64) (v0al
folderIDX = i
case resource.SEARCH_FIELD_TAGS:
tagsIDX = i
case resource.SEARCH_FIELD_MANAGER_ID:
managerIdIDX = i
case resource.SEARCH_FIELD_MANAGER_KIND:
managerKindIDX = i
case resource.SEARCH_FIELD_DESCRIPTION:
descriptionIDX = i
}
@@ -89,9 +98,10 @@ func ParseResults(result *resourcepb.ResourceSearchResponse, offset int64) (v0al
return v0alpha1.SearchResults{}, fmt.Errorf("error parsing Search Response: mismatch number of columns and cells")
}
// Dynamically defined fields
fields := &common.Unstructured{}
for colIndex, col := range result.Results.Columns {
if _, ok := excludedFields[col.Name]; !ok {
if _, ok := standardFields[col.Name]; !ok {
val, err := resource.DecodeCell(col, colIndex, row.Cells[colIndex])
if err != nil {
return v0alpha1.SearchResults{}, err
@@ -122,6 +132,12 @@ func ParseResults(result *resourcepb.ResourceSearchResponse, offset int64) (v0al
if descriptionIDX >= 0 && row.Cells[descriptionIDX] != nil {
hit.Description = string(row.Cells[descriptionIDX])
}
if managerIdIDX >= 0 && row.Cells[managerIdIDX] != nil {
hit.ManagedBy.ID = string(row.Cells[managerIdIDX])
}
if managerKindIDX >= 0 && row.Cells[managerKindIDX] != nil {
hit.ManagedBy.Kind = utils.ManagerKind(row.Cells[managerKindIDX])
}
if tagsIDX >= 0 && row.Cells[tagsIDX] != nil {
_ = json.Unmarshal(row.Cells[tagsIDX], &hit.Tags)
}
@@ -276,12 +276,8 @@ func (ss *FolderUnifiedStoreImpl) GetChildren(ctx context.Context, q folder.GetC
UID: item.Name,
Title: item.Title,
ParentUID: item.Folder,
ManagedBy: item.ManagedBy.Kind,
}
if item.Field.GetNestedString(resource.SEARCH_FIELD_MANAGER_KIND) != "" {
f.ManagedBy = utils.ParseManagerKindString(item.Field.GetNestedString(resource.SEARCH_FIELD_MANAGER_KIND))
}
hits = append(hits, f)
}