mirror of
https://github.com/grafana/grafana.git
synced 2024-11-23 09:26:43 -06:00
4bb3f66569
* Update backend * Update frontend * Keep old plugin id * Update docs * Place doc images to a new directory * Legacy support for stackdriver-auto alignment * Consistent plugin name * Apply suggestions from code review Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com> Co-authored-by: Tobias Skarhed <1438972+tskarhed@users.noreply.github.com> * Update docs * Update public/app/plugins/datasource/cloud-monitoring/README.md Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com> * Add reference to the data source formerly being named Stackdriver * Update pkg/models/datasource.go Co-authored-by: Carl Bergquist <carl@grafana.com> * Fix gofmt Co-authored-by: Marcus Efraimsson <marcus.efraimsson@gmail.com> Co-authored-by: Tobias Skarhed <1438972+tskarhed@users.noreply.github.com> Co-authored-by: Carl Bergquist <carl@grafana.com>
249 lines
7.8 KiB
Go
249 lines
7.8 KiB
Go
package models
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/grafana/grafana/pkg/components/securejsondata"
|
|
"github.com/grafana/grafana/pkg/components/simplejson"
|
|
)
|
|
|
|
const (
|
|
DS_GRAPHITE = "graphite"
|
|
DS_INFLUXDB = "influxdb"
|
|
DS_INFLUXDB_08 = "influxdb_08"
|
|
DS_ES = "elasticsearch"
|
|
DS_OPENTSDB = "opentsdb"
|
|
DS_CLOUDWATCH = "cloudwatch"
|
|
DS_KAIROSDB = "kairosdb"
|
|
DS_PROMETHEUS = "prometheus"
|
|
DS_POSTGRES = "postgres"
|
|
DS_MYSQL = "mysql"
|
|
DS_MSSQL = "mssql"
|
|
DS_ACCESS_DIRECT = "direct"
|
|
DS_ACCESS_PROXY = "proxy"
|
|
// Stackdriver was renamed Google Cloud monitoring 2020-05 but we keep
|
|
// "stackdriver" to avoid breaking changes in reporting.
|
|
DS_CLOUD_MONITORING = "stackdriver"
|
|
DS_AZURE_MONITOR = "grafana-azure-monitor-datasource"
|
|
DS_LOKI = "loki"
|
|
)
|
|
|
|
var (
|
|
ErrDataSourceNotFound = errors.New("Data source not found")
|
|
ErrDataSourceNameExists = errors.New("Data source with the same name already exists")
|
|
ErrDataSourceUidExists = errors.New("Data source with the same uid already exists")
|
|
ErrDataSourceUpdatingOldVersion = errors.New("Trying to update old version of datasource")
|
|
ErrDatasourceIsReadOnly = errors.New("Data source is readonly. Can only be updated from configuration")
|
|
ErrDataSourceAccessDenied = errors.New("Data source access denied")
|
|
ErrDataSourceFailedGenerateUniqueUid = errors.New("Failed to generate unique datasource id")
|
|
)
|
|
|
|
type DsAccess string
|
|
|
|
type DataSource struct {
|
|
Id int64
|
|
OrgId int64
|
|
Version int
|
|
|
|
Name string
|
|
Type string
|
|
Access DsAccess
|
|
Url string
|
|
Password string
|
|
User string
|
|
Database string
|
|
BasicAuth bool
|
|
BasicAuthUser string
|
|
BasicAuthPassword string
|
|
WithCredentials bool
|
|
IsDefault bool
|
|
JsonData *simplejson.Json
|
|
SecureJsonData securejsondata.SecureJsonData
|
|
ReadOnly bool
|
|
Uid string
|
|
|
|
Created time.Time
|
|
Updated time.Time
|
|
}
|
|
|
|
// DecryptedBasicAuthPassword returns data source basic auth password in plain text. It uses either deprecated
|
|
// basic_auth_password field or encrypted secure_json_data[basicAuthPassword] variable.
|
|
func (ds *DataSource) DecryptedBasicAuthPassword() string {
|
|
return ds.decryptedValue("basicAuthPassword", ds.BasicAuthPassword)
|
|
}
|
|
|
|
// DecryptedPassword returns data source password in plain text. It uses either deprecated password field
|
|
// or encrypted secure_json_data[password] variable.
|
|
func (ds *DataSource) DecryptedPassword() string {
|
|
return ds.decryptedValue("password", ds.Password)
|
|
}
|
|
|
|
// decryptedValue returns decrypted value from secureJsonData
|
|
func (ds *DataSource) decryptedValue(field string, fallback string) string {
|
|
if value, ok := ds.DecryptedValue(field); ok {
|
|
return value
|
|
}
|
|
return fallback
|
|
}
|
|
|
|
var knownDatasourcePlugins = map[string]bool{
|
|
DS_ES: true,
|
|
DS_GRAPHITE: true,
|
|
DS_INFLUXDB: true,
|
|
DS_INFLUXDB_08: true,
|
|
DS_KAIROSDB: true,
|
|
DS_CLOUDWATCH: true,
|
|
DS_PROMETHEUS: true,
|
|
DS_OPENTSDB: true,
|
|
DS_POSTGRES: true,
|
|
DS_MYSQL: true,
|
|
DS_MSSQL: true,
|
|
DS_CLOUD_MONITORING: true,
|
|
DS_AZURE_MONITOR: true,
|
|
DS_LOKI: true,
|
|
"opennms": true,
|
|
"abhisant-druid-datasource": true,
|
|
"dalmatinerdb-datasource": true,
|
|
"gnocci": true,
|
|
"zabbix": true,
|
|
"newrelic-app": true,
|
|
"grafana-datadog-datasource": true,
|
|
"grafana-simple-json": true,
|
|
"grafana-splunk-datasource": true,
|
|
"udoprog-heroic-datasource": true,
|
|
"grafana-openfalcon-datasource": true,
|
|
"opennms-datasource": true,
|
|
"rackerlabs-blueflood-datasource": true,
|
|
"crate-datasource": true,
|
|
"ayoungprogrammer-finance-datasource": true,
|
|
"monasca-datasource": true,
|
|
"vertamedia-clickhouse-datasource": true,
|
|
"alexanderzobnin-zabbix-datasource": true,
|
|
"grafana-influxdb-flux-datasource": true,
|
|
"doitintl-bigquery-datasource": true,
|
|
"grafana-azure-data-explorer-datasource": true,
|
|
}
|
|
|
|
func IsKnownDataSourcePlugin(dsType string) bool {
|
|
_, exists := knownDatasourcePlugins[dsType]
|
|
return exists
|
|
}
|
|
|
|
// ----------------------
|
|
// COMMANDS
|
|
|
|
// Also acts as api DTO
|
|
type AddDataSourceCommand struct {
|
|
Name string `json:"name" binding:"Required"`
|
|
Type string `json:"type" binding:"Required"`
|
|
Access DsAccess `json:"access" binding:"Required"`
|
|
Url string `json:"url"`
|
|
Password string `json:"password"`
|
|
Database string `json:"database"`
|
|
User string `json:"user"`
|
|
BasicAuth bool `json:"basicAuth"`
|
|
BasicAuthUser string `json:"basicAuthUser"`
|
|
BasicAuthPassword string `json:"basicAuthPassword"`
|
|
WithCredentials bool `json:"withCredentials"`
|
|
IsDefault bool `json:"isDefault"`
|
|
JsonData *simplejson.Json `json:"jsonData"`
|
|
SecureJsonData map[string]string `json:"secureJsonData"`
|
|
Uid string `json:"uid"`
|
|
|
|
OrgId int64 `json:"-"`
|
|
ReadOnly bool `json:"-"`
|
|
|
|
Result *DataSource
|
|
}
|
|
|
|
// Also acts as api DTO
|
|
type UpdateDataSourceCommand struct {
|
|
Name string `json:"name" binding:"Required"`
|
|
Type string `json:"type" binding:"Required"`
|
|
Access DsAccess `json:"access" binding:"Required"`
|
|
Url string `json:"url"`
|
|
Password string `json:"password"`
|
|
User string `json:"user"`
|
|
Database string `json:"database"`
|
|
BasicAuth bool `json:"basicAuth"`
|
|
BasicAuthUser string `json:"basicAuthUser"`
|
|
BasicAuthPassword string `json:"basicAuthPassword"`
|
|
WithCredentials bool `json:"withCredentials"`
|
|
IsDefault bool `json:"isDefault"`
|
|
JsonData *simplejson.Json `json:"jsonData"`
|
|
SecureJsonData map[string]string `json:"secureJsonData"`
|
|
Version int `json:"version"`
|
|
Uid string `json:"uid"`
|
|
|
|
OrgId int64 `json:"-"`
|
|
Id int64 `json:"-"`
|
|
ReadOnly bool `json:"-"`
|
|
|
|
Result *DataSource
|
|
}
|
|
|
|
type DeleteDataSourceByIdCommand struct {
|
|
Id int64
|
|
OrgId int64
|
|
|
|
DeletedDatasourcesCount int64
|
|
}
|
|
|
|
type DeleteDataSourceByNameCommand struct {
|
|
Name string
|
|
OrgId int64
|
|
|
|
DeletedDatasourcesCount int64
|
|
}
|
|
|
|
// ---------------------
|
|
// QUERIES
|
|
|
|
type GetDataSourcesQuery struct {
|
|
OrgId int64
|
|
User *SignedInUser
|
|
Result []*DataSource
|
|
}
|
|
|
|
type GetAllDataSourcesQuery struct {
|
|
Result []*DataSource
|
|
}
|
|
|
|
type GetDataSourceByIdQuery struct {
|
|
Id int64
|
|
OrgId int64
|
|
Result *DataSource
|
|
}
|
|
|
|
type GetDataSourceByNameQuery struct {
|
|
Name string
|
|
OrgId int64
|
|
Result *DataSource
|
|
}
|
|
|
|
// ---------------------
|
|
// Permissions
|
|
// ---------------------
|
|
|
|
type DsPermissionType int
|
|
|
|
const (
|
|
DsPermissionNoAccess DsPermissionType = iota
|
|
DsPermissionQuery
|
|
)
|
|
|
|
func (p DsPermissionType) String() string {
|
|
names := map[int]string{
|
|
int(DsPermissionQuery): "Query",
|
|
int(DsPermissionNoAccess): "No Access",
|
|
}
|
|
return names[int(p)]
|
|
}
|
|
|
|
type DatasourcesPermissionFilterQuery struct {
|
|
User *SignedInUser
|
|
Datasources []*DataSource
|
|
Result []*DataSource
|
|
}
|