mirror of
https://github.com/coreos/prometheus-operator.git
synced 2026-02-05 06:45:27 +01:00
Feat: Add Config Generator for Alertmanager's Mattermost Receiver (#8188)
This commit is contained in:
3
.github/workflows/cspell.json
vendored
3
.github/workflows/cspell.json
vendored
@@ -419,6 +419,7 @@
|
||||
"finalizer",
|
||||
"selfsigned",
|
||||
"FIPS",
|
||||
"FIPSSTS"
|
||||
"FIPSSTS",
|
||||
"checkmark"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -2357,6 +2357,13 @@ func (r *receiver) sanitize(amVersion semver.Version, logger *slog.Logger) error
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
for _, conf := range r.MattermostConfigs {
|
||||
if err := conf.sanitize(amVersion, withLogger); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -2766,6 +2773,25 @@ func (rc *rocketChatConfig) sanitize(amVersion semver.Version, logger *slog.Logg
|
||||
return rc.HTTPConfig.sanitize(amVersion, logger)
|
||||
}
|
||||
|
||||
func (mc *mattermostConfig) sanitize(amVersion semver.Version, logger *slog.Logger) error {
|
||||
mattermostAllowed := amVersion.GTE(semver.MustParse("0.30.0"))
|
||||
if !mattermostAllowed {
|
||||
return fmt.Errorf(`invalid syntax in receivers config; mattermost integration is available in Alertmanager >= 0.30.0`)
|
||||
}
|
||||
|
||||
if mc.WebhookURL == "" && mc.WebhookURLFile == "" {
|
||||
return fmt.Errorf(`one of 'webhook_url' or 'webhook_url_file' must be configured`)
|
||||
}
|
||||
|
||||
if mc.WebhookURL != "" && mc.WebhookURLFile != "" {
|
||||
msg := "'webhook_url' and 'webhook_url_file' are mutually exclusive for mattermost receiver config - 'webhook_url' has taken precedence"
|
||||
logger.Warn(msg)
|
||||
mc.WebhookURLFile = ""
|
||||
}
|
||||
|
||||
return mc.HTTPConfig.sanitize(amVersion, logger)
|
||||
}
|
||||
|
||||
func (ir *inhibitRule) sanitize(amVersion semver.Version, logger *slog.Logger) error {
|
||||
matchersV2Allowed := amVersion.GTE(semver.MustParse("0.22.0"))
|
||||
|
||||
|
||||
@@ -3909,6 +3909,9 @@ func TestSanitizeConfig(t *testing.T) {
|
||||
versionSMTPTLSConfigAllowed := semver.Version{Major: 0, Minor: 28}
|
||||
versionSMTPTLSConfigNotAllowed := semver.Version{Major: 0, Minor: 27}
|
||||
|
||||
versionMattermostConfigAllowed := semver.Version{Major: 0, Minor: 30}
|
||||
versionMattermostConfigNotAllowed := semver.Version{Major: 0, Minor: 29}
|
||||
|
||||
versionTimeoutConfigAllowed := semver.Version{Major: 0, Minor: 30}
|
||||
versionTimeoutConfigNotAllowed := semver.Version{Major: 0, Minor: 29}
|
||||
|
||||
@@ -4604,6 +4607,58 @@ func TestSanitizeConfig(t *testing.T) {
|
||||
},
|
||||
golden: "summary_add_in_supported_versions_for_MSTeams_config.golden",
|
||||
},
|
||||
{
|
||||
name: "Test config version mattermost allowed",
|
||||
againstVersion: versionMattermostConfigAllowed,
|
||||
in: &alertmanagerConfig{
|
||||
Receivers: []*receiver{
|
||||
{
|
||||
MattermostConfigs: []*mattermostConfig{
|
||||
{
|
||||
WebhookURL: "www.test.com",
|
||||
Text: "test text",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
golden: "test_config_version_mattermost_allowed.golden",
|
||||
},
|
||||
{
|
||||
name: "Test drop config version mattermost not allowed",
|
||||
againstVersion: versionMattermostConfigNotAllowed,
|
||||
in: &alertmanagerConfig{
|
||||
Receivers: []*receiver{
|
||||
{
|
||||
MattermostConfigs: []*mattermostConfig{
|
||||
{
|
||||
WebhookURL: "www.test.com",
|
||||
Text: "test text",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
expectErr: true,
|
||||
},
|
||||
{
|
||||
name: "Test webhook_url takes precedence in mattermost config",
|
||||
againstVersion: versionMattermostConfigAllowed,
|
||||
in: &alertmanagerConfig{
|
||||
Receivers: []*receiver{
|
||||
{
|
||||
MattermostConfigs: []*mattermostConfig{
|
||||
{
|
||||
WebhookURL: "www.test.com",
|
||||
WebhookURLFile: "/test",
|
||||
Text: "test text",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
golden: "test_webhook_url_takes_precedence_in_mattermost_config.golden",
|
||||
},
|
||||
{
|
||||
name: "Test timeout is dropped in pagerduty config for unsupported versions",
|
||||
againstVersion: versionTimeoutConfigNotAllowed,
|
||||
|
||||
14
pkg/alertmanager/testdata/CR_with_Mattermost_Reeceiver_Bare_Minimum.golden
generated
vendored
Normal file
14
pkg/alertmanager/testdata/CR_with_Mattermost_Reeceiver_Bare_Minimum.golden
generated
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
route:
|
||||
receiver: "null"
|
||||
routes:
|
||||
- receiver: mynamespace/myamc/test
|
||||
matchers:
|
||||
- namespace="mynamespace"
|
||||
continue: true
|
||||
receivers:
|
||||
- name: "null"
|
||||
- name: mynamespace/myamc/test
|
||||
mattermost_configs:
|
||||
- webhook_url: https://mattermost.example.com
|
||||
text: test text
|
||||
templates: []
|
||||
6
pkg/alertmanager/testdata/test_config_version_mattermost_allowed.golden
generated
vendored
Normal file
6
pkg/alertmanager/testdata/test_config_version_mattermost_allowed.golden
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
receivers:
|
||||
- name: ""
|
||||
mattermost_configs:
|
||||
- webhook_url: www.test.com
|
||||
text: test text
|
||||
templates: []
|
||||
6
pkg/alertmanager/testdata/test_webhook_url_takes_precedence_in_mattermost_config.golden
generated
vendored
Normal file
6
pkg/alertmanager/testdata/test_webhook_url_takes_precedence_in_mattermost_config.golden
generated
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
receivers:
|
||||
- name: ""
|
||||
mattermost_configs:
|
||||
- webhook_url: www.test.com
|
||||
text: test text
|
||||
templates: []
|
||||
@@ -119,6 +119,7 @@ type receiver struct {
|
||||
MSTeamsV2Configs []*msTeamsV2Config `yaml:"msteamsv2_configs,omitempty"`
|
||||
JiraConfigs []*jiraConfig `yaml:"jira_configs,omitempty"`
|
||||
RocketChatConfigs []*rocketChatConfig `yaml:"rocketchat_configs,omitempty"`
|
||||
MattermostConfigs []*mattermostConfig `yaml:"mattermost_configs,omitempty" json:"mattermost_configs,omitempty"`
|
||||
}
|
||||
|
||||
type webhookConfig struct {
|
||||
@@ -490,4 +491,52 @@ type rocketChatConfig struct {
|
||||
Actions []*rocketchatAttachmentAction `yaml:"actions,omitempty"`
|
||||
}
|
||||
|
||||
type mattermostConfig struct {
|
||||
SendResolved *bool `yaml:"send_resolved,omitempty" json:"send_resolved,omitempty"`
|
||||
WebhookURL string `yaml:"webhook_url,omitempty" json:"webhook_url,omitempty"`
|
||||
WebhookURLFile string `yaml:"webhook_url_file,omitempty" json:"webhook_url_file,omitempty"`
|
||||
Channel string `yaml:"channel,omitempty" json:"channel,omitempty"`
|
||||
Username string `yaml:"username,omitempty" json:"username,omitempty"`
|
||||
Text string `yaml:"text" json:"text"`
|
||||
IconURL string `yaml:"icon_url,omitempty" json:"icon_url,omitempty"`
|
||||
IconEmoji string `yaml:"icon_emoji,omitempty" json:"icon_emoji,omitempty"`
|
||||
Attachments []*mattermostAttachmentConfig `yaml:"attachments,omitempty" json:"attachments,omitempty"`
|
||||
Props *mattermostPropsConfig `yaml:"props,omitempty" json:"props,omitempty"`
|
||||
Priority *mattermostPriorityConfig `yaml:"priority,omitempty" json:"priority,omitempty"`
|
||||
HTTPConfig *httpClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"`
|
||||
}
|
||||
|
||||
type mattermostAttachmentConfig struct {
|
||||
Fallback string `yaml:"fallback,omitempty" json:"fallback,omitempty"`
|
||||
Color string `yaml:"color,omitempty" json:"color,omitempty"`
|
||||
Pretext string `yaml:"pretext,omitempty" json:"pretext,omitempty"`
|
||||
Text string `yaml:"text,omitempty" json:"text,omitempty"`
|
||||
AuthorName string `yaml:"author_name,omitempty" json:"author_name,omitempty"`
|
||||
AuthorLink string `yaml:"author_link,omitempty" json:"author_link,omitempty"`
|
||||
AuthorIcon string `yaml:"author_icon,omitempty" json:"author_icon,omitempty"`
|
||||
Title string `yaml:"title,omitempty" json:"title,omitempty"`
|
||||
TitleLink string `yaml:"title_link,omitempty" json:"title_link,omitempty"`
|
||||
Fields []mattermostField `yaml:"fields,omitempty" json:"fields,omitempty"`
|
||||
ThumbURL string `yaml:"thumb_url,omitempty" json:"thumb_url,omitempty"`
|
||||
Footer string `yaml:"footer,omitempty" json:"footer,omitempty"`
|
||||
FooterIcon string `yaml:"footer_icon,omitempty" json:"footer_icon,omitempty"`
|
||||
ImageURL string `yaml:"image_url,omitempty" json:"image_url,omitempty"`
|
||||
}
|
||||
|
||||
type mattermostField struct {
|
||||
Title string `yaml:"title,omitempty" json:"title,omitempty"`
|
||||
Value string `yaml:"value,omitempty" json:"value,omitempty"`
|
||||
Short bool `yaml:"short,omitempty" json:"short,omitempty"`
|
||||
}
|
||||
|
||||
type mattermostPropsConfig struct {
|
||||
Card *string `yaml:"card,omitempty" json:"card,omitempty"`
|
||||
}
|
||||
|
||||
type mattermostPriorityConfig struct {
|
||||
Priority string `yaml:"priority,omitempty" json:"priority,omitempty"`
|
||||
RequestedAck *bool `yaml:"requested_ack,omitempty" json:"requested_ack,omitempty"`
|
||||
PersistentNotifications *bool `yaml:"persistent_notifications,omitempty" json:"persistent_notifications,omitempty"`
|
||||
}
|
||||
|
||||
type timeInterval config.TimeInterval
|
||||
|
||||
@@ -114,7 +114,6 @@ func validateReceivers(receivers []monitoringv1alpha1.Receiver) (map[string]stru
|
||||
if err := validateMSTeamsV2Configs(receiver.MSTeamsV2Configs); err != nil {
|
||||
return nil, fmt.Errorf("failed to validate 'msteamsv2Config' - receiver %s: %w", receiver.Name, err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return receiverNames, nil
|
||||
|
||||
@@ -114,7 +114,6 @@ func validateReceivers(receivers []monitoringv1beta1.Receiver) (map[string]struc
|
||||
if err := validateMSTeamsV2Configs(receiver.MSTeamsV2Configs); err != nil {
|
||||
return nil, fmt.Errorf("failed to validate 'msteamsv2Config' - receiver %s: %w", receiver.Name, err)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return receiverNames, nil
|
||||
|
||||
Reference in New Issue
Block a user