diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f44817f779..3260ec7a469 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ * [ENHANCEMENT] StoreGateway: Emit more histogram buckets on the `cortex_querier_storegateway_refetches_per_query` metric. #6570 * [ENHANCEMENT] Querier: Apply bytes limiter to LabelNames and LabelValuesForLabelNames. #6568 * [ENHANCEMENT] Query Frontend: Add a `too_many_tenants` reason label value to `cortex_rejected_queries_total` metric to track the rejected query count due to the # of tenant limits. #6569 +* [ENHANCEMENT] Alertmanager: Add receiver validations for msteamsv2 and rocketchat. #6606 * [BUGFIX] Ingester: Avoid error or early throttling when READONLY ingesters are present in the ring #6517 * [BUGFIX] Ingester: Fix labelset data race condition. #6573 * [BUGFIX] Compactor: Cleaner should not put deletion marker for blocks with no-compact marker. #6576 diff --git a/pkg/alertmanager/api.go b/pkg/alertmanager/api.go index 6f51e7c766b..a4a73d43014 100644 --- a/pkg/alertmanager/api.go +++ b/pkg/alertmanager/api.go @@ -52,6 +52,10 @@ var ( errPushOverUserKeyFileNotAllowed = errors.New("setting PushOver user_key_file is not allowed") errPushOverTokenFileNotAllowed = errors.New("setting PushOver token_file is not allowed") errTelegramBotTokenFileNotAllowed = errors.New("setting Telegram bot_token_file is not allowed") + errMSTeamsWebhookUrlFileNotAllowed = errors.New("setting MSTeams webhook_url_file is not allowed") + errMSTeamsV2WebhookUrlFileNotAllowed = errors.New("setting MSTeamsV2 webhook_url_file is not allowed") + errRocketChatTokenIdFileNotAllowed = errors.New("setting RocketChat token_id_file is not allowed") + errRocketChatTokenFileNotAllowed = errors.New("setting RocketChat token_file is not allowed") ) // UserConfig is used to communicate a users alertmanager configs @@ -383,6 +387,18 @@ func validateAlertmanagerConfig(cfg interface{}) error { if err := validateTelegramConfig(v.Interface().(config.TelegramConfig)); err != nil { return err } + case reflect.TypeOf(config.MSTeamsConfig{}): + if err := validateMSTeamsConfig(v.Interface().(config.MSTeamsConfig)); err != nil { + return err + } + case reflect.TypeOf(config.MSTeamsV2Config{}): + if err := validateMSTeamsV2Config(v.Interface().(config.MSTeamsV2Config)); err != nil { + return err + } + case reflect.TypeOf(config.RocketchatConfig{}): + if err := validateRocketChatConfig(v.Interface().(config.RocketchatConfig)); err != nil { + return err + } } // If the input config is a struct, recursively iterate on all fields. @@ -540,3 +556,35 @@ func validateTelegramConfig(cfg config.TelegramConfig) error { } return nil } + +// validateMSTeamsConfig validates the MSTeams Config and returns an error if it contains +// settings not allowed by Cortex. +func validateMSTeamsConfig(cfg config.MSTeamsConfig) error { + if cfg.WebhookURLFile != "" { + return errMSTeamsWebhookUrlFileNotAllowed + } + return nil +} + +// validateMSTeamsV2Config validates the MSTeamsV2 Config and returns an error if it contains +// settings not allowed by Cortex. +func validateMSTeamsV2Config(cfg config.MSTeamsV2Config) error { + if cfg.WebhookURLFile != "" { + return errMSTeamsV2WebhookUrlFileNotAllowed + } + return nil +} + +// validateRocketChatConfig validates the RocketChat Config and returns an error if it contains +// settings not allowed by Cortex. +func validateRocketChatConfig(cfg config.RocketchatConfig) error { + if cfg.TokenIDFile != "" { + return errRocketChatTokenIdFileNotAllowed + } + + if cfg.TokenFile != "" { + return errRocketChatTokenFileNotAllowed + } + + return nil +} diff --git a/pkg/alertmanager/api_test.go b/pkg/alertmanager/api_test.go index bdd9c6504de..e70af952478 100644 --- a/pkg/alertmanager/api_test.go +++ b/pkg/alertmanager/api_test.go @@ -649,6 +649,60 @@ alertmanager_config: | `, err: errors.Wrap(errTelegramBotTokenFileNotAllowed, "error validating Alertmanager config"), }, + { + name: "Should return error if MSTeams webhook_url_file is set", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + msteams_configs: + - webhook_url_file: /urlFile + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errMSTeamsWebhookUrlFileNotAllowed, "error validating Alertmanager config"), + }, + { + name: "Should return error if MSTeamsV2 webhook_url_file is set", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + msteamsv2_configs: + - webhook_url_file: /urlFile + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errMSTeamsV2WebhookUrlFileNotAllowed, "error validating Alertmanager config"), + }, + { + name: "Should return error if RocketChat token_id_file is set", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + rocketchat_configs: + - token_id_file: /tokenIdFile + token: 'token' + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errRocketChatTokenIdFileNotAllowed, "error validating Alertmanager config"), + }, + { + name: "Should return error if RocketChat token_file is set", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + rocketchat_configs: + - token_file: /tokenFile + token_id: 'tokenId' + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errRocketChatTokenFileNotAllowed, "error validating Alertmanager config"), + }, } limits := &mockAlertManagerLimits{}