@ -23,38 +23,38 @@ type AlertmanagerSrv struct {
func ( srv AlertmanagerSrv ) RouteCreateSilence ( c * models . ReqContext , postableSilence apimodels . PostableSilence ) response . Response {
if ! c . HasUserRole ( models . ROLE_EDITOR ) {
return response . Error ( http . StatusForbidden , "Permission denied" , nil )
return ErrResp ( http . StatusForbidden , errors . New ( "permission denied" ) , "" )
}
silenceID , err := srv . am . CreateSilence ( & postableSilence )
if err != nil {
if errors . Is ( err , notifier . ErrSilenceNotFound ) {
return response . Error ( http . StatusNotFound , err . Error ( ) , nil )
return ErrResp ( http . StatusNotFound , err , "" )
}
if errors . Is ( err , notifier . ErrCreateSilenceBadPayload ) {
return response . Error ( http . StatusBadRequest , err . Error ( ) , nil )
return ErrResp ( http . StatusBadRequest , err , "" )
}
return response . Error ( http . StatusInternalServerError , "failed to create silence" , err )
return ErrResp ( http . StatusInternalServerError , err , "failed to create silence" )
}
return response . JSON ( http . StatusAccepted , util . DynMap { "message" : "silence created" , "id" : silenceID } )
}
func ( srv AlertmanagerSrv ) RouteDeleteAlertingConfig ( c * models . ReqContext ) response . Response {
// not implemented
return response . Error ( http . StatusNotImplemented , "" , nil )
return NotImplementedResp
}
func ( srv AlertmanagerSrv ) RouteDeleteSilence ( c * models . ReqContext ) response . Response {
if ! c . HasUserRole ( models . ROLE_EDITOR ) {
return response . Error ( http . StatusForbidden , "Permission denied" , nil )
return ErrResp ( http . StatusForbidden , errors . New ( "permission denied" ) , "" )
}
silenceID := c . Params ( ":SilenceId" )
if err := srv . am . DeleteSilence ( silenceID ) ; err != nil {
if errors . Is ( err , notifier . ErrSilenceNotFound ) {
return response . Error ( http . StatusNotFound , err . Error ( ) , nil )
return ErrResp ( http . StatusNotFound , err , "" )
}
return response . Error ( http . StatusInternalServerError , err . Error ( ) , nil )
return ErrResp ( http . StatusInternalServerError , err , "" )
}
return response . JSON ( http . StatusOK , util . DynMap { "message" : "silence deleted" } )
}
@ -63,14 +63,14 @@ func (srv AlertmanagerSrv) RouteGetAlertingConfig(c *models.ReqContext) response
query := ngmodels . GetLatestAlertmanagerConfigurationQuery { }
if err := srv . store . GetLatestAlertmanagerConfiguration ( & query ) ; err != nil {
if errors . Is ( err , store . ErrNoAlertmanagerConfiguration ) {
return response . Error ( http . StatusNotFound , err . Error ( ) , nil )
return ErrResp ( http . StatusNotFound , err , "" )
}
return response . Error ( http . StatusInternalServerError , "failed to get latest configuration" , err )
return ErrResp ( http . StatusInternalServerError , err , "failed to get latest configuration" )
}
cfg , err := notifier . Load ( [ ] byte ( query . Result . AlertmanagerConfiguration ) )
if err != nil {
return response . Error ( http . StatusInternalServerError , "failed to unmarshal alertmanager configuration" , err )
return ErrResp ( http . StatusInternalServerError , er r , "failed to unmarshal alertmanager configuration" )
}
result := apimodels . GettableUserConfig {
@ -86,7 +86,7 @@ func (srv AlertmanagerSrv) RouteGetAlertingConfig(c *models.ReqContext) response
for k := range pr . SecureSettings {
decryptedValue , err := pr . GetDecryptedSecret ( k )
if err != nil {
return response . Error ( http . StatusInternalServerError , fmt . Sprintf ( "failed to decrypt stored secure setting: %s" , k ) , err )
return ErrResp ( http . StatusInternalServerError , err , "failed to decrypt stored secure setting: %s" , k )
}
if decryptedValue == "" {
continue
@ -125,10 +125,10 @@ func (srv AlertmanagerSrv) RouteGetAMAlertGroups(c *models.ReqContext) response.
)
if err != nil {
if errors . Is ( err , notifier . ErrGetAlertGroupsBadPayload ) {
return response . Error ( http . StatusBadRequest , err . Error ( ) , nil )
return ErrResp ( http . StatusBadRequest , err , "" )
}
// any other error here should be an unexpected failure and thus an internal error
return response . Error ( http . StatusInternalServerError , err . Error ( ) , nil )
return ErrResp ( http . StatusInternalServerError , err , "" )
}
return response . JSON ( http . StatusOK , groups )
@ -144,10 +144,10 @@ func (srv AlertmanagerSrv) RouteGetAMAlerts(c *models.ReqContext) response.Respo
)
if err != nil {
if errors . Is ( err , notifier . ErrGetAlertsBadPayload ) {
return response . Error ( http . StatusBadRequest , err . Error ( ) , nil )
return ErrResp ( http . StatusBadRequest , err , "" )
}
// any other error here should be an unexpected failure and thus an internal error
return response . Error ( http . StatusInternalServerError , err . Error ( ) , nil )
return ErrResp ( http . StatusInternalServerError , err , "" )
}
return response . JSON ( http . StatusOK , alerts )
@ -158,10 +158,10 @@ func (srv AlertmanagerSrv) RouteGetSilence(c *models.ReqContext) response.Respon
gettableSilence , err := srv . am . GetSilence ( silenceID )
if err != nil {
if errors . Is ( err , notifier . ErrSilenceNotFound ) {
return response . Error ( http . StatusNotFound , err . Error ( ) , nil )
return ErrResp ( http . StatusNotFound , err , "" )
}
// any other error here should be an unexpected failure and thus an internal error
return response . Error ( http . StatusInternalServerError , err . Error ( ) , nil )
return ErrResp ( http . StatusInternalServerError , err , "" )
}
return response . JSON ( http . StatusOK , gettableSilence )
}
@ -170,17 +170,17 @@ func (srv AlertmanagerSrv) RouteGetSilences(c *models.ReqContext) response.Respo
gettableSilences , err := srv . am . ListSilences ( c . QueryStrings ( "filter" ) )
if err != nil {
if errors . Is ( err , notifier . ErrListSilencesBadPayload ) {
return response . Error ( http . StatusBadRequest , err . Error ( ) , nil )
return ErrResp ( http . StatusBadRequest , err , "" )
}
// any other error here should be an unexpected failure and thus an internal error
return response . Error ( http . StatusInternalServerError , err . Error ( ) , nil )
return ErrResp ( http . StatusInternalServerError , err , "" )
}
return response . JSON ( http . StatusOK , gettableSilences )
}
func ( srv AlertmanagerSrv ) RoutePostAlertingConfig ( c * models . ReqContext , body apimodels . PostableUserConfig ) response . Response {
if ! c . HasUserRole ( models . ROLE_EDITOR ) {
return response . Error ( http . StatusForbidden , "Permission denied" , nil )
return ErrResp ( http . StatusForbidden , errors . New ( "permission denied" ) , "" )
}
// Get the last known working configuration
@ -188,13 +188,13 @@ func (srv AlertmanagerSrv) RoutePostAlertingConfig(c *models.ReqContext, body ap
if err := srv . store . GetLatestAlertmanagerConfiguration ( & query ) ; err != nil {
// If we don't have a configuration there's nothing for us to know and we should just continue saving the new one
if ! errors . Is ( err , store . ErrNoAlertmanagerConfiguration ) {
return response . Error ( http . StatusInternalServerError , "failed to get latest configuration" , err )
return ErrResp ( http . StatusInternalServerError , err , "failed to get latest configuration" )
}
}
currentConfig , err := notifier . Load ( [ ] byte ( query . Result . AlertmanagerConfiguration ) )
if err != nil {
return response . Error ( http . StatusInternalServerError , "failed to load lastest configuration" , err )
return ErrResp ( http . StatusInternalServerError , err , "failed to load lastest configuration" )
}
currentReceiverMap := currentConfig . GetGrafanaReceiverMap ( )
@ -208,7 +208,7 @@ func (srv AlertmanagerSrv) RoutePostAlertingConfig(c *models.ReqContext, body ap
cgmr , ok := currentReceiverMap [ gr . UID ]
if ! ok {
// it tries to update a receiver that didn't previously exist
return response . Error ( http . StatusBadRequest , fmt . Sprint f( "unknown receiver: %s" , gr . UID ) , nil )
return ErrResp ( http . StatusBadRequest , fmt . Error f( "unknown receiver: %s" , gr . UID ) , "" )
}
// frontend sends only the secure settings that have to be updated
@ -218,7 +218,7 @@ func (srv AlertmanagerSrv) RoutePostAlertingConfig(c *models.ReqContext, body ap
if ! ok {
decryptedValue , err := cgmr . GetDecryptedSecret ( key )
if err != nil {
return response . Error ( http . StatusInternalServerError , fmt . Sprintf ( "failed to decrypt stored secure setting: %s" , key ) , err )
return ErrResp ( http . StatusInternalServerError , err , "failed to decrypt stored secure setting: %s" , key )
}
if body . AlertmanagerConfig . Receivers [ i ] . PostableGrafanaReceivers . GrafanaManagedReceivers [ j ] . SecureSettings == nil {
@ -232,12 +232,12 @@ func (srv AlertmanagerSrv) RoutePostAlertingConfig(c *models.ReqContext, body ap
}
if err := body . ProcessConfig ( ) ; err != nil {
return response . Error ( http . StatusInternalServerError , "failed to post process Alertmanager configuration" , err )
return ErrResp ( http . StatusInternalServerError , er r , "failed to post process Alertmanager configuration" )
}
if err := srv . am . SaveAndApplyConfig ( & body ) ; err != nil {
srv . log . Error ( "unable to save and apply alertmanager configuration" , "err" , err )
return response . Error ( http . StatusBadRequest , "failed to save and apply Alertmanager configuration" , err )
return ErrResp ( http . StatusBadRequest , err , "failed to save and apply Alertmanager configuration" )
}
return response . JSON ( http . StatusAccepted , util . DynMap { "message" : "configuration created" } )
@ -245,5 +245,5 @@ func (srv AlertmanagerSrv) RoutePostAlertingConfig(c *models.ReqContext, body ap
func ( srv AlertmanagerSrv ) RoutePostAMAlerts ( c * models . ReqContext , body apimodels . PostableAlerts ) response . Response {
// not implemented
return response . Error ( http . StatusNotImplemented , "" , nil )
return NotImplementedResp
}