Dashboard: replace datasource name with a reference object (#33817)

Co-authored-by: Torkel Ödegaard <torkel@grafana.com>
Co-authored-by: Elfo404 <me@giordanoricci.com>
This commit is contained in:
Ryan McKinley
2021-10-29 10:57:24 -07:00
committed by GitHub
co-authored by Torkel Ödegaard Elfo404
parent 61fbdb60ff
commit 7319efe077
78 changed files with 759 additions and 320 deletions
+53 -10
View File
@@ -33,16 +33,59 @@ type rawNode struct {
DatasourceUID string
}
func (rn *rawNode) GetDatasourceName() (string, error) {
func (rn *rawNode) GetDatasourceUID() (string, error) {
if rn.DatasourceUID != "" {
return rn.DatasourceUID, nil
}
rawDs, ok := rn.Query["datasource"]
if !ok {
return "", nil
return "", fmt.Errorf("no datasource property found in query model")
}
dsName, ok := rawDs.(string)
// For old queries with string datasource prop representing data source name
if dsName, ok := rawDs.(string); ok {
return dsName, nil
}
dsRef, ok := rawDs.(map[string]interface{})
if !ok {
return "", fmt.Errorf("expted datasource identifier to be a string, got %T", rawDs)
return "", fmt.Errorf("data source property is not an object nor string, got %T", rawDs)
}
return dsName, nil
if dsUid, ok := dsRef["uid"].(string); ok {
return dsUid, nil
}
return "", fmt.Errorf("no datasource uid found for query, got %T", rn.Query)
}
func (rn *rawNode) IsExpressionQuery() (bool, error) {
if rn.DatasourceUID != "" {
return rn.DatasourceUID == DatasourceUID, nil
}
rawDs, ok := rn.Query["datasource"]
if !ok {
return false, fmt.Errorf("no datasource property found in query model")
}
// For old queries with string datasource prop representing data source name
dsName, ok := rawDs.(string)
if ok && dsName == DatasourceName {
return true, nil
}
dsRef, ok := rawDs.(map[string]interface{})
if !ok {
return false, nil
}
if dsRef["uid"].(string) == DatasourceUID {
return true, nil
}
return false, nil
}
func (rn *rawNode) GetCommandType() (c CommandType, err error) {
@@ -171,18 +214,18 @@ func (s *Service) buildDSNode(dp *simple.DirectedGraph, rn *rawNode, req *Reques
}
rawDsID, ok := rn.Query["datasourceId"]
switch ok {
case true:
if ok {
floatDsID, ok := rawDsID.(float64)
if !ok {
return nil, fmt.Errorf("expected datasourceId to be a float64, got type %T for refId %v", rawDsID, rn.RefID)
}
dsNode.datasourceID = int64(floatDsID)
default:
if rn.DatasourceUID == "" {
} else {
dsUid, err := rn.GetDatasourceUID()
if err != nil {
return nil, fmt.Errorf("neither datasourceId or datasourceUid in expression data source request for refId %v", rn.RefID)
}
dsNode.datasourceUID = rn.DatasourceUID
dsNode.datasourceUID = dsUid
}
var floatIntervalMS float64