grafana-backuper/pkg/grafanabackuper/restore.go

103 lines
2.6 KiB
Go

package grafanabackuper
import (
"context"
"fmt"
"io"
"git.ar21.de/yolokube/grafana-backuper/internal/config"
"git.ar21.de/yolokube/grafana-backuper/pkg/grafana"
)
type RestoreClient struct {
client *Client
}
func (r *RestoreClient) Start(ctx context.Context, cfg *config.Config) error {
files, err := r.client.git.ListJSONFiles("./")
if err != nil {
return err
}
r.client.logger.Debug().Int("files", len(files)).Msg("Collected all files")
for _, filename := range files {
r.client.logger.Debug().Str("file", filename).Msg("Reading data")
var data []byte
data, err = r.client.git.ReadFile(filename)
if err != nil {
return err
}
r.client.logger.Debug().Msg("Parsing raw dashboard data")
var dashboard *grafana.Dashboard
dashboard, err = r.client.grafana.Dashboard.ParseRaw(data)
if err != nil {
return err
}
content, ok := dashboard.Dashboard.(map[string]any)
if !ok {
continue
}
uid := fmt.Sprint(content["uid"])
title := fmt.Sprint(content["title"])
r.client.logger.Debug().
Str("dashboard-uid", uid).
Str("title", title).
Msg("Fetching current dashboard version from Grafana")
var current *grafana.Dashboard
current, _, err = r.client.grafana.Dashboard.Get(ctx, uid)
if err != nil {
return err
}
if current.Version == dashboard.Version && !cfg.ForceCommits {
r.client.logger.Info().
Any("dashboard-uid", uid).
Str("folder", dashboard.FolderTitle).
Str("dashboard", title).
Msg("Dashboard already up to date")
continue
}
r.client.logger.Debug().Str("dashboard-uid", uid).Str("title", title).Msg("Syncing dashboard with Grafana")
var createResp *grafana.DashboardCreateResponse
createResp, err = r.syncDashboard(ctx, dashboard, cfg.ForceCommits)
if err != nil {
return err
}
r.client.logger.Info().Any("resp", createResp).Msg("Created / Updated dashboard successfully")
}
return nil
}
func (r *RestoreClient) syncDashboard(
ctx context.Context,
d *grafana.Dashboard,
force bool,
) (*grafana.DashboardCreateResponse, error) {
createOpts := grafana.DashboardCreateOpts{
Dashboard: d.Dashboard,
FolderUID: d.FolderUID,
Message: "sync git repository to grafana",
Overwrite: force,
}
r.client.logger.Debug().Msg("Validating create options")
if err := createOpts.Validate(); err != nil {
return nil, err
}
createResp, resp, err := r.client.grafana.Dashboard.Create(ctx, createOpts)
if err != nil {
body, _ := io.ReadAll(resp.Body)
r.client.logger.Debug().Str("resp", string(body)).Msg("Got error during dashboard creation / update")
return nil, err
}
return createResp, nil
}