Dashboard Provisioning: Add duplicate cleanup for modes 0-2 (#113336)

This commit is contained in:
Stephanie Hingtgen
2025-11-02 20:39:15 +00:00
committed by GitHub
parent c98259f74a
commit 445e88cb93
8 changed files with 139 additions and 11 deletions
+53 -3
View File
@@ -209,7 +209,7 @@ func (d *dashboardStore) GetProvisionedDataByDashboardID(ctx context.Context, da
return sess.Table(`dashboard`).
Join(`INNER`, `dashboard_provisioning`, `dashboard.id = dashboard_provisioning.dashboard_id`).
Where(`dashboard_provisioning.dashboard_id = ?`, dashboardID).
Select("dashboard.*, dashboard_provisioning.name, dashboard_provisioning.external_id, dashboard_provisioning.updated as provisioning_updated, dashboard_provisioning.check_sum").
Select("dashboard.id, dashboard.uid, dashboard.title, dashboard.folder_uid, dashboard.org_id, dashboard_provisioning.name, dashboard_provisioning.external_id, dashboard_provisioning.updated as provisioning_updated, dashboard_provisioning.check_sum").
Find(&data)
})
if err != nil {
@@ -241,7 +241,7 @@ func (d *dashboardStore) GetProvisionedDataByDashboardUID(ctx context.Context, o
return sess.Table(`dashboard`).
Join(`INNER`, `dashboard_provisioning`, `dashboard.id = dashboard_provisioning.dashboard_id`).
Where(`dashboard_provisioning.dashboard_id = ?`, dashboard.ID).
Select("dashboard.*, dashboard_provisioning.name, dashboard_provisioning.external_id, dashboard_provisioning.updated as provisioning_updated, dashboard_provisioning.check_sum").
Select("dashboard.id, dashboard.uid, dashboard.title, dashboard.folder_uid, dashboard.org_id, dashboard_provisioning.name, dashboard_provisioning.external_id, dashboard_provisioning.updated as provisioning_updated, dashboard_provisioning.check_sum").
Find(&provisionedDashboard)
})
if err != nil {
@@ -275,7 +275,7 @@ func (d *dashboardStore) GetProvisionedDashboardsByName(ctx context.Context, nam
return sess.Table(`dashboard`).
Join(`INNER`, `dashboard_provisioning`, `dashboard.id = dashboard_provisioning.dashboard_id`).
Where(`dashboard_provisioning.name = ? AND dashboard.org_id = ?`, name, orgID).
Select("dashboard.*, dashboard_provisioning.name, dashboard_provisioning.external_id, dashboard_provisioning.updated as provisioning_updated, dashboard_provisioning.check_sum").
Select("dashboard.id, dashboard.uid, dashboard.title, dashboard.folder_uid, dashboard.org_id, dashboard_provisioning.name, dashboard_provisioning.external_id, dashboard_provisioning.updated as provisioning_updated, dashboard_provisioning.check_sum").
Find(&dashes)
})
if err != nil {
@@ -301,6 +301,56 @@ func (d *dashboardStore) GetOrphanedProvisionedDashboards(ctx context.Context, n
return dashes, nil
}
func (d *dashboardStore) GetDuplicateProvisionedDashboards(ctx context.Context) ([]*dashboards.DashboardProvisioningSearchResults, error) {
ctx, span := tracer.Start(ctx, "dashboards.database.GetDuplicateProvisionedDashboards")
defer span.End()
dashes := []*dashboards.DashboardProvisioningSearchResults{}
err := d.store.WithDbSession(ctx, func(sess *db.Session) error {
type duplicateGroup struct {
Name string `xorm:"name"`
ExternalID string `xorm:"external_id"`
CheckSum string `xorm:"check_sum"`
}
duplicateGroups := []duplicateGroup{}
err := sess.SQL(`
SELECT dp.name, dp.external_id
FROM dashboard_provisioning dp
INNER JOIN dashboard d ON d.id = dp.dashboard_id
GROUP BY dp.name, dp.external_id, dp.check_sum
HAVING COUNT(*) > 1
`).Find(&duplicateGroups)
if err != nil {
return err
}
if len(duplicateGroups) == 0 {
return nil
}
for _, group := range duplicateGroups {
var groupDashes []*dashboards.DashboardProvisioningSearchResults
err := sess.Table(`dashboard`).
Join(`INNER`, `dashboard_provisioning`, `dashboard.id = dashboard_provisioning.dashboard_id`).
Where(`dashboard_provisioning.name = ? AND dashboard_provisioning.external_id = ?`, group.Name, group.ExternalID).
Find(&groupDashes)
if err != nil {
return err
}
dashes = append(dashes, groupDashes...)
}
return nil
})
if err != nil {
return nil, err
}
return dashes, nil
}
func (d *dashboardStore) SaveProvisionedDashboard(ctx context.Context, cmd dashboards.SaveDashboardCommand, provisioning *dashboards.DashboardProvisioning) (*dashboards.Dashboard, error) {
ctx, span := tracer.Start(ctx, "dashboards.database.SaveProvisionedDashboard")
defer span.End()