mirror of https://github.com/grafana/grafana
Alerting: Add file provisioning for mute timings (#52936)
parent
7b249d19b2
commit
3d39594d75
@ -0,0 +1,73 @@ |
||||
package alerting |
||||
|
||||
import ( |
||||
"context" |
||||
|
||||
"github.com/grafana/grafana/pkg/infra/log" |
||||
"github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" |
||||
"github.com/grafana/grafana/pkg/services/ngalert/models" |
||||
"github.com/grafana/grafana/pkg/services/ngalert/provisioning" |
||||
) |
||||
|
||||
type MuteTimesProvisioner interface { |
||||
Provision(ctx context.Context, files []*AlertingFile) error |
||||
Unprovision(ctx context.Context, files []*AlertingFile) error |
||||
} |
||||
|
||||
type defaultMuteTimesProvisioner struct { |
||||
logger log.Logger |
||||
muteTimingService provisioning.MuteTimingService |
||||
} |
||||
|
||||
func NewMuteTimesProvisioner(logger log.Logger, |
||||
muteTimingService provisioning.MuteTimingService) MuteTimesProvisioner { |
||||
return &defaultMuteTimesProvisioner{ |
||||
logger: logger, |
||||
muteTimingService: muteTimingService, |
||||
} |
||||
} |
||||
|
||||
func (c *defaultMuteTimesProvisioner) Provision(ctx context.Context, |
||||
files []*AlertingFile) error { |
||||
cache := map[int64]map[string]definitions.MuteTimeInterval{} |
||||
for _, file := range files { |
||||
for _, muteTiming := range file.MuteTimes { |
||||
if _, exists := cache[muteTiming.OrgID]; !exists { |
||||
intervals, err := c.muteTimingService.GetMuteTimings(ctx, muteTiming.OrgID) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
cache[muteTiming.OrgID] = make(map[string]definitions.MuteTimeInterval, len(intervals)) |
||||
for _, interval := range intervals { |
||||
cache[muteTiming.OrgID][interval.Name] = interval |
||||
} |
||||
} |
||||
muteTiming.MuteTime.Provenance = models.ProvenanceFile |
||||
if _, exists := cache[muteTiming.OrgID][muteTiming.MuteTime.Name]; exists { |
||||
_, err := c.muteTimingService.UpdateMuteTiming(ctx, muteTiming.MuteTime, muteTiming.OrgID) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
continue |
||||
} |
||||
_, err := c.muteTimingService.CreateMuteTiming(ctx, muteTiming.MuteTime, muteTiming.OrgID) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
} |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
func (c *defaultMuteTimesProvisioner) Unprovision(ctx context.Context, |
||||
files []*AlertingFile) error { |
||||
for _, file := range files { |
||||
for _, deleteMuteTime := range file.DeleteMuteTimes { |
||||
err := c.muteTimingService.DeleteMuteTiming(ctx, deleteMuteTime.Name, deleteMuteTime.OrgID) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
} |
||||
} |
||||
return nil |
||||
} |
@ -0,0 +1,55 @@ |
||||
package alerting |
||||
|
||||
import ( |
||||
"errors" |
||||
"strings" |
||||
|
||||
"github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" |
||||
"github.com/grafana/grafana/pkg/services/provisioning/values" |
||||
) |
||||
|
||||
type MuteTimeV1 struct { |
||||
OrgID values.Int64Value `json:"orgId" yaml:"orgId"` |
||||
MuteTime definitions.MuteTimeInterval `json:",inline" yaml:",inline"` |
||||
} |
||||
|
||||
func (v1 *MuteTimeV1) mapToModel() MuteTime { |
||||
orgID := v1.OrgID.Value() |
||||
if orgID < 1 { |
||||
orgID = 1 |
||||
} |
||||
return MuteTime{ |
||||
OrgID: orgID, |
||||
MuteTime: v1.MuteTime, |
||||
} |
||||
} |
||||
|
||||
type MuteTime struct { |
||||
OrgID int64 |
||||
MuteTime definitions.MuteTimeInterval |
||||
} |
||||
|
||||
type DeleteMuteTimeV1 struct { |
||||
OrgID values.Int64Value `json:"orgId" yaml:"orgId"` |
||||
Name values.StringValue `json:"name" yaml:"name"` |
||||
} |
||||
|
||||
func (v1 *DeleteMuteTimeV1) mapToModel() (DeleteMuteTime, error) { |
||||
name := strings.TrimSpace(v1.Name.Value()) |
||||
if name == "" { |
||||
return DeleteMuteTime{}, errors.New("delete mute time missing name") |
||||
} |
||||
orgID := v1.OrgID.Value() |
||||
if orgID < 1 { |
||||
orgID = 1 |
||||
} |
||||
return DeleteMuteTime{ |
||||
OrgID: orgID, |
||||
Name: name, |
||||
}, nil |
||||
} |
||||
|
||||
type DeleteMuteTime struct { |
||||
OrgID int64 |
||||
Name string |
||||
} |
@ -0,0 +1,10 @@ |
||||
apiVersion: 1 |
||||
muteTimes: |
||||
- orgId: 1337 |
||||
name: test |
||||
time_intervals: |
||||
- times: |
||||
- start_time: '06:00' |
||||
end_time: '23:59' |
||||
weekdays: |
||||
- monday |
@ -0,0 +1,11 @@ |
||||
apiVersion: 1 |
||||
muteTimes: |
||||
- name: test |
||||
time_intervals: |
||||
- times: |
||||
- start_time: '06:00' |
||||
end_time: '23:59' |
||||
weekdays: ['monday:wednesday','saturday', 'sunday'] |
||||
months: ['1:3', 'may:august', 'december'] |
||||
years: ['2020:2022', '2030'] |
||||
days_of_month: ['1:5', '-3:-1'] |
@ -0,0 +1,17 @@ |
||||
apiVersion: 1 |
||||
muteTimes: |
||||
- name: test |
||||
time_intervals: |
||||
- times: |
||||
- start_time: '06:00' |
||||
end_time: '23:59' |
||||
weekdays: |
||||
- monday |
||||
- orgId: 1337 |
||||
name: test |
||||
time_intervals: |
||||
- times: |
||||
- start_time: '06:00' |
||||
end_time: '23:59' |
||||
weekdays: |
||||
- monday |
Loading…
Reference in new issue