Linting fixes for dashboard provsioning (#23576)

This commit is contained in:
Carl Bergquist
2020-04-15 08:12:52 +02:00
committed by GitHub
parent 010c67cc71
commit 80f40040b0
12 changed files with 106 additions and 84 deletions
@@ -21,17 +21,22 @@ import (
)
var (
// ErrFolderNameMissing is returned when folder name is missing.
ErrFolderNameMissing = errors.New("Folder name missing")
)
type fileReader struct {
// FileReader is responsible for reading dashboards from disc and
// insert/update dashboards to the Grafana database using
// `dashboards.DashboardProvisioningService`
type FileReader struct {
Cfg *DashboardsAsConfig
Path string
log log.Logger
dashboardProvisioningService dashboards.DashboardProvisioningService
}
func NewDashboardFileReader(cfg *DashboardsAsConfig, log log.Logger) (*fileReader, error) {
// NewDashboardFileReader returns a new filereader based on `DashboardsAsConfig`
func NewDashboardFileReader(cfg *DashboardsAsConfig, log log.Logger) (*FileReader, error) {
var path string
path, ok := cfg.Options["path"].(string)
if !ok {
@@ -43,7 +48,7 @@ func NewDashboardFileReader(cfg *DashboardsAsConfig, log log.Logger) (*fileReade
log.Warn("[Deprecated] The folder property is deprecated. Please use path instead.")
}
return &fileReader{
return &FileReader{
Cfg: cfg,
Path: path,
log: log,
@@ -52,7 +57,7 @@ func NewDashboardFileReader(cfg *DashboardsAsConfig, log log.Logger) (*fileReade
}
// pollChanges periodically runs startWalkingDisk based on interval specified in the config.
func (fr *fileReader) pollChanges(ctx context.Context) {
func (fr *FileReader) pollChanges(ctx context.Context) {
ticker := time.NewTicker(time.Duration(int64(time.Second) * fr.Cfg.UpdateIntervalSeconds))
for {
@@ -69,14 +74,14 @@ func (fr *fileReader) pollChanges(ctx context.Context) {
// startWalkingDisk traverses the file system for defined path, reads dashboard definition files and applies any change
// to the database.
func (fr *fileReader) startWalkingDisk() error {
func (fr *FileReader) startWalkingDisk() error {
fr.log.Debug("Start walking disk", "path", fr.Path)
resolvedPath := fr.resolvedPath()
if _, err := os.Stat(resolvedPath); err != nil {
return err
}
folderId, err := getOrCreateFolderId(fr.Cfg, fr.dashboardProvisioningService)
folderID, err := getOrCreateFolderID(fr.Cfg, fr.dashboardProvisioningService)
if err != nil && err != ErrFolderNameMissing {
return err
}
@@ -98,7 +103,7 @@ func (fr *fileReader) startWalkingDisk() error {
// save dashboards based on json files
for path, fileInfo := range filesFoundOnDisk {
provisioningMetadata, err := fr.saveDashboard(path, folderId, fileInfo, provisionedDashboardRefs)
provisioningMetadata, err := fr.saveDashboard(path, folderID, fileInfo, provisionedDashboardRefs)
sanityChecker.track(provisioningMetadata)
if err != nil {
fr.log.Error("failed to save dashboard", "error", err)
@@ -110,7 +115,7 @@ func (fr *fileReader) startWalkingDisk() error {
}
// handleMissingDashboardFiles will unprovision or delete dashboards which are missing on disk.
func (fr *fileReader) handleMissingDashboardFiles(provisionedDashboardRefs map[string]*models.DashboardProvisioning, filesFoundOnDisk map[string]os.FileInfo) {
func (fr *FileReader) handleMissingDashboardFiles(provisionedDashboardRefs map[string]*models.DashboardProvisioning, filesFoundOnDisk map[string]os.FileInfo) {
// find dashboards to delete since json file is missing
var dashboardToDelete []int64
for path, provisioningData := range provisionedDashboardRefs {
@@ -123,27 +128,27 @@ func (fr *fileReader) handleMissingDashboardFiles(provisionedDashboardRefs map[s
if fr.Cfg.DisableDeletion {
// If deletion is disabled for the provisioner we just remove provisioning metadata about the dashboard
// so afterwards the dashboard is considered unprovisioned.
for _, dashboardId := range dashboardToDelete {
fr.log.Debug("unprovisioning provisioned dashboard. missing on disk", "id", dashboardId)
err := fr.dashboardProvisioningService.UnprovisionDashboard(dashboardId)
for _, dashboardID := range dashboardToDelete {
fr.log.Debug("unprovisioning provisioned dashboard. missing on disk", "id", dashboardID)
err := fr.dashboardProvisioningService.UnprovisionDashboard(dashboardID)
if err != nil {
fr.log.Error("failed to unprovision dashboard", "dashboard_id", dashboardId, "error", err)
fr.log.Error("failed to unprovision dashboard", "dashboard_id", dashboardID, "error", err)
}
}
} else {
// delete dashboard that are missing json file
for _, dashboardId := range dashboardToDelete {
fr.log.Debug("deleting provisioned dashboard. missing on disk", "id", dashboardId)
err := fr.dashboardProvisioningService.DeleteProvisionedDashboard(dashboardId, fr.Cfg.OrgId)
for _, dashboardID := range dashboardToDelete {
fr.log.Debug("deleting provisioned dashboard. missing on disk", "id", dashboardID)
err := fr.dashboardProvisioningService.DeleteProvisionedDashboard(dashboardID, fr.Cfg.OrgId)
if err != nil {
fr.log.Error("failed to delete dashboard", "id", dashboardId, "error", err)
fr.log.Error("failed to delete dashboard", "id", dashboardID, "error", err)
}
}
}
}
// saveDashboard saves or updates the dashboard provisioning file at path.
func (fr *fileReader) saveDashboard(path string, folderId int64, fileInfo os.FileInfo, provisionedDashboardRefs map[string]*models.DashboardProvisioning) (provisioningMetadata, error) {
func (fr *FileReader) saveDashboard(path string, folderID int64, fileInfo os.FileInfo, provisionedDashboardRefs map[string]*models.DashboardProvisioning) (provisioningMetadata, error) {
provisioningMetadata := provisioningMetadata{}
resolvedFileInfo, err := resolveSymlink(fileInfo, path)
if err != nil {
@@ -153,7 +158,7 @@ func (fr *fileReader) saveDashboard(path string, folderId int64, fileInfo os.Fil
provisionedData, alreadyProvisioned := provisionedDashboardRefs[path]
upToDate := alreadyProvisioned && provisionedData.Updated >= resolvedFileInfo.ModTime().Unix()
jsonFile, err := fr.readDashboardFromFile(path, resolvedFileInfo.ModTime(), folderId)
jsonFile, err := fr.readDashboardFromFile(path, resolvedFileInfo.ModTime(), folderID)
if err != nil {
fr.log.Error("failed to load dashboard from ", "file", path, "error", err)
return provisioningMetadata, nil
@@ -207,7 +212,7 @@ func getProvisionedDashboardByPath(service dashboards.DashboardProvisioningServi
return byPath, nil
}
func getOrCreateFolderId(cfg *DashboardsAsConfig, service dashboards.DashboardProvisioningService) (int64, error) {
func getOrCreateFolderID(cfg *DashboardsAsConfig, service dashboards.DashboardProvisioningService) (int64, error) {
if cfg.Folder == "" {
return 0, ErrFolderNameMissing
}
@@ -288,13 +293,13 @@ func validateWalkablePath(fileInfo os.FileInfo) (bool, error) {
return true, nil
}
type dashboardJsonFile struct {
type dashboardJSONFile struct {
dashboard *dashboards.SaveDashboardDTO
checkSum string
lastModified time.Time
}
func (fr *fileReader) readDashboardFromFile(path string, lastModified time.Time, folderId int64) (*dashboardJsonFile, error) {
func (fr *FileReader) readDashboardFromFile(path string, lastModified time.Time, folderID int64) (*dashboardJSONFile, error) {
reader, err := os.Open(path)
if err != nil {
return nil, err
@@ -316,19 +321,19 @@ func (fr *fileReader) readDashboardFromFile(path string, lastModified time.Time,
return nil, err
}
dash, err := createDashboardJson(data, lastModified, fr.Cfg, folderId)
dash, err := createDashboardJson(data, lastModified, fr.Cfg, folderID)
if err != nil {
return nil, err
}
return &dashboardJsonFile{
return &dashboardJSONFile{
dashboard: dash,
checkSum: checkSum,
lastModified: lastModified,
}, nil
}
func (fr *fileReader) resolvedPath() string {
func (fr *FileReader) resolvedPath() string {
if _, err := os.Stat(fr.Path); os.IsNotExist(err) {
fr.log.Error("Cannot read directory", "error", err)
}
@@ -370,10 +375,10 @@ type provisioningSanityChecker struct {
func (checker provisioningSanityChecker) track(pm provisioningMetadata) {
if len(pm.uid) > 0 {
checker.uidUsage[pm.uid] += 1
checker.uidUsage[pm.uid]++
}
if len(pm.title) > 0 {
checker.titleUsage[pm.title] += 1
checker.titleUsage[pm.title]++
}
}