diff --git a/conf/provisioning/alert_notifications/sample.yaml b/conf/provisioning/notifiers/sample.yaml similarity index 90% rename from conf/provisioning/alert_notifications/sample.yaml rename to conf/provisioning/notifiers/sample.yaml index d08df2545e9..7d909839412 100644 --- a/conf/provisioning/alert_notifications/sample.yaml +++ b/conf/provisioning/notifiers/sample.yaml @@ -1,7 +1,7 @@ # # config file version apiVersion: 1 -# alert_notifications: +# notifiers: # - name: default-slack-temp # type: slack # org_name: Main Org. @@ -19,7 +19,7 @@ apiVersion: 1 # is_default: false # settings: # addresses: example11111@example.com -# delete_alert_notifications: +# delete_notifiers: # - name: default-slack-temp # org_name: Main Org. # uid: notifier1 \ No newline at end of file diff --git a/docs/sources/administration/provisioning.md b/docs/sources/administration/provisioning.md index 9d3fd9385d4..3c94cb79f21 100644 --- a/docs/sources/administration/provisioning.md +++ b/docs/sources/administration/provisioning.md @@ -234,11 +234,11 @@ By default Grafana will delete dashboards in the database if the file is removed ## Alert Notification Channels -Alert Notification Channels can be provisionned by adding one or more yaml config files in the [`provisioning/alert_notifications`](/installation/configuration/#provisioning) directory. +Alert Notification Channels can be provisionned by adding one or more yaml config files in the [`provisioning/notifiers`](/installation/configuration/#provisioning) directory. Each config file can contain the following top-level fields: -- `alert_notifications`, a list of alert notifications that will be added or updated during start up. If the notification channel already exists, Grafana will update it to match the configuration file. -- `delete_alert_notifications`, a list of alert notifications to be deleted before before inserting/updating those in the `alert_notifications` list. +- `notifiers`, a list of alert notifications that will be added or updated during start up. If the notification channel already exists, Grafana will update it to match the configuration file. +- `delete_notifiers`, a list of alert notifications to be deleted before before inserting/updating those in the `notifiers` list. Provisionning looks up alert notifications by name, and will update any existing notification with the provided name. @@ -264,7 +264,7 @@ By default, exporting a dashboard as JSON will use a sequential identifier to re ### Example Alert Notification Channels Config File ```yaml -alert_notifications: +notifiers: - name: notification-channel-1 type: slack uid: notifier1 @@ -281,7 +281,7 @@ alert_notifications: uploadImage: true url: https://slack.com -delete_alert_notifications: +delete_notifiers: - name: notification-channel-1 uid: notifier1 # either diff --git a/pkg/services/provisioning/alert_notifications/alert_notifications.go b/pkg/services/provisioning/notifiers/alert_notifications.go similarity index 98% rename from pkg/services/provisioning/alert_notifications/alert_notifications.go rename to pkg/services/provisioning/notifiers/alert_notifications.go index 0f155dda4a8..514f11379c8 100644 --- a/pkg/services/provisioning/alert_notifications/alert_notifications.go +++ b/pkg/services/provisioning/notifiers/alert_notifications.go @@ -1,4 +1,4 @@ -package alert_notifications +package notifiers import ( "errors" @@ -13,7 +13,7 @@ var ( ) func Provision(configDirectory string) error { - dc := newNotificationProvisioner(log.New("provisioning.alert_notifications")) + dc := newNotificationProvisioner(log.New("provisioning.notifiers")) return dc.applyChanges(configDirectory) } @@ -54,6 +54,7 @@ func (dc *NotificationProvisioner) deleteNotifications(notificationToDelete []*d } else if notification.OrgId < 0 { notification.OrgId = 1 } + getNotification := &models.GetAlertNotificationsWithUidQuery{Uid: notification.Uid, OrgId: notification.OrgId} if err := bus.Dispatch(getNotification); err != nil { @@ -103,6 +104,7 @@ func (dc *NotificationProvisioner) mergeNotifications(notificationToMerge []*not Frequency: notification.Frequency, SendReminder: notification.SendReminder, } + if err := bus.Dispatch(insertCmd); err != nil { return err } @@ -119,6 +121,7 @@ func (dc *NotificationProvisioner) mergeNotifications(notificationToMerge []*not Frequency: notification.Frequency, SendReminder: notification.SendReminder, } + if err := bus.Dispatch(updateCmd); err != nil { return err } diff --git a/pkg/services/provisioning/alert_notifications/config_reader.go b/pkg/services/provisioning/notifiers/config_reader.go similarity index 99% rename from pkg/services/provisioning/alert_notifications/config_reader.go rename to pkg/services/provisioning/notifiers/config_reader.go index 56bfdab2f19..e712e8e3eff 100644 --- a/pkg/services/provisioning/alert_notifications/config_reader.go +++ b/pkg/services/provisioning/notifiers/config_reader.go @@ -1,4 +1,4 @@ -package alert_notifications +package notifiers import ( "fmt" @@ -94,8 +94,8 @@ func checkOrgIdAndOrgName(notifications []*notificationsAsConfig) { } } } - } + func validateRequiredField(notifications []*notificationsAsConfig) error { for i := range notifications { var errStrings []string @@ -106,6 +106,7 @@ func validateRequiredField(notifications []*notificationsAsConfig) error { fmt.Sprintf("Added alert notification item %d in configuration doesn't contain required field name", index+1), ) } + if notification.Uid == "" { errStrings = append( errStrings, @@ -121,6 +122,7 @@ func validateRequiredField(notifications []*notificationsAsConfig) error { fmt.Sprintf("Deleted alert notification item %d in configuration doesn't contain required field name", index+1), ) } + if notification.Uid == "" { errStrings = append( errStrings, @@ -128,10 +130,12 @@ func validateRequiredField(notifications []*notificationsAsConfig) error { ) } } + if len(errStrings) != 0 { return fmt.Errorf(strings.Join(errStrings, "\n")) } } + return nil } @@ -148,6 +152,7 @@ func validateNotifications(notifications []*notificationsAsConfig) error { Settings: notification.SettingsToJson(), Type: notification.Type, }) + if err != nil { return err } diff --git a/pkg/services/provisioning/alert_notifications/config_reader_test.go b/pkg/services/provisioning/notifiers/config_reader_test.go similarity index 99% rename from pkg/services/provisioning/alert_notifications/config_reader_test.go rename to pkg/services/provisioning/notifiers/config_reader_test.go index d66dded8407..18074d7614e 100644 --- a/pkg/services/provisioning/alert_notifications/config_reader_test.go +++ b/pkg/services/provisioning/notifiers/config_reader_test.go @@ -1,4 +1,4 @@ -package alert_notifications +package notifiers import ( "testing" @@ -35,11 +35,13 @@ func TestNotificationAsConfig(t *testing.T) { Name: "slack", Factory: notifiers.NewSlackNotifier, }) + alerting.RegisterNotifier(&alerting.NotifierPlugin{ Type: "email", Name: "email", Factory: notifiers.NewEmailNotifier, }) + Convey("Can read correct properties", func() { cfgProvifer := &configReader{log: log.New("test logger")} cfg, err := cfgProvifer.readConfig(correct_properties) @@ -264,6 +266,7 @@ func TestNotificationAsConfig(t *testing.T) { So(errString, ShouldContainSubstring, "Added alert notification item 1 in configuration doesn't contain required field name") So(errString, ShouldContainSubstring, "Added alert notification item 2 in configuration doesn't contain required field uid") }) + Convey("Empty yaml file", func() { Convey("should have not changed repo", func() { dc := newNotificationProvisioner(logger) @@ -277,11 +280,13 @@ func TestNotificationAsConfig(t *testing.T) { So(notificationsQuery.Result, ShouldBeEmpty) }) }) + Convey("Broken yaml should return error", func() { reader := &configReader{log: log.New("test logger")} _, err := reader.readConfig(brokenYaml) So(err, ShouldNotBeNil) }) + Convey("Skip invalid directory", func() { cfgProvifer := &configReader{log: log.New("test logger")} cfg, err := cfgProvifer.readConfig(emptyFolder) @@ -290,6 +295,7 @@ func TestNotificationAsConfig(t *testing.T) { } So(len(cfg), ShouldEqual, 0) }) + Convey("Unknown notifier should return error", func() { cfgProvifer := &configReader{log: log.New("test logger")} _, err := cfgProvifer.readConfig(unknownNotifier) @@ -303,6 +309,5 @@ func TestNotificationAsConfig(t *testing.T) { So(err, ShouldNotBeNil) So(err.Error(), ShouldEqual, "Alert validation error: Could not find url property in settings") }) - }) } diff --git a/pkg/services/provisioning/alert_notifications/test-configs/broken-yaml/broken.yaml b/pkg/services/provisioning/notifiers/test-configs/broken-yaml/broken.yaml similarity index 88% rename from pkg/services/provisioning/alert_notifications/test-configs/broken-yaml/broken.yaml rename to pkg/services/provisioning/notifiers/test-configs/broken-yaml/broken.yaml index e7c38d22f2c..72f2fbdbf63 100644 --- a/pkg/services/provisioning/alert_notifications/test-configs/broken-yaml/broken.yaml +++ b/pkg/services/provisioning/notifiers/test-configs/broken-yaml/broken.yaml @@ -1,4 +1,4 @@ -alert_notifications: +notifiers: - name: notification-channel-1 type: slack org_id: 2 diff --git a/pkg/services/provisioning/alert_notifications/test-configs/broken-yaml/not.yaml.text b/pkg/services/provisioning/notifiers/test-configs/broken-yaml/not.yaml.text similarity index 100% rename from pkg/services/provisioning/alert_notifications/test-configs/broken-yaml/not.yaml.text rename to pkg/services/provisioning/notifiers/test-configs/broken-yaml/not.yaml.text diff --git a/pkg/services/provisioning/alert_notifications/test-configs/correct-properties-with-orgName/correct-properties-with-orgName.yaml b/pkg/services/provisioning/notifiers/test-configs/correct-properties-with-orgName/correct-properties-with-orgName.yaml similarity index 83% rename from pkg/services/provisioning/alert_notifications/test-configs/correct-properties-with-orgName/correct-properties-with-orgName.yaml rename to pkg/services/provisioning/notifiers/test-configs/correct-properties-with-orgName/correct-properties-with-orgName.yaml index 214396982ea..25c4536d1f3 100644 --- a/pkg/services/provisioning/alert_notifications/test-configs/correct-properties-with-orgName/correct-properties-with-orgName.yaml +++ b/pkg/services/provisioning/notifiers/test-configs/correct-properties-with-orgName/correct-properties-with-orgName.yaml @@ -1,4 +1,4 @@ -alert_notifications: +notifiers: - name: default-notification-create type: email uid: notifier2 @@ -6,7 +6,7 @@ alert_notifications: addresses: example@example.com org_name: Main Org. 2 is_default: false -delete_alert_notifications: +delete_notifiers: - name: default-notification-delete org_name: Main Org. 2 uid: notifier2 \ No newline at end of file diff --git a/pkg/services/provisioning/alert_notifications/test-configs/correct-properties/correct-properties.yaml b/pkg/services/provisioning/notifiers/test-configs/correct-properties/correct-properties.yaml similarity index 95% rename from pkg/services/provisioning/alert_notifications/test-configs/correct-properties/correct-properties.yaml rename to pkg/services/provisioning/notifiers/test-configs/correct-properties/correct-properties.yaml index 4f4cd171852..af0736f35a4 100644 --- a/pkg/services/provisioning/alert_notifications/test-configs/correct-properties/correct-properties.yaml +++ b/pkg/services/provisioning/notifiers/test-configs/correct-properties/correct-properties.yaml @@ -1,4 +1,4 @@ -alert_notifications: +notifiers: - name: default-slack-notification type: slack uid: notifier1 @@ -29,7 +29,7 @@ alert_notifications: uid: "notifier4" settings: addresses: example@exmaple.com -delete_alert_notifications: +delete_notifiers: - name: default-slack-notification org_id: 2 uid: notifier1 diff --git a/pkg/services/provisioning/alert_notifications/test-configs/double-default/default-1.yml b/pkg/services/provisioning/notifiers/test-configs/double-default/default-1.yml similarity index 85% rename from pkg/services/provisioning/alert_notifications/test-configs/double-default/default-1.yml rename to pkg/services/provisioning/notifiers/test-configs/double-default/default-1.yml index d3ae32c5ae7..d9d2fe66081 100644 --- a/pkg/services/provisioning/alert_notifications/test-configs/double-default/default-1.yml +++ b/pkg/services/provisioning/notifiers/test-configs/double-default/default-1.yml @@ -1,4 +1,4 @@ -alert_notifications: +notifiers: - name: first-default type: slack uid: notifier1 diff --git a/pkg/services/provisioning/alert_notifications/test-configs/double-default/default-2.yaml b/pkg/services/provisioning/notifiers/test-configs/double-default/default-2.yaml similarity index 86% rename from pkg/services/provisioning/alert_notifications/test-configs/double-default/default-2.yaml rename to pkg/services/provisioning/notifiers/test-configs/double-default/default-2.yaml index 3c2e8953f6b..878f8b48aa5 100644 --- a/pkg/services/provisioning/alert_notifications/test-configs/double-default/default-2.yaml +++ b/pkg/services/provisioning/notifiers/test-configs/double-default/default-2.yaml @@ -1,4 +1,4 @@ -alert_notifications: +notifiers: - name: second-default type: email uid: notifier2 diff --git a/pkg/services/provisioning/alert_notifications/test-configs/empty/empty.yaml b/pkg/services/provisioning/notifiers/test-configs/empty/empty.yaml similarity index 100% rename from pkg/services/provisioning/alert_notifications/test-configs/empty/empty.yaml rename to pkg/services/provisioning/notifiers/test-configs/empty/empty.yaml diff --git a/pkg/services/provisioning/alert_notifications/test-configs/empty_folder/.gitignore b/pkg/services/provisioning/notifiers/test-configs/empty_folder/.gitignore similarity index 100% rename from pkg/services/provisioning/alert_notifications/test-configs/empty_folder/.gitignore rename to pkg/services/provisioning/notifiers/test-configs/empty_folder/.gitignore diff --git a/pkg/services/provisioning/alert_notifications/test-configs/incorrect-settings/incorrect-settings.yaml b/pkg/services/provisioning/notifiers/test-configs/incorrect-settings/incorrect-settings.yaml similarity index 90% rename from pkg/services/provisioning/alert_notifications/test-configs/incorrect-settings/incorrect-settings.yaml rename to pkg/services/provisioning/notifiers/test-configs/incorrect-settings/incorrect-settings.yaml index 2d720d9d2d9..b7ecfbdf012 100644 --- a/pkg/services/provisioning/alert_notifications/test-configs/incorrect-settings/incorrect-settings.yaml +++ b/pkg/services/provisioning/notifiers/test-configs/incorrect-settings/incorrect-settings.yaml @@ -1,4 +1,4 @@ -alert_notifications: +notifiers: - name: slack-notification-without-url-in-settings type: slack org_id: 2 diff --git a/pkg/services/provisioning/alert_notifications/test-configs/no-required-fields/no-required-fields.yaml b/pkg/services/provisioning/notifiers/test-configs/no-required-fields/no-required-fields.yaml similarity index 92% rename from pkg/services/provisioning/alert_notifications/test-configs/no-required-fields/no-required-fields.yaml rename to pkg/services/provisioning/notifiers/test-configs/no-required-fields/no-required-fields.yaml index 582abefe14d..55ff545525e 100644 --- a/pkg/services/provisioning/alert_notifications/test-configs/no-required-fields/no-required-fields.yaml +++ b/pkg/services/provisioning/notifiers/test-configs/no-required-fields/no-required-fields.yaml @@ -1,4 +1,4 @@ -alert_notifications: +notifiers: - type: slack org_id: 2 uid: no-name_added-notification @@ -15,7 +15,7 @@ alert_notifications: recipient: "XXX" token: "xoxb" uploadImage: true -delete_alert_notifications: +delete_notifiers: - name: no-uid type: slack org_id: 2 diff --git a/pkg/services/provisioning/alert_notifications/test-configs/two-notifications/two-notifications.yaml b/pkg/services/provisioning/notifiers/test-configs/two-notifications/two-notifications.yaml similarity index 90% rename from pkg/services/provisioning/alert_notifications/test-configs/two-notifications/two-notifications.yaml rename to pkg/services/provisioning/notifiers/test-configs/two-notifications/two-notifications.yaml index 23fff0aff23..aeeb718e6de 100644 --- a/pkg/services/provisioning/alert_notifications/test-configs/two-notifications/two-notifications.yaml +++ b/pkg/services/provisioning/notifiers/test-configs/two-notifications/two-notifications.yaml @@ -1,4 +1,4 @@ -alert_notifications: +notifiers: - name: channel1 type: email uid: notifier1 diff --git a/pkg/services/provisioning/alert_notifications/test-configs/unknown-notifier/notification.yaml b/pkg/services/provisioning/notifiers/test-configs/unknown-notifier/notification.yaml similarity index 76% rename from pkg/services/provisioning/alert_notifications/test-configs/unknown-notifier/notification.yaml rename to pkg/services/provisioning/notifiers/test-configs/unknown-notifier/notification.yaml index e46db7b8b6e..ca0d3fa3c75 100644 --- a/pkg/services/provisioning/alert_notifications/test-configs/unknown-notifier/notification.yaml +++ b/pkg/services/provisioning/notifiers/test-configs/unknown-notifier/notification.yaml @@ -1,4 +1,4 @@ -alert_notifications: +notifiers: - name: unknown-notifier type: nonexisting uid: notifier1 \ No newline at end of file diff --git a/pkg/services/provisioning/alert_notifications/types.go b/pkg/services/provisioning/notifiers/types.go similarity index 84% rename from pkg/services/provisioning/alert_notifications/types.go rename to pkg/services/provisioning/notifiers/types.go index d3a858ae956..f788da79c79 100644 --- a/pkg/services/provisioning/alert_notifications/types.go +++ b/pkg/services/provisioning/notifiers/types.go @@ -1,10 +1,10 @@ -package alert_notifications +package notifiers import "github.com/grafana/grafana/pkg/components/simplejson" type notificationsAsConfig struct { - Notifications []*notificationFromConfig `json:"alert_notifications" yaml:"alert_notifications"` - DeleteNotifications []*deleteNotificationConfig `json:"delete_alert_notifications" yaml:"delete_alert_notifications"` + Notifications []*notificationFromConfig `json:"notifiers" yaml:"notifiers"` + DeleteNotifications []*deleteNotificationConfig `json:"delete_notifiers" yaml:"delete_notifiers"` } type deleteNotificationConfig struct { diff --git a/pkg/services/provisioning/provisioning.go b/pkg/services/provisioning/provisioning.go index fdecd03a3da..eb19cb2c5e8 100644 --- a/pkg/services/provisioning/provisioning.go +++ b/pkg/services/provisioning/provisioning.go @@ -6,7 +6,7 @@ import ( "path" "github.com/grafana/grafana/pkg/registry" - "github.com/grafana/grafana/pkg/services/provisioning/alert_notifications" + "github.com/grafana/grafana/pkg/services/provisioning/notifiers" "github.com/grafana/grafana/pkg/services/provisioning/dashboards" "github.com/grafana/grafana/pkg/services/provisioning/datasources" "github.com/grafana/grafana/pkg/setting" @@ -26,8 +26,8 @@ func (ps *ProvisioningService) Init() error { return fmt.Errorf("Datasource provisioning error: %v", err) } - alertNotificationsPath := path.Join(ps.Cfg.ProvisioningPath, "alert_notifications") - if err := alert_notifications.Provision(alertNotificationsPath); err != nil { + alertNotificationsPath := path.Join(ps.Cfg.ProvisioningPath, "notifiers") + if err := notifiers.Provision(alertNotificationsPath); err != nil { return fmt.Errorf("Alert notification provisioning error: %v", err) }