mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
Alerting: validate condition before updating rulegroup (#33367)
* Alerting: validate condition before updating rulegroup * Apply suggestions from code review
This commit is contained in:
committed by
GitHub
parent
643e7af3e0
commit
7ccb022c03
@@ -158,67 +158,53 @@ func messageExtractor(b []byte) (interface{}, error) {
|
||||
}
|
||||
|
||||
func validateCondition(c ngmodels.Condition, user *models.SignedInUser, skipCache bool, datasourceCache datasources.CacheService) error {
|
||||
var refID string
|
||||
|
||||
if len(c.Data) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
for _, query := range c.Data {
|
||||
if c.Condition == query.RefID {
|
||||
refID = c.Condition
|
||||
}
|
||||
|
||||
datasourceUID, err := query.GetDatasource()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
isExpression, err := query.IsExpression()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if isExpression {
|
||||
continue
|
||||
}
|
||||
|
||||
_, err = datasourceCache.GetDatasourceByUID(datasourceUID, user, skipCache)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get datasource: %s: %w", datasourceUID, err)
|
||||
}
|
||||
refIDs, err := validateQueriesAndExpressions(c.Data, user, skipCache, datasourceCache)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if refID == "" {
|
||||
return fmt.Errorf("condition %s not found in any query or expression", c.Condition)
|
||||
t := make([]string, 0, len(refIDs))
|
||||
for refID := range refIDs {
|
||||
t = append(t, refID)
|
||||
}
|
||||
if _, ok := refIDs[c.Condition]; !ok {
|
||||
return fmt.Errorf("condition %s not found in any query or expression: it should be one of: [%s]", c.Condition, strings.Join(t, ","))
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func validateQueriesAndExpressions(data []ngmodels.AlertQuery, user *models.SignedInUser, skipCache bool, datasourceCache datasources.CacheService) error {
|
||||
func validateQueriesAndExpressions(data []ngmodels.AlertQuery, user *models.SignedInUser, skipCache bool, datasourceCache datasources.CacheService) (map[string]struct{}, error) {
|
||||
refIDs := make(map[string]struct{})
|
||||
if len(data) == 0 {
|
||||
return nil
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
for _, query := range data {
|
||||
datasourceUID, err := query.GetDatasource()
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
|
||||
isExpression, err := query.IsExpression()
|
||||
if err != nil {
|
||||
return err
|
||||
return nil, err
|
||||
}
|
||||
if isExpression {
|
||||
refIDs[query.RefID] = struct{}{}
|
||||
continue
|
||||
}
|
||||
|
||||
_, err = datasourceCache.GetDatasourceByUID(datasourceUID, user, skipCache)
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to get datasource: %s: %w", datasourceUID, err)
|
||||
return nil, fmt.Errorf("invalid query %s: %w: %s", query.RefID, err, datasourceUID)
|
||||
}
|
||||
refIDs[query.RefID] = struct{}{}
|
||||
}
|
||||
return nil
|
||||
return refIDs, nil
|
||||
}
|
||||
|
||||
func conditionEval(c *models.ReqContext, cmd ngmodels.EvalAlertConditionCommand, datasourceCache datasources.CacheService, dataService *tsdb.Service, cfg *setting.Cfg) response.Response {
|
||||
|
||||
Reference in New Issue
Block a user