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 ( |
import ( |
||||||
"testing" |
"testing" |
||||||
|
|
||||||
"github.com/stretchr/testify/require" |
"github.com/stretchr/testify/require" |
||||||
|
|
||||||
|
"github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" |
||||||
) |
) |
||||||
|
|
||||||
func TestToModel(t *testing.T) { |
func TestToModel(t *testing.T) { |
||||||
t.Run("if no rules are provided the rule field should be nil", func(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", |
Title: "123", |
||||||
FolderUID: "123", |
FolderUID: "123", |
||||||
Interval: 10, |
Interval: 10, |
||||||
} |
} |
||||||
tm, err := ruleGroup.ToModel() |
tm, err := AlertRuleGroupFromApi(ruleGroup) |
||||||
require.NoError(t, err) |
require.NoError(t, err) |
||||||
require.Nil(t, tm.Rules) |
require.Nil(t, tm.Rules) |
||||||
}) |
}) |
||||||
t.Run("if rules are provided the rule field should be not nil", func(t *testing.T) { |
t.Run("if rules are provided the rule field should be not nil", func(t *testing.T) { |
||||||
ruleGroup := AlertRuleGroup{ |
ruleGroup := definitions.AlertRuleGroup{ |
||||||
Title: "123", |
Title: "123", |
||||||
FolderUID: "123", |
FolderUID: "123", |
||||||
Interval: 10, |
Interval: 10, |
||||||
Rules: []ProvisionedAlertRule{ |
Rules: []definitions.ProvisionedAlertRule{ |
||||||
{ |
{ |
||||||
UID: "1", |
UID: "1", |
||||||
}, |
}, |
||||||
}, |
}, |
||||||
} |
} |
||||||
tm, err := ruleGroup.ToModel() |
tm, err := AlertRuleGroupFromApi(ruleGroup) |
||||||
require.NoError(t, err) |
require.NoError(t, err) |
||||||
require.Len(t, tm.Rules, 1) |
require.Len(t, tm.Rules, 1) |
||||||
}) |
}) |
Loading…
Reference in new issue