mirror of https://github.com/grafana/grafana
Alerting: decouple api models from domain\dto models: separate Provenance status + converters (#63594)
* move conversions of domain models to api models and reverse from definition package to api packagepull/63828/head
parent
dc01e1ee6a
commit
f561e71de8
@ -0,0 +1,91 @@ |
||||
package api |
||||
|
||||
import ( |
||||
"time" |
||||
|
||||
"github.com/prometheus/common/model" |
||||
|
||||
"github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" |
||||
"github.com/grafana/grafana/pkg/services/ngalert/models" |
||||
) |
||||
|
||||
// AlertRuleFromProvisionedAlertRule converts definitions.ProvisionedAlertRule to models.AlertRule
|
||||
func AlertRuleFromProvisionedAlertRule(a definitions.ProvisionedAlertRule) (models.AlertRule, error) { |
||||
return models.AlertRule{ |
||||
ID: a.ID, |
||||
UID: a.UID, |
||||
OrgID: a.OrgID, |
||||
NamespaceUID: a.FolderUID, |
||||
RuleGroup: a.RuleGroup, |
||||
Title: a.Title, |
||||
Condition: a.Condition, |
||||
Data: a.Data, |
||||
Updated: a.Updated, |
||||
NoDataState: a.NoDataState, |
||||
ExecErrState: a.ExecErrState, |
||||
For: time.Duration(a.For), |
||||
Annotations: a.Annotations, |
||||
Labels: a.Labels, |
||||
IsPaused: a.IsPaused, |
||||
}, nil |
||||
} |
||||
|
||||
// ProvisionedAlertRuleFromAlertRule converts models.AlertRule to definitions.ProvisionedAlertRule and sets provided provenance status
|
||||
func ProvisionedAlertRuleFromAlertRule(rule models.AlertRule, provenance models.Provenance) definitions.ProvisionedAlertRule { |
||||
return definitions.ProvisionedAlertRule{ |
||||
ID: rule.ID, |
||||
UID: rule.UID, |
||||
OrgID: rule.OrgID, |
||||
FolderUID: rule.NamespaceUID, |
||||
RuleGroup: rule.RuleGroup, |
||||
Title: rule.Title, |
||||
For: model.Duration(rule.For), |
||||
Condition: rule.Condition, |
||||
Data: rule.Data, |
||||
Updated: rule.Updated, |
||||
NoDataState: rule.NoDataState, |
||||
ExecErrState: rule.ExecErrState, |
||||
Annotations: rule.Annotations, |
||||
Labels: rule.Labels, |
||||
Provenance: definitions.Provenance(provenance), // TODO validate enum conversion?
|
||||
IsPaused: rule.IsPaused, |
||||
} |
||||
} |
||||
|
||||
// ProvisionedAlertRuleFromAlertRules converts a collection of models.AlertRule to definitions.ProvisionedAlertRules with provenance status models.ProvenanceNone
|
||||
func ProvisionedAlertRuleFromAlertRules(rules []*models.AlertRule) definitions.ProvisionedAlertRules { |
||||
result := make([]definitions.ProvisionedAlertRule, 0, len(rules)) |
||||
for _, r := range rules { |
||||
result = append(result, ProvisionedAlertRuleFromAlertRule(*r, models.ProvenanceNone)) |
||||
} |
||||
return result |
||||
} |
||||
|
||||
func AlertRuleGroupFromApi(a definitions.AlertRuleGroup) (models.AlertRuleGroup, error) { |
||||
ruleGroup := models.AlertRuleGroup{ |
||||
Title: a.Title, |
||||
FolderUID: a.FolderUID, |
||||
Interval: a.Interval, |
||||
} |
||||
for i := range a.Rules { |
||||
converted, err := AlertRuleFromProvisionedAlertRule(a.Rules[i]) |
||||
if err != nil { |
||||
return models.AlertRuleGroup{}, err |
||||
} |
||||
ruleGroup.Rules = append(ruleGroup.Rules, converted) |
||||
} |
||||
return ruleGroup, nil |
||||
} |
||||
|
||||
func AlertRuleGroupToApi(d models.AlertRuleGroup) definitions.AlertRuleGroup { |
||||
rules := make([]definitions.ProvisionedAlertRule, 0, len(d.Rules)) |
||||
for i := range d.Rules { |
||||
rules = append(rules, ProvisionedAlertRuleFromAlertRule(d.Rules[i], d.Provenance)) |
||||
} |
||||
return definitions.AlertRuleGroup{ |
||||
Title: d.Title, |
||||
FolderUID: d.FolderUID, |
||||
Interval: d.Interval, |
||||
Rules: rules, |
||||
} |
||||
} |
@ -1,34 +1,36 @@ |
||||
package definitions |
||||
package api |
||||
|
||||
import ( |
||||
"testing" |
||||
|
||||
"github.com/stretchr/testify/require" |
||||
|
||||
"github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" |
||||
) |
||||
|
||||
func TestToModel(t *testing.T) { |
||||
t.Run("if no rules are provided the rule field should be nil", func(t *testing.T) { |
||||
ruleGroup := AlertRuleGroup{ |
||||
ruleGroup := definitions.AlertRuleGroup{ |
||||
Title: "123", |
||||
FolderUID: "123", |
||||
Interval: 10, |
||||
} |
||||
tm, err := ruleGroup.ToModel() |
||||
tm, err := AlertRuleGroupFromApi(ruleGroup) |
||||
require.NoError(t, err) |
||||
require.Nil(t, tm.Rules) |
||||
}) |
||||
t.Run("if rules are provided the rule field should be not nil", func(t *testing.T) { |
||||
ruleGroup := AlertRuleGroup{ |
||||
ruleGroup := definitions.AlertRuleGroup{ |
||||
Title: "123", |
||||
FolderUID: "123", |
||||
Interval: 10, |
||||
Rules: []ProvisionedAlertRule{ |
||||
Rules: []definitions.ProvisionedAlertRule{ |
||||
{ |
||||
UID: "1", |
||||
}, |
||||
}, |
||||
} |
||||
tm, err := ruleGroup.ToModel() |
||||
tm, err := AlertRuleGroupFromApi(ruleGroup) |
||||
require.NoError(t, err) |
||||
require.Len(t, tm.Rules, 1) |
||||
}) |
Loading…
Reference in new issue