Skip to content

Commit 4479e72

Browse files
Alerting: MuteTiming service return errutil + GetTiming by name (#79772)
* add get mute timing by name to MuteTimingService * update get mute timing request handler to use the service method * replace validation, uniqueness and used errors with errutils * update mute timing methods return errutil responses * use the term "time interval" in errors bevause mute timings are deprecated in Alertmanager and will be replaced by time intervals in the future. * update create and update methods to return struct instead of pointer
1 parent 11662e1 commit 4479e72

File tree

12 files changed

+286
-78
lines changed

12 files changed

+286
-78
lines changed

pkg/services/ngalert/api/api_provisioning.go

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ type NotificationPolicyService interface {
5151

5252
type MuteTimingService interface {
5353
GetMuteTimings(ctx context.Context, orgID int64) ([]definitions.MuteTimeInterval, error)
54-
CreateMuteTiming(ctx context.Context, mt definitions.MuteTimeInterval, orgID int64) (*definitions.MuteTimeInterval, error)
55-
UpdateMuteTiming(ctx context.Context, mt definitions.MuteTimeInterval, orgID int64) (*definitions.MuteTimeInterval, error)
54+
GetMuteTiming(ctx context.Context, name string, orgID int64) (definitions.MuteTimeInterval, error)
55+
CreateMuteTiming(ctx context.Context, mt definitions.MuteTimeInterval, orgID int64) (definitions.MuteTimeInterval, error)
56+
UpdateMuteTiming(ctx context.Context, mt definitions.MuteTimeInterval, orgID int64) (definitions.MuteTimeInterval, error)
5657
DeleteMuteTiming(ctx context.Context, name string, orgID int64) error
5758
}
5859

@@ -243,22 +244,17 @@ func (srv *ProvisioningSrv) RouteDeleteTemplate(c *contextmodel.ReqContext, name
243244
}
244245

245246
func (srv *ProvisioningSrv) RouteGetMuteTiming(c *contextmodel.ReqContext, name string) response.Response {
246-
timings, err := srv.muteTimings.GetMuteTimings(c.Req.Context(), c.SignedInUser.GetOrgID())
247+
timing, err := srv.muteTimings.GetMuteTiming(c.Req.Context(), name, c.SignedInUser.GetOrgID())
247248
if err != nil {
248-
return ErrResp(http.StatusInternalServerError, err, "")
249-
}
250-
for _, timing := range timings {
251-
if name == timing.Name {
252-
return response.JSON(http.StatusOK, timing)
253-
}
249+
return response.ErrOrFallback(http.StatusInternalServerError, "failed to get mute timing by name", err)
254250
}
255-
return response.Empty(http.StatusNotFound)
251+
return response.JSON(http.StatusOK, timing)
256252
}
257253

258254
func (srv *ProvisioningSrv) RouteGetMuteTimingExport(c *contextmodel.ReqContext, name string) response.Response {
259255
timings, err := srv.muteTimings.GetMuteTimings(c.Req.Context(), c.SignedInUser.GetOrgID())
260256
if err != nil {
261-
return ErrResp(http.StatusInternalServerError, err, "")
257+
return response.ErrOrFallback(http.StatusInternalServerError, "failed to get mute timings", err)
262258
}
263259
for _, timing := range timings {
264260
if name == timing.Name {
@@ -272,15 +268,15 @@ func (srv *ProvisioningSrv) RouteGetMuteTimingExport(c *contextmodel.ReqContext,
272268
func (srv *ProvisioningSrv) RouteGetMuteTimings(c *contextmodel.ReqContext) response.Response {
273269
timings, err := srv.muteTimings.GetMuteTimings(c.Req.Context(), c.SignedInUser.GetOrgID())
274270
if err != nil {
275-
return ErrResp(http.StatusInternalServerError, err, "")
271+
return response.ErrOrFallback(http.StatusInternalServerError, "failed to get mute timings", err)
276272
}
277273
return response.JSON(http.StatusOK, timings)
278274
}
279275

280276
func (srv *ProvisioningSrv) RouteGetMuteTimingsExport(c *contextmodel.ReqContext) response.Response {
281277
timings, err := srv.muteTimings.GetMuteTimings(c.Req.Context(), c.SignedInUser.GetOrgID())
282278
if err != nil {
283-
return ErrResp(http.StatusInternalServerError, err, "")
279+
return response.ErrOrFallback(http.StatusInternalServerError, "failed to get mute timings", err)
284280
}
285281
e := AlertingFileExportFromMuteTimings(c.SignedInUser.GetOrgID(), timings)
286282
return exportResponse(c, e)
@@ -290,10 +286,7 @@ func (srv *ProvisioningSrv) RoutePostMuteTiming(c *contextmodel.ReqContext, mt d
290286
mt.Provenance = determineProvenance(c)
291287
created, err := srv.muteTimings.CreateMuteTiming(c.Req.Context(), mt, c.SignedInUser.GetOrgID())
292288
if err != nil {
293-
if errors.Is(err, provisioning.ErrValidation) {
294-
return ErrResp(http.StatusBadRequest, err, "")
295-
}
296-
return ErrResp(http.StatusInternalServerError, err, "")
289+
return response.ErrOrFallback(http.StatusInternalServerError, "failed to create mute timing", err)
297290
}
298291
return response.JSON(http.StatusCreated, created)
299292
}
@@ -303,21 +296,15 @@ func (srv *ProvisioningSrv) RoutePutMuteTiming(c *contextmodel.ReqContext, mt de
303296
mt.Provenance = determineProvenance(c)
304297
updated, err := srv.muteTimings.UpdateMuteTiming(c.Req.Context(), mt, c.SignedInUser.GetOrgID())
305298
if err != nil {
306-
if errors.Is(err, provisioning.ErrValidation) {
307-
return ErrResp(http.StatusBadRequest, err, "")
308-
}
309-
return ErrResp(http.StatusInternalServerError, err, "")
310-
}
311-
if updated == nil {
312-
return response.Empty(http.StatusNotFound)
299+
return response.ErrOrFallback(http.StatusInternalServerError, "failed to update mute timing", err)
313300
}
314301
return response.JSON(http.StatusAccepted, updated)
315302
}
316303

317304
func (srv *ProvisioningSrv) RouteDeleteMuteTiming(c *contextmodel.ReqContext, name string) response.Response {
318305
err := srv.muteTimings.DeleteMuteTiming(c.Req.Context(), name, c.SignedInUser.GetOrgID())
319306
if err != nil {
320-
return ErrResp(http.StatusInternalServerError, err, "")
307+
return response.ErrOrFallback(http.StatusInternalServerError, "failed to delete mute timing", err)
321308
}
322309
return response.JSON(http.StatusNoContent, nil)
323310
}

pkg/services/ngalert/api/tooling/api.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1281,6 +1281,14 @@
12811281
"title": "Frames is a slice of Frame pointers.",
12821282
"type": "array"
12831283
},
1284+
"GenericPublicError": {
1285+
"properties": {
1286+
"body": {
1287+
"$ref": "#/definitions/PublicError"
1288+
}
1289+
},
1290+
"type": "object"
1291+
},
12841292
"GettableAlertmanagers": {
12851293
"properties": {
12861294
"data": {
@@ -4405,6 +4413,7 @@
44054413
"type": "object"
44064414
},
44074415
"alertGroup": {
4416+
"description": "AlertGroup alert group",
44084417
"properties": {
44094418
"alerts": {
44104419
"description": "alerts",
@@ -4533,7 +4542,6 @@
45334542
"type": "object"
45344543
},
45354544
"gettableAlert": {
4536-
"description": "GettableAlert gettable alert",
45374545
"properties": {
45384546
"annotations": {
45394547
"$ref": "#/definitions/labelSet"
@@ -5641,6 +5649,12 @@
56415649
"responses": {
56425650
"204": {
56435651
"description": " The mute timing was deleted successfully."
5652+
},
5653+
"409": {
5654+
"description": "GenericPublicError",
5655+
"schema": {
5656+
"$ref": "#/definitions/GenericPublicError"
5657+
}
56445658
}
56455659
},
56465660
"summary": "Delete a mute timing.",

pkg/services/ngalert/api/tooling/definitions/provisioning_mute_timings.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ import (
6363
//
6464
// Responses:
6565
// 204: description: The mute timing was deleted successfully.
66+
// 409: GenericPublicError
6667

6768
// swagger:route
6869

pkg/services/ngalert/api/tooling/definitions/shared.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,10 @@ type ForbiddenError struct {
2020
// in: body
2121
Body errutil.PublicError `json:"body"`
2222
}
23+
24+
// swagger:model
25+
type GenericPublicError struct {
26+
// The response message
27+
// in: body
28+
Body errutil.PublicError `json:"body"`
29+
}

pkg/services/ngalert/api/tooling/post.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1281,6 +1281,14 @@
12811281
"title": "Frames is a slice of Frame pointers.",
12821282
"type": "array"
12831283
},
1284+
"GenericPublicError": {
1285+
"properties": {
1286+
"body": {
1287+
"$ref": "#/definitions/PublicError"
1288+
}
1289+
},
1290+
"type": "object"
1291+
},
12841292
"GettableAlertmanagers": {
12851293
"properties": {
12861294
"data": {
@@ -4590,13 +4598,13 @@
45904598
"type": "object"
45914599
},
45924600
"gettableAlerts": {
4601+
"description": "GettableAlerts gettable alerts",
45934602
"items": {
45944603
"$ref": "#/definitions/gettableAlert"
45954604
},
45964605
"type": "array"
45974606
},
45984607
"gettableSilence": {
4599-
"description": "GettableSilence gettable silence",
46004608
"properties": {
46014609
"comment": {
46024610
"description": "comment",
@@ -7624,6 +7632,12 @@
76247632
"responses": {
76257633
"204": {
76267634
"description": " The mute timing was deleted successfully."
7635+
},
7636+
"409": {
7637+
"description": "GenericPublicError",
7638+
"schema": {
7639+
"$ref": "#/definitions/GenericPublicError"
7640+
}
76277641
}
76287642
},
76297643
"summary": "Delete a mute timing.",

pkg/services/ngalert/api/tooling/spec.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2785,6 +2785,12 @@
27852785
"responses": {
27862786
"204": {
27872787
"description": " The mute timing was deleted successfully."
2788+
},
2789+
"409": {
2790+
"description": "GenericPublicError",
2791+
"schema": {
2792+
"$ref": "#/definitions/GenericPublicError"
2793+
}
27882794
}
27892795
}
27902796
}
@@ -4688,6 +4694,14 @@
46884694
"$ref": "#/definitions/Frame"
46894695
}
46904696
},
4697+
"GenericPublicError": {
4698+
"type": "object",
4699+
"properties": {
4700+
"body": {
4701+
"$ref": "#/definitions/PublicError"
4702+
}
4703+
}
4704+
},
46914705
"GettableAlertmanagers": {
46924706
"type": "object",
46934707
"properties": {
@@ -8001,14 +8015,14 @@
80018015
"$ref": "#/definitions/gettableAlert"
80028016
},
80038017
"gettableAlerts": {
8018+
"description": "GettableAlerts gettable alerts",
80048019
"type": "array",
80058020
"items": {
80068021
"$ref": "#/definitions/gettableAlert"
80078022
},
80088023
"$ref": "#/definitions/gettableAlerts"
80098024
},
80108025
"gettableSilence": {
8011-
"description": "GettableSilence gettable silence",
80128026
"type": "object",
80138027
"required": [
80148028
"comment",

pkg/services/ngalert/provisioning/errors.go

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ var ErrPermissionDenied = errors.New("permission denied")
1414
var (
1515
ErrNoAlertmanagerConfiguration = errutil.Internal("alerting.notification.configMissing", errutil.WithPublicMessage("No alertmanager configuration present in this organization"))
1616
ErrBadAlertmanagerConfiguration = errutil.Internal("alerting.notification.configCorrupted").MustTemplate("Failed to unmarshal the Alertmanager configuration", errutil.WithPublic("Current Alertmanager configuration in the storage is corrupted. Reset the configuration or rollback to a recent valid one."))
17+
18+
ErrTimeIntervalNotFound = errutil.NotFound("alerting.notifications.time-intervals.notFound")
19+
ErrTimeIntervalExists = errutil.BadRequest("alerting.notifications.time-intervals.nameExists", errutil.WithPublicMessage("Time interval with this name already exists. Use a different name or update existing one."))
20+
ErrTimeIntervalInvalid = errutil.BadRequest("alerting.notifications.time-intervals.invalidFormat").MustTemplate("Invalid format of the submitted time interval", errutil.WithPublic("Time interval is in invalid format. Correct the payload and try again."))
21+
ErrTimeIntervalInUse = errutil.Conflict("alerting.notifications.time-intervals.used", errutil.WithPublicMessage("Time interval is used by one or many notification policies"))
1722
)
1823

1924
func makeErrBadAlertmanagerConfiguration(err error) error {
@@ -23,6 +28,17 @@ func makeErrBadAlertmanagerConfiguration(err error) error {
2328
},
2429
Error: err,
2530
}
26-
2731
return ErrBadAlertmanagerConfiguration.Build(data)
2832
}
33+
34+
// MakeErrTimeIntervalInvalid creates an error with the ErrTimeIntervalInvalid template
35+
func MakeErrTimeIntervalInvalid(err error) error {
36+
data := errutil.TemplateData{
37+
Public: map[string]interface{}{
38+
"Error": err.Error(),
39+
},
40+
Error: err,
41+
}
42+
43+
return ErrTimeIntervalInvalid.Build(data)
44+
}

0 commit comments

Comments
 (0)