mirror of
https://github.com/grafana/grafana.git
synced 2024-12-02 13:39:19 -06:00
0276b029fc
* add SQL migrations * dashboard previews from sql: poc * added todos * refactor: use the same enums where possible * use useEffect, always return json * added todo * refactor + delete files after use * refactor + fix manual thumbnail upload * refactor: move all interactions with sqlStore to thumbnail repo * refactor: remove file operations in thumb crawler/service * refactor: fix dashboard_thumbs sql store * refactor: extracted thumbnail fetching/updating to a hook * refactor: store thumbnails in redux store * refactor: store thumbnails in redux store * refactor: private'd repo methods * removed redux storage, saving images as blobs * allow for configurable rendering timeouts * added 1) query for dashboards with stale thumbnails, 2) command for marking thumbnails as stale * use sql-based queue in crawler * ui for marking thumbnails as stale * replaced `stale` boolean prop with `state` enum * introduce rendering session * compilation errors * fix crawler stop button * rename thumbnail state frozen to locked * #44449: fix merge conflicts * #44449: remove thumb methods from `Store` interface * #44449: clean filepath, defer file closing * #44449: fix rendering.Theme cyclic import * #44449: linting * #44449: linting * #44449: mutex'd crawlerStatus access * #44449: added integration tests for `sqlstore.dashboard_thumbs` * #44449: added comments to explain the `ThumbnailState` enum * #44449: use os.ReadFile rather then os.Open * #44449: always enable dashboardPreviews feature during integration tests * #44449: remove sleep time, adjust number of threads * #44449: review fix: add `orgId` to `DashboardThumbnailMeta` * #44449: review fix: automatic parsing of thumbnailState * #44449: lint fixes * #44449: crawler as a background service v0.1 * #44449: use ServerLockService * #44449: use ServerLockService * #44449: review fix: prefer `WithDbSession` over `WithTransactionalDbSession` * #44449: review fix: add a comment explaining source of the filepath * #44449: review fix: added filepath validation * #44449: fix FindDashboardsWithStaleThumbnails to include `theme` and `kind` in search params * #44449: fix FindDashboardsWithStaleThumbnails to include `theme` and `kind` in search params * #44449: create function for crawler on demand * #44449: improve crawler logging * #44449: fix wire * #44449: uncomment dummy thumb service, fix ticker interval * #44449: prevent race condition * #44449: improve logging * #44449: fix theme * #44449: review fixes https://github.com/grafana/grafana/pull/45063/files @fzambia * #44449: add missing unlock * #44449: merge * #44449: review fix - logger @fzambia https://github.com/grafana/grafana/pull/45063/files * #44449: formatting * #44449: merge conflict fix * #44449: merge conflict fix * #44449: merge conflict fix * #44449: naming fix * #44449: update authOpts * #44449: change authOpts.role back to admin * #44449: fix `walk` signature, move ctx to a first argument * #44449: add `dashboardPreviewsScheduler` feature flag Co-authored-by: Ryan McKinley <ryantxu@gmail.com> Co-authored-by: Alexander Emelin <frvzmb@gmail.com>
140 lines
3.6 KiB
Go
140 lines
3.6 KiB
Go
package models
|
|
|
|
import (
|
|
"encoding/json"
|
|
"errors"
|
|
"fmt"
|
|
"time"
|
|
)
|
|
|
|
type ThumbnailKind string
|
|
type ThumbnailState string
|
|
type CrawlerMode string
|
|
|
|
const (
|
|
// ThumbnailKindDefault is a small 320x240 preview
|
|
ThumbnailKindDefault ThumbnailKind = "thumb"
|
|
|
|
// unsupported for now
|
|
// - ThumbnailKindLarge ThumbnailKind = "large"
|
|
// - ThumbnailKindTall ThumbnailKind = "tall"
|
|
)
|
|
|
|
const (
|
|
// ThumbnailStateDefault is the initial state for all thumbnails. Thumbnails in the "default" state will be considered stale,
|
|
// and thus refreshed by the crawler, if the dashboard version from the time of taking the thumbnail is different from the current dashboard version
|
|
ThumbnailStateDefault ThumbnailState = "default"
|
|
|
|
// ThumbnailStateStale is a manually assigned state. Thumbnails in the "stale" state will be refreshed on the next crawler run
|
|
ThumbnailStateStale ThumbnailState = "stale"
|
|
|
|
// ThumbnailStateLocked is a manually assigned state. Thumbnails in the "locked" state will not be refreshed by the crawler as long as they remain in the "locked" state.
|
|
ThumbnailStateLocked ThumbnailState = "locked"
|
|
)
|
|
|
|
func (s ThumbnailState) IsValid() bool {
|
|
return s == ThumbnailStateDefault || s == ThumbnailStateStale || s == ThumbnailStateLocked
|
|
}
|
|
|
|
func (s *ThumbnailState) UnmarshalJSON(data []byte) error {
|
|
var str string
|
|
err := json.Unmarshal(data, &str)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
*s = ThumbnailState(str)
|
|
|
|
if !s.IsValid() {
|
|
if (*s) != "" {
|
|
return fmt.Errorf("JSON validation error: invalid thumbnail state value: %s", *s)
|
|
}
|
|
|
|
*s = ThumbnailStateDefault
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// IsKnownThumbnailKind checks if the value is supported
|
|
func (p ThumbnailKind) IsKnownThumbnailKind() bool {
|
|
switch p {
|
|
case
|
|
ThumbnailKindDefault:
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
func ParseThumbnailKind(str string) (ThumbnailKind, error) {
|
|
switch str {
|
|
case string(ThumbnailKindDefault):
|
|
return ThumbnailKindDefault, nil
|
|
}
|
|
return ThumbnailKindDefault, errors.New("unknown thumbnail kind " + str)
|
|
}
|
|
|
|
// A DashboardThumbnail includes all metadata for a dashboard thumbnail
|
|
type DashboardThumbnail struct {
|
|
Id int64 `json:"id"`
|
|
DashboardId int64 `json:"dashboardId"`
|
|
DashboardVersion int `json:"dashboardVersion"`
|
|
State ThumbnailState `json:"state"`
|
|
PanelId int64 `json:"panelId,omitempty"`
|
|
Kind ThumbnailKind `json:"kind"`
|
|
Theme Theme `json:"theme"`
|
|
Image []byte `json:"image"`
|
|
MimeType string `json:"mimeType"`
|
|
Updated time.Time `json:"updated"`
|
|
}
|
|
|
|
//
|
|
// Commands
|
|
//
|
|
|
|
// DashboardThumbnailMeta uniquely identifies a thumbnail; a natural key
|
|
type DashboardThumbnailMeta struct {
|
|
DashboardUID string
|
|
OrgId int64
|
|
PanelID int64
|
|
Kind ThumbnailKind
|
|
Theme Theme
|
|
}
|
|
|
|
type GetDashboardThumbnailCommand struct {
|
|
DashboardThumbnailMeta
|
|
|
|
Result *DashboardThumbnail
|
|
}
|
|
|
|
const DashboardVersionForManualThumbnailUpload = -1
|
|
|
|
type DashboardWithStaleThumbnail struct {
|
|
Id int64
|
|
OrgId int64
|
|
Uid string
|
|
Version int
|
|
Slug string
|
|
}
|
|
|
|
type FindDashboardsWithStaleThumbnailsCommand struct {
|
|
IncludeManuallyUploadedThumbnails bool
|
|
Theme Theme
|
|
Kind ThumbnailKind
|
|
Result []*DashboardWithStaleThumbnail
|
|
}
|
|
|
|
type SaveDashboardThumbnailCommand struct {
|
|
DashboardThumbnailMeta
|
|
DashboardVersion int
|
|
Image []byte
|
|
MimeType string
|
|
|
|
Result *DashboardThumbnail
|
|
}
|
|
|
|
type UpdateThumbnailStateCommand struct {
|
|
State ThumbnailState
|
|
DashboardThumbnailMeta
|
|
}
|