mirror of https://github.com/grafana/grafana
Alerting: Add file provisioning for notification policies (#52877)
parent
d9cace4dca
commit
eab6365cf7
@ -0,0 +1,55 @@ |
||||
package alerting |
||||
|
||||
import ( |
||||
"context" |
||||
"fmt" |
||||
|
||||
"github.com/grafana/grafana/pkg/infra/log" |
||||
"github.com/grafana/grafana/pkg/services/ngalert/models" |
||||
"github.com/grafana/grafana/pkg/services/ngalert/provisioning" |
||||
) |
||||
|
||||
type NotificationPolicyProvisioner interface { |
||||
Provision(ctx context.Context, files []*AlertingFile) error |
||||
Unprovision(ctx context.Context, files []*AlertingFile) error |
||||
} |
||||
|
||||
type defaultNotificationPolicyProvisioner struct { |
||||
logger log.Logger |
||||
notificationPolicyService provisioning.NotificationPolicyService |
||||
} |
||||
|
||||
func NewNotificationPolicyProvisoner(logger log.Logger, |
||||
notificationPolicyService provisioning.NotificationPolicyService) NotificationPolicyProvisioner { |
||||
return &defaultNotificationPolicyProvisioner{ |
||||
logger: logger, |
||||
notificationPolicyService: notificationPolicyService, |
||||
} |
||||
} |
||||
|
||||
func (c *defaultNotificationPolicyProvisioner) Provision(ctx context.Context, |
||||
files []*AlertingFile) error { |
||||
for _, file := range files { |
||||
for _, np := range file.Policies { |
||||
err := c.notificationPolicyService.UpdatePolicyTree(ctx, np.OrgID, |
||||
np.Policy, models.ProvenanceFile) |
||||
if err != nil { |
||||
return fmt.Errorf("%s: %w", file.Filename, err) |
||||
} |
||||
} |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
func (c *defaultNotificationPolicyProvisioner) Unprovision(ctx context.Context, |
||||
files []*AlertingFile) error { |
||||
for _, file := range files { |
||||
for _, orgID := range file.ResetPolicies { |
||||
_, err := c.notificationPolicyService.ResetPolicyTree(ctx, int64(orgID)) |
||||
if err != nil { |
||||
return fmt.Errorf("%s: %w", file.Filename, err) |
||||
} |
||||
} |
||||
} |
||||
return nil |
||||
} |
@ -0,0 +1,29 @@ |
||||
package alerting |
||||
|
||||
import ( |
||||
"github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" |
||||
"github.com/grafana/grafana/pkg/services/provisioning/values" |
||||
) |
||||
|
||||
type NotificiationPolicyV1 struct { |
||||
OrgID values.Int64Value `json:"orgId" yaml:"orgId"` |
||||
Policy definitions.Route `json:",inline" yaml:",inline"` |
||||
} |
||||
|
||||
func (v1 *NotificiationPolicyV1) mapToModel() NotificiationPolicy { |
||||
orgID := v1.OrgID.Value() |
||||
if orgID < 1 { |
||||
orgID = 1 |
||||
} |
||||
// we don't need any further validation here as it's done by
|
||||
// the notification policy service
|
||||
return NotificiationPolicy{ |
||||
OrgID: orgID, |
||||
Policy: v1.Policy, |
||||
} |
||||
} |
||||
|
||||
type NotificiationPolicy struct { |
||||
OrgID int64 |
||||
Policy definitions.Route |
||||
} |
@ -0,0 +1,7 @@ |
||||
apiVersion: 1 |
||||
policies: |
||||
- orgId: 1337 |
||||
receiver: grafana-default-email |
||||
group_by: |
||||
- grafana_folder |
||||
- alertname |
@ -0,0 +1,6 @@ |
||||
apiVersion: 1 |
||||
policies: |
||||
- receiver: grafana-default-email |
||||
group_by: |
||||
- grafana_folder |
||||
- alertname |
@ -0,0 +1,11 @@ |
||||
apiVersion: 1 |
||||
policies: |
||||
- receiver: grafana-default-email |
||||
group_by: |
||||
- grafana_folder |
||||
- alertname |
||||
- orgId: 1337 |
||||
receiver: grafana-default-email |
||||
group_by: |
||||
- grafana_folder |
||||
- alertname |
Loading…
Reference in new issue