2022-06-02 18:27:23 -08:00
package models
2022-06-22 13:58:52 -08:00
import (
2022-09-13 13:33:41 -03:00
"encoding/json"
2022-09-07 12:08:52 -06:00
"strconv"
2022-06-22 13:58:52 -08:00
"time"
Reconcile coremodels, entities, objects under new kind framework (#56492)
* Update thema to latest
* Deal with s/Library/*Runtime/
* Commit new, working results of codegen
* We like pointers now
* Always take runtime arg for NewBase()
* Sketchy handwavy pass at entity meta framework
* Little nibbles
* Update pkg/framework/coremodel/entityframework.cue
Co-authored-by: Artur Wierzbicki <wierzbicki.artur.94@gmail.com>
* Move file into new framework location
* Introduce loaders, Go code
* Complete rename to kind
* Flesh out framework, add svg/dashboard examples
* Cruft removal
* Remove generated kind go files from gitignore
* Refine maturity concept, add SlotKind
* Update embed and go deps
* Export PrefixWithGrafanaCUE
* Make the loader actually work, holy crap
* Many small tweaks to type.cue
* Add Apache 2 licensing exceptions for kinds
* Add new kinds dir, start of generator
* Roll back to earlier oapi-codegen
* Introduce new grafana-specific CUE loaders
* Introduce new tidy code generators framework
* Catch up kind framework with tinkering
* Add slices for the generators
* Add write/verify step to main generator
* Many renames
* Split up kind framework cue files
* Use kind.Decl within generated kinds
* Create kind.SomeDecl wrapper type to cache lineages
* Better names again
* Get one generated implemented, hopefully
* Copy dashboard schema into new kind.cue
* Small fixes to make the initial gen work
* Put svg kind in its new home
* Add generated Go dashboard type
* More renames and cleanups
* Add base kind registry and generator
* Stop blacklisting *_gen.go files
This is not the Go best practice, anyway. All we actually want to ignore
for enterprise is generated wire files.
* Change codegen output directories
pkg/kind -> pkg/kinds
pkg/registry/kindreg -> pkg/registry/corekind
* Rename pkg/framework/kind to pkg/kindsys
* Add core structured kind generator
* Add plural and machine names to kind spec
* Copy playlist over to kind system
* Consolidate kindsys files
* Add raw kind generator
* Update CODEOWNERS for kind framework
* Touch up comments a bit
* More docs tweaks
* Remove generated types to reduce noise for review
* Split each generator into its own file
* Rename Slot kind to Composable kind
* Add handwavy types for customkind loading
* Guard against init calls to framework loader
* First pass at doc on extending the kind system
* Improve attribute example in docs
* Fix wire imports
* Add basic TS types generator
* Fix composable kind category def
* No need for a separate file with generate directive
* Catch dashboard schema up
* Rename generator types to something saner and generic
* Make version configurable in ts/go generators
* Add CommonMeta to ease property access
* Add kindsys prop indicating whether lineage is group
* Put all kind categories back in a single file
* Finish with kindsys group props
* Refactor maturity progression per discussion
- Replace "committed" with "merged"
- All kindcats can use all maturity levels, at least for now
* Convert ts veneer index generator to modular system
* Move over to new jennywrites framework
* Strip down old coremodel generator
* Use public version of jennywrites
* Pull latest thema
* Commit generated Go types
* Add header injection postprocessor
* Move sdboyer/jennywrites to grafana/codejen
* Tweak header output
* Remove dashboard and playlist coremodels
* Fix up backend dashboards devenv test
* Fix TS import patterns to new gen filename
* Update internal imports, remove coremodel registry
* Fix compilation errors, wire generation
* Export and replace the prefix dropper
* More Go struct and field name changes
* Last name fixes, hopefully
* Fix lint errors
* Last lint error
Co-authored-by: Artur Wierzbicki <wierzbicki.artur.94@gmail.com>
2022-11-10 15:36:40 -05:00
"github.com/grafana/grafana/pkg/kinds/dashboard"
2023-01-16 16:33:55 +01:00
"github.com/grafana/grafana/pkg/services/dashboards"
2022-09-07 12:08:52 -06:00
"github.com/grafana/grafana/pkg/tsdb/legacydata"
2022-07-06 15:51:44 -08:00
)
// PublicDashboardErr represents a dashboard error.
type PublicDashboardErr struct {
StatusCode int
Status string
Reason string
}
// Error returns the error message.
func ( e PublicDashboardErr ) Error ( ) string {
if e . Reason != "" {
return e . Reason
}
return "Dashboard Error"
}
2022-09-27 12:25:56 -06:00
const QuerySuccess = "success"
const QueryFailure = "failure"
var QueryResultStatuses = [ ] string { QuerySuccess , QueryFailure }
2022-06-02 18:27:23 -08:00
type PublicDashboard struct {
2022-12-01 11:37:08 -03:00
Uid string ` json:"uid" xorm:"pk uid" `
DashboardUid string ` json:"dashboardUid" xorm:"dashboard_uid" `
OrgId int64 ` json:"-" xorm:"org_id" ` // Don't ever marshal orgId to Json
TimeSettings * TimeSettings ` json:"timeSettings" xorm:"time_settings" `
IsEnabled bool ` json:"isEnabled" xorm:"is_enabled" `
AccessToken string ` json:"accessToken" xorm:"access_token" `
AnnotationsEnabled bool ` json:"annotationsEnabled" xorm:"annotations_enabled" `
TimeSelectionEnabled bool ` json:"timeSelectionEnabled" xorm:"time_selection_enabled" `
2023-01-24 18:23:39 -06:00
Share string ` json:"share" `
2022-06-22 13:58:52 -08:00
CreatedBy int64 ` json:"createdBy" xorm:"created_by" `
UpdatedBy int64 ` json:"updatedBy" xorm:"updated_by" `
CreatedAt time . Time ` json:"createdAt" xorm:"created_at" `
UpdatedAt time . Time ` json:"updatedAt" xorm:"updated_at" `
2022-06-02 18:27:23 -08:00
}
2022-10-18 19:48:20 -06:00
// Alias the generated type
type DashAnnotation = dashboard . AnnotationQuery
type AnnotationsDto struct {
Annotations struct {
List [ ] DashAnnotation ` json:"list" `
}
}
type AnnotationEvent struct {
Id int64 ` json:"id" `
DashboardId int64 ` json:"dashboardId" `
PanelId int64 ` json:"panelId" `
Tags [ ] string ` json:"tags" `
IsRegion bool ` json:"isRegion" `
Text string ` json:"text" `
Color string ` json:"color" `
Time int64 ` json:"time" `
TimeEnd int64 ` json:"timeEnd" `
Source dashboard . AnnotationQuery ` json:"source" `
}
2022-06-02 18:27:23 -08:00
func ( pd PublicDashboard ) TableName ( ) string {
2022-06-22 13:58:52 -08:00
return "dashboard_public"
}
2022-10-12 21:36:05 -08:00
type PublicDashboardListResponse struct {
Uid string ` json:"uid" xorm:"uid" `
AccessToken string ` json:"accessToken" xorm:"access_token" `
Title string ` json:"title" xorm:"title" `
DashboardUid string ` json:"dashboardUid" xorm:"dashboard_uid" `
IsEnabled bool ` json:"isEnabled" xorm:"is_enabled" `
}
2022-06-22 13:58:52 -08:00
type TimeSettings struct {
2022-09-13 13:33:41 -03:00
From string ` json:"from,omitempty" `
To string ` json:"to,omitempty" `
}
func ( ts * TimeSettings ) FromDB ( data [ ] byte ) error {
return json . Unmarshal ( data , ts )
}
func ( ts * TimeSettings ) ToDB ( ) ( [ ] byte , error ) {
return json . Marshal ( ts )
2022-06-22 13:58:52 -08:00
}
2022-12-15 10:44:33 -03:00
// BuildTimeSettings build time settings object using selected values if enabled and are valid or dashboard default values
2023-01-16 16:33:55 +01:00
func ( pd PublicDashboard ) BuildTimeSettings ( dashboard * dashboards . Dashboard , reqDTO PublicDashboardQueryDTO ) TimeSettings {
2022-09-07 12:08:52 -06:00
from := dashboard . Data . GetPath ( "time" , "from" ) . MustString ( )
to := dashboard . Data . GetPath ( "time" , "to" ) . MustString ( )
2022-12-15 10:44:33 -03:00
if pd . TimeSelectionEnabled {
from = reqDTO . TimeRange . From
to = reqDTO . TimeRange . To
}
2022-09-07 12:08:52 -06:00
timeRange := legacydata . NewDataTimeRange ( from , to )
// Were using epoch ms because this is used to build a MetricRequest, which is used by query caching, which expected the time range in epoch milliseconds.
2022-12-15 10:44:33 -03:00
return TimeSettings {
2022-09-07 12:08:52 -06:00
From : strconv . FormatInt ( timeRange . GetFromAsMsEpoch ( ) , 10 ) ,
To : strconv . FormatInt ( timeRange . GetToAsMsEpoch ( ) , 10 ) ,
2022-06-22 13:58:52 -08:00
}
2022-06-02 18:27:23 -08:00
}
2022-07-06 15:51:44 -08:00
// DTO for transforming user input in the api
2022-10-27 17:08:11 -08:00
type SavePublicDashboardDTO struct {
2022-07-06 15:51:44 -08:00
DashboardUid string
OrgId int64
UserId int64
PublicDashboard * PublicDashboard
}
2022-08-29 18:13:06 -03:00
type PublicDashboardQueryDTO struct {
IntervalMs int64
MaxDataPoints int64
2022-12-15 10:44:33 -03:00
TimeRange TimeSettings
2022-08-29 18:13:06 -03:00
}
2022-10-18 19:48:20 -06:00
type AnnotationsQueryDTO struct {
From int64
To int64
}
2022-06-02 18:27:23 -08:00
//
// COMMANDS
//
2022-10-27 17:08:11 -08:00
type SavePublicDashboardCommand struct {
2022-06-22 13:58:52 -08:00
PublicDashboard PublicDashboard
2022-06-02 18:27:23 -08:00
}